diff --git a/eos/db/gamedata/__init__.py b/eos/db/gamedata/__init__.py index 83fe03c97..eabfd7f1b 100644 --- a/eos/db/gamedata/__init__.py +++ b/eos/db/gamedata/__init__.py @@ -1,2 +1,2 @@ __all__ = ["attribute", "category", "effect", "group", "metaData", - "icon", "item", "marketGroup", "metaGroup", "unit"] + "icon", "item", "marketGroup", "metaGroup", "unit", "alphaClones"] diff --git a/eos/db/gamedata/alphaClones.py b/eos/db/gamedata/alphaClones.py new file mode 100644 index 000000000..602f8070c --- /dev/null +++ b/eos/db/gamedata/alphaClones.py @@ -0,0 +1,46 @@ +# =============================================================================== +# 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 Column, String, Integer, Table, ForeignKey +from sqlalchemy.orm import relation, mapper, synonym + +from eos.db import gamedata_meta +from eos.types import AlphaClone, AlphaCloneSkill + +alphaclones_table = Table("alphaClones", gamedata_meta, + Column("alphaCloneID", Integer, primary_key=True), + Column("alphaCloneName", String), + ) + +alphacloneskskills_table = Table("alphaCloneSkills", gamedata_meta, + Column("alphaCloneID", Integer, ForeignKey("alphaClones.alphaCloneID"), primary_key=True), + Column("typeID", Integer, primary_key=True), + Column("level", Integer), + ) + +mapper(AlphaClone, alphaclones_table, + properties={ + "ID": synonym("alphaCloneID"), + "skills": relation( + AlphaCloneSkill, + cascade="all,delete-orphan", + backref="clone") + }) + +mapper(AlphaCloneSkill, alphacloneskskills_table) diff --git a/eos/db/gamedata/queries.py b/eos/db/gamedata/queries.py index b2db92437..957e4c657 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,24 @@ 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 + + +def getAlphaCloneList(eager=None): + eager = processEager(eager) + clones = gamedata_session.query(AlphaClone).options(*eager).all() + return clones + + groupNameMap = {} diff --git a/eos/db/saveddata/character.py b/eos/db/saveddata/character.py index fad8c579d..aa9a99c74 100644 --- a/eos/db/saveddata/character.py +++ b/eos/db/saveddata/character.py @@ -33,10 +33,12 @@ characters_table = Table("characters", saveddata_meta, Column("defaultChar", Integer), Column("chars", String, nullable=True), Column("defaultLevel", Integer, nullable=True), + Column("alphaCloneID", Integer, nullable=True), Column("ownerID", ForeignKey("users.ID"), nullable=True)) mapper(Character, characters_table, properties={ + "_Character__alphaCloneID": characters_table.c.alphaCloneID, "savedName": characters_table.c.name, "_Character__owner": relation( User, diff --git a/eos/gamedata.py b/eos/gamedata.py index c4b58b235..e4a4afa1c 100644 --- a/eos/gamedata.py +++ b/eos/gamedata.py @@ -444,6 +444,25 @@ class Category(EqBase): pass +class AlphaClone(EqBase): + @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): + pass + + class Group(EqBase): pass diff --git a/eos/saveddata/character.py b/eos/saveddata/character.py index 9657c7d04..cd5e278fd 100644 --- a/eos/saveddata/character.py +++ b/eos/saveddata/character.py @@ -99,6 +99,7 @@ class Character(object): self.__skills = [] self.__skillIdMap = {} self.dirtySkills = set() + self.alphaClone = None if initSkills: for item in self.getSkillList(): @@ -109,11 +110,17 @@ class Character(object): @reconstructor def init(self): + self.__skillIdMap = {} for skill in self.__skills: self.__skillIdMap[skill.itemID] = skill self.dirtySkills = set() + self.alphaClone = None + + if self.alphaCloneID: + self.alphaClone = eos.db.getAlphaClone(self.alphaCloneID) + def apiUpdateCharSheet(self, skills): del self.__skills[:] self.__skillIdMap.clear() @@ -140,6 +147,15 @@ class Character(object): def name(self, name): self.savedName = name + @property + def alphaCloneID(self): + return self.__alphaCloneID + + @alphaCloneID.setter + def alphaCloneID(self, cloneID): + self.__alphaCloneID = cloneID + self.alphaClone = eos.db.getAlphaClone(cloneID) if cloneID is not None else None + @property def skills(self): return self.__skills @@ -294,6 +310,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/eos/types.py b/eos/types.py index 1fbf2676b..e6663689f 100644 --- a/eos/types.py +++ b/eos/types.py @@ -18,7 +18,8 @@ # =============================================================================== from eos.gamedata import Attribute, Category, Effect, Group, Icon, Item, MarketGroup, \ - MetaGroup, AttributeInfo, Unit, EffectInfo, MetaType, MetaData, Traits + MetaGroup, AttributeInfo, Unit, EffectInfo, MetaType, MetaData, Traits, AlphaClone, \ + AlphaCloneSkill from eos.saveddata.price import Price from eos.saveddata.user import User from eos.saveddata.crestchar import CrestChar diff --git a/eve.db b/eve.db index 035d2f36b..c0aca9c2e 100644 Binary files a/eve.db and b/eve.db differ diff --git a/gui/characterEditor.py b/gui/characterEditor.py index bf7db18bf..82b47fd62 100644 --- a/gui/characterEditor.py +++ b/gui/characterEditor.py @@ -239,10 +239,25 @@ class SkillTreeView (wx.Panel): pmainSizer = wx.BoxSizer(wx.VERTICAL) + self.clonesChoice = wx.Choice(self, wx.ID_ANY, style=0) + i = self.clonesChoice.Append("Omega Clone", None) + self.clonesChoice.SetSelection(i) + pmainSizer.Add(self.clonesChoice, 0, wx.ALL | wx.EXPAND, 5) + + sChar = service.Character.getInstance() + self.alphaClones = sChar.getAlphaCloneList() + char = self.charEditor.entityEditor.getActiveEntity() + + for clone in self.alphaClones: + i = self.clonesChoice.Append(clone.alphaCloneName, clone.ID) + if clone.ID == char.alphaCloneID: + self.clonesChoice.SetSelection(i) + + self.clonesChoice.Bind(wx.EVT_CHOICE, self.cloneChanged) + tree = self.skillTreeListCtrl = wx.gizmos.TreeListCtrl(self, wx.ID_ANY, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT) pmainSizer.Add(tree, 1, wx.EXPAND | wx.ALL, 5) - self.imageList = wx.ImageList(16, 16) tree.SetImageList(self.imageList) self.skillBookImageId = self.imageList.Add(BitmapLoader.getBitmap("skill_small", "gui")) @@ -262,7 +277,7 @@ class SkillTreeView (wx.Panel): tree.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.scheduleMenu) # bind the Character selection event - self.charEditor.entityEditor.Bind(wx.EVT_CHOICE, self.populateSkillTree) + self.charEditor.entityEditor.Bind(wx.EVT_CHOICE, self.charChanged) self.charEditor.Bind(GE.CHAR_LIST_UPDATED, self.populateSkillTree) srcContext = "skillItem" @@ -295,11 +310,30 @@ class SkillTreeView (wx.Panel): self.Layout() + def cloneChanged(self, event): + sChar = service.Character.getInstance() + sChar.setAlphaClone(self.charEditor.entityEditor.getActiveEntity(), event.ClientData) + self.populateSkillTree() + + def charChanged(self, event=None): + char = self.charEditor.entityEditor.getActiveEntity() + for i in range(self.clonesChoice.GetCount()): + cloneID = self.clonesChoice.GetClientData(i) + if char.alphaCloneID == cloneID: + self.clonesChoice.SetSelection(i) + + self.populateSkillTree(event) + def populateSkillTree(self, event=None): sChar = service.Character.getInstance() char = self.charEditor.entityEditor.getActiveEntity() dirtyGroups = set([skill.item.group.ID for skill in char.dirtySkills]) + if char.name in ("All 0", "All 5"): + self.clonesChoice.Disable() + else: + self.clonesChoice.Enable() + groups = sChar.getSkillGroups() imageId = self.skillBookImageId root = self.root diff --git a/scripts/jsonToSql.py b/scripts/jsonToSql.py index 1f431f3d8..173fc59f3 100755 --- a/scripts/jsonToSql.py +++ b/scripts/jsonToSql.py @@ -47,6 +47,7 @@ def main(db, json_path): # Config dict tables = { + "clonegrades": eos.gamedata.AlphaCloneSkill, "dgmattribs": eos.gamedata.AttributeInfo, "dgmeffects": eos.gamedata.EffectInfo, "dgmtypeattribs": eos.gamedata.Attribute, @@ -60,7 +61,8 @@ def main(db, json_path): "evetypes": eos.gamedata.Item, "phbtraits": eos.gamedata.Traits, "phbmetadata": eos.gamedata.MetaData, - "mapbulk_marketGroups": eos.gamedata.MarketGroup + "mapbulk_marketGroups": eos.gamedata.MarketGroup, + } fieldMapping = { @@ -109,6 +111,19 @@ def main(db, json_path): new.append(v) return new + def convertClones(data): + newData = [] + + for ID in data: + for skill in data[ID]["skills"]: + newData.append({ + "alphaCloneID": int(ID), + "alphaCloneName": data[ID]["internalDescription"], + "typeID": skill["typeID"], + "level": skill["level"]}) + + return newData + def convertTraits(data): def convertSection(sectionData): @@ -167,6 +182,8 @@ def main(db, json_path): tableData = convertTraits(tableData) if jsonName == "evetypes": tableData = convertTypes(tableData) + if jsonName == "clonegrades": + tableData = convertClones(tableData) data[jsonName] = tableData # Set with typeIDs which we will have in our database @@ -191,7 +208,10 @@ def main(db, json_path): # Loop through each json file and write it away, checking ignored rows for jsonName, table in data.iteritems(): fieldMap = fieldMapping.get(jsonName, {}) + tmp = [] + print "processing {}".format(jsonName) + for row in table: # We don't care about some kind of rows, filter it out if so if not isIgnored(jsonName, row): @@ -207,6 +227,14 @@ def main(db, json_path): if jsonName is "icons" and "modules/" in str(row["iconFile"]).lower(): row["iconFile"] = row["iconFile"].lower().replace("modules/", "").replace(".png", "") + if jsonName is "clonegrades": + if (row["alphaCloneID"] not in tmp): + cloneParent = eos.gamedata.AlphaClone() + setattr(cloneParent, "alphaCloneID", row["alphaCloneID"]) + setattr(cloneParent, "alphaCloneName", row["alphaCloneName"]) + eos.db.gamedata_session.add(cloneParent) + tmp.append(row['alphaCloneID']) + for k, v in row.iteritems(): if (isinstance(v, basestring)): v = v.strip() diff --git a/scripts/prep_data.py b/scripts/prep_data.py index 5df4d715f..7de1cfdc3 100644 --- a/scripts/prep_data.py +++ b/scripts/prep_data.py @@ -80,7 +80,7 @@ if not args.nojson: list = "dgmexpressions,dgmattribs,dgmeffects,dgmtypeattribs,dgmtypeeffects,"\ "dgmunits,invcategories,invgroups,invmetagroups,invmetatypes,"\ "invtypes,mapbulk_marketGroups,phbmetadata,phbtraits,fsdTypeOverrides,"\ - "evegroups,evetypes,evecategories,mapbulk_marketGroups" + "evegroups,evetypes,evecategories,mapbulk_marketGroups,clonegrades" FlowManager(miners, writers).run(list, "en-us") diff --git a/service/character.py b/service/character.py index d439f1cd4..8e36a2e02 100644 --- a/service/character.py +++ b/service/character.py @@ -205,6 +205,9 @@ class Character(object): def all5ID(self): return self.all5().ID + def getAlphaCloneList(self): + return eos.db.getAlphaCloneList() + def getCharacterList(self): return eos.db.getCharacterList() @@ -250,6 +253,10 @@ class Character(object): skills.append((skill.ID, skill.name)) return skills + def setAlphaClone(self, char, cloneID): + char.alphaCloneID = cloneID + eos.db.commit() + def getSkillDescription(self, itemID): return eos.db.getItem(itemID).description