Files
pyfa/savedata/effs_util.py
2018-06-16 04:50:55 -04:00

213 lines
8.6 KiB
Python

from optparse import AmbiguousOptionError, BadOptionError, OptionParser
class PassThroughOptionParser(OptionParser):
def _process_args(self, largs, rargs, values):
while rargs:
try:
OptionParser._process_args(self, largs, rargs, values)
except (BadOptionError, AmbiguousOptionError) as e:
pyfalog.error("Bad startup option passed.")
largs.append(e.opt_str)
usage = "usage: %prog [options]"
parser = PassThroughOptionParser(usage=usage)
parser.add_option(
"-f", "--exportfits", action="store_true", dest="exportfits", \
help="Export this copy of pyfa's local fits to a shipJSON file that Eve Fleet Simulator can import from", \
default=False)
parser.add_option(
"-b", "--exportbaseships", action="store_true", dest="exportbaseships", \
help="Export ship stats to a shipBaseJSON file used by Eve Fleet Simulator", \
default=False)
parser.add_option(
"-c", "--convertfitsfromhtml", action="store_true", dest="convertfitsfromhtml", \
help="Convert an exported pyfaFits.html file to a shipJSON file that Eve Fleet Simulator can import from\n"
+ " Note this process loses data like fleet boosters as the DNA format exported by to html contains limited data", \
default=False)
parser.add_option("-s", "--savepath", action="store", dest="savepath",
help="Set the folder for savedata", default=None)
parser.add_option(
"-o", "--outputpath", action="store", dest="outputpath",
help="Output directory, defaults to the savepath", default=None)
parser.add_option(
'-i', "--search", action="store", dest="search",
help="Ignore ships and fits that don't contain the searched string", default=None)
(options, args) = parser.parse_args()
if options.exportfits:
from effs_export_pyfa_fits import exportPyfaFits
exportPyfaFits(options)
if options.exportbaseships:
from effs_export_base_fits import exportBaseShips
exportBaseShips(options)
if options.convertfitsfromhtml:
from effs_process_html_export import effsFitsFromHTMLExport
effsFitsFromHTMLExport(options)
#stuff bellow this point is purely scrap diagnostic stuff and should not be public (as it's scrawl)
def printGroupData():
from eos.db import gamedata_session
from eos.gamedata import Group, Category
filterVal = Group.categoryID == 6
data = gamedata_session.query(Group).options().list(filter(filterVal).all())
for group in data:
print(group.groupName + ' groupID: ' + str(group.groupID))
return ''
def printSizeData():
from eos.db import gamedata_session
from eos.gamedata import Group
filterVal = Group.categoryID == 6
data = gamedata_session.query(Group).options().filter(filterVal).all()
ships = gamedata_session.query(Group).options().filter(filterVal)
print(data)
print(vars(data[0]))
shipSizes = ['Frigate', 'Destroyer', 'Cruiser', 'Battlecruiser', 'Battleship', 'Capital', 'Industrial', 'Misc']
groupSets = [
[25, 31, 237, 324, 830, 831, 834, 893, 1283, 1527],
[420, 541, 1305, 1534],
[26, 358, 832, 833, 894, 906, 963],
[419, 540, 1201],
[27, 381, 898, 900],
[30, 485, 513, 547, 659, 883, 902, 1538],
[28, 380, 1202, 463, 543, 941],
[29, 1022]
]
i = 0
while i < 8:
groupNames = '\'' + shipSizes[i] + '\': {\'name\': \'' + shipSizes[i] + '\', \'groupIDs\': groupIDFromGroupName(['
for gid in groupSets[i]:
if gid is not groupSets[i][0]:
groupNames = groupNames + '\', '
groupNames = groupNames + '\'' + list(filter(lambda gr: gr.groupID == gid, data))[0].groupName
print(groupNames + '\'], data)}')
i = i + 1
projectedModGroupIds = [
41, 52, 65, 67, 68, 71, 80, 201, 208, 291, 325, 379, 585,
842, 899, 1150, 1154, 1189, 1306, 1672, 1697, 1698, 1815, 1894
]
from eos.db import gamedata_session
from eos.gamedata import Group
data = gamedata_session.query(Group).all()
groupNames = ''
for gid in projectedModGroupIds:
if gid is not projectedModGroupIds[0]:
groupNames = groupNames + '\', '
print(gid)
groupNames = groupNames + '\'' + list(filter(lambda gr: gr.groupID == gid, data))[0].groupName
print(groupNames + '\'')
def wepMultisFromTraitText(fit):
filterVal = Traits.typeID == fit.shipID
data = gamedata_session.query(Traits).options().filter(filterVal).all()
roleBonusMode = False
if len(data) == 0:
return multipliers
d = data[0]
s1 = str(vars(d))
ds = s1.encode(encoding="utf-8", errors="ignore")
#print(ds)
previousTypedBonus = 0
previousDroneTypeBonus = 0
for bonusText in data[0].traitText.splitlines():
bonusText = bonusText.lower()
if 'per skill level' in bonusText:
roleBonusMode = False
if 'role bonus' in bonusText or 'misc bonus' in bonusText:
roleBonusMode = True
multi = 1
if 'damage' in bonusText and not any(e in bonusText for e in ['control', 'heat']):
splitText = bonusText.split('%')
if (float(splitText[0]) > 0) is False:
print('damage bonus split did not parse correctly!')
print(float(splitText[0]))
if roleBonusMode:
addedMulti = float(splitText[0])
else:
addedMulti = float(splitText[0]) * 5
if any(e in bonusText for e in [' em', 'thermal', 'kinetic', 'explosive']):
if addedMulti > previousTypedBonus:
previousTypedBonus = addedMulti
else:
addedMulti = 0
if any(e in bonusText for e in ['heavy drone', 'medium drone', 'light drone', 'sentry drone']):
if addedMulti > previousDroneTypeBonus:
previousDroneTypeBonus = addedMulti
else:
addedMulti = 0
multi = 1 + (addedMulti / 100)
elif 'rate of fire' in bonusText:
splitText = bonusText.split('%')
if (float(splitText[0]) > 0) is False:
print('rate of fire bonus split did not parse correctly!')
print(float(splitText[0]))
if roleBonusMode:
rofMulti = float(splitText[0])
else:
rofMulti = float(splitText[0]) * 5
multi = 1 / (1 - (rofMulti / 100))
if multi > 1:
if 'drone' in bonusText.lower():
multipliers['droneBandwidth'] *= multi
elif 'turret' in bonusText.lower():
multipliers['turret'] *= multi
elif any(e in bonusText for e in ['missile', 'torpedo']):
multipliers['launcher'] *= multi
def examDiff(ai, bi, attr=False):
print('')
print('A:' + str(ai))
print('B:' + str(bi))
a = dict(map(lambda k: (k, getattr(ai, k)), dir(ai)))
b = dict(map(lambda k: (k, getattr(bi, k)), dir(bi)))
try:
print(a.keys())
print('A:' + str(a))
print(b.keys())
print('B:' + str(b))
print('A exclusive keys:')
for key in filter(lambda k: k not in b.keys(), a.keys()):
print(key)
print('B exclusive keys:')
for key in filter(lambda k: k not in a.keys(), b.keys()):
print(key)
print('A key/value pairs where B is None:')
for key in filter(lambda k: k in b.keys() and b[k] == None and a[k] != None, a.keys()):
print(key)
print(a[key])
print('B key/value pairs where A is None:')
for key in filter(lambda k: k in a.keys() and a[k] == None and b[k] != None, b.keys()):
print(key)
print(b[key])
except Exception as e:
if attr == True:
print('Could not print itemModifiedAttributes for a or b')
print(e)
else:
print('Checking itemModifiedAttributes diff')
examDiff(ai.itemModifiedAttributes, bi.itemModifiedAttributes, True)
if attr == False:
print('Checking itemModifiedAttributes diff')
examDiff(ai.itemModifiedAttributes, bi.itemModifiedAttributes, True)
print('')
def groupIDFromGroupName(names, data=None):
# Group data can optionally be passed to the function to improve preformace with repeated calls.
if data is None:
data = gamedata_session.query(Group).all()
returnSingle = False
if not isinstance(names, list):
names = [names]
returnSingle = True
gidList = list(map(lambda incGroup: incGroup.groupID, (filter(lambda group: group.groupName in names, data))))
if returnSingle:
return gidList[0]
return gidList