From 02103b6d2ed8594a2619ae010d5accf10d7d0bf0 Mon Sep 17 00:00:00 2001 From: WatchMeCalculate Date: Fri, 1 Jun 2018 02:16:29 -0700 Subject: [PATCH 1/5] Refactor checking if Hardpoints has free spots into a function fit can use --- eos/saveddata/fit.py | 10 ++++++++++ eos/saveddata/module.py | 8 ++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index e768bf216..4a7cf8371 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -1016,6 +1016,16 @@ class Fit(object): def getNumSlots(self, type): return self.ship.getModifiedItemAttr(self.slots[type]) or 0 + def getHardpointsFree(self, type): + if type == Hardpoint.NONE: + return 1 + elif type == Hardpoint.TURRET: + return self.ship.getModifiedItemAttr('turretSlotsLeft') - self.getHardpointsUsed(Hardpoint.TURRET) + elif type == Hardpoint.MISSILE: + return self.ship.getModifiedItemAttr('launcherSlotsLeft') - self.getHardpointsUsed(Hardpoint.MISSILE) + else: + raise ValueError("%d is not a valid value for Hardpoint Enum", type) + @property def calibrationUsed(self): return self.getItemAttrOnlineSum(self.modules, 'upgradeCost') diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index 41bed8c50..4fce1cfb9 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -480,12 +480,8 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): # Check this only if we're told to do so if hardpointLimit: - if self.hardpoint == Hardpoint.TURRET: - if fit.ship.getModifiedItemAttr('turretSlotsLeft') - fit.getHardpointsUsed(Hardpoint.TURRET) < 1: - return False - elif self.hardpoint == Hardpoint.MISSILE: - if fit.ship.getModifiedItemAttr('launcherSlotsLeft') - fit.getHardpointsUsed(Hardpoint.MISSILE) < 1: - return False + if fit.getHardpointsFree(self.hardpoint) < 1: + return False return True From cc586f6532c26cc2bfdf6228fb8445c25503830b Mon Sep 17 00:00:00 2001 From: WatchMeCalculate Date: Fri, 1 Jun 2018 02:18:03 -0700 Subject: [PATCH 2/5] For modules with maxfitting, ensure on validity count, don't count itself --- eos/saveddata/module.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index 4fce1cfb9..33eae37ec 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -472,7 +472,8 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if max is not None: current = 0 # if self.owner != fit else -1 # Disabled, see #1278 for mod in fit.modules: - if mod.item and mod.item.groupID == self.item.groupID: + if (mod.item and mod.item.groupID == self.item.groupID and + self.modPosition != mod.modPosition): current += 1 if current >= max: From 87660246b6e7f51f7f9d9fc512c5ff77325671b5 Mon Sep 17 00:00:00 2001 From: WatchMeCalculate Date: Fri, 1 Jun 2018 02:19:14 -0700 Subject: [PATCH 3/5] When re-enabling restrictions only delete incompatible modules Hardpoints past limit will show up highlighted red. --- service/fit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/fit.py b/service/fit.py index 5fb884cad..75939a049 100644 --- a/service/fit.py +++ b/service/fit.py @@ -973,7 +973,7 @@ class Fit(object): # remove invalid modules when switching back to enabled fitting restrictions if not fit.ignoreRestrictions: for m in fit.modules: - if not m.isEmpty and not m.fits(fit): + if not m.isEmpty and not m.fits(fit, False): self.removeModule(fit.ID, m.modPosition) eos.db.commit() From cbb8545c30910357670ed5093bd505f08f0cf490 Mon Sep 17 00:00:00 2001 From: WatchMeCalculate Date: Fri, 1 Jun 2018 02:22:29 -0700 Subject: [PATCH 4/5] If module had previously violated fitting restrictions, but now is a valid module, recolor background --- gui/builtinViews/fittingView.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 36b3da6b1..f0b95cdc9 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -686,7 +686,22 @@ class FittingView(d.Display): # only consider changing color if we're dealing with a Module if type(mod) is Module: - if slotMap[mod.slot] or getattr(mod, 'restrictionOverridden', None): # Color too many modules as red + hasRestrictionOverriden = getattr(mod, 'restrictionOverridden', None) + # If module had broken fitting restrictions but now doesn't, + # ensure it is now valid, and remove restrictionOverridden + # variable. More in #1519 + if not fit.ignoreRestrictions and hasRestrictionOverriden: + clean = False + if mod.fits(fit, False): + if not mod.hardpoint: + clean = True + elif fit.getHardpointsFree(mod.hardpoint) >= 0: + clean = True + if clean: + del mod.restrictionOverridden + hasRestrictionOverriden = not hasRestrictionOverriden + + if slotMap[mod.slot] or hasRestrictionOverriden: # Color too many modules as red # Color too many modules as red self.SetItemBackgroundColour(i, wx.Colour(204, 51, 51)) elif sFit.serviceFittingOptions["colorFitBySlot"]: # Color by slot it enabled self.SetItemBackgroundColour(i, self.slotColour(mod.slot)) From a5b5cec919f6aa774b5b2e87db8140e892e9ceb4 Mon Sep 17 00:00:00 2001 From: WatchMeCalculate Date: Fri, 1 Jun 2018 13:08:25 -0700 Subject: [PATCH 5/5] Fixed flake8 issues --- eos/saveddata/fit.py | 2 +- eos/saveddata/module.py | 2 +- gui/builtinViews/fittingView.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 4a7cf8371..d44f8adca 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -1025,7 +1025,7 @@ class Fit(object): return self.ship.getModifiedItemAttr('launcherSlotsLeft') - self.getHardpointsUsed(Hardpoint.MISSILE) else: raise ValueError("%d is not a valid value for Hardpoint Enum", type) - + @property def calibrationUsed(self): return self.getItemAttrOnlineSum(self.modules, 'upgradeCost') diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index 33eae37ec..f3c6132ac 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -473,7 +473,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): current = 0 # if self.owner != fit else -1 # Disabled, see #1278 for mod in fit.modules: if (mod.item and mod.item.groupID == self.item.groupID and - self.modPosition != mod.modPosition): + self.modPosition != mod.modPosition): current += 1 if current >= max: diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index f0b95cdc9..9a7a97a43 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -701,7 +701,7 @@ class FittingView(d.Display): del mod.restrictionOverridden hasRestrictionOverriden = not hasRestrictionOverriden - if slotMap[mod.slot] or hasRestrictionOverriden: # Color too many modules as red # Color too many modules as red + if slotMap[mod.slot] or hasRestrictionOverriden: # Color too many modules as red self.SetItemBackgroundColour(i, wx.Colour(204, 51, 51)) elif sFit.serviceFittingOptions["colorFitBySlot"]: # Color by slot it enabled self.SetItemBackgroundColour(i, self.slotColour(mod.slot))