diff --git a/eos/db/gamedata/alphaClones.py b/eos/db/gamedata/alphaClones.py index e21b61d5c..602f8070c 100644 --- a/eos/db/gamedata/alphaClones.py +++ b/eos/db/gamedata/alphaClones.py @@ -18,7 +18,7 @@ # =============================================================================== from sqlalchemy import Column, String, Integer, Table, ForeignKey -from sqlalchemy.orm import relation, mapper +from sqlalchemy.orm import relation, mapper, synonym from eos.db import gamedata_meta from eos.types import AlphaClone, AlphaCloneSkill @@ -36,7 +36,8 @@ alphacloneskskills_table = Table("alphaCloneSkills", gamedata_meta, mapper(AlphaClone, alphaclones_table, properties={ - "_AlphaClone__skills": relation( + "ID": synonym("alphaCloneID"), + "skills": relation( AlphaCloneSkill, cascade="all,delete-orphan", backref="clone") diff --git a/eos/db/gamedata/queries.py b/eos/db/gamedata/queries.py index b2db92437..ed75c62a8 100644 --- a/eos/db/gamedata/queries.py +++ b/eos/db/gamedata/queries.py @@ -24,7 +24,7 @@ import eos.config from eos.db import gamedata_session from eos.db.gamedata.metaGroup import metatypes_table, items_table from eos.db.util import processEager, processWhere -from eos.types import Item, Category, Group, MarketGroup, AttributeInfo, MetaData, MetaGroup +from eos.types import Item, Category, Group, MarketGroup, AttributeInfo, MetaData, MetaGroup, AlphaClone configVal = getattr(eos.config, "gamedataCache", None) if configVal is True: @@ -97,6 +97,18 @@ def getItem(lookfor, eager=None): return item +@cachedQuery(1, "lookfor") +def getAlphaClone(lookfor, eager=None): + if isinstance(lookfor, int): + if eager is None: + item = gamedata_session.query(AlphaClone).get(lookfor) + else: + item = gamedata_session.query(AlphaClone).options(*processEager(eager)).filter(AlphaClone.ID == lookfor).first() + else: + raise TypeError("Need integer as argument") + return item + + groupNameMap = {} diff --git a/eos/gamedata.py b/eos/gamedata.py index 1084cb317..e4a4afa1c 100644 --- a/eos/gamedata.py +++ b/eos/gamedata.py @@ -445,7 +445,18 @@ class Category(EqBase): class AlphaClone(EqBase): - pass + @reconstructor + def init(self): + self.skillCache = {} + + for x in self.skills: + self.skillCache[x.typeID] = x + + def getSkillLevel(self, skill): + if skill.item.ID in self.skillCache: + return self.skillCache[skill.item.ID].level + else: + return None class AlphaCloneSkill(EqBase): diff --git a/eos/saveddata/character.py b/eos/saveddata/character.py index 9657c7d04..a4e8c6fce 100644 --- a/eos/saveddata/character.py +++ b/eos/saveddata/character.py @@ -109,10 +109,14 @@ class Character(object): @reconstructor def init(self): + self.__skillIdMap = {} for skill in self.__skills: self.__skillIdMap[skill.itemID] = skill self.dirtySkills = set() + + if self.alphaClone: + self.alphaClone = eos.db.getAlphaClone(self.alphaClone) def apiUpdateCharSheet(self, skills): del self.__skills[:] @@ -294,6 +298,9 @@ class Skill(HandledItem): @property def level(self): + if self.character.alphaClone: + return min(self.activeLevel, self.character.alphaClone.getSkillLevel(self)) or 0 + return self.activeLevel or 0 @level.setter diff --git a/eve.db b/eve.db index 78230ae47..c0aca9c2e 100644 Binary files a/eve.db and b/eve.db differ