diff --git a/eos/db/saveddata/fleet.py b/eos/db/saveddata/fleet.py deleted file mode 100644 index eb644b02e..000000000 --- a/eos/db/saveddata/fleet.py +++ /dev/null @@ -1,65 +0,0 @@ -# =============================================================================== -# Copyright (C) 2010 Diego Duclos -# -# This file is part of eos. -# -# eos is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# eos 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with eos. If not, see . -# =============================================================================== - -from sqlalchemy import Table, Column, Integer, ForeignKey, String -from sqlalchemy.orm import mapper, relation - -from eos.db import saveddata_meta -from eos.db.saveddata.fit import fits_table -from eos.types import Fleet, Wing, Squad, Fit - -gangs_table = Table("gangs", saveddata_meta, - Column("ID", Integer, primary_key=True), - Column("leaderID", ForeignKey("fits.ID")), - Column("boosterID", ForeignKey("fits.ID")), - Column("name", String)) - -wings_table = Table("wings", saveddata_meta, - Column("ID", Integer, primary_key=True), - Column("gangID", ForeignKey("gangs.ID")), - Column("boosterID", ForeignKey("fits.ID")), - Column("leaderID", ForeignKey("fits.ID"))) - -squads_table = Table("squads", saveddata_meta, - Column("ID", Integer, primary_key=True), - Column("wingID", ForeignKey("wings.ID")), - Column("leaderID", ForeignKey("fits.ID")), - Column("boosterID", ForeignKey("fits.ID"))) - -squadmembers_table = Table("squadmembers", saveddata_meta, - Column("squadID", ForeignKey("squads.ID"), primary_key=True), - Column("memberID", ForeignKey("fits.ID"), primary_key=True)) - -mapper(Fleet, gangs_table, - properties={"wings": relation(Wing, backref="gang"), - "leader": relation(Fit, primaryjoin=gangs_table.c.leaderID == fits_table.c.ID), - "booster": relation(Fit, primaryjoin=gangs_table.c.boosterID == fits_table.c.ID)}) - -mapper(Wing, wings_table, - properties={"squads": relation(Squad, backref="wing"), - "leader": relation(Fit, primaryjoin=wings_table.c.leaderID == fits_table.c.ID), - "booster": relation(Fit, primaryjoin=wings_table.c.boosterID == fits_table.c.ID)}) - -mapper(Squad, squads_table, - properties={"leader": relation(Fit, primaryjoin=squads_table.c.leaderID == fits_table.c.ID), - "booster": relation(Fit, primaryjoin=squads_table.c.boosterID == fits_table.c.ID), - "members": relation(Fit, - primaryjoin=squads_table.c.ID == squadmembers_table.c.squadID, - secondaryjoin=squadmembers_table.c.memberID == fits_table.c.ID, - secondary=squadmembers_table)}) diff --git a/eos/saveddata/fleet.py b/eos/saveddata/fleet.py deleted file mode 100644 index 6fc1b6330..000000000 --- a/eos/saveddata/fleet.py +++ /dev/null @@ -1,341 +0,0 @@ -# =============================================================================== -# Copyright (C) 2010 Diego Duclos -# -# This file is part of eos. -# -# eos is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# eos 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with eos. If not, see . -# =============================================================================== - -from copy import deepcopy -from itertools import chain - -from eos.types import Skill, Module, Ship - - -class Fleet(object): - def calculateModifiedAttributes(self): - # Make sure ALL fits in the gang have been calculated - for c in chain(self.wings, (self.leader,)): - if c is not None: - c.calculateModifiedAttributes() - - leader = self.leader - self.booster = booster = self.booster if self.booster is not None else leader - self.broken = False - self.store = store = Store() - store.set(booster, "fleet") - # Go all the way down for each subtree we have. - for wing in self.wings: - wing.calculateGangBonusses(store) - - # Check skill requirements and wing amount to see if we break or not - if len(self.wings) == 0 or leader is None or leader.character is None or leader.character.getSkill( - "Fleet Command").level < len(self.wings): - self.broken = True - - # Now calculate our own if we aren't broken - if not self.broken: - # We only get our own bonuses *Sadface* - store.apply(leader, "fleet") - - def recalculateLinear(self, withBoosters=True, dirtyStorage=None): - self.store = Store() - self.linearBoosts = {} - if withBoosters is True: - if self.leader is not None and self.leader.character is not None and self.leader.character.getSkill( - "Fleet Command").level >= 1: - self.leader.boostsFits.add(self.wings[0].squads[0].members[0].ID) - self.leader.calculateModifiedAttributes() - self.store.set(self.leader, "squad", clearingUpdate=True) - else: - self.store = Store() - if self.leader is not None: - try: - self.leader.boostsFits.remove(self.wings[0].squads[0].members[0].ID) - except KeyError: - pass - self.wings[0].recalculateLinear(self.store, withBoosters=withBoosters, dirtyStorage=dirtyStorage) - return self.linearBoosts - - def count(self): - total = 0 - for wing in self.wings: - total += wing.count() - - return total - - def extend(self): - self.wings.append(Wing()) - - def __deepcopy__(self, memo): - copy = Fleet() - copy.name = self.name - copy.booster = deepcopy(self.booster) - copy.leader = deepcopy(self.leader) - for wing in self.wings: - copy.wings.append(deepcopy(wing)) - - return copy - - -class Wing(object): - def calculateModifiedAttributes(self): - for c in chain(self.squads, (self.leader,)): - if c is not None: - c.calculateModifiedAttributes() - - def calculateGangBonusses(self, store): - self.broken = False - leader = self.leader - self.booster = booster = self.booster if self.booster is not None else leader - - store.set(booster, "wing") - - # ALWAYS move down - for squad in self.squads: - squad.calculateGangBonusses(store) - - # Check skill requirements and squad amount to see if we break or not - if len(self.squads) == 0 or leader is None or leader.character is None or leader.character.getSkill( - "Wing Command").level < len(self.squads): - self.broken = True - - # Check if we aren't broken, if we aren't, boost - if not self.broken: - store.apply(leader, "wing") - else: - # We broke, don't go up - self.gang.broken = True - - def recalculateLinear(self, store, withBoosters=True, dirtyStorage=None): - if withBoosters is True: - if self.leader is not None and self.leader.character is not None and self.leader.character.getSkill( - "Wing Command").level >= 1: - self.leader.boostsFits.add(self.squads[0].members[0].ID) - self.leader.calculateModifiedAttributes() - store.set(self.leader, "squad", clearingUpdate=False) - else: - store = Store() - if self.gang.leader is not None: - try: - self.gang.leader.boostsFits.remove(self.squads[0].members[0].ID) - except KeyError: - pass - if self.leader is not None: - try: - self.leader.boostsFits.remove(self.squads[0].members[0].ID) - except KeyError: - pass - self.squads[0].recalculateLinear(store, withBoosters=withBoosters, dirtyStorage=dirtyStorage) - - def count(self): - total = 0 if self.leader is None else 1 - for squad in self.squads: - total += squad.count() - - return total - - def extend(self): - self.squads.append(Squad()) - - def __deepcopy__(self, memo): - copy = Wing() - copy.booster = deepcopy(self.booster) - copy.leader = deepcopy(self.leader) - for squad in self.squads: - copy.squads.append(deepcopy(squad)) - - return copy - - -class Squad(object): - def calculateModifiedAttributes(self): - for member in self.members: - member.calculateModifiedAttributes() - - def calculateGangBonusses(self, store): - self.broken = False - leader = self.leader - self.booster = booster = self.booster if self.booster is not None else leader - store.set(booster, "squad") - - # Check skill requirements and squad size to see if we break or not - if len(self.members) <= 0 or leader is None or leader.character is None or leader.character.getSkill( - "Leadership").level * 2 < len(self.members): - self.broken = True - - if not self.broken: - for member in self.members: - store.apply(member, "squad") - else: - self.wing.broken = True - - def recalculateLinear(self, store, withBoosters=True, dirtyStorage=None): - if withBoosters is True: - if self.leader is not None and self.leader.character is not None and self.leader.character.getSkill( - "Leadership").level >= 1: - self.leader.boostsFits.add(self.members[0].ID) - self.leader.calculateModifiedAttributes(dirtyStorage=dirtyStorage) - store.set(self.leader, "squad", clearingUpdate=False) - else: - store = Store() - if self.leader is not None: - try: - self.leader.boostsFits.remove(self.members[0].ID) - except KeyError: - pass - if self.wing.leader is not None: - try: - self.wing.leader.boostsFits.remove(self.members[0].ID) - except KeyError: - pass - if self.wing.gang.leader is not None: - try: - self.wing.gang.leader.boostsFits.remove(self.members[0].ID) - except KeyError: - pass - if getattr(self.wing.gang, "linearBoosts", None) is None: - self.wing.gang.linearBoosts = {} - dict = store.bonuses["squad"] - for boostedAttr, boostInfoList in dict.iteritems(): - for boostInfo in boostInfoList: - effect, thing = boostInfo - # Get current boost value for given attribute, use 0 as fallback if - # no boosts applied yet - currBoostAmount = self.wing.gang.linearBoosts.get(boostedAttr, (0,))[0] - # Attribute name which is used to get boost value - newBoostAttr = effect.getattr("gangBonus") or "commandBonus" - # Get boost amount for current boost - newBoostAmount = thing.getModifiedItemAttr(newBoostAttr) or 0 - # Skill used to modify the gang bonus (for purposes of comparing old vs new) - newBoostSkill = effect.getattr("gangBonusSkill") - # If skill takes part in gang boosting, multiply by skill level - if type(thing) == Skill: - newBoostAmount *= thing.level - # boost the gang bonus based on skill noted in effect file - if newBoostSkill: - newBoostAmount *= thing.parent.character.getSkill(newBoostSkill).level - # If new boost is more powerful, replace older one with it - if abs(newBoostAmount) > abs(currBoostAmount): - self.wing.gang.linearBoosts[boostedAttr] = (newBoostAmount, boostInfo) - - def count(self): - return len(self.members) - - def __deepcopy__(self, memo): - copy = Squad() - copy.booster = deepcopy(self.booster) - copy.leader = deepcopy(self.leader) - for member in self.members: - copy.members.append(deepcopy(member)) - - return copy - - -class Store(object): - def __init__(self): - # Container for gang boosters and their respective bonuses, three-layered - self.bonuses = {} - for dictType in ("fleet", "wing", "squad"): - self.bonuses[dictType] = {} - # Container for boosted fits and corresponding boosts applied onto them - self.boosts = {} - - def set(self, fitBooster, layer, clearingUpdate=True): - """Add all gang boosts of given fit for given layer to boost store""" - if fitBooster is None: - return - - # This dict contains all bonuses for specified layer - dict = self.bonuses[layer] - if clearingUpdate is True: - # Clear existing bonuses - dict.clear() - - # Go through everything which can be used as gang booster - for thing in chain(fitBooster.modules, fitBooster.implants, fitBooster.character.skills, (fitBooster.ship,)): - if thing.item is None: - continue - for effect in thing.item.effects.itervalues(): - # And check if it actually has gang boosting effects - if effect.isType("gang"): - # Attribute which is boosted - boostedAttr = effect.getattr("gangBoost") - # List which contains all bonuses for given attribute for given layer - l = dict.get(boostedAttr) - # If there was no list, create it - if l is None: - l = dict[boostedAttr] = [] - # And append effect which is used to boost stuff and carrier of this effect - l.append((effect, thing)) - - contextMap = {Skill: "skill", - Ship: "ship", - Module: "module"} - - def apply(self, fitBoosted, layer): - """Applies all boosts onto given fit for given layer""" - if fitBoosted is None: - return - # Boosts dict contains all bonuses applied onto given fit - self.boosts[fitBoosted] = boosts = {} - # Go through all bonuses for given layer, and find highest one per boosted attribute - for currLayer in ("fleet", "wing", "squad"): - # Dictionary with boosts for given layer - dict = self.bonuses[currLayer] - for boostedAttr, boostInfoList in dict.iteritems(): - for boostInfo in boostInfoList: - effect, thing = boostInfo - # Get current boost value for given attribute, use 0 as fallback if - # no boosts applied yet - currBoostAmount = boosts.get(boostedAttr, (0,))[0] - # Attribute name which is used to get boost value - newBoostAttr = effect.getattr("gangBonus") or "commandBonus" - # Get boost amount for current boost - newBoostAmount = thing.getModifiedItemAttr(newBoostAttr) or 0 - # Skill used to modify the gang bonus (for purposes of comparing old vs new) - newBoostSkill = effect.getattr("gangBonusSkill") - # If skill takes part in gang boosting, multiply by skill level - if type(thing) == Skill: - newBoostAmount *= thing.level - # boost the gang bonus based on skill noted in effect file - if newBoostSkill: - newBoostAmount *= thing.parent.character.getSkill(newBoostSkill).level - # If new boost is more powerful, replace older one with it - if abs(newBoostAmount) > abs(currBoostAmount): - boosts[boostedAttr] = (newBoostAmount, boostInfo) - - # Don't look further down then current layer, wing commanders don't get squad bonuses and all that - if layer == currLayer: - break - - self.modify(fitBoosted) - - def getBoosts(self, fit): - """Return all boosts applied onto given fit""" - return self.boosts.get(fit) - - def modify(self, fitBoosted): - # Get all boosts which should be applied onto current fit - boosts = self.getBoosts(fitBoosted) - # Now we got it all figured out, actually do the useful part of all this - for name, info in boosts.iteritems(): - # Unpack all data required to run effect properly - effect, thing = info[1] - context = ("gang", self.contextMap[type(thing)]) - # Run effect, and get proper bonuses applied - try: - effect.handler(fitBoosted, thing, context) - except: - pass