Files
pyfa/gui/fitCommands/helpers.py
2019-04-12 23:46:41 +03:00

185 lines
5.6 KiB
Python

from logbook import Logger
import eos.db
from eos.const import FittingModuleState
from eos.saveddata.booster import Booster
from eos.saveddata.cargo import Cargo
from eos.saveddata.drone import Drone
from eos.saveddata.module import Module
from service.market import Market
from utils.repr import makeReprStr
pyfalog = Logger(__name__)
class ModuleInfo:
def __init__(self, itemID, baseItemID=None, mutaplasmidID=None, mutations=None, chargeID=None, state=None, spoolType=None, spoolAmount=None):
self.itemID = itemID
self.baseItemID = baseItemID
self.mutaplasmidID = mutaplasmidID
self.mutations = mutations
self.chargeID = chargeID
self.state = state
self.spoolType = spoolType
self.spoolAmount = spoolAmount
@classmethod
def fromModule(cls, mod):
if mod is None:
return None
info = cls(
itemID=mod.itemID,
baseItemID=mod.baseItemID,
mutaplasmidID=mod.mutaplasmidID,
mutations={m.attrID: m.value for m in mod.mutators.values()},
chargeID=mod.chargeID,
state=mod.state,
spoolType=mod.spoolType,
spoolAmount=mod.spoolAmount)
return info
def toModule(self, fallbackState=None):
mkt = Market.getInstance()
item = mkt.getItem(self.itemID, eager=('attributes', 'group.category'))
if self.baseItemID and self.mutaplasmidID:
baseItem = mkt.getItem(self.baseItemID, eager=('attributes', 'group.category'))
mutaplasmid = eos.db.getDynamicItem(self.mutaplasmidID)
else:
baseItem = None
mutaplasmid = None
try:
mod = Module(item, baseItem, mutaplasmid)
except ValueError:
pyfalog.warning('Invalid item: {}'.format(self.itemID))
return None
for attrID, mutator in mod.mutators.items():
if attrID in self.mutations:
mutator.value = self.mutations[attrID]
if self.spoolType is not None and self.spoolAmount is not None:
mod.spoolType = self.spoolType
mod.spoolAmount = self.spoolAmount
if self.state is not None:
if not mod.isValidState(self.state):
pyfalog.warning('Cannot set state {}'.format(self.state))
return None
mod.state = self.state
elif fallbackState is not None:
if mod.isValidState(fallbackState):
mod.state = fallbackState
if self.chargeID is not None:
charge = mkt.getItem(self.chargeID)
if charge is None:
pyfalog.warning('Cannot set charge {}'.format(self.chargeID))
return None
mod.charge = charge
return mod
def __repr__(self):
return makeReprStr(self, [
'itemID', 'baseItemID', 'mutaplasmidID', 'mutations',
'chargeID', 'state', 'spoolType', 'spoolAmount'])
class BoosterInfo:
def __init__(self, itemID, state=None, sideEffects=None):
self.itemID = itemID
self.state = state
self.sideEffects = sideEffects
@classmethod
def fromBooster(cls, booster):
if booster is None:
return None
info = cls(
itemID=booster.itemID,
state=booster.active,
sideEffects={se.effectID: se.active for se in booster.sideEffects})
return info
def toBooster(self):
item = Market.getInstance().getItem(self.itemID)
try:
booster = Booster(item)
except ValueError:
pyfalog.warning('Invalid item: {}'.format(self.itemID))
return None
if self.state is not None:
booster.active = self.state
if self.sideEffects is not None:
for sideEffect in booster.sideEffects:
if sideEffect.effectID in self.sideEffects:
sideEffect.active = self.sideEffects[sideEffect.effectID]
return booster
class CargoInfo:
def __init__(self, itemID, amount):
self.itemID = itemID
self.amount = amount
@classmethod
def fromCargo(cls, cargo):
if cargo is None:
return None
info = cls(
itemID=cargo.itemID,
amount=cargo.active)
return info
def toCargo(self):
item = Market.getInstance().getItem(self.itemID)
cargo = Cargo(item)
cargo.amount = self.amount
return cargo
def __repr__(self):
return makeReprStr(self, ['itemID', 'amount'])
class DroneInfo:
def __init__(self, itemID, amount, amountActive):
self.itemID = itemID
self.amount = amount
self.amountActive = amountActive
@classmethod
def fromDrone(cls, drone):
if drone is None:
return None
info = cls(
itemID=drone.itemID,
amount=drone.amount,
amountActive=drone.amountActive)
return info
def toDrone(self):
item = Market.getInstance().getItem(self.itemID)
try:
drone = Drone(item)
except ValueError:
pyfalog.warning('Invalid item: {}'.format(self.itemID))
return None
drone.amount = self.amount
drone.amountActive = self.amountActive
return drone
def __repr__(self):
return makeReprStr(self, ['itemID', 'amount', 'amountActive'])
def stateLimit(itemIdentity):
item = Market.getInstance().getItem(itemIdentity)
if {'moduleBonusAssaultDamageControl', 'moduleBonusIndustrialInvulnerability'}.intersection(item.effects):
return FittingModuleState.ONLINE
return FittingModuleState.ACTIVE