Allow RAH-specific pattern control

This commit is contained in:
DarkPhoenix
2022-03-12 02:19:03 +03:00
parent 0c292e8d6e
commit ae115b640a
9 changed files with 152 additions and 41 deletions

View File

@@ -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

View File

@@ -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):

View File

@@ -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

View File

@@ -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):

View 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()

View 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

View File

@@ -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")

View File

@@ -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 = {}