From 39d2a517afeaeb6b47eb3261805f1935e6183797 Mon Sep 17 00:00:00 2001 From: Jonathan Harris Date: Thu, 25 Feb 2016 00:38:42 +0000 Subject: [PATCH] Update ships and modules from coriolis-data instead of from eddb. Update coriolis-data to 2.02. --- coriolis-data | 2 +- coriolis.py | 126 +++++++++++++++++++++++++++++++++++++++++++++----- eddb.py | 74 ++--------------------------- modules.p | Bin 33948 -> 20543 bytes outfitting.py | 19 ++++---- ships.p | 10 ++-- 6 files changed, 133 insertions(+), 98 deletions(-) mode change 100644 => 100755 coriolis.py diff --git a/coriolis-data b/coriolis-data index 00f8c742..48477d80 160000 --- a/coriolis-data +++ b/coriolis-data @@ -1 +1 @@ -Subproject commit 00f8c7423fac9660884c0eecdea74846dc6c7d53 +Subproject commit 48477d8037af3dc219de0a100878453334d54ddc diff --git a/coriolis.py b/coriolis.py old mode 100644 new mode 100755 index 4a559c15..9dc6af02 --- a/coriolis.py +++ b/coriolis.py @@ -1,4 +1,7 @@ +#!/usr/bin/python +# # Export ship loadout in Coriolis format +# from collections import OrderedDict import cPickle @@ -66,9 +69,10 @@ weaponmount_map = { # Modules that have a name as well as a group bulkheads = outfitting.armour_map.values() -scanners = [x[0] for x in outfitting.misc_internal_map.values()] -countermeasures = [x[0] for x in outfitting.countermeasure_map.values()] -fixup_map = { +fixup_map = {} +fixup_map.update({ x[0] : ('Scanner', x[0]) for x in outfitting.misc_internal_map.values() }) +fixup_map.update({ x[0] : ('Countermeasure', x[0]) for x in outfitting.countermeasure_map.values() }) +fixup_map.update({ 'Advanced Plasma Accelerator' : ('Plasma Accelerator', 'Advanced Plasma Accelerator'), 'Cytoscrambler Burst Laser' : ('Burst Laser', 'Cytoscrambler'), 'Enforcer Cannon' : ('Multi-cannon', 'Enforcer'), @@ -77,10 +81,11 @@ fixup_map = { 'Multi-Cannon' : ('Multi-cannon', None), 'Pacifier Frag-Cannon' : ('Fragment Cannon', 'Pacifier'), 'Pack-Hound Missile Rack' : ('Missile Rack', 'Pack-Hound'), - 'Pulse Disruptor Laser' : ('Pulse Laser', 'Distruptor'), # Note sp - 'Shock Mine Launcher' : ('Mine Launcher', 'Shock Mine Launcher'), # XXX + 'Pulse Disruptor Laser' : ('Pulse Laser', 'Disruptor'), + 'Retributor Beam Laser' : ('Beam Laser', 'Retributor'), + 'Shock Mine Launcher' : ('Mine Launcher', 'Shock Mine Launcher'), 'Standard Docking Computer' : ('Docking Computer', 'Standard Docking Computer'), -} +}) # Ship masses @@ -153,12 +158,6 @@ def export(data, filename=None): if module['name'] in fixup_map: thing['group'], name = fixup_map[module['name']] if name: thing['name'] = name - elif module['name'] in scanners: - thing['group'] = 'Scanner' - thing['name'] = module['name'] - elif module['name'] in countermeasures: - thing['group'] = 'Countermeasure' - thing['name'] = module['name'] else: thing['group'] = module['name'] @@ -226,3 +225,106 @@ def export(data, filename=None): filename = join(config.get('outdir'), '%s.%s.json' % (ship, time.strftime('%Y-%m-%dT%H.%M.%S', time.localtime(querytime)))) with open(filename, 'wt') as h: h.write(string) + + +# +# build ship and module databases from https://github.com/cmmcleod/coriolis-data +# +if __name__ == "__main__": + import json + data = json.load(open('coriolis-data/dist/index.json')) + + # Map Coriolis's names to names displayed in the in-game shipyard + coriolis_ship_map = { + 'Cobra Mk III' : 'Cobra MkIII', + 'Cobra Mk IV' : 'Cobra MkIV', + 'Viper' : 'Viper MkIII', + 'Viper Mk IV' : 'Viper MkIV', + } + + # From https://github.com/cmmcleod/coriolis/blob/master/src/app/shipyard/Constants.js + ModuleGroupToName = { + # Standard + 'pp' : 'Power Plant', + 't' : 'Thrusters', + 'fsd' : 'Frame Shift Drive', + 'ls' : 'Life Support', + 'pd' : 'Power Distributor', + 's' : 'Sensors', + 'ft' : 'Fuel Tank', + 'pas' : 'Planetary Approach Suite', + + # Internal + 'fs' : 'Fuel Scoop', + 'sc' : 'Scanner', + 'am' : 'Auto Field-Maintenance Unit', + 'bsg' : 'Bi-Weave Shield Generator', + 'cr' : 'Cargo Rack', + 'fi' : 'Frame Shift Drive Interdictor', + 'hb' : 'Hatch Breaker Limpet Controller', + 'hr' : 'Hull Reinforcement Package', + 'rf' : 'Refinery', + 'scb' : 'Shield Cell Bank', + 'sg' : 'Shield Generator', + 'pv' : 'Planetary Vehicle Hangar', + 'psg' : 'Prismatic Shield Generator', + 'dc' : 'Docking Computer', + 'fx' : 'Fuel Transfer Limpet Controller', + 'pc' : 'Prospector Limpet Controller', + 'cc' : 'Collector Limpet Controller', + + # Hard Points + 'bl' : 'Beam Laser', + 'ul' : 'Burst Laser', + 'c' : 'Cannon', + 'cs' : 'Cargo Scanner', + 'cm' : 'Countermeasure', + 'fc' : 'Fragment Cannon', + 'ws' : 'Frame Shift Wake Scanner', + 'kw' : 'Kill Warrant Scanner', + 'nl' : 'Mine Launcher', + 'ml' : 'Mining Laser', + 'mr' : 'Missile Rack', + 'pa' : 'Plasma Accelerator', + 'mc' : 'Multi-cannon', + 'pl' : 'Pulse Laser', + 'rg' : 'Rail Gun', + 'sb' : 'Shield Booster', + 'tp' : 'Torpedo Pylon' + }; + + specials = { v:k for k,v in fixup_map.items() } + + ships = {} + modules = {} + + # Ship and armour masses + for m in data['Ships'].values(): + name = coriolis_ship_map.get(m['properties']['name'], str(m['properties']['name'])) + ships[name] = { 'hullMass' : m['properties']['hullMass'] } + for i in range(len(bulkheads)): + modules[(bulkheads[i], name, '1', 'I')] = { 'mass': m['bulkheads'][i]['mass'] } + cPickle.dump(ships, open('ships.p', 'wb'), protocol = cPickle.HIGHEST_PROTOCOL) + + # Module masses + for cat in data['Modules'].values(): + for grp, mlist in cat.iteritems(): + for m in mlist: + key = ('name' in m and specials[(ModuleGroupToName[grp], m['name'])] or specials.get((ModuleGroupToName[grp], None), ModuleGroupToName[grp]), + None, + str(m['class']), + str(m['rating'])) + if key in modules: + # Test our assumption that mount and guidance don't affect mass + assert modules[key]['mass'] == m.get('mass', 0), '%s !=\n%s' % (key, m) + elif grp == 'fsd': + modules[key] = { 'mass' : m['mass'], + 'optmass' : m['optmass'], + 'maxfuel' : m['maxfuel'], + 'fuelmul' : m['fuelmul'], + 'fuelpower' : m['fuelpower'], + } + else: + modules[key] = { 'mass': m.get('mass', 0) } # Some modules don't have mass + cPickle.dump(modules, open('modules.p', 'wb'), protocol = cPickle.HIGHEST_PROTOCOL) + diff --git a/eddb.py b/eddb.py index cc233ed8..003aa67e 100755 --- a/eddb.py +++ b/eddb.py @@ -31,8 +31,9 @@ class EDDB: return (station_id, bool(flags & EDDB.HAS_MARKET), bool(flags & EDDB.HAS_OUTFITTING), bool(flags & EDDB.HAS_SHIPYARD)) -# build databases from files systems.json, stations.json and modules.json from http://eddb.io/api -# and from https://github.com/cmmcleod/coriolis-data +# +# build databases from files systems.json and stations.json from http://eddb.io/api +# if __name__ == "__main__": import json @@ -64,72 +65,3 @@ if __name__ == "__main__": (EDDB.HAS_SHIPYARD if x['has_shipyard'] else 0))) for x in stations]) cPickle.dump(station_ids, open('stations.p', 'wb'), protocol = cPickle.HIGHEST_PROTOCOL) - - - # Map eddb's names to names displayed in the in-game shipyard - eddb_ship_map = { - 'Sidewinder Mk. I' : 'Sidewinder', - 'Eagle Mk. II' : 'Eagle', - 'Cobra Mk. III' : 'Cobra MkIII', - 'Cobra MK IV' : 'Cobra MkIV', - 'Viper Mk III' : 'Viper MkIII', - 'Viper MK IV' : 'Viper MkIV', - } - - # PP modules (see weapon-map in outfitting.py) - specials = { - 'Retributor' : 'Retributor Beam Laser', - 'Pack-Hound' : 'Pack-Hound Missile Rack', - 'Mining Lance' : 'Mining Lance Beam Laser', - 'Enforcer' : 'Enforcer Cannon', - 'Advanced' : 'Advanced Plasma Accelerator', - 'Distruptor' : 'Pulse Disruptor Laser', - 'Cytoscrambler' : 'Cytoscrambler Burst Laser', - 'Imperial Hammer' : 'Imperial Hammer Rail Gun', - 'Pacifier' : 'Pacifier Frag-Cannon', - 'Prismatic' : 'Prismatic Shield Generator', - } - - # Module masses - modules = {} - for m in json.load(open('modules.json')): - # ignore mount and guidance, and convert strings to ascii to save space - key = (specials.get(m['name'], str(m['name'] or m['group']['name'])), - m['ship'] and eddb_ship_map.get(m['ship'], str(m['ship'])), - str(m['class']), - str(m['rating'])) - if key in modules: - # Test our assumption that mount and guidance don't affect mass - assert modules[key]['mass'] == m.get('mass', 0), '%s !=\n%s' % (key, m) - else: - modules[key] = { 'mass': m.get('mass', 0) } # Some modules don't have mass - - # Add FSD data from Coriolis - for m in json.load(open('coriolis-data/components/standard/frame_shift_drive.json')).values(): - key = ('Frame Shift Drive', None, str(m['class']), str(m['rating'])) - assert key in modules, key - modules[key].update({ - 'optmass' : m['optmass'], - 'maxfuel' : m['maxfuel'], - 'fuelmul' : m['fuelmul'], - 'fuelpower' : m['fuelpower'], - }) - cPickle.dump(modules, open('modules.p', 'wb'), protocol = cPickle.HIGHEST_PROTOCOL) - - - # Map Coriolis's names to names displayed in the in-game shipyard - coriolis_ship_map = { - 'Cobra Mk III' : 'Cobra MkIII', - 'Cobra Mk IV' : 'Cobra MkIV', - 'Viper' : 'Viper MkIII', - 'Viper Mk IV' : 'Viper MkIV', - } - - # Ship masses - ships = {} - for f in os.listdir('coriolis-data/ships'): - if not f.endswith('.json'): continue - for m in json.load(open(join('coriolis-data/ships', f))).values(): - ships[coriolis_ship_map.get(m['properties']['name'], str(m['properties']['name']))] = { 'hullMass' : m['properties']['hullMass'] } - cPickle.dump(ships, open('ships.p', 'wb'), protocol = cPickle.HIGHEST_PROTOCOL) - diff --git a/modules.p b/modules.p index 49761e7b605d478284f625327c003f25e2cf98f3..c6358e9c5b6a96c86f87847f5c7ea0dfb8b4af2a 100644 GIT binary patch literal 20543 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 and (name[1],name[4]) or name[1]] if not name[2].startswith('size') or not name[3].startswith('class'): raise AssertionError('%s: Unknown class/rating "%s/%s"' % (module['id'], name[2], name[3])) - new['class'] = name[2][4:] + new['class'] = str(name[2][4:]) new['rating'] = rating_map[name[3][5:]] elif name[0]=='hpt': @@ -319,7 +320,7 @@ def lookup(module, ship_map): raise AssertionError('%s: Unknown module "%s"' % (module['id'], name[1])) if not name[2].startswith('size') or not name[3].startswith('class'): raise AssertionError('%s: Unknown class/rating "%s/%s"' % (module['id'], name[2], name[3])) - new['class'] = name[2][4:] + new['class'] = str(name[2][4:]) new['rating'] = (name[1]=='buggybay' and planet_rating_map or rating_map)[name[3][5:]] # Disposition of fitted modules diff --git a/ships.p b/ships.p index e1a1674b..02a270c1 100644 --- a/ships.p +++ b/ships.p @@ -1,5 +1,5 @@ -€}q(UFederal Assault Ship}qUhullMassqMàsU -Viper MkIVq}qhK¾sUFederal Gunship}qhMDsU Viper MkIIIq}qhK