185 lines
5.6 KiB
Python
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
|