We now use EFT-style import/exports for damage profiles.
Also, percentages now shown next to damage amount instead of foot (where notifications are going)
This commit is contained in:
@@ -69,23 +69,40 @@ class DamagePattern(object):
|
||||
def importPatterns(cls, text):
|
||||
lines = re.split('[\n\r]+', text)
|
||||
patterns = []
|
||||
numPatterns = 0
|
||||
for line in lines:
|
||||
line = line.split('#',1)[0] # allows for comments
|
||||
name, data = line.rsplit('=',1)
|
||||
name, data = name.strip(), ''.join(data.split()) # whitespace
|
||||
try:
|
||||
if line.strip()[0] == "#": # comments
|
||||
continue
|
||||
line = line.split('#',1)[0] # allows for comments
|
||||
type, data = line.rsplit('=',1)
|
||||
type, data = type.strip(), data.split(',')
|
||||
except:
|
||||
# Data isn't in correct format, continue to next line
|
||||
continue
|
||||
|
||||
if type != "DamageProfile":
|
||||
continue
|
||||
|
||||
numPatterns += 1
|
||||
name, data = data[0], data[1:5]
|
||||
fields = {}
|
||||
for entry in data.split(','):
|
||||
key, val = entry.split(':')
|
||||
fields["%sAmount" % cls.importMap[key.lower()]] = float(val)
|
||||
|
||||
if len(fields) > 0: # Avoid possible blank lines
|
||||
for index, val in enumerate(data):
|
||||
try:
|
||||
fields["%sAmount" % cls.DAMAGE_TYPES[index]] = int(val)
|
||||
except:
|
||||
continue
|
||||
|
||||
if len(fields) == 4: # Avoid possible blank lines
|
||||
print name, fields
|
||||
pattern = DamagePattern(**fields)
|
||||
pattern.name = name
|
||||
pattern.name = name.strip()
|
||||
patterns.append(pattern)
|
||||
return patterns
|
||||
|
||||
EXPORT_FORMAT = "%s = EM:%d, Therm:%d, Kin:%d, Exp:%d\n"
|
||||
return patterns, numPatterns
|
||||
|
||||
EXPORT_FORMAT = "DamageProfile = %s,%d,%d,%d,%d\n"
|
||||
@classmethod
|
||||
def exportPatterns(cls, *patterns):
|
||||
out = ""
|
||||
|
||||
@@ -51,7 +51,6 @@ class TargetResists(object):
|
||||
|
||||
numPatterns += 1
|
||||
name, data = data[0], data[1:5]
|
||||
#print name, data
|
||||
fields = {}
|
||||
|
||||
for index, val in enumerate(data):
|
||||
|
||||
@@ -22,6 +22,7 @@ import bitmapLoader
|
||||
import service
|
||||
from wx.lib.intctrl import IntCtrl
|
||||
from gui.utils.clipboard import toClipboard, fromClipboard
|
||||
from service.damagePattern import ImportError
|
||||
|
||||
###########################################################################
|
||||
## Class DmgPatternEditorDlg
|
||||
@@ -94,9 +95,9 @@ class DmgPatternEditorDlg (wx.Dialog):
|
||||
self.kinbitmap = bitmapLoader.getBitmap("kinetic_big", "icons")
|
||||
self.expbitmap = bitmapLoader.getBitmap("explosive_big", "icons")
|
||||
|
||||
dmgeditSizer = wx.FlexGridSizer(2, 4, 0, 2)
|
||||
dmgeditSizer = wx.FlexGridSizer(2, 6, 0, 2)
|
||||
dmgeditSizer.AddGrowableCol(0)
|
||||
dmgeditSizer.AddGrowableCol(3)
|
||||
dmgeditSizer.AddGrowableCol(5)
|
||||
dmgeditSizer.SetFlexibleDirection(wx.BOTH)
|
||||
dmgeditSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
|
||||
|
||||
@@ -106,18 +107,20 @@ class DmgPatternEditorDlg (wx.Dialog):
|
||||
for i, type in enumerate(self.DAMAGE_TYPES):
|
||||
bmp = wx.StaticBitmap(self, wx.ID_ANY, bitmapLoader.getBitmap("%s_big"%type, "icons"))
|
||||
if i%2:
|
||||
style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx. LEFT
|
||||
border = 25
|
||||
style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT
|
||||
border = 10
|
||||
else:
|
||||
style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT
|
||||
border = 5
|
||||
|
||||
# set text edit
|
||||
setattr(self, "%sEdit"%type, IntCtrl(self, wx.ID_ANY, 0, wx.DefaultPosition, defSize))
|
||||
setattr(self, "%sPerc"%type, wx.StaticText(self, wx.ID_ANY, u"0%"))
|
||||
editObj = getattr(self, "%sEdit"%type)
|
||||
|
||||
dmgeditSizer.Add(bmp, 0, style, border)
|
||||
dmgeditSizer.Add(editObj, 0, wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
dmgeditSizer.Add(getattr(self, "%sPerc"%type), 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
editObj.Bind(wx.EVT_TEXT, self.ValuesUpdated)
|
||||
editObj.SetLimited(True)
|
||||
@@ -131,9 +134,9 @@ class DmgPatternEditorDlg (wx.Dialog):
|
||||
footerSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
perSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
self.stPercentages = wx.StaticText(self, wx.ID_ANY, u"")
|
||||
self.stPercentages.Wrap(-1)
|
||||
perSizer.Add(self.stPercentages, 0, wx.BOTTOM | wx.TOP | wx.LEFT, 5)
|
||||
self.stNotice = wx.StaticText(self, wx.ID_ANY, u"")
|
||||
self.stNotice.Wrap(-1)
|
||||
perSizer.Add(self.stNotice, 0, wx.BOTTOM | wx.TOP | wx.LEFT, 5)
|
||||
|
||||
footerSizer.Add(perSizer, 1, wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
@@ -186,20 +189,13 @@ class DmgPatternEditorDlg (wx.Dialog):
|
||||
return
|
||||
|
||||
p = self.getActivePattern()
|
||||
total = 0
|
||||
total = sum(map(lambda attr: getattr(self, "%sEdit"%attr).GetValue(), self.DAMAGE_TYPES))
|
||||
for type in self.DAMAGE_TYPES:
|
||||
editObj = getattr(self, "%sEdit"%type)
|
||||
percObj = getattr(self, "%sPerc"%type)
|
||||
setattr(p, "%sAmount"%type, editObj.GetValue())
|
||||
total += editObj.GetValue()
|
||||
percObj.SetLabel("%.1f%%"%(float(editObj.GetValue())*100/total if total > 0 else 0))
|
||||
|
||||
format = "EM: %d%%, THERM: %d%%, KIN: %d%%, EXP: %d%%"
|
||||
|
||||
if total > 0:
|
||||
ltext = format % tuple(map(lambda attr: getattr(self, "%sEdit"%attr).GetValue()*100/total, self.DAMAGE_TYPES))
|
||||
else:
|
||||
ltext = format % (0, 0, 0, 0)
|
||||
|
||||
self.stPercentages.SetLabel(ltext)
|
||||
self.totSizer.Layout()
|
||||
|
||||
if event is not None:
|
||||
@@ -229,6 +225,7 @@ class DmgPatternEditorDlg (wx.Dialog):
|
||||
|
||||
def patternChanged(self, event=None):
|
||||
p = self.getActivePattern()
|
||||
|
||||
if p is None:
|
||||
return
|
||||
|
||||
@@ -285,16 +282,16 @@ class DmgPatternEditorDlg (wx.Dialog):
|
||||
|
||||
def processRename(self, event):
|
||||
newName = self.namePicker.GetLineText(0)
|
||||
self.stPercentages.SetLabel("")
|
||||
self.stNotice.SetLabel("")
|
||||
|
||||
p = self.getActivePattern()
|
||||
for pattern in self.choices:
|
||||
if pattern.name == newName and p != pattern:
|
||||
self.stPercentages.SetLabel("Name already used, please choose another")
|
||||
self.stNotice.SetLabel("Name already used, please choose another")
|
||||
return
|
||||
|
||||
if newName == "":
|
||||
self.stPercentages.SetLabel("Invalid name.")
|
||||
self.stNotice.SetLabel("Invalid name.")
|
||||
return
|
||||
|
||||
sDP = service.DamagePattern.getInstance()
|
||||
@@ -338,16 +335,42 @@ class DmgPatternEditorDlg (wx.Dialog):
|
||||
def __del__( self ):
|
||||
pass
|
||||
|
||||
def updateChoices(self):
|
||||
"Gathers list of patterns and updates choice selections"
|
||||
sDP = service.DamagePattern.getInstance()
|
||||
self.choices = sDP.getDamagePatternList()
|
||||
|
||||
for dp in self.choices:
|
||||
if dp.name == "Selected Ammo": # don't include this special butterfly
|
||||
self.choices.remove(dp)
|
||||
|
||||
# Sort the remaining list and continue on
|
||||
self.choices.sort(key=lambda p: p.name)
|
||||
self.ccDmgPattern.Clear()
|
||||
|
||||
for choice in map(lambda p: p.name, self.choices):
|
||||
self.ccDmgPattern.Append(choice)
|
||||
|
||||
self.ccDmgPattern.SetSelection(0)
|
||||
self.patternChanged()
|
||||
|
||||
def importPatterns(self, event):
|
||||
text = fromClipboard()
|
||||
if text:
|
||||
sDP = service.DamagePattern.getInstance()
|
||||
sDP.importPatterns(text)
|
||||
self.stPercentages.SetLabel("Patterns imported from clipboard")
|
||||
try:
|
||||
sDP.importPatterns(text)
|
||||
self.stNotice.SetLabel("Patterns successfully imported from clipboard")
|
||||
except service.damagePattern.ImportError, e:
|
||||
self.stNotice.SetLabel(str(e))
|
||||
except Exception, e:
|
||||
self.stNotice.SetLabel("Could not import from clipboard: unknown errors")
|
||||
finally:
|
||||
self.updateChoices()
|
||||
else:
|
||||
self.stPercentages.SetLabel("Could not import from clipboard")
|
||||
self.stNotice.SetLabel("Could not import from clipboard")
|
||||
|
||||
def exportPatterns(self, event):
|
||||
sDP = service.DamagePattern.getInstance()
|
||||
toClipboard( sDP.exportPatterns() )
|
||||
self.stPercentages.SetLabel("Patterns exported to clipboard")
|
||||
self.stNotice.SetLabel("Patterns exported to clipboard")
|
||||
|
||||
@@ -56,7 +56,7 @@ class ResistsEditorDlg (wx.Dialog):
|
||||
self.btnSave.Bind(wx.EVT_BUTTON, self.processRename)
|
||||
|
||||
size = None
|
||||
headerSizer.Add(self.ccResists, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT|wx.LEFT, 3)
|
||||
headerSizer.Add(self.ccResists, 1, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.LEFT, 3)
|
||||
|
||||
buttons = (("new", wx.ART_NEW),
|
||||
("rename", bitmapLoader.getBitmap("rename", "icons")),
|
||||
@@ -95,7 +95,7 @@ class ResistsEditorDlg (wx.Dialog):
|
||||
|
||||
for i, type in enumerate(self.DAMAGE_TYPES):
|
||||
if i%2:
|
||||
style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx. LEFT
|
||||
style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT
|
||||
border = 25
|
||||
else:
|
||||
style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT
|
||||
@@ -197,7 +197,6 @@ class ResistsEditorDlg (wx.Dialog):
|
||||
# if everything checks out, set resist attribute
|
||||
setattr(p, "%sAmount"%type, value/100)
|
||||
|
||||
self.stNotice.SetLabel("")
|
||||
self.totSizer.Layout()
|
||||
|
||||
if event is not None:
|
||||
|
||||
@@ -21,6 +21,9 @@ import eos.db
|
||||
import eos.types
|
||||
import copy
|
||||
|
||||
class ImportError(Exception):
|
||||
pass
|
||||
|
||||
class DamagePattern():
|
||||
instance = None
|
||||
@classmethod
|
||||
@@ -68,17 +71,21 @@ class DamagePattern():
|
||||
current = self.getDamagePatternList()
|
||||
for pattern in current:
|
||||
lookup[pattern.name] = pattern
|
||||
try:
|
||||
imports = eos.types.DamagePattern.importPatterns(text)
|
||||
for pattern in imports:
|
||||
if pattern.name in lookup:
|
||||
match = lookup[pattern.name]
|
||||
match.__dict__.update(pattern.__dict__)
|
||||
else:
|
||||
eos.db.save(pattern)
|
||||
eos.db.commit()
|
||||
except:
|
||||
pass
|
||||
|
||||
imports, num = eos.types.DamagePattern.importPatterns(text)
|
||||
for pattern in imports:
|
||||
if pattern.name in lookup:
|
||||
match = lookup[pattern.name]
|
||||
match.__dict__.update(pattern.__dict__)
|
||||
else:
|
||||
eos.db.save(pattern)
|
||||
eos.db.commit()
|
||||
|
||||
lenImports = len(imports)
|
||||
if lenImports == 0:
|
||||
raise ImportError("No patterns found for import")
|
||||
if lenImports != num:
|
||||
raise ImportError("%d patterns imported from clipboard; %d had errors"%(num, num-lenImports))
|
||||
|
||||
def exportPatterns(self):
|
||||
patterns = self.getDamagePatternList()
|
||||
|
||||
Reference in New Issue
Block a user