From aec9202be1eedaf540b92af7bbb7dca9d9c6c050 Mon Sep 17 00:00:00 2001 From: Maru Maru Date: Thu, 5 Apr 2018 02:24:44 -0400 Subject: [PATCH] added more data to effs exports, including module names. --- effs_stat_export.py | 292 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 265 insertions(+), 27 deletions(-) diff --git a/effs_stat_export.py b/effs_stat_export.py index 3ce41e9b6..411fdbb86 100755 --- a/effs_stat_export.py +++ b/effs_stat_export.py @@ -97,9 +97,9 @@ skirmishLinkShip = eos.db.searchFits('skirmish links')[0] import json def processExportedHtml(fileLocation): - output = open('./jsonShipStatExport.js', 'w') + output = open('./shipJSON.js', 'w') output.write('let shipJSON = JSON.stringify([') - outputBaseline = open('./jsonShipBaseStatExport.js', 'w') + outputBaseline = open('./shipBaseJSON.js', 'w') outputBaseline.write('let shipBaseJSON = JSON.stringify([') shipCata = eos.db.getItemsByCategory('Ship') #shipCata = eos.db.getItem(638) @@ -158,21 +158,19 @@ def processExportedHtml(fileLocation): print 'Not a list of dicts' #print vars(shipCata._sa_instance_state) - baseLimit = 500 + baseLimit = 0 baseN = 0 + nameReqBase = ''; for ship in iter(shipCata): - if baseN < baseLimit: - #print ship - #print ship.ID - #print ship.categoryName - #print vars(ship) + if baseN < baseLimit and nameReqBase in ship.name: dna = str(ship.ID) stats = setFitFromString(dna, ship.name, ship.groupID) outputBaseline.write(stats) outputBaseline.write(',\n') baseN += 1; - limit = 500 + limit = 0 skipTill = 0 + nameReq = '' n = 0 try: with open('pyfaFits.html'): @@ -191,7 +189,17 @@ def processExportedHtml(fileLocation): fileLocation = '../../.pyfa/pyfaFits.html' except: fileLocation = None; - if fileLocation != None: + fitList = eos.db.getFitList() + with open(fileLocation) as f: + for fit in fitList: + if limit == None or n < limit: + n += 1 + name = fit.ship.name + ': ' + fit.name + if n >= skipTill and nameReq in name: + stats = parseNeededFitDetails(fit, 0) + output.write(stats) + output.write(',\n') + if False and fileLocation != None: with open(fileLocation) as f: for fullLine in f: if limit == None or n < limit: @@ -201,7 +209,7 @@ def processExportedHtml(fileLocation): endInd = line.find('::') dna = line[0:endInd] name = line[line.find('>') + 1:line.find('<')] - if n >= skipTill: + if n >= skipTill and nameReq in name: print 'name: ' + name + ' DNA: ' + dna stats = setFitFromString(dna, name, 0) output.write(stats) @@ -210,19 +218,227 @@ def processExportedHtml(fileLocation): output.close() outputBaseline.write(']);\nexport {shipBaseJSON};') outputBaseline.close() +def attrDirectMap(values, target, source): + for val in values: + target[val] = source.itemModifiedAttributes[val] def parseNeededFitDetails(fit, groupID): singleRunPrintPreformed = False weaponSystems = [] groups = {} - #help(fit.modules) - #help(fit.modules[0]) + moduleNames = [] + fitID = fit.ID + if len(fit.modules) > 0: + fit.name = fit.ship.name + ': ' + fit.name + print '' + print 'name: ' + fit.name + fitL = Fit() + fitL.recalc(fit) + fit = eos.db.getFit(fitID) + if False: + from eos.db import gamedata_session + from eos.gamedata import Group, Category + filterVal = Group.categoryID == 6 + data = gamedata_session.query(Group).options().filter(filterVal).all() + for group in data: + print group.groupName + ' groupID: ' + str(group.groupID) + #print group.categoryName + ' categoryID: ' + str(group.categoryID) + ', published: ' + str(group.published) + #print vars(group) + #print '' + return '' + 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 + ] + projectedMods = filter(lambda mod: mod.item and mod.item.groupID in projectedModGroupIds, fit.modules) + + unpropedSpeed = fit.maxSpeed + unpropedSig = fit.ship.itemModifiedAttributes['signatureRadius'] + usingMWD = False + propMods = filter(lambda mod: mod.item and mod.item.groupID in [46], fit.modules) + possibleMWD = filter(lambda mod: 'signatureRadiusBonus' in mod.item.attributes, propMods) + if len(possibleMWD) > 0 and possibleMWD[0].state > 0: + mwd = possibleMWD[0] + oldMwdState = mwd.state + mwd.state = 0 + fitL.recalc(fit) + fit = eos.db.getFit(fitID) + unpropedSpeed = fit.maxSpeed + unpropedSig = fit.ship.itemModifiedAttributes['signatureRadius'] + mwd.state = oldMwdState + fitL.recalc(fit) + fit = eos.db.getFit(fitID) + usingMWD = True + + print fit.ship.itemModifiedAttributes['rigSize'] + print propMods + mwdPropSpeed = fit.maxSpeed + if groupID > 0: + propID = None + rigSize = fit.ship.itemModifiedAttributes['rigSize'] + if rigSize == 1 and fit.ship.itemModifiedAttributes['medSlots'] > 0: + propID = 440 + elif rigSize == 2 and fit.ship.itemModifiedAttributes['medSlots'] > 0: + propID = 12076 + elif rigSize == 3 and fit.ship.itemModifiedAttributes['medSlots'] > 0: + propID = 12084 + elif rigSize == 4 and fit.ship.itemModifiedAttributes['medSlots'] > 0: + if fit.ship.itemModifiedAttributes['powerOutput'] > 60000: + propID = 41253 + else: + propID = 12084 + elif rigSize == None and fit.ship.itemModifiedAttributes['medSlots'] > 0: + propID = 440 + if propID: + fitL.appendModule(fitID, propID) + fitL.recalc(fit) + fit = eos.db.getFit(fitID) + mwdPropSpeed = fit.maxSpeed + mwdPosition = filter(lambda mod: mod.item and mod.item.ID == propID, fit.modules)[0].position + fitL.removeModule(fitID, mwdPosition) + fitL.recalc(fit) + fit = eos.db.getFit(fitID) + + projections = [] + for mod in projectedMods: + stats = {} + if mod.item.groupID == 65 or mod.item.groupID == 1672: + stats['type'] = 'Stasis Web' + stats['optimal'] = mod.itemModifiedAttributes['maxRange'] + attrDirectMap(['duration', 'speedFactor'], stats, mod) + elif mod.item.groupID == 291: + stats['type'] = 'Weapon Disruptor' + stats['optimal'] = mod.itemModifiedAttributes['maxRange'] + stats['falloff'] = mod.itemModifiedAttributes['falloffEffectiveness'] + attrDirectMap([ + 'trackingSpeedBonus', 'maxRangeBonus', 'falloffBonus', 'aoeCloudSizeBonus',\ + 'aoeVelocityBonus', 'missileVelocityBonus', 'explosionDelayBonus'\ + ], stats, mod) + elif mod.item.groupID == 68: + stats['type'] = 'Energy Nosferatu' + attrDirectMap(['powerTransferAmount', 'energyNeutralizerSignatureResolution'], stats, mod) + elif mod.item.groupID == 71: + stats['type'] = 'Energy Neutralizer' + attrDirectMap([ + 'energyNeutralizerSignatureResolution','entityCapacitorLevelModifierSmall',\ + 'entityCapacitorLevelModifierMedium', 'entityCapacitorLevelModifierLarge',\ + 'energyNeutralizerAmount'\ + ], stats, mod) + elif mod.item.groupID == 41 or mod.item.groupID == 1697: + stats['type'] = 'Remote Shield Booster' + attrDirectMap(['shieldBonus'], stats, mod) + elif mod.item.groupID == 325 or mod.item.groupID == 1698: + stats['type'] = 'Remote Armor Repairer' + attrDirectMap(['armorDamageAmount'], stats, mod) + elif mod.item.groupID == 52: + stats['type'] = 'Warp Scrambler' + attrDirectMap(['activationBlockedStrenght', 'warpScrambleStrength'], stats, mod) + elif mod.item.groupID == 379: + stats['type'] = 'Target Painter' + attrDirectMap(['signatureRadiusBonus'], stats, mod) + elif mod.item.groupID == 208: + stats['type'] = 'Sensor Dampener' + attrDirectMap(['maxTargetRangeBonus', 'scanResolutionBonus'], stats, mod) + elif mod.item.groupID == 201: + stats['type'] = 'ECM' + attrDirectMap([ + 'scanGravimetricStrengthBonus', 'scanMagnetometricStrengthBonus',\ + 'scanRadarStrengthBonus', 'scanLadarStrengthBonus',\ + ], stats, mod) + elif mod.item.groupID == 80: + stats['type'] = 'Burst Jammer' + mod.itemModifiedAttributes['maxRange'] = mod.itemModifiedAttributes['ecmBurstRange'] + attrDirectMap([ + 'scanGravimetricStrengthBonus', 'scanMagnetometricStrengthBonus',\ + 'scanRadarStrengthBonus', 'scanLadarStrengthBonus',\ + ], stats, mod) + elif mod.item.groupID == 1189: + stats['type'] = 'Micro Jump Drive' + mod.itemModifiedAttributes['maxRange'] = 0 + attrDirectMap(['moduleReactivationDelay'], stats, mod) + if mod.itemModifiedAttributes['maxRange'] == None: + print mod.item.name + print mod.itemModifiedAttributes.items() + raise ValueError('Projected module lacks a maxRange') + stats['optimal'] = mod.itemModifiedAttributes['maxRange'] + stats['falloff'] = mod.itemModifiedAttributes['falloffEffectiveness'] or 0 + attrDirectMap(['duration', 'capacitorNeed'], stats, mod) + projections.append(stats) + #print '' + #print stats + #print mod.item.name + #print mod.itemModifiedAttributes.items() + #print '' + #print vars(mod.item) + #print vars(web.itemModifiedAttributes) + #print vars(fit.modules) + #print vars(fit.modules[0]) + highSlotNames = [] + midSlotNames = [] + lowSlotNames = [] + rigSlotNames = [] + miscSlotNames = [] #subsystems ect for mod in fit.modules: + if mod.slot == 3: + modSlotNames = highSlotNames + elif mod.slot == 2: + modSlotNames = midSlotNames + elif mod.slot == 1: + modSlotNames = lowSlotNames + elif mod.slot == 4: + modSlotNames = rigSlotNames + elif mod.slot == 5: + modSlotNames = miscSlotNames + try: + if mod.item != None: + if mod.charge != None: + modSlotNames.append(mod.item.name + ': ' + mod.charge.name) + else: + modSlotNames.append(mod.item.name) + else: + modSlotNames.append('Empty Slot') + except: + print vars(mod) + print 'could not find name for module' + print fit.modules if mod.dps > 0: keystr = str(mod.itemID) + '-' + str(mod.chargeID) if keystr in groups: groups[keystr][1] += 1 else: groups[keystr] = [mod, 1] + for modInfo in [['High Slots:'], highSlotNames, ['', 'Med Slots:'], midSlotNames, ['', 'Low Slots:'], lowSlotNames, ['', 'Rig Slots:'], rigSlotNames]: + moduleNames.extend(modInfo) + if len(miscSlotNames) > 0: + moduleNames.append('') + moduleNames.append('Subsystems:') + moduleNames.extend(miscSlotNames) + droneNames = [] + fighterNames = [] + for drone in fit.drones: + if drone.amountActive > 0: + droneNames.append(drone.item.name) + for fighter in fit.fighters: + if fighter.amountActive > 0: + fighterNames.append(fighter.item.name) + if len(droneNames) > 0: + moduleNames.append('') + moduleNames.append('Drones:') + moduleNames.extend(droneNames) + if len(fighterNames) > 0: + moduleNames.append('') + moduleNames.append('Fighters:') + moduleNames.extend(fighterNames) + if len(fit.implants) > 0: + moduleNames.append('') + moduleNames.append('Implants:') + for implant in fit.implants: + moduleNames.append(implant.item.name) + if len(fit.commandFits) > 0: + moduleNames.append('') + moduleNames.append('Command Fits:') + for commandFit in fit.commandFits: + moduleNames.append(commandFit.name) + for wepGroup in groups: stats = groups[wepGroup][0] c = groups[wepGroup][1] @@ -268,7 +484,6 @@ def parseNeededFitDetails(fit, groupID): } weaponSystems.append(statDict) for fighter in fit.fighters: - print vars(fighter) if fighter.dps[0] > 0 and fighter.amountActive > 0: abilities = [] #for ability in fighter.abilities: @@ -313,32 +528,46 @@ def parseNeededFitDetails(fit, groupID): effectiveDroneBandwidth = droneBandwidth from eos.db import gamedata_session from eos.gamedata import Traits - filter = Traits.typeID == fit.shipID - data = gamedata_session.query(Traits).options().filter(filter).all() + filterVal = Traits.typeID == fit.shipID + data = gamedata_session.query(Traits).options().filter(filterVal).all() roleBonusMode = False if len(data) != 0: - print data[0].traitText + #print data[0].traitText + previousTypedBonus = 0 + previousDroneTypeBonus = 0 for bonusText in data[0].traitText.splitlines(): bonusText = bonusText.lower() #print 'bonus text line: ' + bonusText if 'per skill level' in bonusText: roleBonusMode = False - if 'role bonus' in bonusText: + if 'role bonus' in bonusText or 'misc bonus' in bonusText: roleBonusMode = True multi = 1 - if 'damage' in bonusText and not 'control' in bonusText: + if 'damage' in bonusText and not any(e in bonusText for e in ['control', 'heat']):#'control' in bonusText and not 'heat' in bonusText: splitText = bonusText.split('%') - if float(splitText[0]) > 0 == False: - pyfalog.error('damage bonus split did not parse correctly!') + if (float(splitText[0]) > 0) == 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 splitText[0] > 0 == False: - pyfalog.error('rate of fire bonus split did not parse correctly!') + if (float(splitText[0]) > 0) == False: + print 'rate of fire bonus split did not parse correctly!' + print float(splitText[0]) if roleBonusMode: rofMulti = float(splitText[0]) else: @@ -349,8 +578,11 @@ def parseNeededFitDetails(fit, groupID): effectiveDroneBandwidth *= multi elif 'turret' in bonusText.lower(): effectiveTurretSlots *= multi - elif 'missile' in bonusText.lower(): + elif any(e in bonusText for e in ['missile', 'torpedo']): effectiveLauncherSlots *= multi + if groupID == 485: + effectiveTurretSlots *= 9.4 + effectiveLauncherSlots *= 15 effectiveTurretSlots = round(effectiveTurretSlots, 2); effectiveLauncherSlots = round(effectiveLauncherSlots, 2); effectiveDroneBandwidth = round(effectiveDroneBandwidth, 2); @@ -394,7 +626,10 @@ def parseNeededFitDetails(fit, groupID): 'turretSlots': fit.ship.itemModifiedAttributes['turretSlotsLeft'], 'launcherSlots': fit.ship.itemModifiedAttributes['launcherSlotsLeft'],\ 'powerOutput': fit.ship.itemModifiedAttributes['powerOutput'], 'rigSize': fit.ship.itemModifiedAttributes['rigSize'],\ 'effectiveTurrets': effectiveTurretSlots, 'effectiveLaunchers': effectiveLauncherSlots, 'effectiveDroneBandwidth': effectiveDroneBandwidth,\ - 'resonance': resonance, 'typeID': fit.shipID, 'groupID': groupID, 'shipSize': shipSize\ + 'resonance': resonance, 'typeID': fit.shipID, 'groupID': groupID, 'shipSize': shipSize,\ + 'droneControlRange': fit.ship.itemModifiedAttributes['droneControlRange'], 'mass': fit.ship.itemModifiedAttributes['mass'],\ + 'moduleNames': moduleNames, 'projections': projections, 'unpropedSpeed': unpropedSpeed, 'unpropedSig': unpropedSig,\ + 'usingMWD': usingMWD, 'mwdPropSpeed': mwdPropSpeed } except TypeError: print 'Error parsing fit:' + str(fit) @@ -409,6 +644,9 @@ def parseNeededFitDetails(fit, groupID): return stringified def setFitFromString(dnaString, fitName, groupID) : modArray = dnaString.split(':') + additionalModeFit = '' + #if groupID == 485 and len(modArray) == 1: + #additionalModeFit = ',\n' + setFitFromString(dnaString + ':4292', fitName + ' (Sieged)', groupID) fitL = Fit() print modArray[0] fitID = fitL.newFit(int(modArray[0]), fitName) @@ -457,7 +695,7 @@ def setFitFromString(dnaString, fitName, groupID) : abilityAltRef.active = True fitL.recalc(fit) fit = eos.db.getFit(fitID) - #print fit.modules + print filter(lambda mod: mod.item.groupID in [1189, 658], fit.modules) #fit.calculateWeaponStats() fitL.addCommandFit(fit.ID, armorLinkShip) fitL.addCommandFit(fit.ID, shieldLinkShip) @@ -468,7 +706,7 @@ def setFitFromString(dnaString, fitName, groupID) : #print vars(fit.ship._Ship__item) #help(fit) Fit.deleteFit(fitID) - return jsonStr + return jsonStr + additionalModeFit launchUI = False #launchUI = True if launchUI == False: