diff --git a/_development/helpers.py b/_development/helpers.py index ad1447371..3f4635891 100644 --- a/_development/helpers.py +++ b/_development/helpers.py @@ -129,7 +129,8 @@ def Saveddata(): from eos.saveddata.ship import Ship from eos.saveddata.fit import Fit from eos.saveddata.character import Character - from eos.saveddata.module import Module, State + from eos.saveddata.module import Module + from eos.const import FittingModuleState from eos.saveddata.citadel import Citadel from eos.saveddata.booster import Booster @@ -139,7 +140,7 @@ def Saveddata(): 'Fit' : Fit, 'Character': Character, 'Module' : Module, - 'State' : State, + 'State' : FittingModuleState, 'Booster' : Booster, } return helper diff --git a/config.py b/config.py index 488f477b5..371adf8e2 100644 --- a/config.py +++ b/config.py @@ -6,7 +6,7 @@ import wx from logbook import CRITICAL, DEBUG, ERROR, FingersCrossedHandler, INFO, Logger, NestedSetup, NullHandler, \ StreamHandler, TimedRotatingFileHandler, WARNING import hashlib -from eos.const import Slot +from eos.const import FittingSlot from cryptography.fernet import Fernet @@ -50,11 +50,11 @@ LOGLEVEL_MAP = { } slotColourMap = { - Slot.LOW: wx.Colour(250, 235, 204), # yellow = low slots - Slot.MED: wx.Colour(188, 215, 241), # blue = mid slots - Slot.HIGH: wx.Colour(235, 204, 209), # red = high slots - Slot.RIG: '', - Slot.SUBSYSTEM: '' + FittingSlot.LOW: wx.Colour(250, 235, 204), # yellow = low slots + FittingSlot.MED: wx.Colour(188, 215, 241), # blue = mid slots + FittingSlot.HIGH: wx.Colour(235, 204, 209), # red = high slots + FittingSlot.RIG: '', + FittingSlot.SUBSYSTEM: '' } def getClientSecret(): diff --git a/eos/const.py b/eos/const.py index 95dd8a888..e0ae7c9ea 100644 --- a/eos/const.py +++ b/eos/const.py @@ -1,8 +1,30 @@ -from eos.enum import Enum +# ============================================================================= +# Copyright (C) 2019 Ryan Holmes +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +# ============================================================================= + +from enum import IntEnum,unique - -class Slot(Enum): +@unique +class FittingSlot(IntEnum): + """ + Contains slots for ship fittings + """ # These are self-explanatory LOW = 1 MED = 2 @@ -24,3 +46,40 @@ class Slot(Enum): FS_LIGHT = 13 FS_SUPPORT = 14 FS_HEAVY = 15 + +@unique +class ImplantLocation(IntEnum): + """ + Contains location of the implant + """ + FIT = 0 + CHARACTER = 1 + +@unique +class CalcType(IntEnum): + """ + Contains location of the calculation + """ + LOCAL = 0 + PROJECTED = 1 + COMMAND = 2 + +@unique +class FittingModuleState(IntEnum): + """ + Contains the state of a fitting module + """ + OFFLINE = -1 + ONLINE = 0 + ACTIVE = 1 + OVERHEATED = 2 + +@unique +class FittingHardpoint(IntEnum): + """ + Contains the types of a fitting hardpoint + """ + NONE = 0 + MISSILE = 1 + TURRET = 2 + diff --git a/eos/effects/doomsdayaoeneut.py b/eos/effects/doomsdayaoeneut.py index 1be85f6bd..6f9cd2f5e 100644 --- a/eos/effects/doomsdayaoeneut.py +++ b/eos/effects/doomsdayaoeneut.py @@ -3,15 +3,15 @@ # Used by: # Module: Energy Neutralization Burst Projector # Structure Module: Standup Energy Neutralization Burst Projector -from eos.saveddata.module import State +from eos.const import FittingModuleState from eos.modifiedAttributeDict import ModifiedAttributeDict type = "active", "projected" def handler(fit, src, context, **kwargs): - if "projected" in context and ((hasattr(src, "state") and src.state >= State.ACTIVE) or - hasattr(src, "amountActive")): + if "projected" in context and ((hasattr(src, "state") and src.state >= FittingModuleState.ACTIVE) or + hasattr(src, "amountActive")): amount = src.getModifiedItemAttr("energyNeutralizerAmount") if 'effect' in kwargs: diff --git a/eos/effects/energyneutralizerfalloff.py b/eos/effects/energyneutralizerfalloff.py index 67e55e7ad..2ee279d44 100644 --- a/eos/effects/energyneutralizerfalloff.py +++ b/eos/effects/energyneutralizerfalloff.py @@ -2,15 +2,15 @@ # # Used by: # Modules from group: Energy Neutralizer (54 of 54) -from eos.saveddata.module import State +from eos.const import FittingModuleState from eos.modifiedAttributeDict import ModifiedAttributeDict type = "active", "projected" def handler(fit, src, context, **kwargs): - if "projected" in context and ((hasattr(src, "state") and src.state >= State.ACTIVE) or - hasattr(src, "amountActive")): + if "projected" in context and ((hasattr(src, "state") and src.state >= FittingModuleState.ACTIVE) or + hasattr(src, "amountActive")): amount = src.getModifiedItemAttr("energyNeutralizerAmount") if 'effect' in kwargs: diff --git a/eos/effects/entityenergyneutralizerfalloff.py b/eos/effects/entityenergyneutralizerfalloff.py index 751cd540c..ade55d190 100644 --- a/eos/effects/entityenergyneutralizerfalloff.py +++ b/eos/effects/entityenergyneutralizerfalloff.py @@ -2,15 +2,15 @@ # # Used by: # Drones from group: Energy Neutralizer Drone (3 of 3) -from eos.saveddata.module import State +from eos.const import FittingModuleState from eos.modifiedAttributeDict import ModifiedAttributeDict type = "active", "projected" def handler(fit, src, context, **kwargs): - if "projected" in context and ((hasattr(src, "state") and src.state >= State.ACTIVE) or - hasattr(src, "amountActive")): + if "projected" in context and ((hasattr(src, "state") and src.state >= FittingModuleState.ACTIVE) or + hasattr(src, "amountActive")): amount = src.getModifiedItemAttr("energyNeutralizerAmount") time = src.getModifiedItemAttr("energyNeutralizerDuration") diff --git a/eos/effects/structurecombatrigsecuritymodification.py b/eos/effects/structurecombatrigsecuritymodification.py new file mode 100644 index 000000000..dcbc93d39 --- /dev/null +++ b/eos/effects/structurecombatrigsecuritymodification.py @@ -0,0 +1,17 @@ +runTime = "early" +type = "passive" + + +def handler(fit, module, context): + secModifier = module.getModifiedItemAttr("securityModifier") + module.multiplyItemAttr("structureRigDoomsdayDamageLossTargetBonus", secModifier) + module.multiplyItemAttr("structureRigScanResBonus", secModifier) + module.multiplyItemAttr("structureRigPDRangeBonus", secModifier) + module.multiplyItemAttr("structureRigPDCapUseBonus", secModifier) + module.multiplyItemAttr("structureRigMissileExploVeloBonus", secModifier) + module.multiplyItemAttr("structureRigMissileVelocityBonus", secModifier) + module.multiplyItemAttr("structureRigEwarOptimalBonus", secModifier) + module.multiplyItemAttr("structureRigEwarFalloffBonus", secModifier) + module.multiplyItemAttr("structureRigEwarCapUseBonus", secModifier) + module.multiplyItemAttr("structureRigMissileExplosionRadiusBonus", secModifier) + module.multiplyItemAttr("structureRigMaxTargetRangeBonus", secModifier) diff --git a/eos/effects/structureenergyneutralizerfalloff.py b/eos/effects/structureenergyneutralizerfalloff.py index c9cdd769e..284ed616e 100644 --- a/eos/effects/structureenergyneutralizerfalloff.py +++ b/eos/effects/structureenergyneutralizerfalloff.py @@ -2,7 +2,7 @@ # # Used by: # Structure Modules from group: Structure Energy Neutralizer (5 of 5) -from eos.saveddata.module import State +from eos.const import FittingModuleState from eos.modifiedAttributeDict import ModifiedAttributeDict type = "active", "projected" @@ -11,7 +11,7 @@ type = "active", "projected" def handler(fit, src, context, **kwargs): amount = 0 if "projected" in context: - if (hasattr(src, "state") and src.state >= State.ACTIVE) or hasattr(src, "amountActive"): + if (hasattr(src, "state") and src.state >= FittingModuleState.ACTIVE) or hasattr(src, "amountActive"): amount = src.getModifiedItemAttr("energyNeutralizerAmount") if 'effect' in kwargs: diff --git a/eos/effects/structurewarpscrambleblockmwdwithnpceffect.py b/eos/effects/structurewarpscrambleblockmwdwithnpceffect.py index e6ab9536e..4b342e0ec 100644 --- a/eos/effects/structurewarpscrambleblockmwdwithnpceffect.py +++ b/eos/effects/structurewarpscrambleblockmwdwithnpceffect.py @@ -2,7 +2,7 @@ # # Used by: # Structure Modules from group: Structure Warp Scrambler (2 of 2) -from eos.saveddata.module import State +from eos.const import FittingModuleState # Not used by any item runTime = "early" @@ -14,7 +14,7 @@ def handler(fit, module, context): fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength")) if module.charge is not None and module.charge.ID == 47336: for mod in fit.modules: - if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > State.ONLINE: - mod.state = State.ONLINE - if not mod.isEmpty and mod.item.requiresSkill("Micro Jump Drive Operation") and mod.state > State.ONLINE: - mod.state = State.ONLINE + if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > FittingModuleState.ONLINE: + mod.state = FittingModuleState.ONLINE + if not mod.isEmpty and mod.item.requiresSkill("Micro Jump Drive Operation") and mod.state > FittingModuleState.ONLINE: + mod.state = FittingModuleState.ONLINE diff --git a/eos/effects/warpdisruptsphere.py b/eos/effects/warpdisruptsphere.py index f8ce29992..5a5878fd4 100644 --- a/eos/effects/warpdisruptsphere.py +++ b/eos/effects/warpdisruptsphere.py @@ -7,7 +7,7 @@ # # Used by: # Modules from group: Warp Disrupt Field Generator (7 of 7) -from eos.saveddata.module import State +from eos.const import FittingModuleState type = "projected", "active" runTime = "early" @@ -19,10 +19,10 @@ def handler(fit, module, context): fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength")) if module.charge is not None and module.charge.ID == 45010: for mod in fit.modules: - if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > State.ONLINE: - mod.state = State.ONLINE - if not mod.isEmpty and mod.item.requiresSkill("Micro Jump Drive Operation") and mod.state > State.ONLINE: - mod.state = State.ONLINE + if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > FittingModuleState.ONLINE: + mod.state = FittingModuleState.ONLINE + if not mod.isEmpty and mod.item.requiresSkill("Micro Jump Drive Operation") and mod.state > FittingModuleState.ONLINE: + mod.state = FittingModuleState.ONLINE else: if module.charge is None: fit.ship.boostItemAttr("mass", module.getModifiedItemAttr("massBonusPercentage")) diff --git a/eos/effects/warpscrambleblockmwdwithnpceffect.py b/eos/effects/warpscrambleblockmwdwithnpceffect.py index 0985d4673..4b3ee34cb 100644 --- a/eos/effects/warpscrambleblockmwdwithnpceffect.py +++ b/eos/effects/warpscrambleblockmwdwithnpceffect.py @@ -2,7 +2,7 @@ # # Used by: # Modules named like: Warp Scrambler (27 of 27) -from eos.saveddata.module import State +from eos.const import FittingModuleState runTime = "early" type = "projected", "active" @@ -16,10 +16,10 @@ def handler(fit, module, context): # this is such a dirty hack for mod in fit.modules: - if not mod.isEmpty and mod.state > State.ONLINE and ( + if not mod.isEmpty and mod.state > FittingModuleState.ONLINE and ( mod.item.requiresSkill("Micro Jump Drive Operation") or mod.item.requiresSkill("High Speed Maneuvering") ): - mod.state = State.ONLINE - if not mod.isEmpty and mod.item.requiresSkill("Micro Jump Drive Operation") and mod.state > State.ONLINE: - mod.state = State.ONLINE + mod.state = FittingModuleState.ONLINE + if not mod.isEmpty and mod.item.requiresSkill("Micro Jump Drive Operation") and mod.state > FittingModuleState.ONLINE: + mod.state = FittingModuleState.ONLINE diff --git a/eos/enum.py b/eos/enum.py deleted file mode 100644 index 12e8e09e1..000000000 --- a/eos/enum.py +++ /dev/null @@ -1,23 +0,0 @@ -class Enum(object): - def __init__(self): - pass - - @classmethod - def getTypes(cls): - for stuff in cls.__dict__: - if stuff.upper() == stuff: - yield stuff - - @classmethod - def getName(cls, v): - map = getattr(cls, "_map", None) - if map is None: - map = cls._map = {} - for type in cls.getTypes(): - map[cls.getValue(type)] = type - - return map.get(v) - - @classmethod - def getValue(cls, type): - return cls.__dict__[type] diff --git a/eos/graph/fitDps.py b/eos/graph/fitDps.py index a8d6c4ec3..56f0089e1 100644 --- a/eos/graph/fitDps.py +++ b/eos/graph/fitDps.py @@ -20,7 +20,7 @@ from math import log, sin, radians, exp from eos.graph import Graph -from eos.saveddata.module import State, Hardpoint +from eos.const import FittingModuleState, FittingHardpoint from logbook import Logger pyfalog = Logger(__name__) @@ -46,7 +46,7 @@ class FitDpsGraph(Graph): abssort = lambda _val: -abs(_val - 1) for mod in fit.modules: - if not mod.isEmpty and mod.state >= State.ACTIVE: + if not mod.isEmpty and mod.state >= FittingModuleState.ACTIVE: if "remoteTargetPaintFalloff" in mod.item.effects or "structureModuleEffectTargetPainter" in mod.item.effects: ew['signatureRadius'].append( 1 + (mod.getModifiedItemAttr("signatureRadiusBonus") / 100) * self.calculateModuleMultiplier( @@ -76,12 +76,12 @@ class FitDpsGraph(Graph): for mod in fit.modules: dps = mod.getDps(targetResists=fit.targetResists).total - if mod.hardpoint == Hardpoint.TURRET: - if mod.state >= State.ACTIVE: + if mod.hardpoint == FittingHardpoint.TURRET: + if mod.state >= FittingModuleState.ACTIVE: total += dps * self.calculateTurretMultiplier(mod, data) - elif mod.hardpoint == Hardpoint.MISSILE: - if mod.state >= State.ACTIVE and mod.maxRange is not None and mod.maxRange >= distance: + elif mod.hardpoint == FittingHardpoint.MISSILE: + if mod.state >= FittingModuleState.ACTIVE and mod.maxRange is not None and mod.maxRange >= distance: total += dps * self.calculateMissileMultiplier(mod, data) if distance <= fit.extraAttributes["droneControlRange"]: diff --git a/eos/saveddata/fighter.py b/eos/saveddata/fighter.py index c453f09fc..8024b0681 100644 --- a/eos/saveddata/fighter.py +++ b/eos/saveddata/fighter.py @@ -25,8 +25,8 @@ import eos.db from eos.effectHandlerHelpers import HandledItem, HandledCharge from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut, ChargeAttrShortcut from eos.saveddata.fighterAbility import FighterAbility -from eos.saveddata.module import Slot from eos.utils.stats import DmgTypes +from eos.const import FittingSlot pyfalog = Logger(__name__) @@ -116,12 +116,12 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): def __calculateSlot(self, item): types = { - "Light" : Slot.F_LIGHT, - "Support": Slot.F_SUPPORT, - "Heavy" : Slot.F_HEAVY, - "StandupLight": Slot.FS_LIGHT, - "StandupSupport": Slot.FS_SUPPORT, - "StandupHeavy": Slot.FS_HEAVY + "Light" : FittingSlot.F_LIGHT, + "Support": FittingSlot.F_SUPPORT, + "Heavy" : FittingSlot.F_HEAVY, + "StandupLight": FittingSlot.FS_LIGHT, + "StandupSupport": FittingSlot.FS_SUPPORT, + "StandupHeavy": FittingSlot.FS_HEAVY } for t, slot in types.items(): diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index f33a78651..ff1ee24e2 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -28,28 +28,19 @@ from sqlalchemy.orm import validates, reconstructor import eos.db from eos import capSim from eos.effectHandlerHelpers import HandledModuleList, HandledDroneCargoList, HandledImplantBoosterList, HandledProjectedDroneList, HandledProjectedModList -from eos.enum import Enum +from eos.const import ImplantLocation, CalcType, FittingSlot from eos.saveddata.ship import Ship from eos.saveddata.drone import Drone from eos.saveddata.character import Character from eos.saveddata.citadel import Citadel -from eos.saveddata.module import Module, State, Slot, Hardpoint +from eos.const import FittingModuleState, FittingHardpoint +from eos.saveddata.module import Module from eos.utils.stats import DmgTypes from logbook import Logger + pyfalog = Logger(__name__) -class ImplantLocation(Enum): - FIT = 0 - CHARACTER = 1 - - -class CalcType(Enum): - LOCAL = 0 - PROJECTED = 1 - COMMAND = 2 - - class Fit(object): """Represents a fitting, with modules, ship, implants, etc.""" @@ -741,7 +732,7 @@ class Fit(object): The type of calculation our current iteration is in. This helps us determine the interactions between fits that rely on others for proper calculations """ - pyfalog.info("Starting fit calculation on: {0}, calc: {1}", repr(self), CalcType.getName(type)) + pyfalog.info("Starting fit calculation on: {0}, calc: {1}", repr(self), CalcType(type).name) # If we are projecting this fit onto another one, collect the projection info for later use @@ -901,7 +892,7 @@ class Fit(object): if self.ship is None: return - for slotType in (Slot.LOW, Slot.MED, Slot.HIGH, Slot.RIG, Slot.SUBSYSTEM, Slot.SERVICE): + for slotType in (FittingSlot.LOW.value, FittingSlot.MED.value, FittingSlot.HIGH.value, FittingSlot.RIG.value, FittingSlot.SUBSYSTEM.value, FittingSlot.SERVICE.value): amount = self.getSlotsFree(slotType, True) if amount > 0: for _ in range(int(amount)): @@ -948,7 +939,7 @@ class Fit(object): def getItemAttrOnlineSum(dict, attr): amount = 0 for mod in dict: - add = mod.getModifiedItemAttr(attr) if mod.state >= State.ONLINE else None + add = mod.getModifiedItemAttr(attr) if mod.state >= FittingModuleState.ONLINE else None if add is not None: amount += add @@ -967,29 +958,29 @@ class Fit(object): for mod in chain(self.modules, self.fighters): if mod.slot is type and (not getattr(mod, "isEmpty", False) or countDummies): - if type in (Slot.F_HEAVY, Slot.F_SUPPORT, Slot.F_LIGHT, Slot.FS_HEAVY, Slot.FS_LIGHT, Slot.FS_SUPPORT) and not mod.active: + if type in (FittingSlot.F_HEAVY, FittingSlot.F_SUPPORT, FittingSlot.F_LIGHT, FittingSlot.FS_HEAVY, FittingSlot.FS_LIGHT, FittingSlot.FS_SUPPORT) and not mod.active: continue amount += 1 return amount slots = { - Slot.LOW : "lowSlots", - Slot.MED : "medSlots", - Slot.HIGH : "hiSlots", - Slot.RIG : "rigSlots", - Slot.SUBSYSTEM: "maxSubSystems", - Slot.SERVICE : "serviceSlots", - Slot.F_LIGHT : "fighterLightSlots", - Slot.F_SUPPORT: "fighterSupportSlots", - Slot.F_HEAVY : "fighterHeavySlots", - Slot.FS_LIGHT: "fighterStandupLightSlots", - Slot.FS_SUPPORT: "fighterStandupSupportSlots", - Slot.FS_HEAVY: "fighterStandupHeavySlots", + FittingSlot.LOW : "lowSlots", + FittingSlot.MED : "medSlots", + FittingSlot.HIGH : "hiSlots", + FittingSlot.RIG : "rigSlots", + FittingSlot.SUBSYSTEM: "maxSubSystems", + FittingSlot.SERVICE : "serviceSlots", + FittingSlot.F_LIGHT : "fighterLightSlots", + FittingSlot.F_SUPPORT: "fighterSupportSlots", + FittingSlot.F_HEAVY : "fighterHeavySlots", + FittingSlot.FS_LIGHT: "fighterStandupLightSlots", + FittingSlot.FS_SUPPORT: "fighterStandupSupportSlots", + FittingSlot.FS_HEAVY: "fighterStandupHeavySlots", } def getSlotsFree(self, type, countDummies=False): - if type in (Slot.MODE, Slot.SYSTEM): + if type in (FittingSlot.MODE, FittingSlot.SYSTEM): # These slots don't really exist, return default 0 return 0 @@ -1001,12 +992,12 @@ class Fit(object): return self.ship.getModifiedItemAttr(self.slots[type]) or 0 def getHardpointsFree(self, type): - if type == Hardpoint.NONE: + if type == FittingHardpoint.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) + elif type == FittingHardpoint.TURRET: + return self.ship.getModifiedItemAttr('turretSlotsLeft') - self.getHardpointsUsed(FittingHardpoint.TURRET) + elif type == FittingHardpoint.MISSILE: + return self.ship.getModifiedItemAttr('launcherSlotsLeft') - self.getHardpointsUsed(FittingHardpoint.MISSILE) else: raise ValueError("%d is not a valid value for Hardpoint Enum", type) @@ -1168,7 +1159,7 @@ class Fit(object): capUsed = 0 capAdded = 0 for mod in self.modules: - if mod.state >= State.ACTIVE: + if mod.state >= FittingModuleState.ACTIVE: if (mod.getModifiedItemAttr("capacitorNeed") or 0) != 0: cycleTime = mod.rawCycleTime or 0 reactivationTime = mod.getModifiedItemAttr("moduleReactivationDelay") or 0 @@ -1182,7 +1173,7 @@ class Fit(object): capAdded -= capNeed # If this is a turret, don't stagger activations - disableStagger = mod.hardpoint == Hardpoint.TURRET + disableStagger = mod.hardpoint == FittingHardpoint.TURRET drains.append((int(fullCycleTime), mod.getModifiedItemAttr("capacitorNeed") or 0, mod.numShots or 0, disableStagger, reloadTime)) diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index acb64722c..24181748a 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -23,9 +23,8 @@ from logbook import Logger from sqlalchemy.orm import reconstructor, validates import eos.db -from eos.const import Slot +from eos.const import FittingModuleState, FittingHardpoint, FittingSlot from eos.effectHandlerHelpers import HandledCharge, HandledItem -from eos.enum import Enum from eos.modifiedAttributeDict import ChargeAttrShortcut, ItemAttrShortcut, ModifiedAttributeDict from eos.saveddata.citadel import Citadel from eos.saveddata.mutator import Mutator @@ -35,44 +34,30 @@ from eos.utils.stats import DmgTypes pyfalog = Logger(__name__) - -class State(Enum): - OFFLINE = -1 - ONLINE = 0 - ACTIVE = 1 - OVERHEATED = 2 - - ProjectedMap = { - State.OVERHEATED: State.ACTIVE, - State.ACTIVE: State.OFFLINE, - State.OFFLINE: State.ACTIVE, - State.ONLINE: State.ACTIVE # Just in case + FittingModuleState.OVERHEATED: FittingModuleState.ACTIVE, + FittingModuleState.ACTIVE: FittingModuleState.OFFLINE, + FittingModuleState.OFFLINE: FittingModuleState.ACTIVE, + FittingModuleState.ONLINE: FittingModuleState.ACTIVE # Just in case } # Old state : New State LocalMap = { - State.OVERHEATED: State.ACTIVE, - State.ACTIVE: State.ONLINE, - State.OFFLINE: State.ONLINE, - State.ONLINE: State.ACTIVE + FittingModuleState.OVERHEATED: FittingModuleState.ACTIVE, + FittingModuleState.ACTIVE: FittingModuleState.ONLINE, + FittingModuleState.OFFLINE: FittingModuleState.ONLINE, + FittingModuleState.ONLINE: FittingModuleState.ACTIVE } # For system effects. They should only ever be online or offline ProjectedSystem = { - State.OFFLINE: State.ONLINE, - State.ONLINE: State.OFFLINE + FittingModuleState.OFFLINE: FittingModuleState.ONLINE, + FittingModuleState.ONLINE: FittingModuleState.OFFLINE } -class Hardpoint(Enum): - NONE = 0 - MISSILE = 1 - TURRET = 2 - - class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): """An instance of this class represents a module together with its charge and modified attributes""" MINING_ATTRIBUTES = ("miningAmount",) @@ -104,7 +89,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): self.__charge = None self.projected = False - self.state = State.ONLINE + self.state = FittingModuleState.ONLINE self.build() @reconstructor @@ -153,7 +138,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): self.__reloadTime = None self.__reloadForce = None self.__chargeCycles = None - self.__hardpoint = Hardpoint.NONE + self.__hardpoint = FittingHardpoint.NONE self.__itemModifiedAttributes = ModifiedAttributeDict(parent=self) self.__chargeModifiedAttributes = ModifiedAttributeDict(parent=self) self.__slot = self.dummySlot # defaults to None @@ -396,7 +381,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if self.isEmpty: self.__miningyield = 0 else: - if self.state >= State.ACTIVE: + if self.state >= FittingModuleState.ACTIVE: volley = self.getModifiedItemAttr("specialtyMiningAmount") or self.getModifiedItemAttr( "miningAmount") or 0 if volley: @@ -410,7 +395,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): return self.__miningyield def getVolley(self, spoolOptions=None, targetResists=None, ignoreState=False): - if self.isEmpty or (self.state < State.ACTIVE and not ignoreState): + if self.isEmpty or (self.state < FittingModuleState.ACTIVE and not ignoreState): return DmgTypes(0, 0, 0, 0) if self.__baseVolley is None: dmgGetter = self.getModifiedChargeAttr if self.charge else self.getModifiedItemAttr @@ -448,7 +433,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): return dps def getRemoteReps(self, spoolOptions=None, ignoreState=False): - if self.isEmpty or (self.state < State.ACTIVE and not ignoreState): + if self.isEmpty or (self.state < FittingModuleState.ACTIVE and not ignoreState): return None, 0 def getBaseRemoteReps(module): @@ -590,14 +575,14 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): return False # If the mod is a subsystem, don't let two subs in the same slot fit - if self.slot == Slot.SUBSYSTEM: + if self.slot == FittingSlot.SUBSYSTEM: subSlot = self.getModifiedItemAttr("subSystemSlot") for mod in fit.modules: if mod.getModifiedItemAttr("subSystemSlot") == subSlot: return False # Check rig sizes - if self.slot == Slot.RIG: + if self.slot == FittingSlot.RIG: if self.getModifiedItemAttr("rigSize") != fit.ship.getModifiedItemAttr("rigSize"): return False @@ -627,9 +612,9 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): # Check if we're within bounds if state < -1 or state > 2: return False - elif state >= State.ACTIVE and not self.item.isType("active"): + elif state >= FittingModuleState.ACTIVE and not self.item.isType("active"): return False - elif state == State.OVERHEATED and not self.item.isType("overheat"): + elif state == FittingModuleState.OVERHEATED and not self.item.isType("overheat"): return False else: return True @@ -641,7 +626,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): # If we're going to set module to offline or online for local modules or offline for projected, # it should be fine for all cases item = self.item - if (state <= State.ONLINE and projectedOnto is None) or (state <= State.OFFLINE): + if (state <= FittingModuleState.ONLINE and projectedOnto is None) or (state <= FittingModuleState.OFFLINE): return True # Check if the local module is over it's max limit; if it's not, we're fine @@ -655,7 +640,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): group = item.group.name for mod in self.owner.modules: currItem = getattr(mod, "item", None) - if mod.state >= State.ACTIVE and currItem is not None and currItem.group.name == group: + if mod.state >= FittingModuleState.ACTIVE and currItem is not None and currItem.group.name == group: currActive += 1 if currActive > maxGroupActive: break @@ -718,28 +703,28 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): @staticmethod def __calculateHardpoint(item): effectHardpointMap = { - "turretFitted" : Hardpoint.TURRET, - "launcherFitted": Hardpoint.MISSILE + "turretFitted" : FittingHardpoint.TURRET, + "launcherFitted": FittingHardpoint.MISSILE } if item is None: - return Hardpoint.NONE + return FittingHardpoint.NONE for effectName, slot in effectHardpointMap.items(): if effectName in item.effects: return slot - return Hardpoint.NONE + return FittingHardpoint.NONE @staticmethod def calculateSlot(item): effectSlotMap = { - "rigSlot" : Slot.RIG, - "loPower" : Slot.LOW, - "medPower" : Slot.MED, - "hiPower" : Slot.HIGH, - "subSystem" : Slot.SUBSYSTEM, - "serviceSlot": Slot.SERVICE + "rigSlot" : FittingSlot.RIG.value, + "loPower" : FittingSlot.LOW.value, + "medPower" : FittingSlot.MED.value, + "hiPower" : FittingSlot.HIGH.value, + "subSystem" : FittingSlot.SUBSYSTEM.value, + "serviceSlot": FittingSlot.SERVICE.value } if item is None: return None @@ -747,7 +732,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if effectName in item.effects: return slot if item.group.name in Module.SYSTEM_GROUPS: - return Slot.SYSTEM + return FittingSlot.SYSTEM return None @@ -801,8 +786,8 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if effect.runTime == runTime and \ effect.activeByDefault and \ (effect.isType("offline") or - (effect.isType("passive") and self.state >= State.ONLINE) or - (effect.isType("active") and self.state >= State.ACTIVE)) and \ + (effect.isType("passive") and self.state >= FittingModuleState.ONLINE) or + (effect.isType("active") and self.state >= FittingModuleState.ACTIVE)) and \ (not gang or (gang and effect.isType("gang"))): chargeContext = ("moduleCharge",) @@ -815,7 +800,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): effect.handler(fit, self, chargeContext) if self.item: - if self.state >= State.OVERHEATED: + if self.state >= FittingModuleState.OVERHEATED: for effect in self.item.effects.values(): if effect.runTime == runTime and \ effect.isType("overheat") \ @@ -828,8 +813,8 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if effect.runTime == runTime and \ effect.activeByDefault and \ (effect.isType("offline") or - (effect.isType("passive") and self.state >= State.ONLINE) or - (effect.isType("active") and self.state >= State.ACTIVE)) \ + (effect.isType("passive") and self.state >= FittingModuleState.ONLINE) or + (effect.isType("active") and self.state >= FittingModuleState.ACTIVE)) \ and ((projected and effect.isType("projected")) or not projected) \ and ((gang and effect.isType("gang")) or not gang): try: @@ -904,7 +889,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): @property def capUse(self): capNeed = self.getModifiedItemAttr("capacitorNeed") - if capNeed and self.state >= State.ACTIVE: + if capNeed and self.state >= FittingModuleState.ACTIVE: cycleTime = self.cycleTime if cycleTime > 0: capUsed = capNeed / (cycleTime / 1000.0) @@ -916,10 +901,10 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): def getProposedState(mod, click, proposedState=None): # todo: instead of passing in module, make this a instanced function. pyfalog.debug("Get proposed state for module.") - if mod.slot == Slot.SUBSYSTEM or mod.isEmpty: - return State.ONLINE + if mod.slot == FittingSlot.SUBSYSTEM or mod.isEmpty: + return FittingModuleState.ONLINE - if mod.slot == Slot.SYSTEM: + if mod.slot == FittingSlot.SYSTEM: transitionMap = ProjectedSystem else: transitionMap = ProjectedMap if mod.projected else LocalMap @@ -929,9 +914,9 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if proposedState is not None: state = proposedState elif click == "right": - state = State.OVERHEATED + state = FittingModuleState.OVERHEATED elif click == "ctrl": - state = State.OFFLINE + state = FittingModuleState.OFFLINE else: state = transitionMap[currState] if not mod.isValidState(state): diff --git a/gui/builtinAdditionPanes/fighterView.py b/gui/builtinAdditionPanes/fighterView.py index 44e47095e..af98a46ed 100644 --- a/gui/builtinAdditionPanes/fighterView.py +++ b/gui/builtinAdditionPanes/fighterView.py @@ -25,7 +25,7 @@ from gui.builtinMarketBrowser.events import ItemSelected, ITEM_SELECTED import gui.mainFrame import gui.display as d from gui.builtinViewColumns.state import State -from eos.saveddata.module import Slot +from eos.const import FittingSlot from gui.contextMenu import ContextMenu from gui.utils.staticHelpers import DragDropHelper from service.fit import Fit @@ -93,9 +93,9 @@ class FighterView(wx.Panel): if fit: for x in self.labels: if fit.isStructure: - slot = getattr(Slot, "FS_{}".format(x.upper())) + slot = getattr(FittingSlot, "FS_{}".format(x.upper())) else: - slot = getattr(Slot, "F_{}".format(x.upper())) + slot = getattr(FittingSlot, "F_{}".format(x.upper())) used = fit.getSlotsUsed(slot) total = fit.getNumSlots(slot) color = wx.Colour(204, 51, 51) if used > total else wx.SystemSettings.GetColour( diff --git a/gui/builtinAdditionPanes/implantView.py b/gui/builtinAdditionPanes/implantView.py index 0b8521cea..9b7f881f8 100644 --- a/gui/builtinAdditionPanes/implantView.py +++ b/gui/builtinAdditionPanes/implantView.py @@ -26,7 +26,7 @@ from gui.builtinViewColumns.state import State from gui.utils.staticHelpers import DragDropHelper from gui.contextMenu import ContextMenu import gui.globalEvents as GE -from eos.saveddata.fit import ImplantLocation +from eos.const import ImplantLocation from service.fit import Fit from service.market import Market import gui.fitCommands as cmd diff --git a/gui/builtinContextMenus/moduleAmmoPicker.py b/gui/builtinContextMenus/moduleAmmoPicker.py index f4de653b4..4b4719ecc 100644 --- a/gui/builtinContextMenus/moduleAmmoPicker.py +++ b/gui/builtinContextMenus/moduleAmmoPicker.py @@ -5,7 +5,7 @@ import wx import gui.fitCommands as cmd import gui.mainFrame -from eos.saveddata.module import Hardpoint +from eos.const import FittingHardpoint from gui.bitmap_loader import BitmapLoader from gui.contextMenu import ContextMenu from service.market import Market @@ -136,7 +136,7 @@ class ModuleAmmoPicker(ContextMenu): hardpoint = self.module.hardpoint moduleName = self.module.item.name # Make sure we do not consider mining turrets as combat turrets - if hardpoint == Hardpoint.TURRET and self.module.getModifiedItemAttr("miningAmount", None) is None: + if hardpoint == FittingHardpoint.TURRET and self.module.getModifiedItemAttr("miningAmount", None) is None: self.addSeperator(m, "Long Range") items = [] range_ = None @@ -180,7 +180,7 @@ class ModuleAmmoPicker(ContextMenu): m.Append(item) self.addSeperator(m, "Short Range") - elif hardpoint == Hardpoint.MISSILE and moduleName != 'Festival Launcher': + elif hardpoint == FittingHardpoint.MISSILE and moduleName != 'Festival Launcher': self.charges.sort(key=self.missileSorter) type_ = None sub = None diff --git a/gui/builtinItemStatsViews/attributeGrouping.py b/gui/builtinItemStatsViews/attributeGrouping.py index de466cf73..c93e97010 100644 --- a/gui/builtinItemStatsViews/attributeGrouping.py +++ b/gui/builtinItemStatsViews/attributeGrouping.py @@ -1,22 +1,4 @@ -from enum import Enum, auto - - -# Define the various groups of attributes -class AttrGroup(Enum): - FITTING = auto() - STRUCTURE = auto() - SHIELD = auto() - ARMOR = auto() - TARGETING = auto() - EWAR_RESISTS = auto() - CAPACITOR = auto() - SHARED_FACILITIES = auto() - FIGHTER_FACILITIES = auto() - ON_DEATH = auto() - JUMP_SYSTEMS = auto() - PROPULSIONS = auto() - FIGHTERS = auto() - +from service.const import GuiAttrGroup RequiredSkillAttrs = sum((["requiredSkill{}".format(x), "requiredSkill{}Level".format(x)] for x in range(1, 7)), []) @@ -45,7 +27,7 @@ for x in AttrGroups: # Start defining all the known attribute groups AttrGroupDict = { - AttrGroup.FITTING : { + GuiAttrGroup.FITTING : { "label" : "Fitting", "attributes": [ # parent-level attributes @@ -67,7 +49,7 @@ AttrGroupDict = { # "mass", ] }, - AttrGroup.STRUCTURE : { + GuiAttrGroup.STRUCTURE : { "label" : "Structure", "attributes": [ "hp", @@ -97,7 +79,7 @@ AttrGroupDict = { "explosiveDamageResonance" ] }, - AttrGroup.ARMOR : { + GuiAttrGroup.ARMOR : { "label": "Armor", "attributes":[ "armorHP", @@ -109,7 +91,7 @@ AttrGroupDict = { ] }, - AttrGroup.SHIELD : { + GuiAttrGroup.SHIELD : { "label": "Shield", "attributes": [ "shieldCapacity", @@ -122,7 +104,7 @@ AttrGroupDict = { ] }, - AttrGroup.EWAR_RESISTS : { + GuiAttrGroup.EWAR_RESISTS : { "label": "Electronic Warfare", "attributes": [ "ECMResistance", @@ -135,14 +117,14 @@ AttrGroupDict = { "weaponDisruptionResistance", ] }, - AttrGroup.CAPACITOR : { + GuiAttrGroup.CAPACITOR : { "label": "Capacitor", "attributes": [ "capacitorCapacity", "rechargeRate", ] }, - AttrGroup.TARGETING : { + GuiAttrGroup.TARGETING : { "label": "Targeting", "attributes": [ "maxTargetRange", @@ -160,7 +142,7 @@ AttrGroupDict = { "scanLadarStrength", ] }, - AttrGroup.SHARED_FACILITIES : { + GuiAttrGroup.SHARED_FACILITIES : { "label" : "Shared Facilities", "attributes": [ "fleetHangarCapacity", @@ -168,7 +150,7 @@ AttrGroupDict = { "maxJumpClones", ] }, - AttrGroup.FIGHTER_FACILITIES: { + GuiAttrGroup.FIGHTER_FACILITIES: { "label": "Fighter Squadron Facilities", "attributes": [ "fighterCapacity", @@ -181,7 +163,7 @@ AttrGroupDict = { "fighterStandupHeavySlots", ] }, - AttrGroup.ON_DEATH : { + GuiAttrGroup.ON_DEATH : { "label": "On Death", "attributes": [ "onDeathDamageEM", @@ -192,7 +174,7 @@ AttrGroupDict = { "onDeathSignatureRadius", ] }, - AttrGroup.JUMP_SYSTEMS : { + GuiAttrGroup.JUMP_SYSTEMS : { "label": "Jump Drive Systems", "attributes": [ "jumpDriveCapacitorNeed", @@ -206,13 +188,13 @@ AttrGroupDict = { "jumpPortalDuration", ] }, - AttrGroup.PROPULSIONS : { + GuiAttrGroup.PROPULSIONS : { "label": "Propulsion", "attributes": [ "maxVelocity" ] }, - AttrGroup.FIGHTERS : { + GuiAttrGroup.FIGHTERS : { "label": "Fighter", "attributes": [ "mass", @@ -228,25 +210,25 @@ AttrGroupDict = { } Group1 = [ - AttrGroup.FITTING, - AttrGroup.STRUCTURE, - AttrGroup.ARMOR, - AttrGroup.SHIELD, - AttrGroup.EWAR_RESISTS, - AttrGroup.CAPACITOR, - AttrGroup.TARGETING, - AttrGroup.SHARED_FACILITIES, - AttrGroup.FIGHTER_FACILITIES, - AttrGroup.ON_DEATH, - AttrGroup.JUMP_SYSTEMS, - AttrGroup.PROPULSIONS, + GuiAttrGroup.FITTING, + GuiAttrGroup.STRUCTURE, + GuiAttrGroup.ARMOR, + GuiAttrGroup.SHIELD, + GuiAttrGroup.EWAR_RESISTS, + GuiAttrGroup.CAPACITOR, + GuiAttrGroup.TARGETING, + GuiAttrGroup.SHARED_FACILITIES, + GuiAttrGroup.FIGHTER_FACILITIES, + GuiAttrGroup.ON_DEATH, + GuiAttrGroup.JUMP_SYSTEMS, + GuiAttrGroup.PROPULSIONS, ] CategoryGroups = { "Fighter" : [ - AttrGroup.FIGHTERS, - AttrGroup.SHIELD, - AttrGroup.TARGETING, + GuiAttrGroup.FIGHTERS, + GuiAttrGroup.SHIELD, + GuiAttrGroup.TARGETING, ], "Ship" : Group1, "Drone" : Group1, diff --git a/gui/builtinItemStatsViews/itemAttributes.py b/gui/builtinItemStatsViews/itemAttributes.py index dfac034b3..350501e61 100644 --- a/gui/builtinItemStatsViews/itemAttributes.py +++ b/gui/builtinItemStatsViews/itemAttributes.py @@ -4,12 +4,12 @@ import config # noinspection PyPackageRequirements import wx import wx.lib.agw.hypertreelist -from gui.builtinItemStatsViews.helpers import AutoListCtrl from gui.bitmap_loader import BitmapLoader from gui.utils.numberFormatter import formatAmount, roundDec from enum import IntEnum from gui.builtinItemStatsViews.attributeGrouping import * +from service.const import GuiAttrGroup class AttributeView(IntEnum): @@ -205,7 +205,7 @@ class ItemParams(wx.Panel): misc_parent = root # We must first deet4ermine if it's categorey already has defined groupings set for it. Otherwise, we default to just using the fitting group - order = CategoryGroups.get(self.item.category.categoryName, [AttrGroup.FITTING]) + order = CategoryGroups.get(self.item.category.categoryName, [GuiAttrGroup.FITTING]) # start building out the tree for data in [AttrGroupDict[o] for o in order]: heading = data.get("label") diff --git a/gui/builtinStatsViews/resourcesViewFull.py b/gui/builtinStatsViews/resourcesViewFull.py index dbf3259dc..37675a202 100644 --- a/gui/builtinStatsViews/resourcesViewFull.py +++ b/gui/builtinStatsViews/resourcesViewFull.py @@ -26,7 +26,7 @@ import gui.mainFrame from gui.chrome_tabs import EVT_NOTEBOOK_PAGE_CHANGED from gui.utils import fonts -from eos.saveddata.module import Hardpoint +from eos.const import FittingHardpoint from gui.utils.numberFormatter import formatAmount @@ -196,9 +196,9 @@ class ResourcesViewFull(StatsView): # If we did anything intresting, we'd update our labels to reflect the new fit's stats here stats = ( - ("label%sUsedTurretHardpoints", lambda: fit.getHardpointsUsed(Hardpoint.TURRET), 0, 0, 0), + ("label%sUsedTurretHardpoints", lambda: fit.getHardpointsUsed(FittingHardpoint.TURRET), 0, 0, 0), ("label%sTotalTurretHardpoints", lambda: fit.ship.getModifiedItemAttr('turretSlotsLeft'), 0, 0, 0), - ("label%sUsedLauncherHardpoints", lambda: fit.getHardpointsUsed(Hardpoint.MISSILE), 0, 0, 0), + ("label%sUsedLauncherHardpoints", lambda: fit.getHardpointsUsed(FittingHardpoint.MISSILE), 0, 0, 0), ("label%sTotalLauncherHardpoints", lambda: fit.ship.getModifiedItemAttr('launcherSlotsLeft'), 0, 0, 0), ("label%sUsedDronesActive", lambda: fit.activeDrones, 0, 0, 0), ("label%sTotalDronesActive", lambda: fit.extraAttributes["maxActiveDrones"], 0, 0, 0), diff --git a/gui/builtinViewColumns/baseIcon.py b/gui/builtinViewColumns/baseIcon.py index 207d639c5..e5cbd62f2 100644 --- a/gui/builtinViewColumns/baseIcon.py +++ b/gui/builtinViewColumns/baseIcon.py @@ -2,8 +2,9 @@ import wx from eos.saveddata.implant import Implant from eos.saveddata.drone import Drone -from eos.saveddata.module import Module, Slot, Rack +from eos.saveddata.module import Module, Rack from eos.saveddata.fit import Fit +from eos.const import FittingSlot from gui.viewColumn import ViewColumn @@ -32,7 +33,7 @@ class BaseIcon(ViewColumn): return self.shipImage elif isinstance(stuff, Module): if stuff.isEmpty: - return self.fittingView.imageList.GetImageIndex("slot_%s_small" % Slot.getName(stuff.slot).lower(), + return self.fittingView.imageList.GetImageIndex("slot_%s_small" % FittingSlot(stuff.slot).name.lower(), "gui") else: return self.loadIconFile(stuff.item.iconID or "") diff --git a/gui/builtinViewColumns/baseName.py b/gui/builtinViewColumns/baseName.py index 368dd74b6..cad1eebd0 100644 --- a/gui/builtinViewColumns/baseName.py +++ b/gui/builtinViewColumns/baseName.py @@ -25,8 +25,9 @@ from eos.saveddata.cargo import Cargo from eos.saveddata.implant import Implant from eos.saveddata.drone import Drone from eos.saveddata.fighter import Fighter -from eos.saveddata.module import Module, Slot, Rack +from eos.saveddata.module import Module, Rack from eos.saveddata.fit import Fit +from eos.const import FittingSlot from service.fit import Fit as FitSvc from service.market import Market from gui.viewColumn import ViewColumn @@ -72,10 +73,10 @@ class BaseName(ViewColumn): return "%s (%s)" % (stuff.name, stuff.ship.item.name) elif isinstance(stuff, Rack): if FitSvc.getInstance().serviceFittingOptions["rackLabels"]: - if stuff.slot == Slot.MODE: + if stuff.slot == FittingSlot.MODE: return '─ Tactical Mode ─' else: - return '─ {} {} Slot{}─'.format(stuff.num, Slot.getName(stuff.slot).capitalize(), '' if stuff.num == 1 else 's') + return '─ {} {} Slot{}─'.format(stuff.num, FittingSlot(stuff.slot).name.capitalize(), '' if stuff.num == 1 else 's') else: return "" elif isinstance(stuff, Module): @@ -89,7 +90,7 @@ class BaseName(ViewColumn): return "{} {}".format(type.name, stuff.item.name[-1:]) if stuff.isEmpty: - return "%s Slot" % Slot.getName(stuff.slot).capitalize() + return "%s Slot" % FittingSlot(stuff.slot).name.capitalize() else: return stuff.item.name elif isinstance(stuff, Implant): diff --git a/gui/builtinViewColumns/state.py b/gui/builtinViewColumns/state.py index c99ae2947..d62aed631 100644 --- a/gui/builtinViewColumns/state.py +++ b/gui/builtinViewColumns/state.py @@ -24,7 +24,8 @@ import wx from eos.saveddata.fit import Fit from eos.saveddata.implant import Implant from eos.saveddata.drone import Drone -from eos.saveddata.module import Module, State as State_, Rack +from eos.saveddata.module import Module, Rack +from eos.const import FittingModuleState as State_ from gui.viewColumn import ViewColumn import gui.mainFrame @@ -46,12 +47,11 @@ class State(ViewColumn): def getToolTip(self, mod): if isinstance(mod, Module) and not mod.isEmpty: - return State_.getName(mod.state).title() + return State_(mod.state).name.title() def getImageId(self, stuff): - generic_active = self.fittingView.imageList.GetImageIndex("state_%s_small" % State_.getName(1).lower(), "gui") - generic_inactive = self.fittingView.imageList.GetImageIndex("state_%s_small" % State_.getName(-1).lower(), - "gui") + generic_active = self.fittingView.imageList.GetImageIndex("state_%s_small" % State_.ACTIVE.name.lower(), "gui") + generic_inactive = self.fittingView.imageList.GetImageIndex("state_%s_small" % State_.OFFLINE.name.lower(), "gui") if isinstance(stuff, Drone): if stuff.amountActive > 0: @@ -64,7 +64,7 @@ class State(ViewColumn): if stuff.isEmpty: return -1 else: - return self.fittingView.imageList.GetImageIndex("state_%s_small" % State_.getName(stuff.state).lower(), + return self.fittingView.imageList.GetImageIndex("state_%s_small" % State_(stuff.state).name.lower(), "gui") elif isinstance(stuff, Fit): fitID = self.mainFrame.getActiveFit() @@ -83,7 +83,7 @@ class State(ViewColumn): return generic_inactive elif isinstance(stuff, Implant) and stuff.character: # if we're showing character implants, show an "online" state, which should not be changed - return self.fittingView.imageList.GetImageIndex("state_%s_small" % State_.getName(0).lower(), "gui") + return self.fittingView.imageList.GetImageIndex("state_%s_small" % State_.ONLINE.name.lower(), "gui") else: active = getattr(stuff, "active", None) if active is None: diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index 372ea6a2e..97ba7d8f6 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -30,7 +30,8 @@ import gui.globalEvents as GE import gui.mainFrame import gui.multiSwitch from eos.saveddata.mode import Mode -from eos.saveddata.module import Module, Rack, Slot +from eos.saveddata.module import Module, Rack +from eos.const import FittingSlot from gui.bitmap_loader import BitmapLoader from gui.builtinMarketBrowser.events import ITEM_SELECTED from gui.builtinShipBrowser.events import EVT_FIT_REMOVED, EVT_FIT_RENAMED, EVT_FIT_SELECTED, FitSelected @@ -474,7 +475,14 @@ class FittingView(d.Display): sFit = Fit.getInstance() fit = sFit.getFit(self.activeFitID) - slotOrder = [Slot.SUBSYSTEM, Slot.HIGH, Slot.MED, Slot.LOW, Slot.RIG, Slot.SERVICE] + slotOrder = [ + FittingSlot.SUBSYSTEM, + FittingSlot.HIGH, + FittingSlot.MED, + FittingSlot.LOW, + FittingSlot.RIG, + FittingSlot.SERVICE + ] if fit is not None: self.mods = fit.modules[:] @@ -507,7 +515,7 @@ class FittingView(d.Display): # while also marking the mode header position in the Blanks list if sFit.serviceFittingOptions["rackSlots"]: self.blanks.append(len(self.mods)) - self.mods.append(Rack.buildRack(Slot.MODE, None)) + self.mods.append(Rack.buildRack(FittingSlot.MODE, None)) self.mods.append(fit.mode) else: @@ -648,8 +656,7 @@ class FittingView(d.Display): slotMap = {} # test for too many modules (happens with t3s / CCP change in slot layout) - for slotType in Slot.getTypes(): - slot = Slot.getValue(slotType) + for slot in [e.value for e in FittingSlot]: slotMap[slot] = fit.getSlotsFree(slot) < 0 for i, mod in enumerate(self.mods): @@ -735,8 +742,8 @@ class FittingView(d.Display): return slotMap = {} - for slotType in Slot.getTypes(): - slot = Slot.getValue(slotType) + + for slot in [e.value for e in FittingSlot]: slotMap[slot] = fit.getSlotsFree(slot) < 0 padding = 2 diff --git a/gui/fitCommands/calc/fitAddModule.py b/gui/fitCommands/calc/fitAddModule.py index cd96b6d4f..75611de28 100644 --- a/gui/fitCommands/calc/fitAddModule.py +++ b/gui/fitCommands/calc/fitAddModule.py @@ -1,5 +1,6 @@ import wx -from eos.saveddata.module import Module, State +from eos.saveddata.module import Module +from eos.const import FittingModuleState import eos.db from logbook import Logger from service.fit import Fit @@ -52,8 +53,8 @@ class FitAddModuleCommand(wx.Command): self.module.owner = fit numSlots = len(fit.modules) fit.modules.append(self.module) - if self.module.isValidState(State.ACTIVE): - self.module.state = State.ACTIVE + if self.module.isValidState(FittingModuleState.ACTIVE): + self.module.state = FittingModuleState.ACTIVE # todo: fix these # As some items may affect state-limiting attributes of the ship, calculate new attributes first diff --git a/gui/fitCommands/calc/fitAddProjectedEnv.py b/gui/fitCommands/calc/fitAddProjectedEnv.py index dc1a0443a..87d1bd890 100644 --- a/gui/fitCommands/calc/fitAddProjectedEnv.py +++ b/gui/fitCommands/calc/fitAddProjectedEnv.py @@ -1,5 +1,6 @@ import wx -from eos.saveddata.module import Module, State +from eos.saveddata.module import Module +from eos.const import FittingModuleState import eos.db from logbook import Logger pyfalog = Logger(__name__) @@ -28,7 +29,7 @@ class FitAddProjectedEnvCommand(wx.Command): # todo: thing to check for existing environmental effects - module.state = State.ONLINE + module.state = FittingModuleState.ONLINE if module.isExclusiveSystemEffect: # if this is an exclusive system effect, we need to cache the old one. We make room for the new one here, which returns the old one self.old_item = fit.projectedModules.makeRoom(module) diff --git a/gui/fitCommands/calc/fitAddProjectedModule.py b/gui/fitCommands/calc/fitAddProjectedModule.py index 6d2ad3f4f..089705ba1 100644 --- a/gui/fitCommands/calc/fitAddProjectedModule.py +++ b/gui/fitCommands/calc/fitAddProjectedModule.py @@ -1,7 +1,8 @@ import wx import eos.db from logbook import Logger -from eos.saveddata.module import Module, State +from eos.saveddata.module import Module +from eos.const import FittingModuleState pyfalog = Logger(__name__) @@ -27,9 +28,9 @@ class FitAddProjectedModuleCommand(wx.Command): except ValueError: return False - module.state = State.ACTIVE + module.state = FittingModuleState.ACTIVE if not module.canHaveState(module.state, fit): - module.state = State.OFFLINE + module.state = FittingModuleState.OFFLINE fit.projectedModules.append(module) eos.db.commit() diff --git a/gui/fitCommands/calc/fitImportMutatedModule.py b/gui/fitCommands/calc/fitImportMutatedModule.py index 3a28c68ea..bae0ef0d8 100644 --- a/gui/fitCommands/calc/fitImportMutatedModule.py +++ b/gui/fitCommands/calc/fitImportMutatedModule.py @@ -1,5 +1,6 @@ import wx -from eos.saveddata.module import Module, State +from eos.saveddata.module import Module +from eos.const import FittingModuleState import eos.db from eos.db.gamedata.queries import getDynamicItem from logbook import Logger @@ -62,8 +63,8 @@ class FitImportMutatedCommand(wx.Command): module.owner = fit numSlots = len(fit.modules) fit.modules.append(module) - if module.isValidState(State.ACTIVE): - module.state = State.ACTIVE + if module.isValidState(FittingModuleState.ACTIVE): + module.state = FittingModuleState.ACTIVE # todo: fix these # As some items may affect state-limiting attributes of the ship, calculate new attributes first diff --git a/gui/fitCommands/calc/fitReplaceModule.py b/gui/fitCommands/calc/fitReplaceModule.py index 286bd9451..b2d36314c 100644 --- a/gui/fitCommands/calc/fitReplaceModule.py +++ b/gui/fitCommands/calc/fitReplaceModule.py @@ -2,7 +2,8 @@ import wx from logbook import Logger import eos.db -from eos.saveddata.module import Module, State +from eos.saveddata.module import Module +from eos.const import FittingModuleState from gui.fitCommands.helpers import ModuleInfoCache pyfalog = Logger(__name__) @@ -75,8 +76,8 @@ class FitReplaceModuleCommand(wx.Command): if self.module.fits(fit): self.module.owner = fit fit.modules.toModule(self.position, self.module) - if self.module.isValidState(State.ACTIVE): - self.module.state = State.ACTIVE + if self.module.isValidState(FittingModuleState.ACTIVE): + self.module.state = FittingModuleState.ACTIVE if self.old_module and self.old_module.charge and self.module.isValidCharge(self.old_module.charge): self.module.charge = self.old_module.charge diff --git a/gui/fitCommands/guiAddImplant.py b/gui/fitCommands/guiAddImplant.py index 79b75f014..52b284071 100644 --- a/gui/fitCommands/guiAddImplant.py +++ b/gui/fitCommands/guiAddImplant.py @@ -3,7 +3,7 @@ from service.fit import Fit import gui.mainFrame from gui import globalEvents as GE -from eos.saveddata.fit import ImplantLocation +from eos.const import ImplantLocation from .calc.fitAddImplant import FitAddImplantCommand from .calc.fitChangeImplantLocation import FitChangeImplantLocation diff --git a/service/character.py b/service/character.py index 565d7d329..7e95c5f82 100644 --- a/service/character.py +++ b/service/character.py @@ -37,7 +37,8 @@ from service.esi import Esi from eos.saveddata.implant import Implant as es_Implant from eos.saveddata.character import Character as es_Character, Skill -from eos.saveddata.module import Slot as es_Slot, Module as es_Module +from eos.saveddata.module import Module as es_Module +from eos.const import FittingSlot as es_Slot from eos.saveddata.fighter import Fighter as es_Fighter pyfalog = Logger(__name__) diff --git a/service/const.py b/service/const.py new file mode 100644 index 000000000..1f83b38a9 --- /dev/null +++ b/service/const.py @@ -0,0 +1,103 @@ +# ============================================================================= +# Copyright (C) 2019 Ryan Holmes +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +# ============================================================================= + +from enum import Enum, IntEnum, unique, auto + + +@unique +class EsiLoginMethod(IntEnum): + """ + Contains the method of ESI login + """ + SERVER = 0 + MANUAL = 1 + + +@unique +class EsiSsoMode(IntEnum): + """ + Contains the mode of ESI sso mode + """ + AUTO = 0 + CUSTOM = 1 + + +class EsiEndpoints(Enum): + """ + Contains the endpoint paths for the ESI access + """ + CHAR = "/v4/characters/{character_id}/" + CHAR_SKILLS = "/v4/characters/{character_id}/skills/" + CHAR_FITTINGS = "/v1/characters/{character_id}/fittings/" + CHAR_DEL_FIT = "/v1/characters/{character_id}/fittings/{fitting_id}/" + + +@unique +class PortMultiBuyOptions(IntEnum): + """ + Contains different types of items for multibuy export + """ + IMPLANTS = 1 + CARGO = 2 + LOADED_CHARGES = 3 + OPTIMIZE_PRICES = 4 + + +@unique +class PortEftOptions(IntEnum): + """ + Contains different options for eft-export + """ + IMPLANTS = 1 + MUTATIONS = 2 + LOADED_CHARGES = 3 + + +@unique +class PortEftRigSize(IntEnum): + """ + Contains different sizes of ship rigs + This enum is not actively used, but maybe useful someday. + """ + SMALL = 1 + MEDIUM = 2 + LARGE = 3 + CAPITAL = 4 + + +@unique +class GuiAttrGroup(IntEnum): + """ + Define the various groups of attributes. + This enum is used for GUI functions and getting redefined in + /gui/builtinItemStatsViews/attributeGrouping.py + """ + FITTING = auto() + STRUCTURE = auto() + SHIELD = auto() + ARMOR = auto() + TARGETING = auto() + EWAR_RESISTS = auto() + CAPACITOR = auto() + SHARED_FACILITIES = auto() + FIGHTER_FACILITIES = auto() + ON_DEATH = auto() + JUMP_SYSTEMS = auto() + PROPULSIONS = auto() + FIGHTERS = auto() diff --git a/service/esi.py b/service/esi.py index 8162c6844..88b704664 100644 --- a/service/esi.py +++ b/service/esi.py @@ -9,9 +9,9 @@ import config import webbrowser import eos.db -from eos.enum import Enum +from service.const import EsiLoginMethod, EsiSsoMode from eos.saveddata.ssocharacter import SsoCharacter -from service.esiAccess import APIException, SsoMode +from service.esiAccess import APIException import gui.globalEvents as GE from gui.ssoLogin import SsoLogin, SsoLoginServer from service.server import StoppableHTTPServer, AuthHandler @@ -24,11 +24,6 @@ from requests import Session pyfalog = Logger(__name__) -class LoginMethod(Enum): - SERVER = 0 - MANUAL = 1 - - class Esi(EsiAccess): _instance = None @@ -107,8 +102,8 @@ class Esi(EsiAccess): def login(self): # always start the local server if user is using client details. Otherwise, start only if they choose to do so. - if self.settings.get('ssoMode') == SsoMode.CUSTOM or self.settings.get('loginMode') == LoginMethod.SERVER: - dlg = gui.ssoLogin.SsoLoginServer(6461 if self.settings.get('ssoMode') == SsoMode.CUSTOM else 0) + if self.settings.get('ssoMode') == EsiSsoMode.CUSTOM or self.settings.get('loginMode') == EsiLoginMethod.SERVER: + dlg = gui.ssoLogin.SsoLoginServer(6461 if self.settings.get('ssoMode') == EsiSsoMode.CUSTOM else 0) dlg.ShowModal() else: dlg = gui.ssoLogin.SsoLogin() @@ -142,7 +137,7 @@ class Esi(EsiAccess): def handleLogin(self, message): # we already have authenticated stuff for the auto mode - if self.settings.get('ssoMode') == SsoMode.AUTO: + if self.settings.get('ssoMode') == EsiSsoMode.AUTO: ssoInfo = message['SSOInfo'][0] auth_response = json.loads(base64.b64decode(ssoInfo)) else: diff --git a/service/esiAccess.py b/service/esiAccess.py index 8ec3dd95d..1b7a191c8 100644 --- a/service/esiAccess.py +++ b/service/esiAccess.py @@ -17,7 +17,7 @@ import config import base64 import datetime -from eos.enum import Enum +from service.const import EsiSsoMode, EsiEndpoints from service.settings import EsiSettings, NetworkSettings from requests import Session @@ -42,11 +42,6 @@ scopes = [ ] -class SsoMode(Enum): - AUTO = 0 - CUSTOM = 1 - - class APIException(Exception): """ Exception for SSO related errors """ @@ -66,13 +61,6 @@ class APIException(Exception): return 'HTTP Error %s' % self.status_code -class ESIEndpoints(Enum): - CHAR = "/v4/characters/{character_id}/" - CHAR_SKILLS = "/v4/characters/{character_id}/skills/" - CHAR_FITTINGS = "/v1/characters/{character_id}/fittings/" - CHAR_DEL_FIT = "/v1/characters/{character_id}/fittings/{fitting_id}/" - - class EsiAccess(object): def __init__(self): self.settings = EsiSettings.getInstance() @@ -89,7 +77,7 @@ class EsiAccess(object): @property def sso_url(self): - if self.settings.get("ssoMode") == SsoMode.CUSTOM: + if self.settings.get("ssoMode") == EsiSsoMode.CUSTOM: return "https://login.eveonline.com" return "https://www.pyfa.io" @@ -110,20 +98,20 @@ class EsiAccess(object): return '%s/oauth/token' % self.sso_url def getSkills(self, char): - return self.get(char, ESIEndpoints.CHAR_SKILLS, character_id=char.characterID) + return self.get(char, EsiEndpoints.CHAR_SKILLS, character_id=char.characterID) def getSecStatus(self, char): - return self.get(char, ESIEndpoints.CHAR, character_id=char.characterID) + return self.get(char, EsiEndpoints.CHAR, character_id=char.characterID) def getFittings(self, char): - return self.get(char, ESIEndpoints.CHAR_FITTINGS, character_id=char.characterID) + return self.get(char, EsiEndpoints.CHAR_FITTINGS, character_id=char.characterID) def postFitting(self, char, json_str): # @todo: new fitting ID can be recovered from resp.data, - return self.post(char, ESIEndpoints.CHAR_FITTINGS, json_str, character_id=char.characterID) + return self.post(char, EsiEndpoints.CHAR_FITTINGS, json_str, character_id=char.characterID) def delFitting(self, char, fittingID): - return self.delete(char, ESIEndpoints.CHAR_DEL_FIT, character_id=char.characterID, fitting_id=fittingID) + return self.delete(char, EsiEndpoints.CHAR_DEL_FIT, character_id=char.characterID, fitting_id=fittingID) @staticmethod def update_token(char, tokenResponse): @@ -136,7 +124,7 @@ class EsiAccess(object): def getLoginURI(self, redirect=None): self.state = str(uuid.uuid4()) - if self.settings.get("ssoMode") == SsoMode.AUTO: + if self.settings.get("ssoMode") == EsiSsoMode.AUTO: args = { 'state': self.state, 'pyfa_version': config.version, @@ -183,7 +171,7 @@ class EsiAccess(object): 'refresh_token': refreshToken, } - if self.settings.get('ssoMode') == SsoMode.AUTO: + if self.settings.get('ssoMode') == EsiSsoMode.AUTO: # data is all we really need, the rest is handled automatically by pyfa.io return { 'data': data, diff --git a/service/fit.py b/service/fit.py index d6cad2867..c02dd7159 100644 --- a/service/fit.py +++ b/service/fit.py @@ -30,8 +30,9 @@ from eos.saveddata.citadel import Citadel as es_Citadel from eos.saveddata.damagePattern import DamagePattern as es_DamagePattern from eos.saveddata.drone import Drone as es_Drone from eos.saveddata.fighter import Fighter as es_Fighter -from eos.saveddata.fit import Fit as FitType, ImplantLocation -from eos.saveddata.module import Module as es_Module, State +from eos.const import ImplantLocation, FittingModuleState +from eos.saveddata.fit import Fit as FitType +from eos.saveddata.module import Module as es_Module from eos.saveddata.ship import Ship as es_Ship from service.character import Character from service.damagePattern import DamagePattern @@ -352,7 +353,7 @@ class Fit(FitDeprecated): elif isinstance(thing, es_Module): thing.state = es_Module.getProposedState(thing, click) if not thing.canHaveState(thing.state, fit): - thing.state = State.OFFLINE + thing.state = FittingModuleState.OFFLINE elif isinstance(thing, FitType): projectionInfo = thing.getProjectionInfo(fitID) if projectionInfo: @@ -384,8 +385,8 @@ class Fit(FitDeprecated): if m.fits(fit): m.owner = fit fit.modules.toModule(position, m) - if m.isValidState(State.ACTIVE): - m.state = State.ACTIVE + if m.isValidState(FittingModuleState.ACTIVE): + m.state = FittingModuleState.ACTIVE # As some items may affect state-limiting attributes of the ship, calculate new attributes first self.recalc(fit) @@ -539,13 +540,13 @@ class Fit(FitDeprecated): if mod != base: # fix for #529, where a module may be in incorrect state after CCP changes mechanics of module if not mod.canHaveState(mod.state) or not mod.isValidState(mod.state): - mod.state = State.ONLINE + mod.state = FittingModuleState.ONLINE changed = True for mod in fit.projectedModules: # fix for #529, where a module may be in incorrect state after CCP changes mechanics of module if not mod.canHaveState(mod.state, fit) or not mod.isValidState(mod.state): - mod.state = State.OFFLINE + mod.state = FittingModuleState.OFFLINE changed = True for drone in fit.projectedDrones: diff --git a/service/fitDeprecated.py b/service/fitDeprecated.py index 4f0d79b0d..138da90e6 100644 --- a/service/fitDeprecated.py +++ b/service/fitDeprecated.py @@ -27,7 +27,8 @@ from eos.saveddata.cargo import Cargo as es_Cargo from eos.saveddata.drone import Drone as es_Drone from eos.saveddata.fighter import Fighter as es_Fighter from eos.saveddata.implant import Implant as es_Implant -from eos.saveddata.module import Module as es_Module, State +from eos.saveddata.module import Module as es_Module +from eos.const import FittingModuleState from eos.saveddata.fit import Fit as FitType from utils.deprecated import deprecated @@ -304,16 +305,16 @@ class FitDeprecated(object): fit.projectedFighters.append(fighter) elif thing.group.name in es_Module.SYSTEM_GROUPS: module = es_Module(thing) - module.state = State.ONLINE + module.state = FittingModuleState.ONLINE fit.projectedModules.append(module) else: try: module = es_Module(thing) except ValueError: return False - module.state = State.ACTIVE + module.state = FittingModuleState.ACTIVE if not module.canHaveState(module.state, fit): - module.state = State.OFFLINE + module.state = FittingModuleState.OFFLINE fit.projectedModules.append(module) eos.db.commit() @@ -396,8 +397,8 @@ class FitDeprecated(object): m.owner = fit numSlots = len(fit.modules) fit.modules.append(m) - if m.isValidState(State.ACTIVE): - m.state = State.ACTIVE + if m.isValidState(FittingModuleState.ACTIVE): + m.state = FittingModuleState.ACTIVE # As some items may affect state-limiting attributes of the ship, calculate new attributes first self.recalc(fit) @@ -465,8 +466,8 @@ class FitDeprecated(object): if m.fits(fit): m.owner = fit fit.modules.toModule(position, m) - if m.isValidState(State.ACTIVE): - m.state = State.ACTIVE + if m.isValidState(FittingModuleState.ACTIVE): + m.state = FittingModuleState.ACTIVE if recalc: # As some items may affect state-limiting attributes of the ship, calculate new attributes first @@ -508,8 +509,8 @@ class FitDeprecated(object): try: cargoP = es_Module(cargo.item) cargoP.owner = fit - if cargoP.isValidState(State.ACTIVE): - cargoP.state = State.ACTIVE + if cargoP.isValidState(FittingModuleState.ACTIVE): + cargoP.state = FittingModuleState.ACTIVE except: pyfalog.warning("Invalid item: {0}", cargo.item) return diff --git a/service/port/dna.py b/service/port/dna.py index 7e310f936..9b1a5ecee 100644 --- a/service/port/dna.py +++ b/service/port/dna.py @@ -28,8 +28,9 @@ from eos.saveddata.citadel import Citadel from eos.saveddata.drone import Drone from eos.saveddata.fighter import Fighter from eos.saveddata.fit import Fit -from eos.saveddata.module import Module, State, Slot +from eos.saveddata.module import Module from eos.saveddata.ship import Ship +from eos.const import FittingSlot, FittingModuleState from service.fit import Fit as svcFit from service.market import Market @@ -106,8 +107,8 @@ def importDna(string): f.modules.append(m) else: m.owner = f - if m.isValidState(State.ACTIVE): - m.state = State.ACTIVE + if m.isValidState(FittingModuleState.ACTIVE): + m.state = FittingModuleState.ACTIVE moduleList.append(m) # Recalc to get slot numbers correct for T3 cruisers @@ -116,8 +117,8 @@ def importDna(string): for module in moduleList: if module.fits(f): module.owner = f - if module.isValidState(State.ACTIVE): - module.state = State.ACTIVE + if module.isValidState(FittingModuleState.ACTIVE): + module.state = FittingModuleState.ACTIVE f.modules.append(module) return f @@ -131,7 +132,7 @@ def exportDna(fit, callback): sFit = svcFit.getInstance() for mod in fit.modules: if not mod.isEmpty: - if mod.slot == Slot.SUBSYSTEM: + if mod.slot == FittingSlot.SUBSYSTEM: subsystems.append(mod) continue if mod.itemID not in mods: diff --git a/service/port/efs.py b/service/port/efs.py index 94e6471f3..fc00d5dfb 100755 --- a/service/port/efs.py +++ b/service/port/efs.py @@ -6,8 +6,9 @@ from numbers import Number from config import version as pyfaVersion from service.fit import Fit from service.market import Market -from eos.enum import Enum -from eos.saveddata.module import Hardpoint, Slot, Module, State +from eos.const import FittingModuleState, FittingHardpoint, FittingSlot +from service.const import PortEftRigSize +from eos.saveddata.module import Module from eos.saveddata.drone import Drone from eos.effectHandlerHelpers import HandledList from eos.db import gamedata_session, getCategory, getAttributeInfo, getGroup @@ -19,14 +20,6 @@ from logbook import Logger pyfalog = Logger(__name__) -class RigSize(Enum): - # Matches to item attribute "rigSize" on ship and rig items - SMALL = 1 - MEDIUM = 2 - LARGE = 3 - CAPITAL = 4 - - class EfsPort: wepTestSet = {} version = 0.03 @@ -58,13 +51,13 @@ class EfsPort: mwd50mn = mapPropData("50MN Microwarpdrive II") mwd500mn = mapPropData("500MN Microwarpdrive II") mwd50000mn = mapPropData("50000MN Microwarpdrive II") - if rigSize == RigSize.SMALL or rigSize is None: + if rigSize == PortEftRigSize.SMALL or rigSize is None: propID = mwd5mn["id"] if shipPower > mwd5mn["powerReq"] else None - elif rigSize == RigSize.MEDIUM: + elif rigSize == PortEftRigSize.MEDIUM: propID = mwd50mn["id"] if shipPower > mwd50mn["powerReq"] else mwd5mn["id"] - elif rigSize == RigSize.LARGE: + elif rigSize == PortEftRigSize.LARGE: propID = mwd500mn["id"] if shipPower > mwd500mn["powerReq"] else mwd50mn["id"] - elif rigSize == RigSize.CAPITAL: + elif rigSize == PortEftRigSize.CAPITAL: propID = mwd50000mn["id"] if shipPower > mwd50000mn["powerReq"] else mwd500mn["id"] if propID is None: @@ -86,7 +79,7 @@ class EfsPort: propWithBloom = next(filter(activePropWBloomFilter, propMods), None) if propWithBloom is not None: oldPropState = propWithBloom.state - propWithBloom.state = State.ONLINE + propWithBloom.state = FittingModuleState.ONLINE sFit.recalc(fit) sp = fit.maxSpeed sig = fit.ship.getModifiedItemAttr("signatureRadius") @@ -198,8 +191,8 @@ class EfsPort: def getModuleInfo(fit, padTypeIDs=False): moduleNames = [] modTypeIDs = [] - moduleNameSets = {Slot.LOW: [], Slot.MED: [], Slot.HIGH: [], Slot.RIG: [], Slot.SUBSYSTEM: []} - modTypeIDSets = {Slot.LOW: [], Slot.MED: [], Slot.HIGH: [], Slot.RIG: [], Slot.SUBSYSTEM: []} + moduleNameSets = {FittingSlot.LOW: [], FittingSlot.MED: [], FittingSlot.HIGH: [], FittingSlot.RIG: [], FittingSlot.SUBSYSTEM: []} + modTypeIDSets = {FittingSlot.LOW: [], FittingSlot.MED: [], FittingSlot.HIGH: [], FittingSlot.RIG: [], FittingSlot.SUBSYSTEM: []} for mod in fit.modules: try: if mod.item is not None: @@ -216,17 +209,17 @@ class EfsPort: pyfalog.error("Could not find name for module {0}".format(vars(mod))) for modInfo in [ - ["High Slots:"], moduleNameSets[Slot.HIGH], ["", "Med Slots:"], moduleNameSets[Slot.MED], - ["", "Low Slots:"], moduleNameSets[Slot.LOW], ["", "Rig Slots:"], moduleNameSets[Slot.RIG] + ["High Slots:"], moduleNameSets[FittingSlot.HIGH], ["", "Med Slots:"], moduleNameSets[FittingSlot.MED], + ["", "Low Slots:"], moduleNameSets[FittingSlot.LOW], ["", "Rig Slots:"], moduleNameSets[FittingSlot.RIG] ]: moduleNames.extend(modInfo) - if len(moduleNameSets[Slot.SUBSYSTEM]) > 0: + if len(moduleNameSets[FittingSlot.SUBSYSTEM]) > 0: moduleNames.extend(["", "Subsystems:"]) - moduleNames.extend(moduleNameSets[Slot.SUBSYSTEM]) + moduleNames.extend(moduleNameSets[FittingSlot.SUBSYSTEM]) - for slotType in [Slot.HIGH, Slot.MED, Slot.LOW, Slot.RIG, Slot.SUBSYSTEM]: - if slotType is not Slot.SUBSYSTEM or len(modTypeIDSets[slotType]) > 0: - modTypeIDs.extend([0, 0] if slotType is not Slot.HIGH else [0]) + for slotType in [FittingSlot.HIGH, FittingSlot.MED, FittingSlot.LOW, FittingSlot.RIG, FittingSlot.SUBSYSTEM]: + if slotType is not FittingSlot.SUBSYSTEM or len(modTypeIDSets[slotType]) > 0: + modTypeIDs.extend([0, 0] if slotType is not FittingSlot.HIGH else [0]) modTypeIDs.extend(modTypeIDSets[slotType]) droneNames = [] @@ -331,18 +324,18 @@ class EfsPort: name = stats.item.name + ", " + stats.charge.name else: name = stats.item.name - if stats.hardpoint == Hardpoint.TURRET: + if stats.hardpoint == FittingHardpoint.TURRET: tracking = stats.getModifiedItemAttr("trackingSpeed") typeing = "Turret" # Bombs share most attributes with missiles despite not needing the hardpoint - elif stats.hardpoint == Hardpoint.MISSILE or "Bomb Launcher" in stats.item.name: + elif stats.hardpoint == FittingHardpoint.MISSILE or "Bomb Launcher" in stats.item.name: maxVelocity = stats.getModifiedChargeAttr("maxVelocity") explosionDelay = stats.getModifiedChargeAttr("explosionDelay") damageReductionFactor = stats.getModifiedChargeAttr("aoeDamageReductionFactor") explosionRadius = stats.getModifiedChargeAttr("aoeCloudSize") explosionVelocity = stats.getModifiedChargeAttr("aoeVelocity") typeing = "Missile" - elif stats.hardpoint == Hardpoint.NONE: + elif stats.hardpoint == FittingHardpoint.NONE: aoeFieldRange = stats.getModifiedItemAttr("empFieldRange") # This also covers non-bomb weapons with dps values and no hardpoints, most notably targeted doomsdays. typeing = "SmartBomb" @@ -496,11 +489,11 @@ class EfsPort: getDroneMulti = lambda d: sumDamage(d.getModifiedItemAttr) * d.getModifiedItemAttr("damageMultiplier") fitMultipliers["drones"] = list(map(getDroneMulti, tf.drones)) - getFitTurrets = lambda f: filter(lambda mod: mod.hardpoint == Hardpoint.TURRET, f.modules) + getFitTurrets = lambda f: filter(lambda mod: mod.hardpoint == FittingHardpoint.TURRET, f.modules) getTurretMulti = lambda mod: mod.getModifiedItemAttr("damageMultiplier") / mod.cycleTime fitMultipliers["turrets"] = list(map(getTurretMulti, getFitTurrets(tf))) - getFitLaunchers = lambda f: filter(lambda mod: mod.hardpoint == Hardpoint.MISSILE, f.modules) + getFitLaunchers = lambda f: filter(lambda mod: mod.hardpoint == FittingHardpoint.MISSILE, f.modules) getLauncherMulti = lambda mod: sumDamage(mod.getModifiedChargeAttr) / mod.cycleTime fitMultipliers["launchers"] = list(map(getLauncherMulti, getFitLaunchers(tf))) return fitMultipliers @@ -538,7 +531,7 @@ class EfsPort: if effect._Effect__effectModule is not None: effect.handler(tf, fit.mode, []) if fit.ship.item.groupID == getGroup("Strategic Cruiser").ID: - subSystems = list(filter(lambda mod: mod.slot == Slot.SUBSYSTEM and mod.item, fit.modules)) + subSystems = list(filter(lambda mod: mod.slot == FittingSlot.SUBSYSTEM and mod.item, fit.modules)) for sub in subSystems: for effect in sub.item.effects.values(): if effect._Effect__effectModule is not None: diff --git a/service/port/eft.py b/service/port/eft.py index 5dfec9968..e1c15be7e 100644 --- a/service/port/eft.py +++ b/service/port/eft.py @@ -19,7 +19,6 @@ import re -from enum import IntEnum, unique from logbook import Logger @@ -30,9 +29,11 @@ from eos.saveddata.booster import Booster from eos.saveddata.drone import Drone from eos.saveddata.fighter import Fighter from eos.saveddata.implant import Implant -from eos.saveddata.module import Module, State, Slot +from eos.saveddata.module import Module from eos.saveddata.ship import Ship from eos.saveddata.fit import Fit +from eos.const import FittingSlot, FittingModuleState +from service.const import PortEftOptions, PortEftRigSize from service.fit import Fit as svcFit from service.market import Market from service.port.muta import parseMutant, renderMutant @@ -41,23 +42,15 @@ from service.port.shared import IPortUser, fetchItem, processing_notify pyfalog = Logger(__name__) - -@unique -class Options(IntEnum): - IMPLANTS = 1 - MUTATIONS = 2 - LOADED_CHARGES = 3 - - EFT_OPTIONS = ( - (Options.LOADED_CHARGES.value, 'Loaded Charges', 'Export charges loaded into modules', True), - (Options.MUTATIONS.value, 'Mutated Attributes', 'Export mutated modules\' stats', True), - (Options.IMPLANTS.value, 'Implants && Boosters', 'Export implants and boosters', True), + (PortEftOptions.LOADED_CHARGES.value, 'Loaded Charges', 'Export charges loaded into modules', True), + (PortEftOptions.MUTATIONS.value, 'Mutated Attributes', 'Export mutated modules\' stats', True), + (PortEftOptions.IMPLANTS.value, 'Implants && Boosters', 'Export implants and boosters', True), ) MODULE_CATS = ('Module', 'Subsystem', 'Structure Module') -SLOT_ORDER = (Slot.LOW, Slot.MED, Slot.HIGH, Slot.RIG, Slot.SUBSYSTEM, Slot.SERVICE) +SLOT_ORDER = (FittingSlot.LOW, FittingSlot.MED, FittingSlot.HIGH, FittingSlot.RIG, FittingSlot.SUBSYSTEM, FittingSlot.SERVICE) OFFLINE_SUFFIX = '/OFFLINE' @@ -87,21 +80,21 @@ def exportEft(fit, options, callback): modName = module.baseItem.name else: modName = module.item.name - if module.isMutated and options[Options.MUTATIONS.value]: + if module.isMutated and options[PortEftOptions.MUTATIONS.value]: mutants[mutantReference] = module mutationSuffix = ' [{}]'.format(mutantReference) mutantReference += 1 else: mutationSuffix = '' - modOfflineSuffix = ' {}'.format(OFFLINE_SUFFIX) if module.state == State.OFFLINE else '' - if module.charge and options[Options.LOADED_CHARGES.value]: + modOfflineSuffix = ' {}'.format(OFFLINE_SUFFIX) if module.state == FittingModuleState.OFFLINE else '' + if module.charge and options[PortEftOptions.LOADED_CHARGES.value]: rackLines.append('{}, {}{}{}'.format( modName, module.charge.name, modOfflineSuffix, mutationSuffix)) else: rackLines.append('{}{}{}'.format(modName, modOfflineSuffix, mutationSuffix)) else: rackLines.append('[Empty {} slot]'.format( - Slot.getName(slotType).capitalize() if slotType is not None else '')) + FittingSlot(slotType).name.capitalize() if slotType is not None else '')) if rackLines: modSection.append('\n'.join(rackLines)) if modSection: @@ -123,7 +116,7 @@ def exportEft(fit, options, callback): sections.append('\n\n'.join(minionSection)) # Section 3: implants, boosters - if options[Options.IMPLANTS.value]: + if options[PortEftOptions.IMPLANTS.value]: charSection = [] implantLines = [] for implant in fit.implants: @@ -150,7 +143,7 @@ def exportEft(fit, options, callback): # Section 5: mutated modules' details mutationLines = [] - if mutants and options[Options.MUTATIONS.value]: + if mutants and options[PortEftOptions.MUTATIONS.value]: for mutantReference in sorted(mutants): mutant = mutants[mutantReference] mutationLines.append(renderMutant(mutant, firstPrefix='[{}] '.format(mutantReference), prefix=' ')) @@ -447,8 +440,8 @@ def importEftCfg(shipname, lines, iportuser): else: m.owner = fitobj # Activate mod if it is activable - if m.isValidState(State.ACTIVE): - m.state = State.ACTIVE + if m.isValidState(FittingModuleState.ACTIVE): + m.state = FittingModuleState.ACTIVE # Add charge to mod if applicable, on any errors just don't add anything if chargeName: try: @@ -728,12 +721,12 @@ class AbstractFit: @property def __slotContainerMap(self): return { - Slot.HIGH: self.modulesHigh, - Slot.MED: self.modulesMed, - Slot.LOW: self.modulesLow, - Slot.RIG: self.rigs, - Slot.SUBSYSTEM: self.subsystems, - Slot.SERVICE: self.services} + FittingSlot.HIGH: self.modulesHigh, + FittingSlot.MED: self.modulesMed, + FittingSlot.LOW: self.modulesLow, + FittingSlot.RIG: self.rigs, + FittingSlot.SUBSYSTEM: self.subsystems, + FittingSlot.SERVICE: self.services} def getContainerBySlot(self, slotType): return self.__slotContainerMap.get(slotType) @@ -804,10 +797,10 @@ class AbstractFit: if itemSpec.charge is not None and m.isValidCharge(itemSpec.charge): m.charge = itemSpec.charge - if itemSpec.offline and m.isValidState(State.OFFLINE): - m.state = State.OFFLINE - elif m.isValidState(State.ACTIVE): - m.state = State.ACTIVE + if itemSpec.offline and m.isValidState(FittingModuleState.OFFLINE): + m.state = FittingModuleState.OFFLINE + elif m.isValidState(FittingModuleState.ACTIVE): + m.state = FittingModuleState.ACTIVE return m def addImplant(self, itemSpec): diff --git a/service/port/esi.py b/service/port/esi.py index 9847cbf05..b97e9d20a 100644 --- a/service/port/esi.py +++ b/service/port/esi.py @@ -28,7 +28,8 @@ from eos.saveddata.citadel import Citadel from eos.saveddata.drone import Drone from eos.saveddata.fighter import Fighter from eos.saveddata.fit import Fit -from eos.saveddata.module import Module, State, Slot +from eos.saveddata.module import Module +from eos.const import FittingSlot, FittingModuleState from eos.saveddata.ship import Ship from service.fit import Fit as svcFit from service.market import Market @@ -41,12 +42,12 @@ class ESIExportException(Exception): pyfalog = Logger(__name__) INV_FLAGS = { - Slot.LOW: 11, - Slot.MED: 19, - Slot.HIGH: 27, - Slot.RIG: 92, - Slot.SUBSYSTEM: 125, - Slot.SERVICE: 164 + FittingSlot.LOW: 11, + FittingSlot.MED: 19, + FittingSlot.HIGH: 27, + FittingSlot.RIG: 92, + FittingSlot.SUBSYSTEM: 125, + FittingSlot.SERVICE: 164 } INV_FLAG_CARGOBAY = 5 @@ -82,7 +83,7 @@ def exportESI(ofit, callback): item = nested_dict() slot = module.slot - if slot == Slot.SUBSYSTEM: + if slot == FittingSlot.SUBSYSTEM: # Order of subsystem matters based on this attr. See GH issue #130 slot = int(module.getModifiedItemAttr("subSystemSlot")) item['flag'] = slot @@ -194,8 +195,8 @@ def importESI(string): if m.fits(fitobj): fitobj.modules.append(m) else: - if m.isValidState(State.ACTIVE): - m.state = State.ACTIVE + if m.isValidState(FittingModuleState.ACTIVE): + m.state = FittingModuleState.ACTIVE moduleList.append(m) diff --git a/service/port/multibuy.py b/service/port/multibuy.py index 69f82e4e7..fbb099a6d 100644 --- a/service/port/multibuy.py +++ b/service/port/multibuy.py @@ -18,24 +18,15 @@ # ============================================================================= -from enum import IntEnum, unique - +from service.const import PortMultiBuyOptions from service.price import Price as sPrc -@unique -class Options(IntEnum): - IMPLANTS = 1 - CARGO = 2 - LOADED_CHARGES = 3 - OPTIMIZE_PRICES = 4 - - MULTIBUY_OPTIONS = ( - (Options.LOADED_CHARGES.value, 'Loaded Charges', 'Export charges loaded into modules', True), - (Options.IMPLANTS.value, 'Implants && Boosters', 'Export implants and boosters', False), - (Options.CARGO.value, 'Cargo', 'Export cargo contents', True), - (Options.OPTIMIZE_PRICES.value, 'Optimize Prices', 'Replace items by cheaper alternatives', False), + (PortMultiBuyOptions.LOADED_CHARGES.value, 'Loaded Charges', 'Export charges loaded into modules', True), + (PortMultiBuyOptions.IMPLANTS.value, 'Implants && Boosters', 'Export implants and boosters', False), + (PortMultiBuyOptions.CARGO.value, 'Cargo', 'Export cargo contents', True), + (PortMultiBuyOptions.OPTIMIZE_PRICES.value, 'Optimize Prices', 'Replace items by cheaper alternatives', False), ) @@ -48,7 +39,7 @@ def exportMultiBuy(fit, options, callback): if module.isMutated: continue _addItem(itemAmounts, module.item) - if module.charge and options[Options.LOADED_CHARGES.value]: + if module.charge and options[PortMultiBuyOptions.LOADED_CHARGES.value]: _addItem(itemAmounts, module.charge, module.numCharges) for drone in fit.drones: @@ -57,18 +48,18 @@ def exportMultiBuy(fit, options, callback): for fighter in fit.fighters: _addItem(itemAmounts, fighter.item, fighter.amountActive) - if options[Options.CARGO.value]: + if options[PortMultiBuyOptions.CARGO.value]: for cargo in fit.cargo: _addItem(itemAmounts, cargo.item, cargo.amount) - if options[Options.IMPLANTS.value]: + if options[PortMultiBuyOptions.IMPLANTS.value]: for implant in fit.implants: _addItem(itemAmounts, implant.item) for booster in fit.boosters: _addItem(itemAmounts, booster.item) - if options[Options.OPTIMIZE_PRICES.value]: + if options[PortMultiBuyOptions.OPTIMIZE_PRICES.value]: def formatCheaperExportCb(replacementsCheaper): updatedAmounts = {} diff --git a/service/port/port.py b/service/port/port.py index 0b2420003..1f961f6c1 100644 --- a/service/port/port.py +++ b/service/port/port.py @@ -29,7 +29,7 @@ from bs4 import UnicodeDammit from logbook import Logger from eos import db -from eos.saveddata.fit import ImplantLocation +from eos.const import ImplantLocation from service.fit import Fit as svcFit from service.port.dna import exportDna, importDna from service.port.eft import exportEft, importEft, importEftCfg diff --git a/service/port/xml.py b/service/port/xml.py index 01da634c2..0e1f1e9ed 100644 --- a/service/port/xml.py +++ b/service/port/xml.py @@ -28,8 +28,9 @@ from eos.saveddata.citadel import Citadel from eos.saveddata.drone import Drone from eos.saveddata.fighter import Fighter from eos.saveddata.fit import Fit -from eos.saveddata.module import Module, State, Slot +from eos.saveddata.module import Module from eos.saveddata.ship import Ship +from eos.const import FittingSlot, FittingModuleState from service.fit import Fit as svcFit from service.market import Market from utils.strfunctions import sequential_rep, replace_ltgt @@ -198,8 +199,8 @@ def importXml(text, iportuser): m.owner = fitobj fitobj.modules.append(m) else: - if m.isValidState(State.ACTIVE): - m.state = State.ACTIVE + if m.isValidState(FittingModuleState.ACTIVE): + m.state = FittingModuleState.ACTIVE moduleList.append(m) @@ -265,7 +266,7 @@ def exportXml(iportuser, callback, *fits): slot = module.slot - if slot == Slot.SUBSYSTEM: + if slot == FittingSlot.SUBSYSTEM: # Order of subsystem matters based on this attr. See GH issue #130 slotId = module.getModifiedItemAttr("subSystemSlot") - 125 else: @@ -277,7 +278,7 @@ def exportXml(iportuser, callback, *fits): hardware = doc.createElement("hardware") hardware.setAttribute("type", module.item.name) - slotName = Slot.getName(slot).lower() + slotName = FittingSlot(slot).name.lower() slotName = slotName if slotName != "high" else "hi" hardware.setAttribute("slot", "%s slot %d" % (slotName, slotId)) fitting.appendChild(hardware)