1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-06-05 18:03:17 +03:00

Add 3.1 ships and modules

This commit is contained in:
Jonathan Harris 2018-07-08 01:04:04 +01:00
parent 9947e9a919
commit 9ced79f077
7 changed files with 5895 additions and 7432 deletions

View File

@ -62,6 +62,7 @@ ship_map = {
'hauler' : 'Hauler', 'hauler' : 'Hauler',
'independant_trader' : 'Keelback', 'independant_trader' : 'Keelback',
'independent_fighter' : 'Taipan Fighter', 'independent_fighter' : 'Taipan Fighter',
'krait_mkii' : 'Krait MkII',
'orca' : 'Orca', 'orca' : 'Orca',
'python' : 'Python', 'python' : 'Python',
'scout' : 'Taipan Fighter', 'scout' : 'Taipan Fighter',
@ -72,6 +73,7 @@ ship_map = {
'type9' : 'Type-9 Heavy', 'type9' : 'Type-9 Heavy',
'type9_military' : 'Type-10 Defender', 'type9_military' : 'Type-10 Defender',
'typex' : 'Alliance Chieftain', 'typex' : 'Alliance Chieftain',
'typex_3' : 'Alliance Challenger',
'viper' : 'Viper MkIII', 'viper' : 'Viper MkIII',
'viper_mkiv' : 'Viper MkIV', 'viper_mkiv' : 'Viper MkIV',
'vulture' : 'Vulture', 'vulture' : 'Vulture',

@ -1 +1 @@
Subproject commit 44d57f26a8099cfa8d91815f453c7bba303a63ec Subproject commit 35473b30d391975dc4a00e0ab2dc0e8611cce268

View File

@ -16,32 +16,6 @@ import companion
if __name__ == "__main__": if __name__ == "__main__":
data = json.load(open('coriolis-data/dist/index.json')) data = json.load(open('coriolis-data/dist/index.json'))
bulkheads = outfitting.armour_map.values()
# Modules that have a name as well as a group
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'),
'Corrosion Resistant Cargo Rack': ('Cargo Rack', 'Corrosion Resistant'),
'Cytoscrambler Burst Laser' : ('Burst Laser', 'Cytoscrambler'),
'Enforcer Cannon' : ('Multi-cannon', 'Enforcer'),
'Enhanced Performance Thrusters': ('Thrusters', 'Enhanced Performance'),
'Imperial Hammer Rail Gun' : ('Rail Gun', 'Imperial Hammer'),
'Luxury Class Passenger Cabin' : ('Luxury Passenger Cabin', None),
'Mining Lance Beam Laser' : ('Mining Laser', 'Mining Lance'),
'Multi-Cannon' : ('Multi-cannon', None),
'Pacifier Frag-Cannon' : ('Fragment Cannon', 'Pacifier'),
'Pack-Hound Missile Rack' : ('Missile Rack', 'Pack-Hound'),
'Pulse Disruptor Laser' : ('Pulse Laser', 'Disruptor'),
'Retributor Beam Laser' : ('Beam Laser', 'Retributor'),
'Rocket Propelled FSD Disruptor': ('Missile Rack', 'Rocket Propelled FSD Disruptor'),
'Shock Mine Launcher' : ('Mine Launcher', 'Shock Mine Launcher'),
'Standard Docking Computer' : ('Docking Computer', 'Standard Docking Computer'),
})
specials = { v:k for k,v in fixup_map.items() }
# Map Coriolis's names to names displayed in the in-game shipyard # Map Coriolis's names to names displayed in the in-game shipyard
coriolis_ship_map = { coriolis_ship_map = {
'Cobra Mk III' : 'Cobra MkIII', 'Cobra Mk III' : 'Cobra MkIII',
@ -50,73 +24,10 @@ if __name__ == "__main__":
'Viper Mk IV' : 'Viper MkIV', 'Viper Mk IV' : 'Viper MkIV',
} }
# From https://github.com/EDCD/coriolis/blob/master/src/app/shipyard/Constants.js # Symbolic name from in-game name
ModuleGroupToName = { reverse_ship_map = {v: k for k, v in companion.ship_map.iteritems()}
# 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 bulkheads = outfitting.armour_map.keys()
'fs' : 'Fuel Scoop',
'sc' : 'Scanner',
'am' : 'Auto Field-Maintenance Unit',
'bsg' : 'Bi-Weave Shield Generator',
'cr' : 'Cargo Rack',
'fh' : 'Fighter Hangar',
'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',
'mrp' : 'Module Reinforcement Package',
'pc' : 'Prospector Limpet Controller',
'pce' : 'Economy Class Passenger Cabin',
'pci' : 'Business Class Passenger Cabin',
'pcm' : 'First Class Passenger Cabin',
'pcq' : 'Luxury Passenger Cabin',
'cc' : 'Collector Limpet Controller',
'rpl' : 'Repair Limpet Controller',
'ss' : 'Detailed Surface Scanner',
# Hard Points
'bl' : 'Beam Laser',
'ul' : 'Burst Laser',
'c' : 'Cannon',
'ch' : 'Chaff Launcher',
'cs' : 'Cargo Scanner',
'cm' : 'Countermeasure',
'ec' : 'Electronic Countermeasure',
'fc' : 'Fragment Cannon',
'rfl' : 'Remote Release Flak Launcher',
'hs' : 'Heat Sink Launcher',
'ws' : 'Frame Shift Wake Scanner',
'kw' : 'Kill Warrant Scanner',
'nl' : 'Mine Launcher',
'ml' : 'Mining Laser',
'mr' : 'Missile Rack',
'axmr': 'AX Missile Rack',
'pa' : 'Plasma Accelerator',
'po' : 'Point Defence',
'mc' : 'Multi-cannon',
'axmc': 'AX Multi-Cannon',
'pl' : 'Pulse Laser',
'rg' : 'Rail Gun',
'sb' : 'Shield Booster',
'tp' : 'Torpedo Pylon',
'sfn' : 'Shutdown Field Neutraliser',
'xs' : 'Xeno Scanner',
};
ships = {} ships = {}
modules = {} modules = {}
@ -124,9 +35,10 @@ if __name__ == "__main__":
# Ship and armour masses # Ship and armour masses
for m in data['Ships'].values(): for m in data['Ships'].values():
name = coriolis_ship_map.get(m['properties']['name'], str(m['properties']['name'])) name = coriolis_ship_map.get(m['properties']['name'], str(m['properties']['name']))
assert name in reverse_ship_map, name
ships[name] = { 'hullMass' : m['properties']['hullMass'] } ships[name] = { 'hullMass' : m['properties']['hullMass'] }
for i in range(len(bulkheads)): for i in range(len(bulkheads)):
modules[(bulkheads[i], name, '1', 'I')] = { 'mass': m['bulkheads'][i]['mass'] } modules['_'.join([reverse_ship_map[name], 'armour', bulkheads[i]])] = { 'mass': m['bulkheads'][i]['mass'] }
ships = OrderedDict([(k,ships[k]) for k in sorted(ships)]) # sort for easier diffing ships = OrderedDict([(k,ships[k]) for k in sorted(ships)]) # sort for easier diffing
cPickle.dump(ships, open('ships.p', 'wb')) cPickle.dump(ships, open('ships.p', 'wb'))
@ -135,14 +47,9 @@ if __name__ == "__main__":
for cat in data['Modules'].values(): for cat in data['Modules'].values():
for grp, mlist in cat.iteritems(): for grp, mlist in cat.iteritems():
for m in mlist: for m in mlist:
key = (specials.get((ModuleGroupToName[grp], m.get('name'))) or ModuleGroupToName[grp], assert 'symbol' in m, m
None, key = str(m['symbol'].lower())
str(m['class']), if grp == 'fsd':
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] = { modules[key] = {
'mass' : m['mass'], 'mass' : m['mass'],
'optmass' : m['optmass'], 'optmass' : m['optmass'],
@ -150,32 +57,42 @@ if __name__ == "__main__":
'fuelmul' : m['fuelmul'], 'fuelmul' : m['fuelmul'],
'fuelpower' : m['fuelpower'], 'fuelpower' : m['fuelpower'],
} }
elif grp == 'gfsb':
modules[key] = {
'mass' : m['mass'],
'jumpboost' : m['jumpboost'],
}
else: else:
modules[key] = { 'mass': m.get('mass', 0) } # Some modules don't have mass modules[key] = { 'mass': m.get('mass', 0) } # Some modules don't have mass
# 3.0 additions not yet present in coriolis-data # 3.0 / 3.1 additions not yet present in coriolis-data
for k in modules.keys(): for k in modules.keys():
if k[0] == 'Module Reinforcement Package': if k.startswith('int_hullreinforcement_'):
modules[('Meta Alloy Hull Reinforcement',) + k[1:]] = modules[k] modules['int_guardianhullreinforcement_' + k[22:]] = modules[k]
modules[('Decontamination Limpet Controller', None, '1', 'E')] = {'mass': 1.3} modules['int_metaalloyhullreinforcement_' + k[22:]] = modules[k]
modules[('Decontamination Limpet Controller', None, '3', 'E')] = {'mass': 2} modules['int_guardianmodulereinforcement_' + k[22:]] = modules[k]
modules[('Decontamination Limpet Controller', None, '5', 'E')] = {'mass': 20} modules['hpt_causticmissile_fixed_medium'] = {'mass': 4}
modules[('Decontamination Limpet Controller', None, '7', 'E')] = {'mass': 128} modules['hpt_flechettelauncher_fixed_medium'] = {'mass': 4}
modules[('Recon Limpet Controller', None, '1', 'E')] = {'mass': 1.3} modules['hpt_flechettelauncher_turret_medium'] = {'mass': 4}
modules[('Recon Limpet Controller', None, '3', 'E')] = {'mass': 2} modules['hpt_guardian_plasmalauncher_fixed_medium'] = {'mass': 4}
modules[('Recon Limpet Controller', None, '5', 'E')] = {'mass': 20} modules['hpt_guardian_plasmalauncher_fixed_large'] = {'mass': 8}
modules[('Recon Limpet Controller', None, '7', 'E')] = {'mass': 128} modules['hpt_guardian_plasmalauncher_turret_medium'] = {'mass': 4}
modules[('Research Limpet Controller', None, '1', 'E')] = {'mass': 1.3} modules['hpt_guardian_plasmalauncher_turret_large'] = {'mass': 8}
modules[('Guardian Power Plant', None, '2', 'A')] = {'mass': 1.5} modules['hpt_guardian_shardcannon_fixed_medium'] = {'mass': 4}
modules[('Guardian Power Plant', None, '3', 'A')] = {'mass': 2.9} modules['hpt_guardian_shardcannon_fixed_large'] = {'mass': 8}
modules[('Guardian Power Plant', None, '4', 'A')] = {'mass': 5.9} modules['hpt_guardian_shardcannon_turret_medium'] = {'mass': 4}
modules[('Guardian Power Plant', None, '5', 'A')] = {'mass': 11.7} modules['hpt_guardian_shardcannon_turret_large'] = {'mass': 8}
modules[('Guardian Power Plant', None, '6', 'A')] = {'mass': 23.4} modules['hpt_plasmashockcannon_fixed_medium'] = {'mass': 4}
modules[('Guardian Power Plant', None, '7', 'A')] = {'mass': 46.8} modules['hpt_plasmashockcannon_fixed_large'] = {'mass': 8} # ???
modules[('Guardian Power Plant', None, '8', 'A')] = {'mass': 93.6} modules['hpt_plasmashockcannon_gimbal_medium'] = {'mass': 4}
modules[('Bi-Weave Shield Generator', None, '8', 'C')] = {'mass': 160} modules['hpt_plasmashockcannon_gimbal_large'] = {'mass': 8} # ???
modules[('Enzyme Missile Rack', None, '2', 'B')] = {'mass': 4} modules['hpt_plasmashockcannon_turret_medium'] = {'mass': 4}
modules[('Remote Release Flechette Launcher', None, '2', 'B')] = {'mass': 4} modules['hpt_plasmashockcannon_turret_large'] = {'mass': 8} # ???
modules['int_dronecontrol_decontamination_size1_class1'] = {'mass': 1.3}
modules['int_dronecontrol_decontamination_size3_class1'] = {'mass': 2}
modules['int_dronecontrol_decontamination_size5_class1'] = {'mass': 20}
modules['int_dronecontrol_decontamination_size7_class1'] = {'mass': 128}
modules['int_dronecontrol_unkvesselresearch'] = {'mass': 1.3}
modules = OrderedDict([(k,modules[k]) for k in sorted(modules)]) # sort for easier diffing modules = OrderedDict([(k,modules[k]) for k in sorted(modules)]) # sort for easier diffing
cPickle.dump(modules, open('modules.p', 'wb')) cPickle.dump(modules, open('modules.p', 'wb'))

View File

@ -63,6 +63,7 @@ def export(data, filename=None):
fuel = 0 fuel = 0
cargo = 0 cargo = 0
fsd = None fsd = None
jumpboost = 0
for slot in sorted(data['ship']['modules']): for slot in sorted(data['ship']['modules']):
@ -96,7 +97,7 @@ def export(data, filename=None):
fsd['optmass'] *= mods['OutfittingFieldType_FSDOptimalMass']['value'] fsd['optmass'] *= mods['OutfittingFieldType_FSDOptimalMass']['value']
if mods.get('OutfittingFieldType_MaxFuelPerJump'): if mods.get('OutfittingFieldType_MaxFuelPerJump'):
fsd['maxfuel'] *= mods['OutfittingFieldType_MaxFuelPerJump']['value'] fsd['maxfuel'] *= mods['OutfittingFieldType_MaxFuelPerJump']['value']
jumpboost += module.get('jumpboost', 0)
for s in slot_map: for s in slot_map:
if slot.lower().startswith(s): if slot.lower().startswith(s):
@ -134,8 +135,8 @@ def export(data, filename=None):
string += 'Mass : %.2f T empty\n %.2f T full\n' % (mass, mass + fuel + cargo) string += 'Mass : %.2f T empty\n %.2f T full\n' % (mass, mass + fuel + cargo)
multiplier = pow(min(fuel, fsd['maxfuel']) / fsd['fuelmul'], 1.0 / fsd['fuelpower']) * fsd['optmass'] multiplier = pow(min(fuel, fsd['maxfuel']) / fsd['fuelmul'], 1.0 / fsd['fuelpower']) * fsd['optmass']
string += 'Range : %.2f LY unladen\n %.2f LY laden\n' % ( string += 'Range : %.2f LY unladen\n %.2f LY laden\n' % (
multiplier / (mass + fuel), multiplier / (mass + fuel) + jumpboost,
multiplier / (mass + fuel + cargo)) multiplier / (mass + fuel + cargo) + jumpboost)
except: except:
if __debug__: raise if __debug__: raise

12948
modules.p

File diff suppressed because it is too large Load Diff

View File

@ -31,8 +31,9 @@ weapon_map = {
('dumbfiremissilerack', 'lasso') : 'Rocket Propelled FSD Disruptor', ('dumbfiremissilerack', 'lasso') : 'Rocket Propelled FSD Disruptor',
'flakmortar' : 'Remote Release Flak Launcher', 'flakmortar' : 'Remote Release Flak Launcher',
'flechettelauncher' : 'Remote Release Flechette Launcher', 'flechettelauncher' : 'Remote Release Flechette Launcher',
('guardian', 'gausscannon') : 'Guardian Gauss Cannon', 'guardian_gausscannon' : 'Guardian Gauss Cannon',
('guardian', 'plasmalauncher') : 'Guardian Plasma Charger', 'guardian_plasmalauncher' : 'Guardian Plasma Charger',
'guardian_shardcannon' : 'Guardian Shard Cannon',
'minelauncher' : 'Mine Launcher', 'minelauncher' : 'Mine Launcher',
('minelauncher','impulse') : 'Shock Mine Launcher', ('minelauncher','impulse') : 'Shock Mine Launcher',
'mininglaser' : 'Mining Laser', 'mininglaser' : 'Mining Laser',
@ -41,6 +42,7 @@ weapon_map = {
('multicannon','strong') : 'Enforcer Cannon', ('multicannon','strong') : 'Enforcer Cannon',
'plasmaaccelerator' : 'Plasma Accelerator', 'plasmaaccelerator' : 'Plasma Accelerator',
('plasmaaccelerator','advanced') : 'Advanced Plasma Accelerator', ('plasmaaccelerator','advanced') : 'Advanced Plasma Accelerator',
'plasmashockcannon' : 'Shock Cannon',
'pulselaser' : 'Pulse Laser', 'pulselaser' : 'Pulse Laser',
('pulselaser','disruptor') : 'Pulse Disruptor Laser', ('pulselaser','disruptor') : 'Pulse Disruptor Laser',
'pulselaserburst' : 'Burst Laser', 'pulselaserburst' : 'Burst Laser',
@ -119,9 +121,15 @@ weaponrating_map = {
'hpt_flakmortar_turret_medium': 'B', 'hpt_flakmortar_turret_medium': 'B',
'hpt_flechettelauncher_fixed_medium': 'B', 'hpt_flechettelauncher_fixed_medium': 'B',
'hpt_flechettelauncher_turret_medium': 'B', 'hpt_flechettelauncher_turret_medium': 'B',
'hpt_guardian_gausscannon_fixed_medium': 'A', # guess 'hpt_guardian_gausscannon_fixed_medium': 'B', # guess
'hpt_guardian_plasmalauncher_fixed_medium': 'A', # guess 'hpt_guardian_plasmalauncher_fixed_medium': 'B',
'hpt_guardian_plasmalauncher_turret_medium': 'A', # guess 'hpt_guardian_plasmalauncher_fixed_large': 'C',
'hpt_guardian_plasmalauncher_turret_medium': 'E',
'hpt_guardian_plasmalauncher_turret_large': 'D',
'hpt_guardian_shardcannon_fixed_medium': 'A',
'hpt_guardian_shardcannon_fixed_large': 'C',
'hpt_guardian_shardcannon_turret_medium': 'D',
'hpt_guardian_shardcannon_turret_large': 'D',
'hpt_minelauncher_fixed_small': 'I', 'hpt_minelauncher_fixed_small': 'I',
'hpt_minelauncher_fixed_medium': 'I', 'hpt_minelauncher_fixed_medium': 'I',
'hpt_mininglaser_fixed_small': 'D', 'hpt_mininglaser_fixed_small': 'D',
@ -141,6 +149,12 @@ weaponrating_map = {
'hpt_plasmaaccelerator_fixed_medium': 'C', 'hpt_plasmaaccelerator_fixed_medium': 'C',
'hpt_plasmaaccelerator_fixed_large': 'B', 'hpt_plasmaaccelerator_fixed_large': 'B',
'hpt_plasmaaccelerator_fixed_huge': 'A', 'hpt_plasmaaccelerator_fixed_huge': 'A',
'hpt_plasmashockcannon_fixed_medium': 'D',
'hpt_plasmashockcannon_fixed_large': 'C',
'hpt_plasmashockcannon_gimbal_medium': 'D',
'hpt_plasmashockcannon_gimbal_large': 'C',
'hpt_plasmashockcannon_turret_medium': 'E',
'hpt_plasmashockcannon_turret_large': 'D',
'hpt_pulselaser_fixed_small': 'F', 'hpt_pulselaser_fixed_small': 'F',
'hpt_pulselaser_fixed_smallfree': 'F', 'hpt_pulselaser_fixed_smallfree': 'F',
'hpt_pulselaser_fixed_medium': 'E', 'hpt_pulselaser_fixed_medium': 'E',
@ -248,7 +262,8 @@ standard_map = {
'engine' : 'Thrusters', 'engine' : 'Thrusters',
('engine','fast') : 'Enhanced Performance Thrusters', ('engine','fast') : 'Enhanced Performance Thrusters',
'fueltank' : 'Fuel Tank', 'fueltank' : 'Fuel Tank',
'guardianpowerplant' : 'Guardian Power Plant', 'guardianpowerdistributor' : 'Guardian Hybrid Power Distributor',
'guardianpowerplant' : 'Guardian Hybrid Power Plant',
'hyperdrive' : 'Frame Shift Drive', 'hyperdrive' : 'Frame Shift Drive',
'lifesupport' : 'Life Support', 'lifesupport' : 'Life Support',
# 'planetapproachsuite' : handled separately # 'planetapproachsuite' : handled separately
@ -267,6 +282,10 @@ internal_map = {
'fsdinterdictor' : 'Frame Shift Drive Interdictor', 'fsdinterdictor' : 'Frame Shift Drive Interdictor',
'fuelscoop' : 'Fuel Scoop', 'fuelscoop' : 'Fuel Scoop',
'fueltransfer' : 'Fuel Transfer Limpet Controller', 'fueltransfer' : 'Fuel Transfer Limpet Controller',
'guardianfsdbooster' : 'Guardian FSD Booster',
'guardianhullreinforcement' : 'Guardian Hull Reinforcement',
'guardianmodulereinforcement': 'Guardian Module Reinforcement',
'guardianshieldreinforcement': 'Guardian Shield Reinforcement',
'hullreinforcement' : 'Hull Reinforcement Package', 'hullreinforcement' : 'Hull Reinforcement Package',
'metaalloyhullreinforcement' : 'Meta Alloy Hull Reinforcement', 'metaalloyhullreinforcement' : 'Meta Alloy Hull Reinforcement',
'modulereinforcement' : 'Module Reinforcement Package', 'modulereinforcement' : 'Module Reinforcement Package',
@ -304,6 +323,11 @@ def lookup(module, ship_map, entitled=False):
name = module['name'].lower().split('_') name = module['name'].lower().split('_')
new = { 'id': module['id'], 'symbol': module['name'] } new = { 'id': module['id'], 'symbol': module['name'] }
# Hack 'Guardian used as a prefix'
if name[1] == 'guardian':
name.pop(1)
name[1] = 'guardian_%s' % name[1]
# Armour - e.g. Federation_Dropship_Armour_Grade2 # Armour - e.g. Federation_Dropship_Armour_Grade2
if name[-2] == 'armour': if name[-2] == 'armour':
name = module['name'].lower().rsplit('_', 2) # Armour is ship-specific, and ship names can have underscores name = module['name'].lower().rsplit('_', 2) # Armour is ship-specific, and ship names can have underscores
@ -405,8 +429,10 @@ def lookup(module, ship_map, entitled=False):
if len(name) < 4 and name[1] == 'unkvesselresearch': # Hack! No size or class. if len(name) < 4 and name[1] == 'unkvesselresearch': # Hack! No size or class.
(new['class'], new['rating']) = ('1', 'E') (new['class'], new['rating']) = ('1', 'E')
elif len(name) < 4 and name[1] == 'guardianpowerplant': # Hack! No class. elif len(name) < 4 and name[1] in ['guardianpowerdistributor', 'guardianpowerplant']: # Hack! No class.
(new['class'], new['rating']) = (str(name[2][4:]), 'A') (new['class'], new['rating']) = (str(name[2][4:]), 'A')
elif len(name) < 4 and name[1] in ['guardianfsdbooster']: # Hack! No class.
(new['class'], new['rating']) = (str(name[2][4:]), 'H')
else: else:
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])) 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'] = str(name[2][4:]) new['class'] = str(name[2][4:])
@ -429,16 +455,19 @@ def lookup(module, ship_map, entitled=False):
new['entitlement'] = 'horizons' new['entitlement'] = 'horizons'
# Extra module data # Extra module data
key = (new['name'], 'ship' in new and companion.ship_map.get(name[0]) or None, new['class'], new['rating']) if module['name'].endswith('_free'):
key = module['name'][:-5].lower() # starter modules - treated like vanilla modules
else:
key = module['name'].lower()
if __debug__: if __debug__:
m = moduledata.get(key, {}) m = moduledata.get(key, {})
if not m: if not m:
print 'No data for module %s' % str(key) print 'No data for module %s' % key
elif new['name'] == 'Frame Shift Drive': elif new['name'] == 'Frame Shift Drive':
assert 'mass' in m and 'optmass' in m and 'maxfuel' in m and 'fuelmul' in m and 'fuelpower' in m, m assert 'mass' in m and 'optmass' in m and 'maxfuel' in m and 'fuelmul' in m and 'fuelpower' in m, m
else: else:
assert 'mass' in m, m assert 'mass' in m, m
new.update(moduledata.get(key, {})) new.update(moduledata.get(module['name'].lower(), {}))
# check we've filled out mandatory fields # check we've filled out mandatory fields
for thing in ['id', 'symbol', 'category', 'name', 'class', 'rating']: # Don't consider mass etc as mandatory for thing in ['id', 'symbol', 'category', 'name', 'class', 'rating']: # Don't consider mass etc as mandatory

136
ships.p
View File

@ -10,196 +10,208 @@ S'hullMass'
p6 p6
I35 I35
saa(lp7 saa(lp7
S'Alliance Chieftain' S'Alliance Challenger'
p8 p8
a(dp9 a(dp9
g6 g6
I420 I450
saa(lp10 saa(lp10
S'Anaconda' S'Alliance Chieftain'
p11 p11
a(dp12 a(dp12
g6 g6
I400 I400
saa(lp13 saa(lp13
S'Asp Explorer' S'Anaconda'
p14 p14
a(dp15 a(dp15
g6 g6
I280 I400
saa(lp16 saa(lp16
S'Asp Scout' S'Asp Explorer'
p17 p17
a(dp18 a(dp18
g6 g6
I150 I280
saa(lp19 saa(lp19
S'Beluga Liner' S'Asp Scout'
p20 p20
a(dp21 a(dp21
g6 g6
I950 I150
saa(lp22 saa(lp22
S'Cobra MkIII' S'Beluga Liner'
p23 p23
a(dp24 a(dp24
g6 g6
I180 I950
saa(lp25 saa(lp25
S'Cobra MkIV' S'Cobra MkIII'
p26 p26
a(dp27 a(dp27
g6 g6
I210 I180
saa(lp28 saa(lp28
S'Diamondback Explorer' S'Cobra MkIV'
p29 p29
a(dp30 a(dp30
g6 g6
I260 I210
saa(lp31 saa(lp31
S'Diamondback Scout' S'Diamondback Explorer'
p32 p32
a(dp33 a(dp33
g6 g6
I170 I260
saa(lp34 saa(lp34
S'Dolphin' S'Diamondback Scout'
p35 p35
a(dp36 a(dp36
g6 g6
I140 I170
saa(lp37 saa(lp37
S'Eagle' S'Dolphin'
p38 p38
a(dp39 a(dp39
g6 g6
I50 I140
saa(lp40 saa(lp40
S'Federal Assault Ship' S'Eagle'
p41 p41
a(dp42 a(dp42
g6 g6
I480 I50
saa(lp43 saa(lp43
S'Federal Corvette' S'Federal Assault Ship'
p44 p44
a(dp45 a(dp45
g6 g6
I900 I480
saa(lp46 saa(lp46
S'Federal Dropship' S'Federal Corvette'
p47 p47
a(dp48 a(dp48
g6 g6
I580 I900
saa(lp49 saa(lp49
S'Federal Gunship' S'Federal Dropship'
p50 p50
a(dp51 a(dp51
g6 g6
I580 I580
saa(lp52 saa(lp52
S'Fer-de-Lance' S'Federal Gunship'
p53 p53
a(dp54 a(dp54
g6 g6
I250 I580
saa(lp55 saa(lp55
S'Hauler' S'Fer-de-Lance'
p56 p56
a(dp57 a(dp57
g6 g6
I14 I250
saa(lp58 saa(lp58
S'Imperial Clipper' S'Hauler'
p59 p59
a(dp60 a(dp60
g6 g6
I400 I14
saa(lp61 saa(lp61
S'Imperial Courier' S'Imperial Clipper'
p62 p62
a(dp63 a(dp63
g6 g6
I35 I400
saa(lp64 saa(lp64
S'Imperial Cutter' S'Imperial Courier'
p65 p65
a(dp66 a(dp66
g6 g6
I1100 I35
saa(lp67 saa(lp67
S'Imperial Eagle' S'Imperial Cutter'
p68 p68
a(dp69 a(dp69
g6 g6
I50 I1100
saa(lp70 saa(lp70
S'Keelback' S'Imperial Eagle'
p71 p71
a(dp72 a(dp72
g6 g6
I180 I50
saa(lp73 saa(lp73
S'Orca' S'Keelback'
p74 p74
a(dp75 a(dp75
g6 g6
I290 I180
saa(lp76 saa(lp76
S'Python' S'Krait MkII'
p77 p77
a(dp78 a(dp78
g6 g6
I350 I320
saa(lp79 saa(lp79
S'Sidewinder' S'Orca'
p80 p80
a(dp81 a(dp81
g6 g6
I25 I290
saa(lp82 saa(lp82
S'Type-10 Defender' S'Python'
p83 p83
a(dp84 a(dp84
g6 g6
I1200 I350
saa(lp85 saa(lp85
S'Type-6 Transporter' S'Sidewinder'
p86 p86
a(dp87 a(dp87
g6 g6
I155 I25
saa(lp88 saa(lp88
S'Type-7 Transporter' S'Type-10 Defender'
p89 p89
a(dp90 a(dp90
g6 g6
I420 I1200
saa(lp91 saa(lp91
S'Type-9 Heavy' S'Type-6 Transporter'
p92 p92
a(dp93 a(dp93
g6 g6
I850 I155
saa(lp94 saa(lp94
S'Viper MkIII' S'Type-7 Transporter'
p95 p95
a(dp96 a(dp96
g6 g6
I50 I350
saa(lp97 saa(lp97
S'Viper MkIV' S'Type-9 Heavy'
p98 p98
a(dp99 a(dp99
g6 g6
I190 I850
saa(lp100 saa(lp100
S'Vulture' S'Viper MkIII'
p101 p101
a(dp102 a(dp102
g6 g6
I50
saa(lp103
S'Viper MkIV'
p104
a(dp105
g6
I190
saa(lp106
S'Vulture'
p107
a(dp108
g6
I230 I230
saatRp103 saatRp109
. .