From 4b5581e911261a872d627340c3e38e0f89175b8f Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Tue, 6 Jan 2015 22:29:38 -0800 Subject: [PATCH 1/3] issue #112 use max_pad_size in run, buy, sell Also added to rares and local Based on code from Sarbian --- CHANGES.txt | 14 +++++++++++- README.txt | 50 ++++++++++++++++++++++++++++++++++++++++++ commands/buy_cmd.py | 15 +++++++++++-- commands/commandenv.py | 18 +++++++++++++++ commands/local_cmd.py | 10 ++++++++- commands/rares_cmd.py | 12 ++++++++++ commands/run_cmd.py | 10 ++++++++- commands/sell_cmd.py | 22 ++++++++++++++----- tradecalc.py | 38 +++++++++++++++++++++++++------- tradedb.py | 26 +++++++++++++++++----- 10 files changed, 191 insertions(+), 24 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index d5e2c283..4002270c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -2,7 +2,19 @@ TradeDangerous, Copyright (C) Oliver "kfsone" Smith, July 2014 ============================================================================== -[wip] +v6.5.0 Jan 06 2015 +. (sarbian/kfsone) Added "--pad-size" option to "run" command to + restrict results to given pad sizes. + e.g. + tdrun sol --hops 2 --pad-size ml? (med, lrg or unk) + tdrun sol --hops 2 --pad-size m? (med or unk) + tdrun sol --hops 2 --pad-size ? (*only* unk) +. (kfsone) Added "--pad-size" to buy, sell, local and rare commands. + e.g. + trade.py buy algae --near sol --ly 20 --pad ml? + trade.py buy algae --near sol --ly 20 --pad l + or find stations that need data: + trade.py local sol --ly 20 --pad ? + Data: kfsone, gazelle, maddavo, Christian Andersen, Jared Buntain, Sebastian Pro diff --git a/README.txt b/README.txt index 42034bc7..ff42274d 100644 --- a/README.txt +++ b/README.txt @@ -239,6 +239,16 @@ RUN sub-command: --max-days-old 7 (data less than a week old) -MD=2 (data less than 2 days old) + --pad-size SML? + --pad SML? + -p + Limit results to stations that match one of the pad sizes + specified. + --pad ML? (med, lrg or unknown only) + -o ML? "" "" "" "" + --pad ? (unknown only), + --pad L (large only, ignores unknown) + --ls-penalty N.NN --lsp N.NN DEFAULT: 0.5 @@ -480,6 +490,16 @@ RARES sub-command: e.g. --limit 10 + --pad-size SML? + --pad SML? + -p + Limit results to stations that match one of the pad sizes + specified. + --pad ML? (med, lrg or unknown only) + -o ML? "" "" "" "" + --pad ? (unknown only), + --pad L (large only, ignores unknown) + --price-sort -P Sort by price rather than proximity @@ -584,6 +604,16 @@ LOCAL sub-command: Constrains local systems to a maximum ly distance --ly 20.0 + --pad-size SML? + --pad SML? + -p + Limit results to stations that match one of the pad sizes + specified. + --pad ML? (med, lrg or unknown only) + -o ML? "" "" "" "" + --pad ? (unknown only), + --pad L (large only, ignores unknown) + -v Show stations + their distance from star @@ -649,6 +679,16 @@ BUY sub-command: Sets the range of --near (requires --near) --near chango --ly 10 + --pad-size SML? + --pad SML? + -p + Limit results to stations that match one of the pad sizes + specified. + --pad ML? (med, lrg or unknown only) + -o ML? "" "" "" "" + --pad ? (unknown only), + --pad L (large only, ignores unknown) + --prices-sort -P Keeps items sorted by price when using --near @@ -682,6 +722,16 @@ SELL sub-command: Sets the range of --near (requires --near) --near chango --ly 10 + --pad-size SML? + --pad SML? + -p + Limit results to stations that match one of the pad sizes + specified. + --pad ML? (med, lrg or unknown only) + -o ML? "" "" "" "" + --pad ? (unknown only), + --pad L (large only, ignores unknown) + --prices-sort -P Keeps items sorted by price when using --near diff --git a/commands/buy_cmd.py b/commands/buy_cmd.py index b1bd6622..81b72d55 100644 --- a/commands/buy_cmd.py +++ b/commands/buy_cmd.py @@ -37,6 +37,11 @@ default=None, type=int, ), + ParseArgument('--pad-size', '-p', + help='Limit the padsize to this ship size (S,M,L or ? for unkown).', + metavar='PADSIZES', + dest='padSize', + ), MutuallyExclusiveGroup( ParseArgument('--price-sort', '-P', help='(When using --near) Sort by price not distance', @@ -125,11 +130,15 @@ def run(results, cmdenv, tdb): cmdenv.DEBUG0('SQL: {}', stmt) cur = tdb.query(stmt, bindValues) + padSize = cmdenv.padSize + stationByID = tdb.stationByID for (stationID, priceCr, stock, age) in cur: + station = stationByID[stationID] + if padSize and not station.checkPadSize(padSize): + continue row = ResultRow() - row.station = stationByID[stationID] - cmdenv.DEBUG2("{} {}cr {} units", row.station.name(), priceCr, stock) + row.station = station if nearSystem: row.dist = systemRanges[row.station.system] row.price = priceCr @@ -183,6 +192,8 @@ def render(results, cmdenv, tdb): key=lambda row: row.age) stnRowFmt.addColumn("StnLs", '>', 10, key=lambda row: row.station.distFromStar()) + stnRowFmt.addColumn('B/mkt', '>', 4, + key=lambda row: TradeDB.marketStates[row.station.blackMarket]) stnRowFmt.addColumn("Pad", '>', '3', key=lambda row: TradeDB.padSizes[row.station.maxPadSize]) diff --git a/commands/commandenv.py b/commands/commandenv.py index 5f1c737a..e956dfe2 100644 --- a/commands/commandenv.py +++ b/commands/commandenv.py @@ -73,6 +73,7 @@ def run(self, tdb): self.checkFromToNear() self.checkAvoids() self.checkVias() + self.checkPadSize() results = CommandResults(self) return self._cmd.run(results, self, tdb) @@ -204,4 +205,21 @@ def checkVias(self): for via in ",".join(viaPlaceNames).split(","): viaPlaces.append(self.tdb.lookupPlace(via)) + def checkPadSize(self): + padSize = getattr(self, 'padSize', None) + if not padSize: + return + padSize = ''.join(sorted(list(set(padSize)))).upper() + if padSize == '?LMS': + self.padSize = None + return + self.padSize = padSize = padSize.upper() + for value in padSize: + if not value in 'SML?': + raise CommandLineError( + "Invalid --pad-size '{}'; " + "use one or more of S, M, L or ?".format( + padSize + )) + self.padSize = padSize diff --git a/commands/local_cmd.py b/commands/local_cmd.py index 62fe8b36..ea5de2e3 100644 --- a/commands/local_cmd.py +++ b/commands/local_cmd.py @@ -25,7 +25,12 @@ metavar='N.NN', type=float, default=None, - ), + ), + ParseArgument('--pad-size', '-p', + help='Limit the padsize to this ship size (S,M,L or ? for unkown).', + metavar='PADSIZES', + dest='padSize', + ), ] ###################################################################### @@ -78,6 +83,7 @@ def run(results, cmdenv, tdb): for ID, age in tdb.query(stmt): ages[ID] = age + padSize = cmdenv.padSize for (system, dist) in sorted(distances.items(), key=lambda x: x[1]): row = ResultRow() row.system = system @@ -85,6 +91,8 @@ def run(results, cmdenv, tdb): row.stations = [] if showStations: for (station) in system.stations: + if padSize and not station.checkPadSize(padSize): + continue try: age = "{:7.2f}".format(ages[station.ID]) except: diff --git a/commands/rares_cmd.py b/commands/rares_cmd.py index 95b2277e..7e4bdf09 100644 --- a/commands/rares_cmd.py +++ b/commands/rares_cmd.py @@ -28,6 +28,11 @@ default=None, type=int, ), + ParseArgument('--pad-size', '-p', + help='Limit the padsize to this ship size (S,M,L or ? for unkown).', + metavar='PADSIZES', + dest='padSize', + ), ParseArgument('--price-sort', '-P', help='(When using --near) Sort by price not distance', action='store_true', @@ -55,7 +60,10 @@ def run(results, cmdenv, tdb): maxLySq = cmdenv.maxLyPer ** 2 + padSize = cmdenv.padSize for rare in tdb.rareItemByID.values(): + if padSize and not rare.station.checkPadSize(padSize): + continue dist = start.distToSq(rare.station.system) if maxLySq > 0 and dist > maxLySq: continue @@ -109,6 +117,10 @@ def render(results, cmdenv, tdb): key=lambda row: row.rare.maxAlloc) rowFmt.addColumn("StnLs", '>', 10, key=lambda row: row.rare.station.distFromStar()) + rowFmt.addColumn('B/mkt', '>', 4, + key=lambda row: \ + TradeDB.marketStates[row.rare.station.blackMarket] + ) rowFmt.addColumn("Pad", '>', '3', key=lambda row: \ TradeDB.padSizes[row.rare.station.maxPadSize] diff --git a/commands/run_cmd.py b/commands/run_cmd.py index 285adeb8..5a76c935 100644 --- a/commands/run_cmd.py +++ b/commands/run_cmd.py @@ -117,6 +117,11 @@ metavar='N', type=int, ), + ParseArgument('--pad-size', '-p', + help='Limit the padsize to this ship size (S,M,L or ? for unkown).', + metavar='PADSIZES', + dest='padSize', + ), ParseArgument('--checklist', help='Provide a checklist flow for the route.', action='store_true', @@ -512,10 +517,13 @@ def run(results, cmdenv, tdb): startCr = cmdenv.credits - cmdenv.insurance # seed the route table with starting places + maxPadSize = cmdenv.padSize.upper() if cmdenv.padSize else None routes = [ Route(stations=[src], hops=[], jumps=[], startCr=startCr, gainCr=0, score=0) for src in cmdenv.origins - if src not in avoidPlaces and src.system not in avoidPlaces + if (src not in avoidPlaces) and \ + (src.system not in avoidPlaces) and \ + (src.checkPadSize(maxPadSize)) ] numHops = cmdenv.hops lastHop = numHops - 1 diff --git a/commands/sell_cmd.py b/commands/sell_cmd.py index e7725e59..be4a95b4 100644 --- a/commands/sell_cmd.py +++ b/commands/sell_cmd.py @@ -19,25 +19,30 @@ ParseArgument('--near', help='Find buyers within jump range of this system.', type=str - ), + ), ParseArgument('--ly-per', help='Maximum light years per jump.', default=None, dest='maxLyPer', metavar='N.NN', type=float, - ), + ), + ParseArgument('--pad-size', '-p', + help='Limit the padsize to this ship size (S,M,L or ? for unkown).', + metavar='PADSIZES', + dest='padSize', + ), ParseArgument('--limit', help='Maximum number of results to list.', default=None, type=int, - ), + ), ParseArgument('--price-sort', '-P', help='(When using --near) Sort by price not distance', action='store_true', default=False, dest='sortByPrice', - ), + ), ] ###################################################################### @@ -113,10 +118,13 @@ def run(results, cmdenv, tdb): cur = tdb.query(stmt, bindValues) stationByID = tdb.stationByID + padSize = cmdenv.padSize for (stationID, priceCr, demand, age) in cur: + station = stationByID[stationID] + if padSize and not station.checkPadSize(padSize): + continue row = ResultRow() - row.station = stationByID[stationID] - cmdenv.DEBUG2("{} {}cr {} units", row.station.name(), priceCr, demand) + row.station = station if nearSystem: row.dist = systemRanges[row.station.system] row.price = priceCr @@ -166,6 +174,8 @@ def render(results, cmdenv, tdb): key=lambda row: row.age) stnRowFmt.addColumn('StnLs', '>', 10, key=lambda row: row.station.distFromStar()) + stnRowFmt.addColumn('B/mkt', '>', 4, + key=lambda row: TradeDB.marketStates[row.station.blackMarket]) stnRowFmt.addColumn("Pad", '>', '3', key=lambda row: TradeDB.padSizes[row.station.maxPadSize]) diff --git a/tradecalc.py b/tradecalc.py index 360dca7c..10eb939d 100644 --- a/tradecalc.py +++ b/tradecalc.py @@ -20,7 +20,7 @@ ###################################################################### # Stuff that passes for classes (but isn't) -from tradedb import System, Station +from tradedb import System, Station, TradeDB from collections import namedtuple class TradeLoad(namedtuple('TradeLoad', [ @@ -137,6 +137,29 @@ def genSubValues(key): dockFmt = None endFmt = " {station} +{gain:n}cr" + if detail > 1: + def decorateStation(station): + ls = station.lsFromStar + bm = station.blackMarket + pad = station.maxPadSize + if not ls: + if bm == '?' and pad == '?': + return station.name() + ' (no details)' + return '{} ({}/bm, {}/pad)'.format( + station.name(), + TradeDB.marketStatesExt[bm], + TradeDB.padSizesExt[pad], + ) + return '{} ({}/star, {}/bm, {}/pad)'.format( + station.name(), + station.distFromStar(True), + TradeDB.marketStatesExt[bm], + TradeDB.padSizesExt[pad], + ) + else: + def decorateStation(station): + return station.name() + def makeAge(value): value = int(value / 3600) if value < 1: @@ -175,7 +198,7 @@ def makeAge(value): age=age, ) hopTonnes += qty - text += hopFmt.format(station=route[i].name(), purchases=purchases) + text += hopFmt.format(station=decorateStation(route[i]), purchases=purchases) if jumpsFmt and self.jumps[i]: jumps = ' -> '.join([ jump.name() for jump in self.jumps[i] ]) text += jumpsFmt.format( @@ -185,12 +208,10 @@ def makeAge(value): credits=credits + gainCr + hopGainCr ) if dockFmt: - stnName = route[i+1].name() - lsFromStar = route[i+1].lsFromStar - if lsFromStar > 0: - stnName += " ({:n}ls)".format(lsFromStar) + stn = route[i+1] + stnName = stn.name() text += dockFmt.format( - station=stnName, + station=decorateStation(stn), gain=hopGainCr, tongain=hopGainCr / hopTonnes, credits=credits + gainCr + hopGainCr @@ -200,7 +221,7 @@ def makeAge(value): text += footer or "" text += endFmt.format( - station=route[-1].name(), + station=decorateStation(route[-1]), gain=gainCr, credits=credits + gainCr ) @@ -485,6 +506,7 @@ def getBestHops(self, routes, restrictTo=None): maxLyPer=maxLyPer, avoidPlaces=avoidPlaces, trading=True, + maxPadSize=tdenv.padSize, ): dstSystem, dstStation = dest.system, dest.station dstLy = dest.distLy diff --git a/tradedb.py b/tradedb.py index dd03a6a6..d45866c5 100644 --- a/tradedb.py +++ b/tradedb.py @@ -162,15 +162,24 @@ def name(self): return '%s/%s' % (self.system.name(), self.dbname) - def distFromStar(self): + def checkPadSize(self, maxPadSize): + return (not maxPadSize or self.maxPadSize in maxPadSize) + + + def distFromStar(self, addSuffix=False): """Describes the distance from the station to the star.""" ls = self.lsFromStar if not ls: - return '?' + if addSuffix: + return "Unk" + else: + return '?' if ls < 4000: - return '{:n}'.format(ls) + suffix = 'ls' if addSuffix else '' + return '{:n}'.format(ls)+suffix if ls < 40000: - return '{:.1f}K'.format(ls / 1000) + suffix = 'ls' if addSuffix else '' + return '{:.1f}'.format(ls / 1000)+suffix return '{:.2f}ly'.format(ls / (365*24*60*60)) @@ -361,7 +370,9 @@ class TradeDB(object): # Translation matrixes for attributes -> common presentation marketStates = { '?': '?', 'Y': 'Yes', 'N': 'No' } + marketStatesExt = { '?': 'Unk', 'Y': 'Yes', 'N': 'No' } padSizes = { '?': '?', 'S': 'Sml', 'M': 'Med', 'L': 'Lrg' } + padSizesExt = { '?': 'Unk', 'S': 'Sml', 'M': 'Med', 'L': 'Lrg' } def __init__(self, @@ -1007,7 +1018,8 @@ def getDestinations(self, maxJumps=None, maxLyPer=None, avoidPlaces=None, - trading=False): + trading=False, + maxPadSize=None): """ Gets a list of the Station destinations that can be reached from this Station within the specified constraints. @@ -1085,6 +1097,8 @@ def getDestinations(self, for station in origSys.stations: if (trading and station not in tradingWith): continue + if (maxPadSize and not station.checkPadSize(maxPadSize)): + continue if station not in avoidPlaces: destStations.append(Destination(origSys, station, [], 0.0)) @@ -1099,6 +1113,8 @@ def getDestinations(self, continue if station in avoidPlaces: continue + if (maxPadSize and not station.checkPadSize(maxPadSize)): + continue destStations.append( Destination(node.system, station, From 216b9faad11186929d207f9851995cd7ffdde147 Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Wed, 7 Jan 2015 09:02:05 -0800 Subject: [PATCH 2/3] Fixes #120 'K' after stn/ls in units of 1000 --- tradedb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tradedb.py b/tradedb.py index d45866c5..54820b8c 100644 --- a/tradedb.py +++ b/tradedb.py @@ -179,7 +179,7 @@ def distFromStar(self, addSuffix=False): return '{:n}'.format(ls)+suffix if ls < 40000: suffix = 'ls' if addSuffix else '' - return '{:.1f}'.format(ls / 1000)+suffix + return '{:.1f}K'.format(ls / 1000)+suffix return '{:.2f}ly'.format(ls / (365*24*60*60)) From f452242150e9660ba966d662656640e1d208ee35 Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Wed, 7 Jan 2015 09:15:52 -0800 Subject: [PATCH 3/3] User station data --- CHANGES.txt | 2 +- data/Station.csv | 70 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 61 insertions(+), 11 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 4002270c..38995912 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -16,7 +16,7 @@ v6.5.0 Jan 06 2015 or find stations that need data: trade.py local sol --ly 20 --pad ? + Data: kfsone, gazelle, maddavo, Christian Andersen, Jared Buntain, - Sebastian Pro + Sebastian Pro, Stefan Zapf, nclavian v6.4.1 Jan 04 2015 . (kfsone) Added the "station" sub-command for querying, adding, updating or diff --git a/data/Station.csv b/data/Station.csv index 098e3212..3fb68a2c 100644 --- a/data/Station.csv +++ b/data/Station.csv @@ -1,7 +1,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size '1 G. CAELI','Smoot Gateway',4747,'N','L' -'10 CANUM VENATICORUM','Collins Port',0,'?','?' -'10 CANUM VENATICORUM','He Port',0,'?','?' +'10 CANUM VENATICORUM','Collins Port',16,'?','?' +'10 CANUM VENATICORUM','He Port',495,'?','?' '10 CANUM VENATICORUM','Litke Port',0,'?','?' '11 CEPHEI','Cook Gateway',0,'?','?' '110 HERCULIS','Jahn Hanger',169,'?','M' @@ -82,6 +82,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size '78 URSAE MAJORIS','Seddon Gateway',196,'Y','L' '78 URSAE MAJORIS','Teller Terminal',659,'?','?' '78 URSAE MAJORIS','Townshend Hub',13102,'Y','L' +'8 ALPHA-1 LIBRA','Hire Hub',5947,'Y','L' '9 CETI','Fanning Vision',2900,'N','L' 'AASGANANU','Houssay Ring',0,'?','?' 'AASGANANU','Lovelace City',0,'?','?' @@ -255,6 +256,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'ANOUPHIS','Brongniart Terminal',0,'?','?' 'ANSARI','Wiberg Colony',0,'?','?' 'ANTINICA','Benyovszky Terminal',0,'?','?' +'ANTOVE DEN','Tall Dock',300,'Y','L' 'ANY NA','Libby Orbital',581,'Y','L' 'ANY NA','McNair Ring',0,'?','L' 'ANY NA','Pettit Port',417,'Y','M' @@ -274,6 +276,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'APALA','Wilson City',30,'N','L' 'APATHAAM','Reamy Dock',1660,'Y','L' 'APHRA','Beckman Terminal',1961,'Y','?' +'APIAN YI','Fowler Platform',0,'N','M' 'APOYAS','Bloss Hanger',0,'?','M' 'APOYAS','Tomita Port',0,'?','M' 'APOYAS','Vess Dock',0,'?','M' @@ -414,6 +417,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'BD+11 570','Forrester Dock',0,'?','?' 'BD+13 693','Drummond''s Progress',0,'?','?' 'BD+15 2847','Reynolds Terminal',163,'Y','L' +'BD+16 2404','Barba Terminal',0,'N','M' 'BD+19 2443','Clifford Dock',19255,'?','L' 'BD+19 2443','Malcolm Mines',10314,'?','M' 'BD+19 2443','Plante Colony',10382,'?','M' @@ -483,6 +487,8 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'BELINARA','Efremov City',400,'?','?' 'BELINARA','Hopkinson Orbital',544,'?','?' 'BELU','Covey Gateway',0,'?','?' +'BEMBARRIOSK','Arrhenius Point',2000,'N','M' +'BEMBARRIOSK','Kuipers Refinery',700,'N','L' 'BERKANAN','Amundsen Dock',0,'?','?' 'BERKANAN','Schouten Platform',0,'?','?' 'BERONII','Carver Survey',0,'?','M' @@ -529,6 +535,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'BIELTANI','Marshburn Enterprise',0,'?','?' 'BITJALA','Walker Dock',0,'?','?' 'BITJALA','Wedge Terminal',103,'Y','L' +'BJORTII','Vavrova Station',0,'N','?' 'BLATA','Gurragchaa Holdings',0,'?','?' 'BLATA','Nowak Landing',0,'?','?' 'BLATA','Sinclair Orbital',0,'?','?' @@ -579,6 +586,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'BUNDA','Cori Orbital',814,'Y','M' 'BUNDA','Faraday Ring',358,'Y','L' 'BUNDA','Walz Dock',617,'N','M' +'BUNURAS','Noguchi Enterprise',1500,'Y','L' 'BUNUS','Jones Freeport',321,'Y','M' 'BUNUVIVIA','Ellison Enterprise',1028,'Y','L' 'BUNUVIVIA','Greenland City',1444,'Y','M' @@ -618,6 +626,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'CAUANI','Poisson Hub',189,'?','M' 'CAUANI','Woolley Orbital',342,'Y','L' 'CD-25 1159','Paulmier de Gonneville Landing',0,'?','?' +'CD-31 1974','Wachmann Port',415000,'N','M' 'CD-34 9020','Back Enterprise',0,'?','?' 'CD-35 9019','Beadle Terminal',405,'?','L' 'CD-35 9019','Brahe Gateway',111,'?','L' @@ -800,7 +809,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'DAHA','Mukai Orbital',0,'?','?' 'DAHA','Tereshkova Hub',0,'?','?' 'DAHA','Tombaugh City',0,'?','?' -'DAHAN','Dahan Gateway',0,'?','?' +'DAHAN','Dahan Gateway',0,'Y','L' 'DAIKU','Chaviano Station',0,'?','?' 'DAIKU','Wrangel Orbital',274,'Y','L' 'DAIKULCANDI','Chretien Oudemans Hanger',0,'?','?' @@ -966,11 +975,12 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'ETA SERPENTIS','Haipeng Port',0,'?','L' 'ETA SERPENTIS','Qurra Ring',0,'?','L' 'ETA SERPENTIS','Ray Dock',662,'Y','L' -'ETHGREZE','Bloch Station',350,'Y','L' +'ETHGREZE','Bloch Station',351,'Y','L' 'EULEXIA','Mad J Wagar''s',105,'Y','L' 'EURIPUS','Blalock Horizons',2769,'Y','M' 'EURYALE','Eg Main Hq',888,'Y','L' 'EURYALE','Gantt Enterprise',14000,'Y','M' +'EURYBIA','Chris & Silvia''''s Paradise Hideout',50,'Y','M' 'EVERGREEN','Forsskal Hub',112,'?','?' 'EVERGREEN','Kazantsev Ring',144,'?','?' 'EVERGREEN','McCaffrey Enterprise',144,'?','?' @@ -1008,6 +1018,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'FORTUNA','Snyder Market',0,'?','?' 'FOTLA','Penzias Dock',2000,'N','L' 'FRENG','Werber Orbital',0,'?','?' +'FRENIS','Shajn Dock',570,'N','L' 'FRIGAHA','Aubakirov Orbital',227,'N','M' 'FRIGAHA','Engle Orbital',75,'N','M' 'FRIGAHA','Onizuka Landing',136,'N','M' @@ -1210,7 +1221,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'HECATE','William Bertram Ayres',962,'?','L' 'HEHENG','Clark Enterprise',230,'?','M' 'HEHENG','Onufriyenko Terminal',168,'Y','L' -'HEHENG','Stefanyshyn-Piper Hub',726,'?','M' +'HEHENG','Stefanyshyn-Piper Hub',726,'N','M' 'HEHENG DE','Malchiodi Colony',0,'?','?' 'HEIKE','Braun Enterprise',0,'?','L' 'HEIKE','Brunel City',411,'Y','L' @@ -1261,6 +1272,10 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'HIP 14007','Lozino-Lozinskiy Colony',1850,'N','L' 'HIP 16607','Thome Gateway',0,'?','?' 'HIP 17298','Louis de Lacaille Terminal',0,'?','?' +'HIP 17621','Fleming Enterprise',17000,'N','L' +'HIP 18918','Johnson Ring',300,'N','L' +'HIP 19510','Maudslay Port',20,'N','L' +'HIP 19510','Schlegel Platform',400,'Y','M' 'HIP 20237','Padalka Market',0,'?','?' 'HIP 20686','Hawley Terminal',0,'?','?' 'HIP 20741','Teng Dock',0,'?','?' @@ -1453,6 +1468,9 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'JIBITOQ','Mach Dock',322,'N','M' 'JIBITOQ','Wellman Gateway',322,'Y','L' 'JILNYTIS','Mikoyan Ring',12000,'?','?' +'JITA','Coats Hub',147000,'Y','M' +'JITA','Grover Horizons',2000,'N','L' +'JITA','Pirsan Settlement',4000,'N','M' 'JITA TEN','Barry Gateway',0,'?','?' 'JIUYOU','Keyes Refinery',346,'Y','M' 'JOTUNHEIM','Big Harry''s Monkey Hangout',147,'Y','L' @@ -1495,6 +1513,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'KAMCHATA','Krikalev Gateway',0,'?','?' 'KAMCHATA','Schweickart Enterprise',0,'?','?' 'KAMCHATA','Tuan Platform',0,'?','?' +'KAMITO','Newcomb Hub',0,'N','L' 'KAMITRA','Hammel Terminal',82,'N','L' 'KAMOCAN','Danforth City',55,'N','L' 'KAMORIN','Godwin Vision',447,'N','L' @@ -1591,6 +1610,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'KP TAURI','Anders Orbital',0,'?','M' 'KP TAURI','Mohmand Dock',0,'?','M' 'KP TAURI','Spedding Orbital',0,'?','L' +'KRAUDJI','Sakers Terminal',200,'N','M' 'KREMAINN','Volta Station',0,'?','M' 'KREMAINN','Wohler Terminal',0,'?','L' 'KRUGER 60','Kepler Gateway',6536,'?','L' @@ -1637,6 +1657,10 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'LACAILLE 8760','Serebrov City',0,'?','?' 'LACAILLE 9352','Gupta City',0,'N','L' 'LACAILLE 9352','Kirtley Platform',0,'?','M' +'LAIFANGYI','Anders Hub',315,'Y','L' +'LAIFANGYI','Anning Enterprise',700,'N','L' +'LAIFANGYI','Johnson Hub',13500,'Y','M' +'LAIFANGYI','Lovelace City',260,'Y','L' 'LALANDE 15394','Lister Mines',0,'?','?' 'LALANDE 15394','Pailes Station',0,'?','?' 'LALANDE 15394','Salam Station',0,'?','?' @@ -1664,8 +1688,10 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'LATJAL','Watt Terminal',0,'Y','M' 'LATORMODUR','Jung Terminal',13,'N','L' 'LATORMODUR','Van de Hulst Enterprise',270,'N','M' +'LAUKAITU','Cummings Prospect',0,'Y','M' +'LAUKAITU','Makarov Depot',366,'N','M' 'LAUKANG','Matheson Orbital',0,'?','?' -'LAVE','Castellan Station',45,'?','?' +'LAVE','Castellan Station',2336,'?','?' 'LAVE','Lave Station',303,'Y','L' 'LAVE','Warinus',863,'?','?' 'LAWD 52','Coles Gateway',1320,'?','?' @@ -1847,6 +1873,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'LHS 3006','WCM Transfer Orbital',65,'Y','L' 'LHS 3057','Wallace Colony',0,'?','?' 'LHS 3197','Szilard Orbital',97,'?','?' +'LHS 3246','Hertz Station',16,'Y','M' 'LHS 3262','Lacaille Prospect',0,'?','?' 'LHS 3295','Yang Hub',0,'?','?' 'LHS 331','Gold Station',0,'?','?' @@ -1958,6 +1985,8 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'LOMBI','Xin Hub',519,'?','L' 'LOMBI','Young Hub',518,'?','M' 'LONG','Grushin Prospect',0,'?','?' +'LONGHUS','Dubyago Port',50000,'Y','M' +'LONGHUS','Karachkina Prospect',60000,'N','M' 'LOPU MARIS','Garan Settlement',0,'?','?' 'LOPU MARIS','Messerschmid Outpost',0,'?','?' 'LOUGUALA','Mcmullen City',2,'Y','L' @@ -1966,7 +1995,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'LP 128-9','Bridges Terminal',0,'?','?' 'LP 128-9','Fisher Port',0,'?','?' 'LP 128-9','Lyell Port',0,'?','?' -'LP 131-55','Abernathy Landing',0,'?','?' +'LP 131-55','Abernathy Landing',11,'N','M' 'LP 131-55','Bounds Vision',0,'?','?' 'LP 131-66','Vasilyev Vision',0,'?','?' 'LP 167-64','Chu City',0,'?','?' @@ -1992,6 +2021,9 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'LP 302-22','Parise Hub',0,'?','?' 'LP 320-359','Fisher Camp',0,'?','?' 'LP 322-836','Bolotov Port',0,'?','?' +'LP 322-836','Clairault Terminal',47000,'?','?' +'LP 322-836','Fife Platform',46000,'?','?' +'LP 322-836','Gaspar De Portola Dock',48000,'N','M' 'LP 332-45','Thoreau Station',0,'?','?' 'LP 332-45','Watson Enterprise',0,'?','?' 'LP 336-4','Bolotov City',2953,'Y','L' @@ -2036,6 +2068,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'LP 751-1','Grissom Orbital',15696,'?','?' 'LP 751-1','Lamarr Ring',0,'?','?' 'LP 751-1','Tito Orbital',0,'?','?' +'LP 800-6','Hadfield Colony',600,'?','M' 'LP 811-17','Doyle Dock',495,'Y','L' 'LP 811-17','Harper Dock',1148,'?','?' 'LP 811-17','Shalatula Colony',1598,'N','?' @@ -2152,6 +2185,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'LTT 4497','Gantt Port',0,'?','?' 'LTT 464','Hambly Platform',480,'Y','M' 'LTT 464','The Mariesh Manoevre',65,'Y','L' +'LTT 4730','Gauss Landing',0,'N','M' 'LTT 4846','Carey Gateway',0,'?','?' 'LTT 4846','Edwards Hub',0,'?','?' 'LTT 4846','Mullane Port',0,'?','?' @@ -2204,6 +2238,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'LUHMAN 16','Heisenberg Colony',14,'N','M' 'LUHMAN 16','Jenner Orbital',10,'Y','M' 'LUMANATA','Matthaus Olbers Colony',663,'N','?' +'LUO WANG','Addams Camp',0,'N','?' 'LUYTEN 674-15','Nobleport',0,'?','L' 'LUYTEN 674-15','Sinclair Relay',0,'?','?' 'LUYTEN 674-15','Tayler Platform',0,'?','M' @@ -2313,7 +2348,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'MEIDUBI','Sullivan Dock',35436,'?','L' 'MELCIOR','Goddard Dock',0,'?','?' 'MELIAE','Shawl Beacon',0,'?','?' -'MELIAE','Whitson Hub',0,'?','?' +'MELIAE','Whitson Hub',1167,'Y','L' 'MELIONTIT','Abe Hub',559,'N','L' 'MELIONTIT','Dawson City',1338,'N','M' 'MELIONTIT','Littrow Ring',1676,'N','M' @@ -2340,6 +2375,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'MOKOSH','Bethe Station',2500,'?','?' 'MOKOSH','Lubin Orbital',1071,'Y','L' 'MOKOWA','Dhawan Outpost',241,'N','M' +'MOMBAL','Witt Port',5000,'N','M' 'MOMBALUMA','Bennett Colony',0,'?','?' 'MOMBALUMA','Hughes-Fulford Terminal',0,'?','?' 'MOMBALUMA','Leavitt Orbital',539,'Y','L' @@ -2407,7 +2443,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'NARASIMHA','Zudov Survey',340779,'?','?' 'NARIM','Hamuy Colony',0,'?','?' 'NARIM','Pond Vision',0,'?','?' -'NAVAJOAR','Dayuan Platform',0,'?','?' +'NAVAJOAR','Dayuan Platform',1270,'N','S' 'NDOYENGHUS','Binney Ring',0,'?','?' 'NDOYENGHUS','Nilson Port',0,'?','?' 'NEGANHOT','Gardner Settlement',0,'?','?' @@ -2433,6 +2469,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'NGUNA','Biggle Hub',0,'?','L' 'NGURELBAN','Duke Hanger',6877,'?','M' 'NGURELBAN','Ricardo Landing',198,'?','M' +'NGURUI','Hartlib Landing',0,'N','M' 'NGURUNGO','Kandrup Point',400,'N','M' 'NICOBARESE','Berezovoy Station',0,'?','?' 'NIHURSAGA','Hardwick Hub',0,'?','?' @@ -2634,6 +2671,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'PEMEDE','Leavitt Orbital',0,'?','?' 'PEMOERI','Al-Din Landing',0,'?','?' 'PEMOERI','Lousma Port',0,'?','?' +'PEMOTEN','Perry Dock',8,'?','S' 'PENG','Clerk Enterprise',34,'Y','M' 'PENG','Lockhart Port',0,'?','M' 'PENG','Runco Hub',301,'Y','L' @@ -2685,6 +2723,9 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'PROCYON','Reightler Station',10500,'N','M' 'PROMBA','Maler Dock',980,'Y','L' 'PSAMATHE','Nelson Gateway',0,'?','?' +'PUKKEITHA','Foster Hub',0,'N','?' +'PUKKEITHA','McKie Orbital',0,'N','?' +'PUKKEITHA','Wilhelm Von Struve Dock',0,'N','?' 'PUNRAZ','Dashiell Legacy',0,'?','?' 'PUNRAZ','Neff Vision',0,'?','?' 'PURUI','Herbert Survey',65,'Y','M' @@ -2725,7 +2766,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'RAJIE','Stanley Platform',29,'?','M' 'RAJUKRU','Kerwin Station',0,'?','?' 'RAJUKRU','Snyder Terminal',117,'Y','L' -'RAKAPILA','Stone Enterprise',41,'Y','L' +'RAKAPILA','Stone Enterprise',40,'Y','L' 'RAKAPILA','Walker Settlement',1227,'N','M' 'RAKSAKA','Trevithick Port',0,'?','?' 'RANA','Ali Hub',670,'Y','L' @@ -2772,6 +2813,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'RITILA','Younghusband Colony',679,'Y','M' 'ROD','Gohar Landing',1435,'N','M' 'ROD','Low City',2142,'N','M' +'ROSS 1008','Yamazaki Hub',18473,'Y','L' 'ROSS 1015','Bowersox Mines',475,'Y','L' 'ROSS 104','Bunch City',0,'?','?' 'ROSS 104','Glenn Dock',0,'?','?' @@ -3007,6 +3049,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'SUDZ','Divis Enterprise',0,'?','?' 'SUGRIVIK','Delbruck Dock',0,'?','?' 'SUHTE','Cavendish Station',0,'?','?' +'SUI GUEI','Alcala Doc',500,'N','S' 'SUKUA','Forest Depot',938,'N','?' 'SUKUA','Wang Base',952,'N','?' 'SUMARR','Armstrong Station',1469,'N','M' @@ -3027,6 +3070,8 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'SYNTEINI','William Sargent Vision',209,'Y','L' 'TABASSAPISI','Parise Camp',0,'?','?' 'TABIT','Haber City',18901,'Y','L' +'TACAJANDI','Rosenberg Hub',0,'N','?' +'TACAJANDI','Tsunenaga Port',0,'N','?' 'TAGA','Gamow Colony',68,'Y','M' 'TAGO','Kregel Dock',193,'?','?' 'TAILTSUR','Phillips Terminal',500,'N','M' @@ -3099,6 +3144,8 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'TETEKHE','GERST PLATFORM',0,'?','?' 'TEWI','Meuron Survey',0,'?','?' 'THELMASCI','Bauschinger Terminal',8,'N','L' +'THEOTOKOS','Meikle Settlement',5000,'Y','M' +'THEOTOKOS','Spring Hanger',9000,'N','M' 'THETA INDI','Cooper Hub',13555,'Y','L' 'THETA INDI','Kornbluth Orbital',0,'?','M' 'THETA INDI','Strzelecki Port',0,'?','L' @@ -3115,6 +3162,8 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'THIIN','Euler Orbital',0,'?','?' 'THIIN','Kotov Terminal',0,'?','?' 'THRASKIAS','Herreshoff Station',0,'?','?' +'THRUTI','Inoda Platform',0,'N','?' +'THRUTI','Von Biela Holdings',0,'N','?' 'THRUTIS','Kingsbury Dock',0,'?','L' 'THUNDERBIRD','Agassiz Orbital',158483,'Y','L' 'THUNDERBIRD','Dobrovolskiy Hub',0,'?','M' @@ -3232,6 +3281,7 @@ unq:name@System.system_id,unq:name,ls_from_star,blackmarket,max_pad_size 'USZAA','Guest Installation',4350,'Y','L' 'USZAA','Patterson Dock',0,'?','L' 'UTGAROAR','Fort Klarix',170,'Y','L' +'UZUMERU','Lorentz Plant',59,'N','M' 'UZUMOKU','Buckell Station',0,'?','?' 'UZUMOKU','Sverdrup Ring',0,'?','L' 'V1090 HERCULIS','Kaku Plant',1233567,'?','M'