diff --git a/eos/effects.py b/eos/effects.py index 278929a92..88b48db8e 100644 --- a/eos/effects.py +++ b/eos/effects.py @@ -16439,13 +16439,10 @@ class Effect4928(BaseEffect): def handler(fit, module, context, projectionRange, **kwargs): # pyfalog = Logger(__name__) - damagePattern = fit.damagePattern + damagePattern = module.rahPatternOverride if module.rahPatternOverride is not None else fit.damagePattern # pyfalog.debug('==============================') - static_adaptive_behavior = eos.config.settings['useStaticAdaptiveArmorHardener'] - - if (damagePattern.emAmount == damagePattern.thermalAmount == damagePattern.kineticAmount == damagePattern.explosiveAmount) and static_adaptive_behavior: - # pyfalog.debug('Setting adaptivearmorhardener resists to uniform profile.') + if damagePattern == 'disable': for attr in ('armorEmDamageResonance', 'armorThermalDamageResonance', 'armorKineticDamageResonance', 'armorExplosiveDamageResonance'): fit.ship.multiplyItemAttr(attr, module.getModifiedItemAttr(attr), stackingPenalties=True, penaltyGroup='preMul') return diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index 767f9e1ba..bbab93494 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -122,6 +122,8 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M if self.__charge and self.__charge.category.name != "Charge": self.__charge = None + self.rahPatternOverride = None + self.__baseVolley = None self.__baseRRAmount = None self.__miningYield = None @@ -1075,6 +1077,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M copy.spoolType = self.spoolType copy.spoolAmount = self.spoolAmount copy.projectionRange = self.projectionRange + copy.rahPatternOverride = self.rahPatternOverride self._mutaApplyMutators(mutatorClass=MutatorModule, targetInstance=copy) return copy @@ -1085,6 +1088,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M spoolType = self.spoolType spoolAmount = self.spoolAmount projectionRange = self.projectionRange + rahPatternOverride = self.rahPatternOverride Module.__init__(self, item, self.baseItem, self.mutaplasmid) self.state = state @@ -1093,6 +1097,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M self.spoolType = spoolType self.spoolAmount = spoolAmount self.projectionRange = projectionRange + self.rahPatternOverride = rahPatternOverride self._mutaApplyMutators(mutatorClass=MutatorModule) def __repr__(self): diff --git a/gui/builtinContextMenus/__init__.py b/gui/builtinContextMenus/__init__.py index 9b3b1c0b5..fd343cc51 100644 --- a/gui/builtinContextMenus/__init__.py +++ b/gui/builtinContextMenus/__init__.py @@ -11,6 +11,7 @@ from gui.builtinContextMenus import graphFitAmmoPicker from gui.builtinContextMenus import shipModeChange from gui.builtinContextMenus import moduleAmmoChange from gui.builtinContextMenus import moduleSpool +from gui.builtinContextMenus import moduleRahPattern from gui.builtinContextMenus import boosterSideEffects from gui.builtinContextMenus import fighterAbilities from gui.builtinContextMenus import resistMode diff --git a/gui/builtinContextMenus/damagePatternChange.py b/gui/builtinContextMenus/damagePatternChange.py index 57720e87c..b2a6fba75 100644 --- a/gui/builtinContextMenus/damagePatternChange.py +++ b/gui/builtinContextMenus/damagePatternChange.py @@ -1,20 +1,16 @@ -from collections import OrderedDict -from itertools import chain - # noinspection PyPackageRequirements import wx import gui.globalEvents as GE import gui.mainFrame +from gui.builtinContextMenus.shared.patterns import DamagePatternMixin from gui.contextMenu import ContextMenuUnconditional -from gui.utils.sorter import smartSort -from service.damagePattern import DamagePattern as DmgPatternSvc from service.fit import Fit _t = wx.GetTranslation -class ChangeDamagePattern(ContextMenuUnconditional): +class ChangeDamagePattern(ContextMenuUnconditional, DamagePatternMixin): def __init__(self): self.mainFrame = gui.mainFrame.MainFrame.getInstance() @@ -27,29 +23,12 @@ class ChangeDamagePattern(ContextMenuUnconditional): return self.mainFrame.getActiveFit() is not None def getText(self, callingWindow, itmContext): - sDP = DmgPatternSvc.getInstance() sFit = Fit.getInstance() fitID = self.mainFrame.getActiveFit() self.fit = sFit.getFit(fitID) - - builtinPatterns = sDP.getBuiltinDamagePatternList() - userPatterns = sorted(sDP.getUserDamagePatternList(), key=lambda p: smartSort(p.fullName)) - # Order here is important: patterns with duplicate names from the latter will overwrite - # patterns from the former - self.patterns = sorted( - chain(builtinPatterns, userPatterns), - key=lambda p: p.fullName not in ["Uniform", "Selected Ammo"]) - self.patternEventMap = {} - self.items = (OrderedDict(), OrderedDict()) - for pattern in self.patterns: - container = self.items - for categoryName in pattern.hierarchy: - categoryName = _t(categoryName) if pattern.builtin else categoryName - container = container[1].setdefault(categoryName, (OrderedDict(), OrderedDict())) - shortName = _t(pattern.shortName) if pattern.builtin else pattern.shortName - container[0][shortName] = pattern - + self.patterns = self._getPatterns() + self.items = self._getItems(self.patterns) return list(self.items[0].keys()) + list(self.items[1].keys()) def _addPattern(self, parentMenu, pattern, name): diff --git a/gui/builtinContextMenus/moduleRahPattern.py b/gui/builtinContextMenus/moduleRahPattern.py new file mode 100644 index 000000000..714153896 --- /dev/null +++ b/gui/builtinContextMenus/moduleRahPattern.py @@ -0,0 +1,97 @@ +from collections import OrderedDict + +# noinspection PyPackageRequirements +import wx + +import gui.globalEvents as GE +import gui.mainFrame +from gui.builtinContextMenus.shared.patterns import DamagePatternMixin +from gui.contextMenu import ContextMenuSingle +from service.fit import Fit + +_t = wx.GetTranslation + + +class ChangeRahPattern(ContextMenuSingle, DamagePatternMixin): + + def __init__(self): + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + def display(self, callingWindow, srcContext, mainItem): + if srcContext != 'fittingModule': + return False + + if self.mainFrame.getActiveFit() is None: + return False + + if (mainItem is None or getattr(mainItem, "isEmpty", False)) and srcContext != "fittingShip": + return False + + if mainItem.item.group.name != 'Armor Resistance Shift Hardener': + return False + + self.module = mainItem + self.patternEventMap = {} + self.patterns = self._getPatterns() + self.items = self._getItems(self.patterns) + return True + + def getText(self, callingWindow, itmContext, mainItem): + return _t('RAH Damage Pattern') + + def _addPattern(self, parentMenu, pattern, name): + id = ContextMenuSingle.nextID() + self.patternEventMap[id] = pattern + menuItem = wx.MenuItem(parentMenu, id, name, kind=wx.ITEM_CHECK) + parentMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, menuItem) + + checked = self.module.rahPatternOverride is pattern + return menuItem, checked + + def _addCategory(self, parentMenu, name): + id = ContextMenuSingle.nextID() + menuItem = wx.MenuItem(parentMenu, id, name) + parentMenu.Bind(wx.EVT_MENU, self.handlePatternSwitch, menuItem) + return menuItem + + def getSubMenu(self, callingWindow, context, mainItem, rootMenu, i, pitem): + # Category as menu item - expands further + msw = "wxMSW" in wx.PlatformInfo + + def makeMenu(container, parentMenu, root=False): + menu = wx.Menu() + if root: + menuItem, checked = self._addPattern(rootMenu if msw else parentMenu, None, 'Fit Pattern') + menu.Append(menuItem) + menuItem.Check(checked) + menuItem, checked = self._addPattern(rootMenu if msw else parentMenu, 'disable', 'Do Not Adapt') + menu.Append(menuItem) + menuItem.Check(checked) + menu.AppendSeparator() + for name, subcontainer in container[1].items(): + menuItem = self._addCategory(rootMenu if msw else parentMenu, name) + subMenu = makeMenu(subcontainer, menu) + menuItem.SetSubMenu(subMenu) + menu.Append(menuItem) + for name, pattern in container[0].items(): + menuItem, checked = self._addPattern(rootMenu if msw else parentMenu, pattern, name) + menu.Append(menuItem) + menuItem.Check(checked) + menu.Bind(wx.EVT_MENU, self.handlePatternSwitch) + return menu + + subMenu = makeMenu(self.items, rootMenu, root=True) + return subMenu + + def handlePatternSwitch(self, event): + pattern = self.patternEventMap.get(event.Id, False) + if pattern is False: + event.Skip() + return + sFit = Fit.getInstance() + fitID = self.mainFrame.getActiveFit() + sFit.setRahPattern(fitID, self.module, pattern) + wx.PostEvent(self.mainFrame, GE.FitChanged(fitIDs=(fitID,))) + + +ChangeRahPattern.register() diff --git a/gui/builtinContextMenus/shared/__init__.py b/gui/builtinContextMenus/shared/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/gui/builtinContextMenus/shared/patterns.py b/gui/builtinContextMenus/shared/patterns.py new file mode 100644 index 000000000..8e825bd4d --- /dev/null +++ b/gui/builtinContextMenus/shared/patterns.py @@ -0,0 +1,35 @@ +from collections import OrderedDict +from itertools import chain + +# noinspection PyPackageRequirements +import wx + +from gui.utils.sorter import smartSort +from service.damagePattern import DamagePattern as DmgPatternSvc + +_t = wx.GetTranslation + + +class DamagePatternMixin: + + def _getPatterns(self): + sDP = DmgPatternSvc.getInstance() + builtinPatterns = sDP.getBuiltinDamagePatternList() + userPatterns = sorted(sDP.getUserDamagePatternList(), key=lambda p: smartSort(p.fullName)) + # Order here is important: patterns with duplicate names from the latter will overwrite + # patterns from the former + patterns = sorted( + chain(builtinPatterns, userPatterns), + key=lambda p: p.fullName not in ["Uniform", "Selected Ammo"]) + return patterns + + def _getItems(self, patterns): + items = (OrderedDict(), OrderedDict()) + for pattern in patterns: + container = items + for categoryName in pattern.hierarchy: + categoryName = _t(categoryName) if pattern.builtin else categoryName + container = container[1].setdefault(categoryName, (OrderedDict(), OrderedDict())) + shortName = _t(pattern.shortName) if pattern.builtin else pattern.shortName + container[0][shortName] = pattern + return items diff --git a/gui/builtinPreferenceViews/pyfaEnginePreferences.py b/gui/builtinPreferenceViews/pyfaEnginePreferences.py index b9c74afcc..6519226d1 100644 --- a/gui/builtinPreferenceViews/pyfaEnginePreferences.py +++ b/gui/builtinPreferenceViews/pyfaEnginePreferences.py @@ -57,12 +57,6 @@ class PFFittingEnginePref(PreferenceView): mainSizer.Add(self.cbStrictSkillLevels, 0, wx.ALL | wx.EXPAND, 5) - self.cbUniversalAdaptiveArmorHardener = wx.CheckBox(panel, wx.ID_ANY, - _t("When damage profile is Uniform, set Reactive Armor " - "Hardener to match (old behavior)."), - wx.DefaultPosition, wx.DefaultSize, 0) - mainSizer.Add(self.cbUniversalAdaptiveArmorHardener, 0, wx.ALL | wx.EXPAND, 5) - spoolup_sizer = wx.BoxSizer(wx.HORIZONTAL) self.spool_up_label = wx.StaticText(panel, wx.ID_ANY, _t("Global Default Spoolup Percentage:"), wx.DefaultPosition, wx.DefaultSize, 0) @@ -110,9 +104,6 @@ class PFFittingEnginePref(PreferenceView): self.cbStrictSkillLevels.SetValue(self.engine_settings.get("strictSkillLevels")) self.cbStrictSkillLevels.Bind(wx.EVT_CHECKBOX, self.OnCBStrictSkillLevelsChange) - self.cbUniversalAdaptiveArmorHardener.SetValue(self.engine_settings.get("useStaticAdaptiveArmorHardener")) - self.cbUniversalAdaptiveArmorHardener.Bind(wx.EVT_CHECKBOX, self.OnCBUniversalAdaptiveArmorHardenerChange) - self.spoolup_value.SetValue(int(self.engine_settings.get("globalDefaultSpoolupPercentage") * 100)) self.spoolup_value.Bind(wx.lib.intctrl.EVT_INT, self.OnSpoolupChange) @@ -129,8 +120,6 @@ class PFFittingEnginePref(PreferenceView): def OnCBStrictSkillLevelsChange(self, event): self.engine_settings.set("strictSkillLevels", self.cbStrictSkillLevels.GetValue()) - def OnCBUniversalAdaptiveArmorHardenerChange(self, event): - self.engine_settings.set("useStaticAdaptiveArmorHardener", self.cbUniversalAdaptiveArmorHardener.GetValue()) def getImage(self): return BitmapLoader.getBitmap("settings_fitting", "gui") diff --git a/service/fit.py b/service/fit.py index 1ad5495bf..8cdf15a02 100644 --- a/service/fit.py +++ b/service/fit.py @@ -457,6 +457,14 @@ class Fit: fit.damagePattern = dp self.recalc(fit) + def setRahPattern(self, fitID, module, pattern): + pyfalog.debug("Set as pattern for fit ID: {0}", fitID) + if fitID is None: + return + module.rahPatternOverride = pattern + fit = eos.db.getFit(fitID) + self.recalc(fit) + def checkStates(self, fit, base): pyfalog.debug("Check states for fit ID: {0}", fit) changedMods = {}