Merge branch 'feature/strictSkills' into dev
Conflicts: service/character.py Implements strict skill requirement handling
This commit is contained in:
@@ -24,6 +24,8 @@ class PFFittingEnginePref(PreferenceView):
|
||||
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
helpCursor = wx.StockCursor(wx.CURSOR_QUESTION_ARROW)
|
||||
|
||||
self.engine_settings = EOSSettings.getInstance()
|
||||
|
||||
self.stTitle = wx.StaticText(panel, wx.ID_ANY, self.title, wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
@@ -36,8 +38,20 @@ class PFFittingEnginePref(PreferenceView):
|
||||
|
||||
self.cbGlobalForceReload = wx.CheckBox(panel, wx.ID_ANY, u"Factor in reload time when calculating capacitor usage, damage, and tank.",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
|
||||
mainSizer.Add(self.cbGlobalForceReload, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbStrictSkillLevels = wx.CheckBox(panel, wx.ID_ANY,
|
||||
u"Enforce strict skill level requirements",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbStrictSkillLevels.SetCursor(helpCursor)
|
||||
self.cbStrictSkillLevels.SetToolTip(wx.ToolTip(
|
||||
u'When enabled, skills will check their dependencies\' requirements when their levels change and reset ' +
|
||||
u'skills that no longer meet the requirement.\neg: Setting Drones from level V to IV will reset the Heavy ' +
|
||||
u'Drone Operation skill, as that requires Drones V'))
|
||||
|
||||
mainSizer.Add(self.cbStrictSkillLevels, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbUniversalAdaptiveArmorHardener = wx.CheckBox(panel, wx.ID_ANY,
|
||||
u"When damage profile is Uniform, set Reactive Armor " +
|
||||
u"Hardener to match (old behavior).",
|
||||
@@ -73,6 +87,9 @@ class PFFittingEnginePref(PreferenceView):
|
||||
self.cbGlobalForceReload.SetValue(self.sFit.serviceFittingOptions["useGlobalForceReload"])
|
||||
self.cbGlobalForceReload.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalForceReloadStateChange)
|
||||
|
||||
self.cbStrictSkillLevels.SetValue(self.engine_settings.get("strictSkillLevels"))
|
||||
self.cbStrictSkillLevels.Bind(wx.EVT_CHECKBOX, self.OnCBStrictSkillLevelsChange)
|
||||
|
||||
self.cbUniversalAdaptiveArmorHardener.SetValue(self.engine_settings.get("useStaticAdaptiveArmorHardener"))
|
||||
self.cbUniversalAdaptiveArmorHardener.Bind(wx.EVT_CHECKBOX, self.OnCBUniversalAdaptiveArmorHardenerChange)
|
||||
|
||||
@@ -82,6 +99,9 @@ class PFFittingEnginePref(PreferenceView):
|
||||
def OnCBGlobalForceReloadStateChange(self, event):
|
||||
self.sFit.serviceFittingOptions["useGlobalForceReload"] = self.cbGlobalForceReload.GetValue()
|
||||
|
||||
def OnCBStrictSkillLevelsChange(self, event):
|
||||
self.engine_settings.set("strictSkillLevels", self.cbStrictSkillLevels.GetValue())
|
||||
|
||||
def OnCBUniversalAdaptiveArmorHardenerChange(self, event):
|
||||
self.engine_settings.set("useStaticAdaptiveArmorHardener", self.cbUniversalAdaptiveArmorHardener.GetValue())
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ class PFGeneralPref(PreferenceView):
|
||||
self.openFitsSettings = SettingsProvider.getInstance().getSettings("pyfaPrevOpenFits",
|
||||
{"enabled": False, "pyfaOpenFits": []})
|
||||
|
||||
helpCursor = wx.StockCursor(wx.CURSOR_QUESTION_ARROW)
|
||||
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
self.stTitle = wx.StaticText(panel, wx.ID_ANY, self.title, wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
@@ -97,6 +99,7 @@ class PFGeneralPref(PreferenceView):
|
||||
|
||||
self.stMarketDelay = wx.StaticText(panel, wx.ID_ANY, u"Market Search Delay (ms):", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stMarketDelay.Wrap(-1)
|
||||
self.stMarketDelay.SetCursor(helpCursor)
|
||||
self.stMarketDelay.SetToolTip(
|
||||
wx.ToolTip('The delay between a keystroke and the market search. Can help reduce lag when typing fast in the market search box.'))
|
||||
|
||||
|
||||
@@ -435,14 +435,28 @@ class SkillTreeView(wx.Panel):
|
||||
skillID = self.skillTreeListCtrl.GetPyData(selection)
|
||||
|
||||
if level is not None:
|
||||
self.skillTreeListCtrl.SetItemText(selection, "Level %d" % level if isinstance(level, int) else level, 1)
|
||||
sChar.changeLevel(char.ID, skillID, level, persist=True)
|
||||
elif event.Id == self.revertID:
|
||||
sChar.revertLevel(char.ID, skillID)
|
||||
elif event.Id == self.saveID:
|
||||
sChar.saveSkill(char.ID, skillID)
|
||||
|
||||
self.skillTreeListCtrl.SetItemTextColour(selection, None)
|
||||
# After saving the skill, we need to update not just the selected skill, but all open skills due to strict skill
|
||||
# level setting. We don't want to refresh tree, as that will lose all expanded categories and users location
|
||||
# within the tree. Thus, we loop through the tree and refresh the info.
|
||||
child, cookie = self.skillTreeListCtrl.GetFirstChild(self.root)
|
||||
while child.IsOk():
|
||||
# child = Skill category
|
||||
grand, cookie2 = self.skillTreeListCtrl.GetFirstChild(child)
|
||||
while grand.IsOk():
|
||||
# grand = Skill (or "dummy" if not expanded)
|
||||
if self.skillTreeListCtrl.GetItemText(grand) != "dummy":
|
||||
lvl, dirty = sChar.getSkillLevel(char.ID, self.skillTreeListCtrl.GetPyData(grand))
|
||||
self.skillTreeListCtrl.SetItemText(grand, "Level {}".format(lvl) if not isinstance(lvl, basestring) else lvl, 1)
|
||||
if not dirty:
|
||||
self.skillTreeListCtrl.SetItemTextColour(grand, None)
|
||||
grand, cookie2 = self.skillTreeListCtrl.GetNextChild(child, cookie2)
|
||||
child, cookie = self.skillTreeListCtrl.GetNextChild(self.root, cookie)
|
||||
|
||||
dirtySkills = sChar.getDirtySkills(char.ID)
|
||||
dirtyGroups = set([skill.item.group.ID for skill in dirtySkills])
|
||||
|
||||
@@ -191,6 +191,10 @@ class ItemStatsContainer(wx.Panel):
|
||||
self.reqs = ItemRequirements(self.nbContainer, stuff, item)
|
||||
self.nbContainer.AddPage(self.reqs, "Requirements")
|
||||
|
||||
if context == "Skill":
|
||||
self.dependants = ItemDependants(self.nbContainer, stuff, item)
|
||||
self.nbContainer.AddPage(self.dependants, "Dependants")
|
||||
|
||||
self.effects = ItemEffects(self.nbContainer, stuff, item)
|
||||
self.nbContainer.AddPage(self.effects, "Effects")
|
||||
|
||||
@@ -762,6 +766,55 @@ class ItemRequirements(wx.Panel):
|
||||
self.skillIdHistory.append(skill.ID)
|
||||
|
||||
|
||||
class ItemDependants(wx.Panel):
|
||||
def __init__(self, parent, stuff, item):
|
||||
wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL)
|
||||
|
||||
# itemId is set by the parent.
|
||||
self.romanNb = ["0", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"]
|
||||
self.skillIdHistory = []
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
self.reqTree = wx.TreeCtrl(self, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT | wx.NO_BORDER)
|
||||
|
||||
mainSizer.Add(self.reqTree, 1, wx.ALL | wx.EXPAND, 0)
|
||||
|
||||
self.SetSizer(mainSizer)
|
||||
self.root = self.reqTree.AddRoot("WINRARZOR")
|
||||
self.reqTree.SetPyData(self.root, None)
|
||||
|
||||
self.imageList = wx.ImageList(16, 16)
|
||||
self.reqTree.SetImageList(self.imageList)
|
||||
skillBookId = self.imageList.Add(BitmapLoader.getBitmap("skill_small", "gui"))
|
||||
|
||||
self.getFullSkillTree(item, self.root, skillBookId)
|
||||
|
||||
self.Layout()
|
||||
|
||||
def getFullSkillTree(self, parentSkill, parent, sbIconId):
|
||||
levelToItems = {}
|
||||
|
||||
for item, level in parentSkill.requiredFor.iteritems():
|
||||
if level not in levelToItems:
|
||||
levelToItems[level] = []
|
||||
levelToItems[level].append(item)
|
||||
|
||||
for x in sorted(levelToItems.keys()):
|
||||
items = levelToItems[x]
|
||||
items.sort(key=lambda x: x.name)
|
||||
|
||||
child = self.reqTree.AppendItem(parent, "Level {}".format(self.romanNb[int(x)]), sbIconId)
|
||||
for item in items:
|
||||
|
||||
if item.icon:
|
||||
bitmap = BitmapLoader.getBitmap(item.icon.iconFile, "icons")
|
||||
itemIcon = self.imageList.Add(bitmap) if bitmap else -1
|
||||
else:
|
||||
itemIcon = -1
|
||||
|
||||
grand = self.reqTree.AppendItem(child, "{}".format(item.name), itemIcon)
|
||||
|
||||
|
||||
class ItemEffects(wx.Panel):
|
||||
def __init__(self, parent, stuff, item):
|
||||
wx.Panel.__init__(self, parent)
|
||||
|
||||
Reference in New Issue
Block a user