Allow RAH-specific pattern control
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
97
gui/builtinContextMenus/moduleRahPattern.py
Normal file
97
gui/builtinContextMenus/moduleRahPattern.py
Normal file
@@ -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()
|
||||
0
gui/builtinContextMenus/shared/__init__.py
Normal file
0
gui/builtinContextMenus/shared/__init__.py
Normal file
35
gui/builtinContextMenus/shared/patterns.py
Normal file
35
gui/builtinContextMenus/shared/patterns.py
Normal file
@@ -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
|
||||
@@ -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")
|
||||
|
||||
@@ -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 = {}
|
||||
|
||||
Reference in New Issue
Block a user