From 6a943c4ea9b7133387dbb21451b26426b8266cf9 Mon Sep 17 00:00:00 2001 From: Xansta <35241832+Xansta@users.noreply.github.com> Date: Fri, 17 Jan 2025 07:45:32 -0600 Subject: [PATCH] Update scenario: Fermi 500 (#2285) ## scenario_58_race.lua: Added sound selection configuration. Switch to using the place station utility. Update to newer goods processing in comms. Add translation information around goods names. Name the zones around waypoints to facilitate color changing. Change default ship names to match what will be used in MAGFest 2025. Add a GM button to reset and randomize the player ship control codes. Simplify discovery of upgrade stations by curtailing the stellar cartography information. Add more enemy stations as potential sources of reputation points and mini-missions. Simplify presentation of upgrade information in comms. Add ad hoc missions for players to get goods for upgrades. Add station service information to status report in comms. Switch from double dot concatenation to string.format. Better sorting to determine race standing. Flexible presentation of race start time rather than assuming it's always 10 minutes. Add countdown and start sounds. Add detail to context tags for race start messages. Add context tags for race position names. ## place_station_scenario_utility.lua: Include more details in diagnostic print line. Add stations Carradine, Grup and Grap which are used in Fermi 500. Spell Ganalda correctly. ## sound files - sa_58_beep.ogg: played 3 times prior to race start. - sa_58_start.ogg: colossus start sound used for MAGFest 2025. - sa_58_goBeep.ogg: other start sound more consistent with other beep sounds. Co-authored-by: Xansta <> --- resources/audio/scenario/58/sa_58_beep.ogg | Bin 0 -> 14402 bytes resources/audio/scenario/58/sa_58_goBeep.ogg | Bin 0 -> 43361 bytes resources/audio/scenario/58/sa_58_start.ogg | Bin 0 -> 43410 bytes scripts/place_station_scenario_utility.lua | 121 +- scripts/scenario_58_race.lua | 1638 +++++++++--------- 5 files changed, 975 insertions(+), 784 deletions(-) create mode 100644 resources/audio/scenario/58/sa_58_beep.ogg create mode 100644 resources/audio/scenario/58/sa_58_goBeep.ogg create mode 100644 resources/audio/scenario/58/sa_58_start.ogg diff --git a/resources/audio/scenario/58/sa_58_beep.ogg b/resources/audio/scenario/58/sa_58_beep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..20d6dfb3d2c2a02212b9b1f86903323cdf67e2e5 GIT binary patch literal 14402 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 Ip?L5=0B1+NssI20 literal 0 HcmV?d00001 diff --git a/resources/audio/scenario/58/sa_58_goBeep.ogg b/resources/audio/scenario/58/sa_58_goBeep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6414f48cf9058e023f1a92c3a176e303b78b29a3 GIT binary patch literal 43361 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 literal 0 HcmV?d00001 diff --git a/resources/audio/scenario/58/sa_58_start.ogg b/resources/audio/scenario/58/sa_58_start.ogg new file mode 100644 index 0000000000000000000000000000000000000000..16bf2a60b90a5ec9b9a0047cc56f3abb11864f69 GIT binary patch literal 43410 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 Sz9^ReM!`t&!|$E_9vuM7kJy9& literal 0 HcmV?d00001 diff --git a/scripts/place_station_scenario_utility.lua b/scripts/place_station_scenario_utility.lua index ff36699530..ba15165fa0 100644 --- a/scripts/place_station_scenario_utility.lua +++ b/scripts/place_station_scenario_utility.lua @@ -50,7 +50,7 @@ function placeStation(x,y,name,faction,size,diagnostic) end local group, station = pickStation(name) if group == nil then - print("place station error: Sub function pick station did not return a group name. Nil is not valid") + print("place station error: Sub function pick station did not return a group name. Nil is not valid. Parameter name passed:",name) return nil end station:setPosition(x,y) @@ -2480,6 +2480,43 @@ function populateStationPool() general = "", history = "", }, + ["Carradine"] = { + weapon_available = { + Homing = random(1,13)<=(8-difficulty), + HVLI = random(1,13)<=(9-difficulty), + Mine = random(1,13)<=(7-difficulty), + Nuke = random(1,13)<=(5-difficulty), + EMP = random(1,13)<=(6-difficulty), + }, + services = { + supplydrop = "friend", + reinforcements = "friend", + jumpsupplydrop = "friend", + }, + service_cost = { + supplydrop = math.random(80,120), + reinforcements = math.random(125,175), + jumpsupplydrop = math.random(110,140), + }, + reputation_cost_multipliers = { + friend = 1.0, + neutral = 2.0, + }, + goods = { + impulse = { + quantity = 5, + cost = 100, + }, + }, + trade = { + food = random(1,100) <= 42, + medicine = false, + luxury = true, + }, + description = _("scienceDescription-station", "Impulse engine components"), + general = _("stationGeneralInfo-comms", "We research and manufacture impulse engine components and systems"), + history = _("stationStory-comms", "Named after one of the station commander's favorite actors from the 20th century"), + }, ["Impala"] = { weapon_available = { Homing = random(1,13)<=(8-difficulty), @@ -2520,6 +2557,86 @@ function populateStationPool() general = _("stationGeneralInfo-comms", "We mine nearby asteroids for precious minerals"), history = "", }, + ["Grup"] = { + weapon_available = { + Homing = random(1,13)<=(8-difficulty), + HVLI = random(1,13)<=(9-difficulty), + Mine = true, + Nuke = random(1,13)<=(5-difficulty), + EMP = random(1,13)<=(6-difficulty), + }, + services = { + supplydrop = "friend", + reinforcements = "friend", + jumpsupplydrop = "friend", + }, + service_cost = { + supplydrop = math.random(80,120), + reinforcements = math.random(125,175), + jumpsupplydrop = math.random(110,140), + }, + reputation_cost_multipliers = { + friend = 1.0, + neutral = 3.0, + }, + goods = { + nickel = { + quantity = 5, + cost = 20, + }, + }, + trade = { + food = random(1,100) < 50, + medicine = true, + luxury = random(1,100) < 50, + }, + buy = { + [randomComponent()] = math.random(40,200), + }, + description = _("scienceDescription-station", "Mining station"), + general = "", + history = "", + }, + ["Grap"] = { + weapon_available = { + Homing = true, + HVLI = random(1,13)<=(9-difficulty), + Mine = random(1,13)<=(7-difficulty), + Nuke = random(1,13)<=(5-difficulty), + EMP = random(1,13)<=(6-difficulty), + }, + services = { + supplydrop = "friend", + reinforcements = "friend", + jumpsupplydrop = "friend", + }, + service_cost = { + supplydrop = math.random(80,120), + reinforcements = math.random(125,175), + jumpsupplydrop = math.random(110,140), + }, + reputation_cost_multipliers = { + friend = 1.0, + neutral = 3.0, + }, + goods = { + nickel = { + quantity = 5, + cost = 20, + }, + }, + trade = { + food = random(1,100) < 50, + medicine = true, + luxury = random(1,100) < 50, + }, + buy = { + [randomComponent()] = math.random(40,200), + }, + description = _("scienceDescription-station", "Mining station"), + general = "", + history = "", + }, ["Krak"] = { weapon_available = { Homing = random(1,13)<=(8-difficulty), @@ -3241,7 +3358,7 @@ function populateStationPool() ["Sinister"] = { ["Aramanth"] = {goods = {}, description = "", general = "", history = ""}, ["Empok Nor"] = {goods = {}, description = "", general = "", history = ""}, - ["Gandala"] = {goods = {}, description = "", general = "", history = ""}, + ["Ganalda"] = {goods = {}, description = "", general = "", history = ""}, ["Hassenstadt"] = {goods = {}, description = "", general = "", history = ""}, ["Kaldor"] = {goods = {}, description = "", general = "", history = ""}, ["Magenta Mesra"] = {goods = {}, description = "", general = "", history = ""}, diff --git a/scripts/scenario_58_race.lua b/scripts/scenario_58_race.lua index 2998c40a3e..aeaade737e 100644 --- a/scripts/scenario_58_race.lua +++ b/scripts/scenario_58_race.lua @@ -4,6 +4,8 @@ --- Placement points depend on the number of racers present at the starting point when the race starts. Precise values are given to Relay at that time. Each target drone of yours shot earns one point. Shoot an opponent's drone and they get the point. --- --- Before the race starts, scope out the course, visit some stations, maybe improve your ship for the race. But, watch your time carefully. If you are not at waypoint 1 at the start of the race, your ship will be destroyed. Your competitors may also try to destroy you despite being your nominal allies, so beware +--- +--- Version 2.2 -- Type: Race -- Setting[Shoot Back]: Configures whether the targets along the race course shoot back or not -- Shoot Back[No|Default]: Targets along the course do not shoot back @@ -17,45 +19,86 @@ -- Setting[Ship Name]: Configures whether player ship names and control codes will be predefined or random. See Game master screen to get control codes -- Ship Name[Predefined|Default]: Player ship names and control codes will be predefined as scripted. See Game master screen to get control codes -- Ship Name[Random]: Player ship names will be selected at random from a list of names and player ship control codes will be randomly generated. See Game master screen to get control codes +-- Setting[Sound]: Configure the start sound to beep or roar +-- Sound[Colossus|Default]: Start sound will be Colossus roar +-- Sound[Fermi]: Start sound will be Pole Position beep require("utils.lua") +require("place_station_scenario_utility.lua") ---------------------- -- Initialization -- ---------------------- function init() - scenario_version = "2.1.3" + scenario_version = "2.2.2" print(string.format(" ----- Scenario: Fermi 500 ----- Version %s -----",scenario_version)) - print(_VERSION) + if _VERSION ~= nil then + print("Lua version:",_VERSION) + end -- 27 types of goods so far - goodsList = { {"food",0}, - {"medicine",0}, - {"nickel",0}, - {"platinum",0}, - {"gold",0}, - {"dilithium",0}, - {"tritanium",0}, - {"luxury",0}, - {"cobalt",0}, - {"impulse",0}, - {"warp",0}, - {"shield",0}, - {"tractor",0}, - {"repulsor",0}, - {"beam",0}, - {"optic",0}, - {"robotic",0}, - {"filament",0}, - {"transporter",0}, - {"sensor",0}, - {"communication",0}, - {"autodoc",0}, - {"lifter",0}, - {"android",0}, - {"nanites",0}, - {"software",0}, - {"battery",0} } - diagnostic = true + goodsList = { + {"food",0}, + {"medicine",0}, + {"nickel",0}, + {"platinum",0}, + {"gold",0}, + {"dilithium",0}, + {"tritanium",0}, + {"luxury",0}, + {"cobalt",0}, + {"impulse",0}, + {"warp",0}, + {"shield",0}, + {"tractor",0}, + {"repulsor",0}, + {"beam",0}, + {"optic",0}, + {"robotic",0}, + {"filament",0}, + {"transporter",0}, + {"sensor",0}, + {"communication",0}, + {"autodoc",0}, + {"lifter",0}, + {"android",0}, + {"nanites",0}, + {"software",0}, + {"battery",0} + } + component_goods = {"impulse","warp","shield","tractor","repulsor","beam","optic","robotic","filament","transporter","sensor","communication","autodoc","lifter","android","nanites","software","circuit","battery"} + mineral_goods = {"nickel","platinum","gold","dilithium","tritanium","cobalt"} + good_desc = { + ["food"] = _("trade-comms","food"), + ["medicine"] = _("trade-comms","medicine"), + ["luxury"] = _("trade-comms","luxury"), + ["cobalt"] = _("trade-comms","cobalt"), + ["dilithium"] = _("trade-comms","dilithium"), + ["gold"] = _("trade-comms","gold"), + ["nickel"] = _("trade-comms","nickel"), + ["platinum"] = _("trade-comms","platinum"), + ["tritanium"] = _("trade-comms","tritanium"), + ["autodoc"] = _("trade-comms","autodoc"), + ["android"] = _("trade-comms","android"), + ["battery"] = _("trade-comms","battery"), + ["beam"] = _("trade-comms","beam"), + ["circuit"] = _("trade-comms","circuit"), + ["communication"] = _("trade-comms","communication"), + ["filament"] = _("trade-comms","filament"), + ["impulse"] = _("trade-comms","impulse"), + ["lifter"] = _("trade-comms","lifter"), + ["nanites"] = _("trade-comms","nanites"), + ["optic"] = _("trade-comms","optic"), + ["repulsor"] = _("trade-comms","repulsor"), + ["robotic"] = _("trade-comms","robotic"), + ["sensor"] = _("trade-comms","sensor"), + ["shield"] = _("trade-comms","shield"), + ["software"] = _("trade-comms","software"), + ["tractor"] = _("trade-comms","tractor"), + ["transporter"] = _("trade-comms","transporter"), + ["warp"] = _("trade-comms","warp"), + } + + diagnostic = false player_count = 0 player_start_list = {} player_ship_stats = { @@ -378,6 +421,7 @@ function init() } goods = {} raceStartDelay = 600 -- should be 600 for a 10 minute prep period + original_race_start_delay = raceStartDelay racePoint1x = -4000 racePoint1y = -4000 raceAxis = random(0,360)+360 @@ -400,25 +444,25 @@ function init() leg3length = distance(racePoint3x,racePoint3y,racePoint4x,racePoint4y) raceLength = (leg1length + leg2length + leg3length + leg4length)/1000 * 3 until(raceLength >= 500) - Zone():setPoints( + start_zone = Zone():setPoints( racePoint1x + 500, racePoint1y + 500, racePoint1x - 500, racePoint1y + 500, racePoint1x - 500, racePoint1y - 500, racePoint1x + 500, racePoint1y - 500 ):setLabel("WP1"):setColor(0,64,0) - Zone():setPoints( + point_2_zone = Zone():setPoints( racePoint2x + 500, racePoint2y + 500, racePoint2x - 500, racePoint2y + 500, racePoint2x - 500, racePoint2y - 500, racePoint2x + 500, racePoint2y - 500 ):setLabel("WP2"):setColor(0,64,0) - Zone():setPoints( + point_3_zone = Zone():setPoints( racePoint3x + 500, racePoint3y + 500, racePoint3x - 500, racePoint3y + 500, racePoint3x - 500, racePoint3y - 500, racePoint3x + 500, racePoint3y - 500 ):setLabel("WP3"):setColor(0,64,0) - Zone():setPoints( + point_4_zone = Zone():setPoints( racePoint4x + 500, racePoint4y + 500, racePoint4x - 500, racePoint4y + 500, racePoint4x - 500, racePoint4y - 500, @@ -458,16 +502,21 @@ function setVariations() else predefined_player_ships = nil end + if getScenarioSetting("Sound") == "Fermi" then + start_sound_file = "audio/scenario/58/sa_58_goBeep.ogg" + else + start_sound_file = "audio/scenario/58/sa_58_start.ogg" + end end end function getPredefinedPlayerShipNames() local predefined_player_ships = { - {name = "Phoenix", control_code = "BURN265"}, - {name = "Callisto", control_code = "MOON558"}, - {name = "Charybdis", control_code = "JACKPOT777"}, - {name = "Sentinel", control_code = "FERENGI432"}, - {name = "Omnivore", control_code = "EQUILATERAL180"}, - {name = "Tarquin", control_code = "TIME909"}, + {name = "Damocles", control_code = "BURN265"}, + {name = "Endeavor", control_code = "MOON558"}, + {name = "Hyperion", control_code = "JACKPOT777"}, + {name = "Liberty", control_code = "FERENGI432"}, + {name = "Prismatic", control_code = "EQUILATERAL180"}, + {name = "Visionary", control_code = "TIME909"}, } return predefined_player_ships end @@ -524,6 +573,7 @@ function mainGMButtonsDuringPause() print(version_message) end) addGMFunction(_("buttonGM", "Show control codes"),showControlCodes) + addGMFunction(_("buttonGM","Reset control codes"),resetControlCodes) addGMFunction(string.format(_("buttonGM", "+Start Delay: %i"),raceStartDelay/60),setStartDelay) addGMFunction(string.format(_("buttonGM", "+Patience: %i"),patienceTimeLimit/60),setPatienceTimeLimit) if predefined_player_ships ~= nil then @@ -569,6 +619,15 @@ function mainGMButtonsDuringPause() addGMMessage(out) end) end +function resetControlCodes() + for i,p in ipairs(getActivePlayerShips()) do + local stem = tableRemoveRandom(control_code_stem) + local branch = math.random(100,999) + p.control_code = stem .. branch + p:setControlCode(stem .. branch) + end + showControlCodes() +end function setShootBack() clearGMFunctions() addGMFunction(_("buttonGM", "-From Shoot Back"),mainGMButtons) @@ -653,12 +712,14 @@ function setStartDelay() if raceStartDelay < 1200 then addGMFunction(string.format(_("buttonGM", "%i Delay + -> %i"),raceStartDelay/60,(raceStartDelay + 60)/60),function() raceStartDelay = raceStartDelay + 60 + original_race_start_delay = raceStartDelay setStartDelay() end) end if raceStartDelay > 60 then addGMFunction(string.format(_("buttonGM", "%i Delay - -> %i"),raceStartDelay/60,(raceStartDelay - 60)/60),function() raceStartDelay = raceStartDelay - 60 + original_race_start_delay = raceStartDelay setStartDelay() end) end @@ -730,6 +791,7 @@ end function setStations() afd = 30 -- asteroid field density stationList = {} + station_upgrade_list = {} totalStations = 0 friendlyStations = 0 neutralStations = 0 @@ -737,308 +799,235 @@ function setStations() stationTimer = SpaceStation():setTemplate("Small Station"):setFaction("Human Navy"):setCommsScript(""):setCommsFunction(commsStation) stationTimer:setPosition(-5000,-5000):setDescription(_("scienceDescription-station", "Race Timing Facility")):setCallSign("Timer") table.insert(stationList,stationTimer) - friendlyStations = friendlyStations + 1 --Vaiken - stationVaiken = SpaceStation():setTemplate("Huge Station"):setFaction("Human Navy"):setCommsScript(""):setCommsFunction(commsStation) - stationVaiken:setPosition(random(-10000,5000),random(5000,9000)):setCallSign("Vaiken"):setDescription(_("scienceDescription-station", "Ship building and maintenance facility")) + stationVaiken = placeStation(random(-10000,5000), random(5000,9000), "Vaiken", "Human Navy", "Huge Station") table.insert(stationList,stationVaiken) - friendlyStations = friendlyStations + 1 - goods[stationVaiken] = {{"food",10,1},{"medicine",5,5}} + stationVaiken.comms_data.goods.food = {cost = 1, quantity = 10} + stationVaiken.comms_data.goods.medicine = {cost = 5, quantity = 5} --Zefram - stationZefram = SpaceStation():setTemplate("Medium Station"):setFaction("Human Navy"):setCommsScript(""):setCommsFunction(commsStation) - stationZefram:setPosition(random(5000,8000),random(-8000,9000)):setCallSign("Zefram"):setDescription(_("scienceDescription-station", "Warp Engine Components")) + stationZefram = placeStation(random(5000,8000),random(-8000,9000),"Zefram","Human Navy","Medium Station") table.insert(stationList,stationZefram) - friendlyStations = friendlyStations + 1 - goods[stationZefram] = {{"warp",5,140},{"food",5,1}} + stationZefram.comms_data.goods.warp = {cost = 140, quantity = 5} + stationZefram.comms_data.goods.food = {cost = 1, quantity = 5} --Marconi - marconiAngle = random(0,360) - xMarconi, yMarconi = vectorFromAngle(marconiAngle,random(12500,15000)) - stationMarconi = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationMarconi:setPosition(xMarconi,yMarconi):setCallSign("Marconi"):setDescription(_("scienceDescription-station", "Energy Beam Components")) + local marconiAngle = random(0,360) + local xMarconi, yMarconi = vectorFromAngle(marconiAngle,random(12500,15000)) + stationMarconi = placeStation(xMarconi,yMarconi,"Marconi","Independent","Small Station") table.insert(stationList,stationMarconi) - neutralStations = neutralStations + 1 - goods[stationMarconi] = {{"beam",5,80}} + stationMarconi.comms_data.goods.beam = {cost = 80, quantity = 5} --Muddville - muddAngle = marconiAngle + random(60,180) - xMudd, yMudd = vectorFromAngle(muddAngle,random(12500,15000)) - stationMudd = SpaceStation():setTemplate("Medium Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationMudd:setPosition(xMudd,yMudd):setCallSign("Muddville"):setDescription(_("scienceDescription-station", "Trading station")) + local muddAngle = marconiAngle + random(60,180) + local xMudd, yMudd = vectorFromAngle(muddAngle,random(12500,15000)) + stationMudd = placeStation(xMudd,yMudd,"Muddville","Independent","Medium Station") table.insert(stationList,stationMudd) - neutralStations = neutralStations + 1 - goods[stationMudd] = {{"luxury",10,60}} + stationMudd.comms_data.goods.luxury = {cost = 60, quantity = 10} --Alcaleica - alcaleicaAngle = muddAngle + random(60,120) - xAlcaleica, yAlcaleica = vectorFromAngle(alcaleicaAngle,random(12500,15000)) - stationAlcaleica = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationAlcaleica:setPosition(xAlcaleica,yAlcaleica):setCallSign("Alcaleica"):setDescription(_("scienceDescription-station", "Optical Components")) + xAlcaleica, yAlcaleica = vectorFromAngle(muddAngle + random(60,120),random(12500,15000)) + stationAlcaleica = placeStation(xAlcaleica,yAlcaleica,"Alcaleica","Independent","Small Station") table.insert(stationList,stationAlcaleica) - neutralStations = neutralStations + 1 - goods[stationAlcaleica] = {{"optic",5,66}} + stationAlcaleica.comms_data.goods.optic = {cost = 66, quantity = 5} --California - stationCalifornia = SpaceStation():setTemplate("Small Station"):setFaction("Human Navy"):setCommsScript(""):setCommsFunction(commsStation) - stationCalifornia:setPosition(random(-90000,-70000),random(-15000,25000)):setCallSign("California"):setDescription(_("scienceDescription-station", "Mining station")) + stationCalifornia = placeStation(random(-90000,-70000),random(-15000,25000),"California","Human Navy","Small Station") table.insert(stationList,stationCalifornia) - friendlyStations = friendlyStations + 1 - goods[stationCalifornia] = {{"food",2,1},{"gold",5,25},{"dilithium",2,25}} + stationCalifornia.comms_data.goods.food = {cost = 1, quantity = 2} + stationCalifornia.comms_data.goods.gold = {cost = 25, quantity = 5} + stationCalifornia.comms_data.goods.dilithium = {cost = 25, quantity = 2} --Outpost-15 - stationOutpost15 = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationOutpost15:setPosition(random(35000,50000),random(52000,79000)):setCallSign("Outpost-15"):setDescription(_("scienceDescription-station", "Mining and trade")) + stationOutpost15 = placeStation(random(35000,50000),random(52000,79000),"Outpost-15","Independent","Small Station") table.insert(stationList,stationOutpost15) - neutralStations = neutralStations + 1 placeRandomAroundPoint(Asteroid,25,1,15000,60000,75000) --Outpost-21 - stationOutpost21 = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationOutpost21:setPosition(random(50000,75000),random(52000,61250)):setCallSign("Outpost-21"):setDescription(_("scienceDescription-station", "Mining and gambling")) + stationOutpost21 = placeStation(random(50000,75000),random(52000,61250),"Outpost-21","Independent","Small Station") table.insert(stationList,stationOutpost21) - neutralStations = neutralStations + 1 if random(1,100) < 50 then - goods[stationOutpost15] = {{"luxury",5,70},{"gold",5,25}} - goods[stationOutpost21] = {{"cobalt",4,50}} + stationOutpost15.comms_data.goods.luxury = {cost = 70, quantity = 5} + stationOutpost15.comms_data.goods.gold = {cost = 25, quantity = 5} + stationOutpost21.comms_data.goods.cobalt = {cost = 50, quantity = 4} else - goods[stationOutpost21] = {{"luxury",5,70},{"gold",5,25}} - goods[stationOutpost15] = {{"cobalt",4,50}} + stationOutpost21.comms_data.goods.luxury = {cost = 70, quantity = 5} + stationOutpost21.comms_data.goods.gold = {cost = 25, quantity = 5} + stationOutpost15.comms_data.goods.cobalt = {cost = 50, quantity = 4} end --Valero - stationValero = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationValero:setPosition(random(-88000,-65000),random(36250,40000)):setCallSign("Valero"):setDescription(_("scienceDescription-station", "Resupply")) + stationValero = placeStation(random(-88000,-65000),random(36250,40000),"Valero","Independent","Small Station") table.insert(stationList,stationValero) - neutralStations = neutralStations + 1 - goods[stationValero] = {{"luxury",5,77}} + stationValero.comms_data.goods.luxury = {cost = 77, quantity = 5} --Vactel - vactelAngle = random(0,360) - xVactel, yVactel = vectorFromAngle(vactelAngle,random(50000,61250)) - stationVactel = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationVactel:setPosition(xVactel,yVactel):setCallSign("Vactel"):setDescription(_("scienceDescription-station", "Shielded Circuitry Fabrication")) + local vactelAngle = random(0,360) + local xVactel, yVactel = vectorFromAngle(vactelAngle,random(50000,61250)) + stationVactel = placeStation(xVactel,yVactel,"Vactel","Independent","Small Station") table.insert(stationList,stationVactel) - neutralStations = neutralStations + 1 - goods[stationVactel] = {{"circuit",5,50}} + stationVactel.comms_data.goods.circuit = {cost = 50, quantity = 5} --Archer - archerAngle = vactelAngle + random(60,120) - xArcher, yArcher = vectorFromAngle(archerAngle,random(50000,61250)) - stationArcher = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationArcher:setPosition(xArcher,yArcher):setCallSign("Archer"):setDescription(_("scienceDescription-station", "Shield and Armor Research")) + local archerAngle = vactelAngle + random(60,120) + local xArcher, yArcher = vectorFromAngle(archerAngle,random(50000,61250)) + stationArcher = placeStation(xArcher,yArcher,"Archer","Independent","Small Station") table.insert(stationList,stationArcher) - neutralStations = neutralStations + 1 - goods[stationArcher] = {{"shield",5,90}} + stationArcher.comms_data.goods.shield = {cost = 90, quantity = 5} --Deer - deerAngle = archerAngle + random(60,120) - xDeer, yDeer = vectorFromAngle(deerAngle,random(50000,61250)) - stationDeer = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationDeer:setPosition(xDeer,yDeer):setCallSign("Deer"):setDescription(_("scienceDescription-station", "Repulsor and Tractor Beam Components")) + local deerAngle = archerAngle + random(60,120) + local xDeer, yDeer = vectorFromAngle(deerAngle,random(50000,61250)) + stationDeer = placeStation(xDeer,yDeer,"Deer","Independent","Small Station") table.insert(stationList,stationDeer) - neutralStations = neutralStations + 1 - goods[stationDeer] = {{"tractor",5,90},{"repulsor",5,95}} + stationDeer.comms_data.goods.tractor = {cost = 90, quantity = 5} + stationDeer.comms_data.goods.repulsor = {cost = 95, quantity = 5} --Cavor - cavorAngle = deerAngle + random(60,90) - xCavor, yCavor = vectorFromAngle(cavorAngle,random(50000,61250)) - stationCavor = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationCavor:setPosition(xCavor,yCavor):setCallSign("Cavor"):setDescription(_("scienceDescription-station", "Advanced Material components")) + local cavorAngle = deerAngle + random(60,90) + local xCavor, yCavor = vectorFromAngle(cavorAngle,random(50000,61250)) + stationCavor = placeStation(xCavor,yCavor,"Cavor","Independent","Small Station") table.insert(stationList,stationCavor) - neutralStations = neutralStations + 1 - goods[stationCavor] = {{"filament",5,42}} + stationCavor.comms_data.goods.filament = {cost = 42, quantity = 5} --Emory - stationEmory = SpaceStation():setTemplate("Small Station"):setFaction("Human Navy"):setCommsScript(""):setCommsFunction(commsStation) - stationEmory:setPosition(random(72000,85000),random(-50000,-26000)):setCallSign("Emory"):setDescription(_("scienceDescription-station", "Transporter Components")) + stationEmory = placeStation(random(72000,85000),random(-50000,-26000),"Erickson","Human Navy","Small Station") table.insert(stationList,stationEmory) - friendlyStations = friendlyStations + 1 - goods[stationEmory] = {{"transporter",5,63},{"food",2,1}} + stationEmory.comms_data.goods.transporter = {cost = 63, quantity = 5} + stationEmory.comms_data.goods.food = {cost = 1, quantity = 2} --Veloquan - stationVeloquan = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationVeloquan:setPosition(random(-25000,15000),random(27000,40000)):setCallSign("Veloquan"):setDescription(_("scienceDescription-station", "Sensor components")) + stationVeloquan = placeStation(random(-25000,15000),random(27000,40000),"Veloquan","Independent","Small Station") table.insert(stationList,stationVeloquan) - neutralStations = neutralStations + 1 - goods[stationVeloquan] = {{"sensor",5,68}} + stationVeloquan.comms_data.goods.sensor = {cost = 68, quantity = 5} --Barclay - stationBarclay = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationBarclay:setPosition(random(-20000,0),random(-45000,-25000)):setCallSign("Barclay"):setDescription(_("scienceDescription-station", "Communications components")) + stationBarclay = placeStation(random(-20000,0),random(-45000,-25000),"Barclay","Independent","Small Station") table.insert(stationList,stationBarclay) - neutralStations = neutralStations + 1 - goods[stationBarclay] = {{"communication",5,58}} + stationBarclay.comms_data.goods.communication = {cost = 58, quantity = 5} --Lipkin - stationLipkin = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationLipkin:setPosition(random(20000,45000),random(-25000,-15000)):setCallSign("Lipkin"):setDescription(_("scienceDescription-station", "Autodoc components")) + stationLipkin = placeStation(random(20000,45000),random(-25000,-15000),"Lipkin","Independent","Small Station") table.insert(stationList,stationLipkin) - neutralStations = neutralStations + 1 - goods[stationLipkin] = {{"autodoc",5,76}} + stationLipkin.comms_data.goods.autodoc = {cost = 7, quantity = 5} --Ripley - stationRipley = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationRipley:setPosition(random(-75000,-30000),random(55000,62150)):setCallSign("Ripley"):setDescription(_("scienceDescription-station", "Load Lifters and components")) + stationRipley = placeStation(random(-75000,-30000),random(55000,62150),"Ripley","Independent","Small Station") table.insert(stationList,stationRipley) - neutralStations = neutralStations + 1 - goods[stationRipley] = {{"lifter",5,61}} + stationRipley.comms_data.goods.lifter = {cost = 61, quantity = 5} --Deckard - stationDeckard = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationDeckard:setPosition(random(-45000,-25000),random(-25000,-14000)):setCallSign("Deckard"):setDescription(_("scienceDescription-station", "Android components")) + stationDeckard = placeStation(random(-45000,-25000),random(-25000,-14000),"Deckard","Independent","Small Station") table.insert(stationList,stationDeckard) - neutralStations = neutralStations + 1 - goods[stationDeckard] = {{"android",5,73}} + stationDeckard.comms_data.goods.android = {cost = 73, quantity = 5} --Conner - stationConnor = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationConnor:setPosition(random(-10000,15000),random(15000,27000)):setCallSign("Connor"):setDescription(_("scienceDescription-station", "Weapons Automation components")) + stationConnor = placeStation(random(-10000,15000),random(15000,27000),"Starnet","Independent","Small Station") table.insert(stationList,stationConnor) - neutralStations = neutralStations + 1 --Anderson - stationAnderson = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationAnderson:setPosition(random(15000,20000),random(-25000,48000)):setCallSign("Anderson"):setDescription(_("scienceDescription-station", "Battery and Software Engineering")) + stationAnderson = placeStation(random(15000,20000),random(-25000,48000),"Anderson","Independent","Small Station") table.insert(stationList,stationAnderson) - neutralStations = neutralStations + 1 - goods[stationAnderson] = {{"battery",5,65},{"software",5,115}} + stationAnderson.comms_data.goods.battery = {cost = 65, quantity = 5} + stationAnderson.comms_data.goods.software = {cost = 115, quantity = 5} --Feynman - stationFeynman = SpaceStation():setTemplate("Small Station"):setFaction("Human Navy"):setCommsScript(""):setCommsFunction(commsStation) - stationFeynman:setPosition(random(-90000,-55000),random(25000,36250)):setCallSign("Feynman"):setDescription(_("scienceDescription-station", "Nanotechnology Research")) + stationFeynman = placeStation(random(-90000,-55000),random(25000,36250),"Feynman","Human Navy","Small Station") table.insert(stationList,stationFeynman) - friendlyStations = friendlyStations + 1 - goods[stationFeynman] = {{"nanites",5,79},{"software",5,115},{"food",2,1}} + stationFeynman.comms_data.goods.nanites = {cost = 79, quantity = 5} + stationFeynman.comms_data.goods.software = {cost = 115, quantity = 5} + stationFeynman.comms_data.goods.food = {cost = 1, quantity = 2} --Mayo - stationMayo = SpaceStation():setTemplate("Large Station"):setFaction("Human Navy"):setCommsScript(""):setCommsFunction(commsStation) - stationMayo:setPosition(random(-45000,-30000),random(-14000,12500)):setCallSign("Mayo"):setDescription(_("scienceDescription-station", "Medical Research")) + stationMayo = placeStation(random(-45000,-30000),random(-14000,12500),"Mayo","Human Navy","Large Station") table.insert(stationList,stationMayo) - friendlyStations = friendlyStations + 1 - goods[stationMayo] = {{"food",5,1},{"medicine",5,5}} + stationMayo.comms_data.goods.food = {cost = 1, quantity = 5} + stationMayo.comms_data.goods.medicine = {cost = 5, quantity = 5} --Nefatha - stationNefatha = SpaceStation():setTemplate("Medium Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationNefatha:setPosition(random(-10000,12500),random(-96000,-80000)):setCallSign("Nefatha"):setDescription(_("scienceDescription-station", "Commerce and recreation")) + stationNefatha = placeStation(random(-10000,12500),random(-96000,-80000),"Nefatha","Independent","Medium Station") table.insert(stationList,stationNefatha) - neutralStations = neutralStations + 1 - goods[stationNefatha] = {{"luxury",5,70}} + stationNefatha.comms_data.goods.luxury = {cost = 70, quantity = 5} --Science-4 - stationScience4 = SpaceStation():setTemplate("Medium Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationScience4:setPosition(random(-60000,-40000),random(47000,55000)):setCallSign("Science-4"):setDescription(_("scienceDescription-station", "Biotech research")) + stationScience4 = placeStation(random(-60000,-40000),random(47000,55000),"Science-4","Independent","Medium Station") table.insert(stationList,stationScience4) - neutralStations = neutralStations + 1 - --Speculation-4 - stationSpeculation4 = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationSpeculation4:setPosition(random(-26000,-15000),random(-10000,27000)):setCallSign("Speculation-4"):setDescription(_("scienceDescription-station", "Trading post")) - table.insert(stationList,stationSpeculation4) - neutralStations = neutralStations + 1 - goods[stationSpeculation4] = {{"luxury",5,65}} + --Research-19 + stationResearch19 = placeStation(random(-26000,-15000),random(-10000,27000),"Research-19","Independent","Small Station") + table.insert(stationList,stationResearch19) --Tiberius - stationTiberius = SpaceStation():setTemplate("Medium Station"):setFaction("Human Navy"):setCommsScript(""):setCommsFunction(commsStation) - stationTiberius:setPosition(random(-30000,-26000),random(-14000,35000)):setCallSign("Tiberius"):setDescription(_("scienceDescription-station", "Logistics coordination")) + stationTiberius = placeStation(random(-30000,-26000),random(-14000,35000),"Tiberius","Human Navy","Medium Station") table.insert(stationList,stationTiberius) - friendlyStations = friendlyStations + 1 - goods[stationTiberius] = {{"food",5,1}} - --Research-1 - stationResearch11 = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationResearch11:setPosition(random(-75000,-55000),random(-50000,-25000)):setCallSign("Research-11"):setDescription(_("scienceDescription-station", "Low Gravity Research")) + stationTiberius.comms_data.goods.food = {cost = 1, quantity = 5} + --Research-11 + stationResearch11 = placeStation(random(-75000,-55000),random(-50000,-25000),"Research-11","Independent","Small Station") table.insert(stationList,stationResearch11) - neutralStations = neutralStations + 1 - --Freena - stationFreena = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationFreena:setPosition(random(0,15000),irandom(-37500,-15000)):setCallSign("Freena"):setDescription(_("scienceDescription-station", "Zero gravity sports")) - table.insert(stationList,stationFreena) - neutralStations = neutralStations + 1 + --Madison + stationMadison = placeStation(random(0,15000),irandom(-37500,-15000),"Madison","Independent","Small Station") + table.insert(stationList,stationMadison) --Outpost-33 - stationOutpost33 = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationOutpost33:setPosition(random(15000,65000),random(-65000,-25000)):setCallSign("Outpost-33"):setDescription(_("scienceDescription-station", "Resupply")) + stationOutpost33 = placeStation(random(15000,65000),random(-65000,-25000),"Outpost-33","Independent","Small Station") table.insert(stationList,stationOutpost33) - neutralStations = neutralStations + 1 - goods[stationOutpost33] = {{"luxury",5,75}} + stationOutpost33.comms_data.goods.luxury = {cost = 75, quantity = 5} --Lando - stationLando = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationLando:setPosition(random(-60000,-30000),random(612500,70000)):setCallSign("Lando"):setDescription(_("scienceDescription-station", "Casino and Gambling")) + stationLando = placeStation(random(-60000,-30000),random(612500,70000),"Lando","Independent","Small Station") table.insert(stationList,stationLando) - neutralStations = neutralStations + 1 --Komov - stationKomov = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationKomov:setPosition(random(-55000,-30000),random(70000,80000)):setCallSign("Komov"):setDescription(_("scienceDescription-station", "Xenopsychology research")) + stationKomov = placeStation(random(-55000,-30000),random(70000,80000),"Komov","Independent","Small Station") table.insert(stationList,stationKomov) - neutralStations = neutralStations + 1 --Science-2 - stationScience2 = SpaceStation():setTemplate("Medium Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationScience2:setPosition(random(20000,35000),random(55000,70000)):setCallSign("Science-2"):setDescription(_("scienceDescription-station", "Research Lab and Observatory")) + stationScience2 = placeStation(random(20000,35000),random(55000,70000),"Science-2","Independent","Medium Station") table.insert(stationList,stationScience2) - neutralStations = neutralStations + 1 - --Prefect - stationPrefect = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationPrefect:setPosition(random(-65000,-60000),random(36250,55000)):setCallSign("Prefect"):setDescription(_("scienceDescription-station", "Textile and Fashion Creation")) - table.insert(stationList,stationPrefect) - neutralStations = neutralStations + 1 - goods[stationPrefect] = {{"luxury",5,45}} + --Prada + stationPrada = placeStation(random(-65000,-60000),random(36250,55000),"Prada","Independent","Small Station") + table.insert(stationList,stationPrada) + stationPrada.comms_data.goods.luxury = {cost = 45, quantity = 5} --Outpost-7 - stationOutpost7 = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationOutpost7:setPosition(random(35000,45000),random(-15000,25000)):setCallSign("Outpost-7"):setDescription(_("scienceDescription-station", "Resupply")) + stationOutpost7 = placeStation(random(35000,45000),random(-15000,25000),"Outpost-7","Independent","Small Station") table.insert(stationList,stationOutpost7) - neutralStations = neutralStations + 1 - goods[stationOutpost7] = {{"luxury",5,80}} + stationOutpost7.comms_data.goods.luxury = {cost = 80, quantity = 5} --Organa - stationOrgana = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationOrgana:setPosition(irandom(55000,62000),random(20000,45000)):setCallSign("Organa"):setDescription(_("scienceDescription-station", "Diplomatic training")) + stationOrgana = placeStation(irandom(55000,62000),random(20000,45000),"Organa","Independent","Small Station") table.insert(stationList,stationOrgana) - neutralStations = neutralStations + 1 --Grap - stationGrap = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - xGrap = random(-20000,0) - yGrap = random(-25000,-20000) - stationGrap:setPosition(xGrap,yGrap):setCallSign("Grap"):setDescription(_("scienceDescription-station", "Mining station")) - posAxisGrap = random(0,360) - posGrap = random(10000,60000) - negGrap = random(10000,60000) - spreadGrap = random(4000,8000) - negAxisGrap = posAxisGrap + 180 - xPosAngleGrap, yPosAngleGrap = vectorFromAngle(posAxisGrap, posGrap) - posEnd = random(40,90) + local xGrap = random(-20000,0) + local yGrap = random(-25000,-20000) + stationGrap = placeStation(xGrap,yGrap,"Grap","Independent","Small Station") + local posAxisGrap = random(0,360) + local posGrap = random(10000,60000) + local negGrap = random(10000,60000) + local spreadGrap = random(4000,8000) + local negAxisGrap = posAxisGrap + 180 + local xPosAngleGrap, yPosAngleGrap = vectorFromAngle(posAxisGrap, posGrap) + local posEnd = random(40,90) createRandomAlongArc(Asteroid, afd+posEnd, xGrap+xPosAngleGrap, yGrap+yPosAngleGrap, posGrap, negAxisGrap, negAxisGrap+posEnd, spreadGrap) - xNegAngleGrap, yNegAngleGrap = vectorFromAngle(negAxisGrap, negGrap) - negEnd = random(20,60) + local xNegAngleGrap, yNegAngleGrap = vectorFromAngle(negAxisGrap, negGrap) + local negEnd = random(20,60) createRandomAlongArc(Asteroid, afd+negEnd, xGrap+xNegAngleGrap, yGrap+yNegAngleGrap, negGrap, posAxisGrap, posAxisGrap+negEnd, spreadGrap) table.insert(stationList,stationGrap) - neutralStations = neutralStations + 1 --Grup - stationGrup = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - xGrup = random(-20000,-10000) - yGrup = random(15000,30000) - stationGrup:setPosition(xGrup,yGrup):setCallSign("Grup"):setDescription(_("scienceDescription-station", "Mining station")) - axisGrup = random(0,360) - longGrup = random(30000,60000) - shortGrup = random(10000,30000) - spreadGrup = random(5000,8000) - negAxisGrup = axisGrup + 180 - xLongAngleGrup, yLongAngleGrup = vectorFromAngle(axisGrup, longGrup) - longGrupEnd = random(30,70) + local xGrup = random(-20000,-10000) + local yGrup = random(15000,30000) + stationGrup = placeStation(xGrup,yGrup,"Grup","Independent","Small Station") + local axisGrup = random(0,360) + local longGrup = random(30000,60000) + local shortGrup = random(10000,30000) + local spreadGrup = random(5000,8000) + local negAxisGrup = axisGrup + 180 + local xLongAngleGrup, yLongAngleGrup = vectorFromAngle(axisGrup, longGrup) + local longGrupEnd = random(30,70) createRandomAlongArc(Asteroid, afd+longGrupEnd, xGrup+xLongAngleGrup, yGrup+yLongAngleGrup, longGrup, negAxisGrup, negAxisGrup+longGrupEnd, spreadGrup) - xShortAngleGrup, yShortAngleGrup = vectorFromAngle(axisGrup, shortGrup) - shortGrupEnd = random(40,90) - shortGrupEndQ = shortGrupEnd + local xShortAngleGrup, yShortAngleGrup = vectorFromAngle(axisGrup, shortGrup) + local shortGrupEnd = random(40,90) + local shortGrupEndQ = shortGrupEnd shortGrupEnd = negAxisGrup - shortGrupEnd if shortGrupEnd < 0 then shortGrupEnd = shortGrupEnd + 360 end createRandomAlongArc(Asteroid, afd+shortGrupEndQ, xGrup+xShortAngleGrup, yGrup+yShortAngleGrup, shortGrup, shortGrupEnd, negAxisGrup, spreadGrup) + table.insert(stationList,stationGrup) if random(1,100) < 50 then - goods[stationGrap] = {{"nickel",5,20},{"tritanium",5,50}} - goods[stationGrup] = {{"nickel",3,22},{"dilithium",5,50},{"platinum",5,70}} + stationGrap.comms_data.goods.nickel = {cost = 20, quantity = 5} + stationGrap.comms_data.goods.tritanium = {cost = 50, quantity = 5} + stationGrup.comms_data.goods.nickel = {cost = 22, quantity = 3} + stationGrup.comms_data.goods.dilithium = {cost = 50, quantity = 5} + stationGrup.comms_data.goods.platinum = {cost = 70, quantity = 5} else - goods[stationGrup] = {{"nickel",5,20},{"tritanium",5,50}} - goods[stationGrap] = {{"nickel",3,22},{"dilithium",5,50},{"platinum",5,70}} + stationGrup.comms_data.goods.nickel = {cost = 20, quantity = 5} + stationGrup.comms_data.goods.tritanium = {cost = 50, quantity = 5} + stationGrap.comms_data.goods.nickel = {cost = 22, quantity = 3} + stationGrap.comms_data.goods.dilithium = {cost = 50, quantity = 5} + stationGrap.comms_data.goods.platinum = {cost = 70, quantity = 5} end - table.insert(stationList,stationGrup) - neutralStations = neutralStations + 1 --Outpost-8 - stationOutpost8 = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationOutpost8:setPosition(random(-65000,-40000),random(-61250,-50000)):setCallSign("Outpost-8") + stationOutpost8 = placeStation(random(-65000,-40000),random(-61250,-50000),"Outpost-8","Independent","Small Station") table.insert(stationList,stationOutpost8) - neutralStations = neutralStations + 1 --Science-7 - stationScience7 = SpaceStation():setTemplate("Small Station"):setFaction("Human Navy"):setCommsScript(""):setCommsFunction(commsStation) - stationScience7:setPosition(random(-25000,-20000),random(-40000,-10000)):setCallSign("Science-7"):setDescription(_("scienceDescription-station", "Observatory")) + stationScience7 = placeStation(random(-25000,-20000),random(-40000,-10000),"Science-7","Human Navy","Small Station") table.insert(stationList,stationScience7) - friendlyStations = friendlyStations + 1 - goods[stationScience7] = {{"food",2,1}} + stationScience7.comms_data.goods.food = {cost = 1, quantity = 2} --Carradine - stationCarradine = SpaceStation():setTemplate("Small Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationCarradine:setPosition(random(20000,35000),random(-15000,40000)):setCallSign("Carradine"):setDescription(_("scienceDescription-station", "Impulse Engine Components")) + stationCarradine = placeStation(random(20000,35000),random(-15000,40000),"Carradine","Independent","Small Station") table.insert(stationList,stationCarradine) - neutralStations = neutralStations + 1 - goods[stationCarradine] = {{"impulse",5,100}} --Calvin - stationCalvin = SpaceStation():setTemplate("Medium Station"):setFaction("Independent"):setCommsScript(""):setCommsFunction(commsStation) - stationCalvin:setPosition(random(40000,86250),random(45000,51000)):setCallSign("Calvin"):setDescription(_("scienceDescription-station", "Robotic components")) + stationCalvin = placeStation(random(40000,86250),random(45000,51000),"Calvin","Independent","Medium Station") table.insert(stationList,stationCalvin) - neutralStations = neutralStations + 1 - totalStations = neutralStations + friendlyStations - goods[stationCalvin] = {{"robotic",5,87}} - originalStationList = stationList --save for statistics --Artifacts. Just color (for now) art1 = Artifact():setModel("artifact4"):allowPickup(false):setScanningParameters(2,2):setRadarSignatureInfo(random(4,20),random(2,12), random(7,13)) art2 = Artifact():setModel("artifact5"):allowPickup(false):setScanningParameters(2,3):setRadarSignatureInfo(random(2,12),random(7,13), random(4,20)) @@ -1090,88 +1079,85 @@ function setStations() art2.chroniton = true art1.parallel = true end + enemy_stations = {} --Ganalda - ganaldaAngle = random(0,360) - xGanalda, yGanalda = vectorFromAngle(ganaldaAngle,random(120000,150000)) - stationGanalda = SpaceStation():setTemplate("Medium Station"):setFaction("Kraylor") - stationGanalda:setPosition(xGanalda,yGanalda):setCallSign("Ganalda") + local ganaldaAngle = random(0,360) + local xGanalda, yGanalda = vectorFromAngle(ganaldaAngle,random(120000,150000)) + stationGanalda = placeStation(xGanalda,yGanalda,"Ganalda","Kraylor","Medium Station") + table.insert(enemy_stations,stationGanalda) --Empok Nor - empokAngle = ganaldaAngle + random(60,180) - xEmpok, yEmpok = vectorFromAngle(empokAngle,random(120000,150000)) - stationEmpok = SpaceStation():setTemplate("Large Station"):setFaction("Exuari") - stationEmpok:setPosition(xEmpok,yEmpok):setCallSign("Empok Nor") + local empokAngle = ganaldaAngle + random(60,180) + local xEmpok, yEmpok = vectorFromAngle(empokAngle,random(120000,150000)) + stationEmpok = placeStation(xEmpok,yEmpok,"Empok Nor","Exuari","Large Station") + table.insert(enemy_stations,stationEmpok) --Ticonderoga - ticAngle = empokAngle + random(60,120) - xTic, yTic = vectorFromAngle(ticAngle,random(120000,150000)) - stationTic = SpaceStation():setTemplate("Medium Station"):setFaction("Kraylor") - stationTic:setPosition(xTic,yTic):setCallSign("Ticonderoga") + local ticAngle = empokAngle + random(60,120) + local xTic, yTic = vectorFromAngle(ticAngle,random(120000,150000)) + stationTic = placeStation(xTic,yTic,"Ticonderoga","Kraylor","Medium Station") + table.insert(enemy_stations,stationTic) --Nebulae createRandomAlongArc(Nebula, 15, 100000, -100000, 140000, 100, 170, 25000) Nebula():setPosition(xGanalda,yGanalda) - gDist = distance(stationGanalda,0,0) + local gDist = distance(stationGanalda,0,0) createRandomAlongArc(Nebula, 5, 0, 0, gDist,ganaldaAngle-20, ganaldaAngle+20, 9000) --Alderaan alderaan= Planet():setPosition(random(-27000,32000),random(65500,87500)):setPlanetRadius(3000):setDistanceFromMovementPlane(-2000):setCallSign("Alderaan") alderaan:setPlanetSurfaceTexture("planets/planet-1.png"):setPlanetCloudTexture("planets/clouds-1.png") alderaan:setPlanetAtmosphereTexture("planets/atmosphere.png"):setPlanetAtmosphereColor(0.2,0.2,1.0) alderaan:setAxialRotationTime(400.0):setDescription(_("scienceDescription-planet", "Lush planet with only mild seasonal variations")) + --Grawp grawp = BlackHole():setPosition(random(67000,90000),random(-21000,40000)) grawp.angle = random(0,360) grawp.travel = random(1,5) -- determine which stations will trade food, luxury items and/or medicine for their goods - tradeFood = {} - tradeLuxury = {} - tradeMedicine = {} - tradeFood[stationGrap] = true - if random(1,100) < 50 then tradeLuxury[stationGrap] = true end - tradeMedicine[stationGrap] = true - tradeFood[stationGrup] = true - tradeLuxury[stationGrup] = true - tradeMedicine[stationGrup] = true - tradeFood[stationOutpost15] = true - tradeFood[stationOutpost21] = true - tradeLuxury[stationOutpost21] = true - if random(1,100) < 50 then tradeMedicine[stationOutpost21] = true end - tradeLuxury[stationCarradine] = true - tradeMedicine[stationCarradine] = true - tradeFood[stationZefram] = true - tradeLuxury[stationZefram] = true - tradeLuxury[stationArcher] = true - tradeMedicine[stationArcher] = true - tradeFood[stationDeer] = true - tradeLuxury[stationDeer] = true - tradeMedicine[stationDeer] = true - tradeFood[stationMarconi] = true - tradeLuxury[stationMarconi] = true - tradeFood[stationAlcaleica] = true - tradeMedicine[stationAlcaleica] = true - tradeLuxury[stationCalvin] = true - whatTrade = random(1,100) - if whatTrade < 33 then - tradeMedicine[stationCavor] = true - elseif whatTrade > 66 then - tradeFood[stationCavor] = true - else - tradeLuxury[stationCavor] = true - end - tradeFood[stationEmory] = true - tradeLuxury[stationEmory] = true - tradeMedicine[stationEmory] = true - tradeFood[stationVeloquan] = true - tradeMedicine[stationVeloquan] = true - tradeMedicine[stationBarclay] = true - tradeFood[stationLipkin] = true - tradeLuxury[stationLipkin] = true - tradeMedicine[stationLipkin] = true - tradeFood[stationRipley] = true - tradeLuxury[stationRipley] = true - tradeFood[stationDeckard] = true - tradeLuxury[stationDeckard] = true - tradeLuxury[stationAnderson] = true - tradeFood[stationAnderson] = true - tradeFood[stationFeynman] = true - tradeMedicine[stationOutpost33] = true - spinRandom = math.random(1,3) + stationGrap.comms_data.trade.food = true + stationGrap.comms_data.trade.medicine = true + stationGrap.comms_data.trade.luxury = random(1,100) < 50 + stationGrup.comms_data.trade.food = true + stationGrup.comms_data.trade.medicine = true + stationGrup.comms_data.trade.luxury = true + stationOutpost15.comms_data.trade.food = true + stationOutpost21.comms_data.trade.food = true + stationOutpost21.comms_data.trade.luxury = true + stationOutpost21.comms_data.trade.medicine = random(1,100) < 50 + stationCarradine.comms_data.trade.luxury = true + stationCarradine.comms_data.trade.medicine = true + stationZefram.comms_data.trade.food = true + stationZefram.comms_data.trade.luxury = true + stationArcher.comms_data.trade.luxury = true + stationArcher.comms_data.trade.medicine = true + stationDeer.comms_data.trade.food = true + stationDeer.comms_data.trade.medicine = true + stationDeer.comms_data.trade.luxury = true + stationMarconi.comms_data.trade.luxury = true + stationMarconi.comms_data.trade.food = true + stationAlcaleica.comms_data.trade.food = true + stationAlcaleica.comms_data.trade.medicine = true + stationCalvin.comms_data.trade.luxury = true + local whatTrade = random(1,100) + stationCavor.comms_data.trade.medicine = whatTrade < 33 + stationCavor.comms_data.trade.food = whatTrade > 66 + stationCavor.comms_data.trade.luxury = (whatTrade >= 33 and whatTrade <= 66) + stationEmory.comms_data.trade.food = true + stationEmory.comms_data.trade.medicine = true + stationEmory.comms_data.trade.luxury = true + stationVeloquan.comms_data.trade.food = true + stationVeloquan.comms_data.trade.medicine = true + stationBarclay.comms_data.trade.medicine = true + stationLipkin.comms_data.trade.food = true + stationLipkin.comms_data.trade.medicine = true + stationLipkin.comms_data.trade.luxury = true + stationRipley.comms_data.trade.luxury = true + stationRipley.comms_data.trade.food = true + stationDeckard.comms_data.trade.luxury = true + stationDeckard.comms_data.trade.food = true + stationAnderson.comms_data.trade.luxury = true + stationAnderson.comms_data.trade.food = true + stationFeynman.comms_data.trade.food = true + stationOutpost33.comms_data.trade.medicine = true + upgrade_goods = {} + --set spin upgrade values + local spinRandom = math.random(1,3) if spinRandom == 1 then spinStation = stationAlcaleica elseif spinRandom == 2 then @@ -1187,14 +1173,16 @@ function setStations() else spinComponent = "android" end + table.insert(upgrade_goods,spinComponent) spinBump = random(20,80) - tubeRandom = math.random(1,3) + --set tube upgrade values + local tubeRandom = math.random(1,3) if tubeRandom == 1 then tubeStation = stationVeloquan elseif tubeRandom == 2 then tubeStation = stationOutpost33 else - tubeStation = stationPrefect + tubeStation = stationPrada end tubeRandom = math.random(1,3) if tubeRandom == 1 then @@ -1204,8 +1192,10 @@ function setStations() else tubeComponent = "communication" end + table.insert(upgrade_goods,tubeComponent) + --set beam range upgrade values beamRangeBump = random(15,60) - beamRandom = math.random(1,3) + local beamRandom = math.random(1,3) if beamRandom == 1 then beamComponent = "filament" elseif beamRandom == 2 then @@ -1213,16 +1203,9 @@ function setStations() else beamComponent = "optic" end --- hullRandom = math.random(1,3) --- if hullRandom == 1 then --- hullComponent = "nickel" --- elseif hullRandom == 2 then --- hullComponent = "tritanium" --- else --- hullComponent = "cobalt" --- end --- hullBump = random(40,80) - shieldRandom = math.random(1,3) + table.insert(upgrade_goods,beamComponent) + --set shield upgrade values + local shieldRandom = math.random(1,3) if shieldRandom == 1 then shieldStation = stationKomov elseif shieldRandom == 2 then @@ -1238,8 +1221,10 @@ function setStations() else shieldComponent = "robotic" end + table.insert(upgrade_goods,shieldComponent) shieldBump = random(40,80) - energyRandom = math.random(1,3) + --set energy upgrade values + local energyRandom = math.random(1,3) if energyRandom == 1 then energyComponent = "beam" elseif energyRandom == 2 then @@ -1247,6 +1232,20 @@ function setStations() else energyComponent = "warp" end + table.insert(upgrade_goods,energyComponent) + table.insert(upgrade_goods,"nanites") + table.insert(upgrade_goods,"robotic") + table.insert(upgrade_goods,"tritanium") + table.insert(upgrade_goods,"dilithium") + station_upgrade_list = { + {station = stationZefram, upgrade = _("upgrade-comms","jump drive"), desc = _("upgrade-comms", "We can upgrade your jump drive maximum range for nanites or robotic goods")}, + {station = stationCarradine, upgrade = _("upgrade-comms","impulse drive"), desc = string.format(_("upgrade-comms", "We can increase the speed of your impulse engines by %.2f percent for tritanium or dilithium"),impulseBump)}, + {station = spinStation, upgrade = _("upgrade-comms","maneuver"), desc = string.format(_("upgrade-comms", "We can increase the your rotate speed by %.2f percent for %s"),spinBump,good_desc[spinComponent])}, + {station = stationMarconi, upgrade = _("upgrade-comms","beam range"), desc = string.format(_("upgrade-comms", "We can increase the range of your beam weapons by %.2f percent for %s"),beamRangeBump,good_desc[beamComponent])}, + {station = tubeStation, upgrade = _("upgrade-comms","extra missile tube"), desc = string.format(_("upgrade-comms", "We can add a homing missile tube to your ship for %s"),good_desc[tubeComponent])}, + {station = shieldStation, upgrade = _("upgrade-comms","shield"), desc = string.format(_("upgrade-comms", "We can upgrade your shields by %.2f percent for %s"),shieldBump,good_desc[shieldComponent])}, + {station = stationNefatha, upgrade = _("upgrade-comms","energy capacity"), desc = string.format(_("upgrade-comms", "We can upgrade your energy capacity by 25 percent for %s"),good_desc[energyComponent])}, + } if hazards then hazardDelayReset = 20 hazardDelay = hazardDelayReset @@ -1533,6 +1532,18 @@ function setStations() tpm.angle = 255 table.insert(pacMine850,tpm) end + local player_count = #getActivePlayerShips() + for i=1,player_count do + local psx, psy = vectorFromAngle(random(0,360),random(80000,120000)) + local objects = getObjectsInRadius(psx,psy,5000) + if objects == nil or #objects < 1 then + local placed_station = placeStation(psx,psy,"Sinister","Kraylor") + table.insert(enemy_stations,placed_station) + if random(1,100) < 77 then + Nebula():setPosition(psx,psy) + end + end + end end function createRandomAlongArc(object_type, amount, x, y, distance, startArc, endArcClockwise, randomize) -- Create amount of objects of type object_type along arc @@ -1608,7 +1619,6 @@ function commsStation() neutral = 0.5 } }) - comms_data = comms_target.comms_data if comms_source:isEnemy(comms_target) then return false end @@ -1665,25 +1675,15 @@ function handleDockedState() end) end addCommsReply(_("upgrade-comms", "Do you upgrade spaceships?"), function() - if comms_target == stationZefram then - setCommsMessage(_("upgrade-comms", "We can upgrade your jump drive maximum range for nanites or robotic goods")) - elseif comms_target == stationCarradine then - setCommsMessage(string.format(_("upgrade-comms", "We can increase the speed of your impulse engines by %.2f percent for tritanium or dilithium"),impulseBump)) - elseif comms_target == spinStation then - setCommsMessage(string.format(_("upgrade-comms", "We can increase the speed your rotate speed by %.2f percent for %s"),spinBump,spinComponent)) - elseif comms_target == stationMarconi then - setCommsMessage(string.format(_("upgrade-comms", "We can increase the range of your beam weapons by %.2f percent for %s"),beamRangeBump,beamComponent)) - elseif comms_target == tubeStation then - setCommsMessage(string.format(_("upgrade-comms", "We can add a homing missile tube to your ship for %s"),tubeComponent)) --- elseif comms_target == stationArcher then --- setCommsMessage(string.format(_("upgrade-comms", "We can upgrade the durability of your hull by %.2f percent for %s")),hullBump,hullComponent)) - elseif comms_target == shieldStation then - setCommsMessage(string.format(_("upgrade-comms", "We can upgrade your shields by %.2f percent for %s"),shieldBump,shieldComponent)) - elseif comms_target == stationNefatha then - setCommsMessage(string.format(_("upgrade-comms", "We can upgrade your energy capacity by 25 percent for %s"),energyComponent)) - else - setCommsMessage(_("upgrade-comms", "We don't upgrade spaceships")) + for i,station_info in ipairs(station_upgrade_list) do + if station_info.station == comms_target then + setCommsMessage(station_info.desc) + break + else + setCommsMessage(_("upgrade-comms", "We don't upgrade spaceships")) + end end + addCommsReply(_("Back"), commsStation) end) addCommsReply(_("cartographyOffice-comms", "Visit cartography office"), function() if comms_target.cartographer_description == nil then @@ -1696,131 +1696,250 @@ function handleDockedState() comms_target.cartographer_description = _("cartographyOffice-comms", "The clerk behind the desk glances at you then returns to preening her feathers.") end end - setCommsMessage(string.format(_("cartographyOffice-comms", "%s\n\nYou can examine the brochure on the coffee table or talk to the cartographer"),comms_target.cartographer_description)) - addCommsReply(_("cartographyOffice-comms", "Examine brochure"),function() - setCommsMessage(_("cartographyOffice-comms", "The brochure has a list of nearby stations and has a list of goods nearby")) - addCommsReply(_("cartographyOffice-comms", "Examine station list"), function() - local brochure_stations = "" - local sx, sy = comms_target:getPosition() - local nearby_objects = getObjectsInRadius(sx,sy,30000) - for i, obj in ipairs(nearby_objects) do - if obj.typeName == "SpaceStation" then - if not obj:isEnemy(comms_target) then - if brochure_stations == "" then - brochure_stations = string.format(_("cartographyOffice-comms", "%s %s %s"),obj:getSectorName(),obj:getFaction(),obj:getCallSign()) + local out = _("cartographyOffice-comms","Without looking at you, the clerk tells you that the cartographers are out of the office for the race. They left this list of stations that provide upgrades for any racer that dropped by:") + for i,station_info in ipairs(station_upgrade_list) do + if station_info.station:isValid() then + out = string.format(_("upgrade-comms","%s\nSector:%s Station:%s Upgrade:%s"),out,station_info.station:getSectorName(),station_info.station:getCallSign(),station_info.upgrade) + end + end + setCommsMessage(string.format(_("cartographyOffice-comms", "%s %s"),comms_target.cartographer_description,out)) + addCommsReply(_("Back"),commsStation) + end) + local commerce_available = false + local station_sells = false + local goods_for_sale = "" + local player_has_goods = false + local goods_in_cargo_hold = "" + if comms_target.comms_data.goods ~= nil then + for good, good_data in pairs(comms_target.comms_data.goods) do + if good_data.quantity ~= nil and good_data.quantity > 0 then + commerce_available = true + station_sells = true + goods_for_sale = string.format(_("trade-comms","%s\n%s %s @ %s"),goods_for_sale,good_data.quantity,good_desc[good],good_data.cost) + end + end + end + if comms_source.goods ~= nil then + for good, quantity in pairs(comms_source.goods) do + if quantity > 0 then + player_has_goods = true + goods_in_cargo_hold = string.format(_("trade-comms","%s\n%s: %s"),goods_in_cargo_hold,good_desc[good],quantity) + end + end + end + if commerce_available then + addCommsReply(_("trade-comms", "Buy, sell, trade"), function() + local oMsg = string.format(_("trade-comms","Goods or components available for sale here:%s"),goods_for_sale) + if player_has_goods then + oMsg = string.format(_("trade-comms","%s\nGoods in cargo hold:%s"),oMsg,goods_in_cargo_hold) + else + oMsg = string.format(_("trade-comms","%s\nCargo hold is empty"),oMsg) + end + oMsg = string.format(_("trade-comms","%s\nAvailable space:%s"),oMsg,comms_source.cargo) + setCommsMessage(oMsg) + if station_sells then + local alt_goods = {} + for good, good_data in pairs(comms_target.comms_data.goods) do + if good_data["quantity"] > 0 then + addCommsReply(string.format(_("trade-comms","Buy a %s for %s reputation"),good_desc[good],good_data["cost"]),function() + if not comms_source:isDocked(comms_target) then + setCommsMessage(_("trade-comms","You have to be docked to complete the transaction.")) + return + end + if comms_source.cargo < 1 then + setCommsMessage(string.format(_("trade-comms","Not enough room on %s to purchase %s"),comms_source:getCallSign(),good_desc[good])) + elseif good_data.quantity < 1 then + setCommsMessage(string.format(_("trade-comms","%s ran out of %s."),comms_target:getCallSign(),good_desc[good])) + elseif comms_source:takeReputationPoints(good_data["cost"]) then + comms_source.cargo = comms_source.cargo - 1 + good_data["quantity"] = good_data["quantity"] - 1 + if comms_source.goods == nil then + comms_source.goods = {} + end + if comms_source.goods[good] == nil then + comms_source.goods[good] = 0 + end + comms_source.goods[good] = comms_source.goods[good] + 1 + setCommsMessage(string.format(_("trade-comms","One %s purchased"),good_desc[good])) else - brochure_stations = string.format(_("cartographyOffice-comms", "%s\n%s %s %s"),brochure_stations,obj:getSectorName(),obj:getFaction(),obj:getCallSign()) + setCommsMessage(_("trade-comms","Insufficient reputation")) end + end) + end + for i,upgrade_good in ipairs(upgrade_goods) do + if upgrade_good == good and comms_source:getReputationPoints() < good_data.cost then + table.insert(alt_goods,good) end end end - setCommsMessage(brochure_stations) - addCommsReply(_("Back"),commsStation) - end) - addCommsReply(_("cartographyOffice-comms", "Examine goods list"), function() - local brochure_goods = "" - local sx, sy = comms_target:getPosition() - local nearby_objects = getObjectsInRadius(sx,sy,30000) - for i, obj in ipairs(nearby_objects) do - if obj.typeName == "SpaceStation" then - if not obj:isEnemy(comms_target) then - if goods[obj] ~= nil then - local gi = 1 - repeat - if brochure_goods == "" then - brochure_goods = string.format(_("cartographyOffice-comms", "Good, quantity, cost, station:\n%s, %i, %i, %s"),goods[obj][gi][1],goods[obj][gi][2],goods[obj][gi][3],obj:getCallSign()) - else - brochure_goods = string.format(_("cartographyOffice-comms", "%s\n%s, %i, %i, %s"),brochure_goods,goods[obj][gi][1],goods[obj][gi][2],goods[obj][gi][3],obj:getCallSign()) + if #alt_goods > 0 then + if comms_source.asteroid_contract ~= nil then + local contract_match = false + local contract_completed = false + local player_contract = nil + local pac_index = nil + for i,pac in ipairs(comms_source.asteroid_contract) do + if pac.station == comms_target then + contract_match = true + player_contract = pac + if not pac.a:isValid() then + contract_completed = true + end + pac_index = i + break + end + end + if contract_completed then + for i,alt_good in ipairs(alt_goods) do + addCommsReply(string.format(_("trade-comms","Accept %s for removing asteroid"),alt_good),function() + if comms_source.goods == nil then + comms_source.goods = {} + end + if comms_source.goods[alt_good] == nil then + comms_source.goods[alt_good] = 0 end - gi = gi + 1 - until(gi > #goods[obj]) + comms_source.goods[alt_good] = comms_source.goods[alt_good] + 1 + comms_source.cargo = comms_source.cargo - 1 + comms_target.comms_data.goods[alt_good].quantity = math.max(0,comms_target.comms_data.goods[alt_good].quantity - 1) + setCommsMessage(string.format(_("trade-comms","One %s obtained"),good_desc[alt_good])) + table.remove(comms_source.asteroid_contract,pac_index) + if #comms_source.asteroid_contract < 1 then + comms_source.asteroid_contract = nil + end + end) + end + else + if contract_match then + addCommsReply(_("trade-comms","Where's the asteroid you want us to remove?"),function() + local a_bearing = angleHeading(comms_station,player_contract.a) + local a_dist = distance(comms_target,player_contract.a)/1000 + setCommsMessage(string.format(_("trade-comms","Bearing %.1f, distance %.1fu from %s"),a_bearing,a_dist,comms_target:getCallSign())) + end) end end - end - end - setCommsMessage(brochure_goods) - addCommsReply(_("Back"),commsStation) - end) - addCommsReply(_("Back"),commsStation) - end) - addCommsReply(_("cartographyOffice-comms", "Talk to apprentice cartographer"), function() - setCommsMessage(_("cartographyOffice-comms", "Hi, would you like for me to locate a station or some goods for you?")) - addCommsReply(_("cartographyOffice-comms", "Locate station"), function() - setCommsMessage(_("cartographyOffice-comms", "These are stations I have learned")) - local sx, sy = comms_target:getPosition() - local nearby_objects = getObjectsInRadius(sx,sy,50000) - local stations_known = 0 - for i, obj in ipairs(nearby_objects) do - if obj.typeName == "SpaceStation" then - if not obj:isEnemy(comms_target) then - stations_known = stations_known + 1 - addCommsReply(obj:getCallSign(),function() - local station_details = string.format(_("cartographyOffice-comms", "%s %s %s"),obj:getSectorName(),obj:getFaction(),obj:getCallSign()) - if goods[obj] ~= nil then - station_details = string.format(_("cartographyOffice-comms", "%s\nGood, quantity, cost"),station_details) - local gi = 1 - repeat - station_details = string.format(_("cartographyOffice-comms", "%s\n %s, %i, %i"),station_details,goods[obj][gi][1],goods[obj][gi][2],goods[obj][gi][3]) - gi = gi + 1 - until(gi > #goods[obj]) + elseif comms_source.enemy_station_contract ~= nil then + local contract_match = false + local contract_completed = false + local player_contract = nil + local pesc_index = nil + for i,pesc in ipairs(comms_source.enemy_station_contract) do + if pesc.contractor == comms_target then + contract_match = true + planer_contract = pesc + if not pesc.station:isValid() then + contract_completed = true end - setCommsMessage(station_details) - addCommsReply(_("Back"),commsStation) - end) + pesc_index = i + break + end end - end - end - if stations_known == 0 then - setCommsMessage(_("cartographyOffice-comms", "I have learned of no stations yet")) - end - addCommsReply(_("Back"),commsStation) - end) - addCommsReply(_("cartographyOffice-comms", "Locate goods"), function() - setCommsMessage(_("cartographyOffice-comms", "These are the goods I know about")) - local sx, sy = comms_target:getPosition() - local nearby_objects = getObjectsInRadius(sx,sy,50000) - local button_count = 0 - local by_goods = {} - for i, obj in ipairs(nearby_objects) do - if obj.typeName == "SpaceStation" then - if not obj:isEnemy(comms_target) then - if goods[obj] ~= nil then - station_details = string.format(_("cartographyOffice-comms", "%s\nGood, quantity, cost"),station_details) - local gi = 1 - repeat - by_goods[goods[obj][gi][1]] = obj - gi = gi + 1 - until(gi > #goods[obj]) + if contract_completed then + for i,alt_good in ipairs(alt_goods) do + addCommsReply(string.format("Accept %s for removing station",alt_good),function() + if comms_source.goods == nil then + comms_source.goods = {} + end + if comms_source.goods[alt_good] == nil then + comms_source.goods[alt_good] = 0 + end + comms_source.goods[alt_good] = comms_source.goods[alt_good] + 1 + comms_source.cargo = comms_source.cargo - 1 + comms_target.comms_data.goods[alt_good].quantity = math.max(0,comms_target.comms_data.goods[alt_good].quantity - 1) + setCommsMessage(string.format(_("trade-comms","One %s obtained"),good_desc[alt_good])) + table.remove(comms_source.enemy_station_contract,pesc_index) + if #comms_source.enemy_station_contract < 1 then + comms_source.enemy_station_contract = nil + end + end) + end + else + if contract_match then + addCommsReply("What station did you want us to remove?",function() + setCommsMessage(string.format("%s in sector %s",player_contract.station:getCallSign(),player_contract.station:getSectorName())) + end) end end - end - end - for good, obj in pairs(by_goods) do - addCommsReply(good, function() - local station_details = string.format(_("cartographyOffice-comms", "%s %s %s"),obj:getSectorName(),obj:getFaction(),obj:getCallSign()) - if goods[obj] ~= nil then --- if obj.comms_data.goods ~= nil then - station_details = string.format(_("cartographyOffice-comms", "%s\nGood, quantity, cost"),station_details) - local gi = 1 - repeat - station_details = string.format(_("cartographyOffice-comms", "%s\n %s, %i, %i"),station_details,goods[obj][gi][1],goods[obj][gi][2],goods[obj][gi][3]) - gi = gi + 1 - until(gi > #goods[obj]) + else + local sx, sy = comms_target:getPosition() + local objects = getObjectsInRadius(sx,sy,10000) + local asteroids = {} + for i,obj in ipairs(objects) do + if obj.typeName == "Asteroid" then + local ax, ay = obj:getPosition() + local sx, sy = comms_target:getPosition() + table.insert(asteroids,{a = obj, dist = distance(ax, ay, sx, sy)}) + end + end + if #asteroids > 0 then + addCommsReply(_("trade-comms","Can I get goods without spending reputation?"),function() + local out = _("trade-comms","We could give you") + if #alt_goods > 1 then + local alt_good_list_string = "" + for i,alt_good in ipairs(alt_goods) do + if alt_good_list_string == "" then + alt_good_list_string = good_desc[alt_good] + else + alt_good_list_string = string.format(_("trade-comms","%s, %s"),alt_good_list_string,good_desc[alt_good]) + end + end + out = string.format(_("trade-comms","%s one of these (%s)"),out,alt_good_list_string) + else + out = string.format(_("trade-comms","%s %s"),out,good_desc[alt_goods[1]]) + end + table.sort(asteroids,function(a,b) + return a.dist < b.dist + end) + local sx, sy = comms_target:getPosition() + local ax, ay = asteroids[1].a:getPosition() + local a_bearing = angleHeading(sx, sy, ax, ay) + out = string.format(_("trade-comms","%s if you removed the asteroid at bearing %.1f, distance %.1fu for us. It's been mined out and has become a navigation hazard."),out,a_bearing,asteroids[1].dist/1000) + setCommsMessage(out) + addCommsReply(_("trade-comms","Agree to remove the asteroid"),function() + if comms_source.asteroid_contract == nil then + comms_source.asteroid_contract = {} + end + table.insert(comms_source.asteroid_contract,{a = asteroids[1].a, station = comms_target}) + setCommsMessage(_("trade-comms","Come back and ask to buy your desired resource after you have removed the asteroid.")) + end) + end) + else + --no nearby asteroids + addCommsReply(_("trade-comms","Can I get goods without spending reputation?"),function() + local out = _("trade-comms","The Human Navy can earn more reputation by destroying enemy stations. These enemies agree to remove their ships for the race since it benefits commerce in the area, but their stations are still here. Technically, we're supposed to leave them alone, but if some were 'accidentally' destroyed, that would facilitate some future business for us. These are the known enemy stations:") + for i,station in ipairs(enemy_stations) do + if station:isValid() then + out = string.format(_("destroyTrade-comms","%s\n%s %s"),out,station:getSectorName(),station:getCallSign()) + end + end + setCommsMessage(out) + addCommsReply(_("trade-comms","Would you exchange goods if we destroyed a station?"),function() + local sorted_enemy_stations = {} + local tx, ty = comms_target:getPosition() + for i,station in ipairs(enemy_stations) do + if station:isValid() then + local sx, sy = station:getPosition() + table.insert(sorted_enemy_stations,{station = station, dist = distance(tx, ty, sx, sy)}) + end + end + table.sort(sorted_enemy_stations,function(a, b) + return a.dist < b.dist + end) + setCommsMessage(string.format(_("trade-comms","We could make an exchange if %s were destroyed. It's the closest and thus disrupts our business the most."),sorted_enemy_stations[1].station:getCallSign())) + addCommsReply(string.format(_("trade-comms","Agree to destroy station %s"),sorted_enemy_stations[1].station:getCallSign()),function() + if comms_source.enemy_station_contract == nil then + comms_source.enemy_station_contract = {} + end + table.insert(comms_source.enemy_station_contract,{station = sorted_enemy_stations[1].station, contractor = comms_target}) + setCommsMessage(string.format(_("trade-comms","Come back and ask to buy your desired resource after %s has been removed."),sorted_enemy_stations[1].station:getCallSign())) + end) + end) + end) end - setCommsMessage(station_details) - addCommsReply(_("Back"),commsStation) - end) - button_count = button_count + 1 - if button_count >= 20 then - break end end - addCommsReply(_("Back"),commsStation) - end) - addCommsReply(_("Back"),commsStation) + end end) - addCommsReply(_("Back"),commsStation) - end) + end if goods[comms_target] ~= nil then addCommsReply(_("trade-comms", "Buy, sell, trade"), function() oMsg = _("trade-comms", "Goods or components available here: quantity, cost in reputation\n") @@ -1979,267 +2098,202 @@ function handleDockedState() end) end if comms_target == stationZefram then - gi = 1 - naniteQuantity = 0 - roboticQuantity = 0 - repeat - if goods[comms_source][gi][1] == "nanites" then - naniteQuantity = goods[comms_source][gi][2] - end - if goods[comms_source][gi][1] == "robotic" then - roboticQuantity = goods[comms_source][gi][2] - end - gi = gi + 1 - until(gi > #goods[comms_source]) - if naniteQuantity > 0 then - if comms_source:hasJumpDrive() then - addCommsReply(_("upgrade-comms", "Provide nanites for jump drive upgrade"), function() - if comms_source.jumpUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) - else - decrementPlayerGoods("nanites") - comms_source.cargo = comms_source.cargo + 1 - comms_source.jumpUpgrade = true - if comms_source:getTypeName() == "Player Fighter" then - comms_source:setJumpDriveRange(3000,45000) + if comms_source:hasJumpDrive() then + if comms_source.goods ~= nil then + if comms_source.goods.nanites ~= nil and comms_source.goods.nanites > 0 then + addCommsReply(_("upgrade-comms", "Provide nanites for jump drive upgrade"), function() + if comms_source.jump_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the upgrade")) + else + comms_source.goods.nanites = comms_source.goods.nanites - 1 + comms_source.cargo = comms_source.cargo + 1 + if comms_source:getTypeName() == "Player Fighter" then + comms_source:setJumpDriveRange(3000,45000) + else + comms_source:setJumpDriveRange(5000,55000) + end + setCommsMessage(_("upgrade-comms", "Your jump drive has been upgraded")) + comms_source.jump_upgrade = true + end + end) + end + if comms_source.goods.robotic ~= nil and comms_source.goods.robotic > 0 then + addCommsReply(_("upgrade-comms", "Provide robotic for jump drive upgrade"), function() + if comms_source.jump_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the jump drive upgrade")) else - comms_source:setJumpDriveRange(5000,55000) + comms_source.goods.robotic = comms_source.goods.robotic - 1 + comms_source.cargo = comms_source.cargo + 1 + if comms_source:getTypeName() == "Player Fighter" then + comms_source:setJumpDriveRange(3000,45000) + else + comms_source:setJumpDriveRange(5000,55000) + end + setCommsMessage(_("upgrade-comms", "Your jump drive has been upgraded")) + comms_source.jump_upgrade = true end - setCommsMessage(_("upgrade-comms", "Your jump drive has been upgraded")) + end) + end + end + end + end + if comms_target == stationCarradine then + if comms_source.goods ~= nil then + if comms_source.goods.dilithium ~= nil and comms_source.goods.dilithium > 0 then + addCommsReply(string.format(_("upgrade-comms", "Provide dilithium for %f percent impulse engine speed upgrade"),impulseBump), function() + if comms_source.impulse_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the impulse drive upgrade")) + else + comms_source.goods.dilithium = comms_source.goods.dilithium - 1 + comms_source.cargo = comms_source.cargo + 1 + comms_source:setImpulseMaxSpeed(comms_source:getImpulseMaxSpeed()*(1+impulseBump/100)) + setCommsMessage(_("upgrade-comms", "Your impulse engine speed has been upgraded")) + comms_source.impulse_upgrade = true end end) end - end - if roboticQuantity > 0 then - if comms_source:hasJumpDrive() then - addCommsReply(_("upgrade-comms", "Provide robotic goods for jump drive upgrade"), function() - if comms_source.jumpUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) + if comms_source.goods.tritanium ~= nil and comms_source.goods.tritanium > 0 then + addCommsReply(string.format(_("upgrade-comms", "Provide tritanium for %f percent impulse engine speed upgrade"),impulseBump), function() + if comms_source.impulse_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the impulse drive upgrade")) else - decrementPlayerGoods("robotic") + comms_source.goods.tritanium = comms_source.goods.tritanium - 1 comms_source.cargo = comms_source.cargo + 1 - comms_source.jumpUpgrade = true - if comms_source:getTypeName() == "Player Fighter" then - comms_source:setJumpDriveRange(3000,45000) - else - comms_source:setJumpDriveRange(5000,55000) - end - setCommsMessage(_("upgrade-comms", "Your jump drive has been upgraded")) + comms_source:setImpulseMaxSpeed(comms_source:getImpulseMaxSpeed()*(1+impulseBump/100)) + setCommsMessage(_("upgrade-comms", "Your impulse engine speed has been upgraded")) + comms_source.impulse_upgrade = true end end) end end end - if comms_target == stationCarradine then - gi = 1 - tritaniumQuantity = 0 - dilithiumQuantity = 0 - repeat - if goods[comms_source][gi][1] == "tritanium" then - tritaniumQuantity = goods[comms_source][gi][2] - end - if goods[comms_source][gi][1] == "dilithium" then - dilithiumQuantity = goods[comms_source][gi][2] - end - gi = gi + 1 - until(gi > #goods[comms_source]) - if tritaniumQuantity > 0 then - addCommsReply(string.format(_("upgrade-comms", "Provide tritanium for %.2f percent impulse engine speed upgrade"),impulseBump), function() - if comms_source.impulseUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) - else - decrementPlayerGoods("tritanium") - comms_source.cargo = comms_source.cargo + 1 - comms_source.impulseUpgrade = true - comms_source:setImpulseMaxSpeed(comms_source:getImpulseMaxSpeed()*(1+impulseBump/100)) - setCommsMessage(_("upgrade-comms", "Your impulse engine speed has been upgraded")) - end - end) - end - if dilithiumQuantity > 0 then - addCommsReply(string.format(_("upgrade-comms", "Provide dilithium for %f percent impulse engine speed upgrade"),impulseBump), function() - if comms_source.impulseUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) - else - decrementPlayerGoods("dilithium") - comms_source.cargo = comms_source.cargo + 1 - comms_source.impulseUpgrade = true - comms_source:setImpulseMaxSpeed(comms_source:getImpulseMaxSpeed()*(1+impulseBump/100)) - setCommsMessage(_("upgrade-comms", "Your impulse engine speed has been upgraded")) - end - end) - end - end if comms_target == spinStation then - gi = 1 - spinQuantity = 0 - repeat - if goods[comms_source][gi][1] == spinComponent then - spinQuantity = goods[comms_source][gi][2] - end - gi = gi + 1 - until(gi > #goods[comms_source]) - if spinQuantity > 0 then - addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent maneuver speed upgrade"),spinComponent,spinBump), function() - if comms_source.spinUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) - else - decrementPlayerGoods(spinComponent) - comms_source.cargo = comms_source.cargo + 1 - comms_source.spinUpgrade = true - comms_source:setRotationMaxSpeed(comms_source:getRotationMaxSpeed()*(1+spinBump/100)) - setCommsMessage(_("upgrade-comms", "Your spin speed has been upgraded")) - end - end) + if comms_source.goods ~= nil then + if comms_source.goods[spinComponent] > 0 then + addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent maneuver speed upgrade"),spinComponent,spinBump), function() + if comms_source.spin_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the maneuver speed upgrade")) + else + comms_source.goods[spinComponent] = comms_source.goods[spinComponent] - 1 + comms_source.cargo = comms_source.cargo + 1 + comms_source:setRotationMaxSpeed(comms_source:getRotationMaxSpeed()*(1+spinBump/100)) + setCommsMessage(_("upgrade-comms", "Your spin speed has been upgraded")) + comms_source.spin_upgrade = true + end + end) + end end end if comms_target == stationMarconi then - gi = 1 - beamQuantity = 0 - repeat - if goods[comms_source][gi][1] == beamComponent then - beamQuantity = goods[comms_source][gi][2] - end - gi = gi + 1 - until(gi > #goods[comms_source]) - if beamQuantity > 0 then - addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent beam range upgrade"),beamComponent,beamRangeBump), function() - if comms_source.beamRangeUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) - else - if comms_source:getBeamWeaponRange(0) > 0 then - decrementPlayerGoods(beamComponent) - comms_source.cargo = comms_source.cargo + 1 - comms_source.beamRangeUpgrade = true - for b=0,tempBeam-1 do - newRange = comms_source:getBeamWeaponRange(b) * (1+beamRangeBump/100) - tempCycle = comms_source:getBeamWeaponCycleTime(b) - tempDamage = comms_source:getBeamWeaponDamage(b) - tempArc = comms_source:getBeamWeaponArc(b) - tempDirection = comms_source:getBeamWeaponDirection(b) - comms_source:setBeamWeapon(b,tempArc,tempDirection,newRange,tempCycle,tempDamage) - end - setCommsMessage(_("upgrade-comms", "Your beam range has been upgraded")) + if comms_source.goods ~= nil then + if comms_source.goods[beamComponent] > 0 then + addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent beam range upgrade"),beamComponent,beamRangeBump), function() + if comms_source.beam_range_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the beam range upgrade")) else - setCommsMessage(_("upgrade-comms", "Your ship does not support a beam weapon upgrade")) + if comms_source:getBeamWeaponRange(0) < 1 then + setCommsMessage(_("upgrade-comms", "Your ship does not support a beam weapon upgrade")) + else + comms_source.goods[beamComponent] = comms_source.goods[beamComponent] - 1 + comms_source.cargo = comms_source.cargo + 1 + local bi = 0 + repeat + local arc = comms_source:getBeamWeaponArc(bi) + local dir = comms_source:getBeamWeaponDirection(bi) + local rng = comms_source:getBeamWeaponRange(bi) + local cyc = comms_source:getBeamWeaponCycleTime(bi) + local dmg = comms_source:getBeamWeaponDamage(bi) + comms_source:setBeamWeapon(bi,arc,dir,rng*(1+beamRangeBump/100),cyc,dmg) + bi = bi + 1 + until(comms_source:getBeamWeaponRange(bi) < 1 or bi > 15) + setCommsMessage(_("upgrade-comms", "Your beam range has been upgraded")) + comms_source.beam_range_upgrade = true + end end - end - end) + end) + end end end if comms_target == tubeStation then - gi = 1 - tubeQuantity = 0 - repeat - if goods[comms_source][gi][1] == tubeComponent then - tubeQuantity = goods[comms_source][gi][2] - end - gi = gi + 1 - until(gi > #goods[comms_source]) - if tubeQuantity > 0 then - addCommsReply(string.format(_("upgrade-comms", "Provide %s for additional homing missile tube"),tubeComponent), function() - if comms_source.tubeUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) - else - decrementPlayerGoods(tubeComponent) - comms_source.cargo = comms_source.cargo + 1 - comms_source.tubeUpgrade = true - originalTubes = comms_source:getWeaponTubeCount() - newTubes = originalTubes + 1 - comms_source:setWeaponTubeCount(newTubes) - comms_source:setWeaponTubeExclusiveFor(originalTubes, "Homing") - comms_source:setWeaponStorageMax("Homing", comms_source:getWeaponStorageMax("Homing") + 2) - comms_source:setWeaponStorage("Homing", comms_source:getWeaponStorage("Homing") + 2) - setCommsMessage(_("upgrade-comms", "You now have an additional homing missile tube")) - end - end) + if comms_source.goods ~= nil then + if comms_source.goods[tubeComponent] > 0 then + addCommsReply(string.format(_("upgrade-comms", "Provide %s for additional homing missile tube"),tubeComponent), function() + if comms_source.tube_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the missile tube upgrade")) + else + comms_source.goods[tubeComponent] = comms_source.goods[tubeComponent] - 1 + comms_source.cargo = comms_source.cargo + 1 + local original_tubes = comms_source:getWeaponTubeCount() + local new_tubes = original_tubes + 1 + comms_source:setWeaponTubeCount(new_tubes) + comms_source:setWeaponTubeExclusiveFor(original_tubes, "Homing") + comms_source:setWeaponStorageMax("Homing", comms_source:getWeaponStorageMax("Homing") + 2) + comms_source:setWeaponStorage("Homing", comms_source:getWeaponStorage("Homing") + 2) + setCommsMessage(_("upgrade-comms", "You now have an additional homing missile tube")) + comms_source.tube_upgrade = true + end + end) + end end end --- if comms_target == stationArcher then --- gi = 1 --- hullQuantity = 0 --- repeat --- if goods[comms_source][gi][1] == hullComponent then --- hullQuantity = goods[comms_source][gi][2] --- end --- gi = gi + 1 --- until(gi > #goods[comms_source]) --- if hullQuantity > 0 then --- addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent hull upgrade"),hullComponent,hullBump), function() --- if comms_source.hullUpgrade then --- setCommsMessage(_("upgrade-comms", "You already have the upgrade")) --- else --- decrementPlayerGoods(hullComponent) --- comms_source.cargo = comms_source.cargo + 1 --- comms_source.hullUpgrade = true --- comms_source:setHullMax(comms_source:getHullMax()*(1+hullBump/100)) --- setCommsMessage(_("upgrade-comms", "You now have an upgraded hull")) --- end --- end) --- end --- end if comms_target == stationNefatha then - gi = 1 - energyQuantity = 0 - repeat - if goods[comms_source][gi][1] == energyComponent then - energyQuantity = goods[comms_source][gi][2] - end - gi = gi + 1 - until(gi > #goods[comms_source]) - if energyQuantity > 0 then - addCommsReply(string.format(_("upgrade-comms", "Provide %s for 25 percent energy capacity upgrade"),energyComponent), function() - if comms_source.energyUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) - else - decrementPlayerGoods(energyComponent) - comms_source.cargo = comms_source.cargo + 1 - comms_source.energyUpgrade = true - comms_source:setMaxEnergy(comms_source:getMaxEnergy()*1.25) - setCommsMessage(_("upgrade-comms", "You now have upgraded energy capacity")) - end - end) + if comms_source.goods ~= nil then + if comms_source.goods[energyComponent] > 0 then + addCommsReply(string.format(_("upgrade-comms", "Provide %s for 25 percent energy capacity upgrade"),energyComponent), function() + if comms_source.energy_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the energy capacity upgrade")) + else + comms_source.goods[energyComponent] = comms_source.goods[energyComponent] - 1 + comms_source.cargo = comms_source.cargo + 1 + comms_source:setMaxEnergy(comms_source:getMaxEnergy()*1.25) + setCommsMessage(_("upgrade-comms", "You now have upgraded energy capacity")) + comms_source.energy_upgrade = true + end + end) + end end end if comms_target == shieldStation then - gi = 1 - shieldQuantity = 0 - repeat - if goods[comms_source][gi][1] == shieldComponent then - shieldQuantity = goods[comms_source][gi][2] - end - gi = gi + 1 - until(gi > #goods[comms_source]) - if shieldQuantity > 0 then - addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent front shield upgrade"),shieldComponent,shieldBump), function() - if comms_source.frontShieldUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) - else - decrementPlayerGoods(shieldComponent) - comms_source.cargo = comms_source.cargo + 1 - comms_source.frontShieldUpgrade = true - si = comms_source:getShieldCount() + if comms_source.goods ~= nil then + if comms_source.goods[shieldComponent] > 0 then + if comms_source:getShieldCount() > 0 then if comms_source:getShieldCount() == 1 then - comms_source:setShieldsMax(comms_source:getShieldMax(0)*(1+shieldBump/100)) - else - comms_source:setShieldsMax(comms_source:getShieldMax(0)*(1+shieldBump/100), comms_source:getShieldMax(1)) + addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent shield upgrade"),shieldComponent,shieldBump), function() + if comms_source.front_shield_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the shield upgrade")) + else + comms_source.goods[shieldComponent] = comms_source.goods[shieldComponent] - 1 + comms_source.cargo = comms_source.cargo + 1 + comms_source:setShieldsMax(comms_source:getShieldMax(0)*(1+shieldBump/100)) + setCommsMessage(_("upgrade-comms", "You now have upgraded shield capacity")) + comms_source.front_shield_upgrade = true + end + end) + elseif comms_source:getShieldCount() > 1 then + addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent front shield upgrade"),shieldComponent,shieldBump), function() + if comms_source.front_shield_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the front shield upgrade")) + else + comms_source.goods[shieldComponent] = comms_source.goods[shieldComponent] - 1 + comms_source.cargo = comms_source.cargo + 1 + comms_source:setShieldsMax(comms_source:getShieldMax(0)*(1+shieldBump/100), comms_source:getShieldMax(1)) + setCommsMessage(_("upgrade-comms", "You now have upgraded front shield capacity")) + comms_source.front_shield_upgrade = true + end + end) + addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent rear shield upgrade"),shieldComponent,shieldBump), function() + if comms_source.rear_shield_upgrade then + setCommsMessage(_("upgrade-comms", "You already have the rear shield upgrade")) + else + comms_source.goods[shieldComponent] = comms_source.goods[shieldComponent] - 1 + comms_source.cargo = comms_source.cargo + 1 + comms_source:setShieldsMax(comms_source:getShieldMax(0), comms_source:getShieldMax(1)*(1+shieldBump/100)) + setCommsMessage(_("upgrade-comms", "You now have upgraded rear shield capacity")) + comms_source.rear_shield_upgrade = true + end + end) end - setCommsMessage(_("upgrade-comms", "You now have an upgraded front shield")) end - end) - if comms_source:getShieldCount() > 1 then - addCommsReply(string.format(_("upgrade-comms", "Provide %s for %.2f percent rear shield upgrade"),shieldComponent,shieldBump), function() - if comms_source.rearShieldUpgrade then - setCommsMessage(_("upgrade-comms", "You already have the upgrade")) - else - decrementPlayerGoods(shieldComponent) - comms_source.cargo = comms_source.cargo + 1 - comms_source.rearShieldUpgrade = true - si = comms_source:getShieldCount() - comms_source:setShieldsMax(comms_source:getShieldMax(0), comms_source:getShieldMax(1)*(1+shieldBump/100)) - setCommsMessage(_("upgrade-comms", "You now have an upgraded rear shield")) - end - end) end end end @@ -2303,26 +2357,16 @@ function handleUndockedState() setCommsMessage(oMsg) addCommsReply(_("station-comms", "I need information"), function() setCommsMessage(_("station-comms", "What kind of information do you need?")) - addCommsReply(_("upgrade-comms","Do you upgrade spaceships?"), function() - if comms_target == stationZefram then - setCommsMessage(_("upgrade-comms","We can upgrade your jump drive maximum range for nanites or robotic goods")) - elseif comms_target == stationCarradine then - setCommsMessage(string.format(_("upgrade-comms","We can increase the speed of your impulse engines by %.2f percent for tritanium or dilithium"),impulseBump)) - elseif comms_target == spinStation then - setCommsMessage(string.format(_("upgrade-comms","We can increase the speed your rotate speed by %.2f percent for %s"),spinBump,spinComponent)) - elseif comms_target == stationMarconi then - setCommsMessage(string.format(_("upgrade-comms","We can increase the range of your beam weapons by %.2f percent for %s"),beamRangeBump,beamComponent)) - elseif comms_target == tubeStation then - setCommsMessage(string.format(_("upgrade-comms","We can add a homing missile tube to your ship for %s"),tubeComponent)) --- elseif comms_target == stationArcher then --- setCommsMessage(string.format(_("upgrade-comms", "We can upgrade the durability of your hull by %.2f percent for %s"),hullBump,hullComponent)) - elseif comms_target == shieldStation then - setCommsMessage(string.format(_("upgrade-comms","We can upgrade your shields by %.2f percent for %s"),shieldBump,shieldComponent)) - elseif comms_target == stationNefatha then - setCommsMessage(string.format(_("upgrade-comms","We can upgrade your energy capacity by 25 percent for %s"),energyComponent)) - else - setCommsMessage(_("upgrade-comms","We don't upgrade spaceships")) + addCommsReply(_("upgrade-comms", "Do you upgrade spaceships?"), function() + for i,station_info in ipairs(station_upgrade_list) do + if station_info.station == comms_target then + setCommsMessage(station_info.desc) + break + else + setCommsMessage(_("upgrade-comms", "We don't upgrade spaceships")) + end end + addCommsReply(_("Back"), commsStation) end) if comms_target == stationTimer then addCommsReply(_("station-comms","How far am I from the race start point?"),function() @@ -2338,8 +2382,17 @@ function handleUndockedState() else setCommsMessage(string.format(_("station-comms","%s, my messaging terminal says you're %.1f units away, %s."),comms_source:getCallSign(),current_distance,qualify)) end + addCommsReply(_("Back"), commsStation) end) - end + end + addCommsReply(_("station-comms","Station docking service status"),function() + local out = _("station-comms","Station docking services report:") + out = string.format(_("station-comms","%s\nRestock scan probes: %s"),out,comms_target:getRestocksScanProbes()) + out = string.format(_("station-comms","%s\nRecharge energy: %s"),out,comms_target:getSharesEnergyWithDocked()) + out = string.format(_("station-comms","%s\nRepair hull: %s"),out,comms_target:getRepairDocked()) + setCommsMessage(out) + addCommsReply(_("Back"), commsStation) + end) end) if comms_source:isFriendly(comms_target) then addCommsReply(_("orders-comms", "What are my current orders?"), function() @@ -2449,7 +2502,7 @@ end function getServiceCost(service) -- Return the number of reputation points that a specified service costs for -- the current player. - return math.ceil(comms_data.service_cost[service]) + return math.ceil(comms_target.comms_data.service_cost[service]) end function getFriendStatus() if comms_source:isFriendly(comms_target) then @@ -2458,6 +2511,13 @@ function getFriendStatus() return "neutral" end end +function tableSelectRandom(array) + local array_item_count = #array + if array_item_count == 0 then + return nil + end + return array[math.random(1,#array)] +end -------------------------- -- Ship communication -- -------------------------- @@ -2465,20 +2525,24 @@ function commsShip() if comms_target.comms_data == nil then comms_target.comms_data = {friendlyness = random(0.0, 100.0)} end - if goods[comms_target] == nil then - goods[comms_target] = {goodsList[irandom(1,#goodsList)][1], 1, random(20,80)} + if comms_target.comms_data.goods == nil then + comms_target.comms_data.goods = {} + local selected_good = tableSelectRandom(component_goods) + if random(1,100) < 40 then + selected_good = tableSelectRandom(mineral_goods) + end + comms_target.comms_data.goods[selected_good] = {cost = math.random(20,80), quantity = 1} end - comms_data = comms_target.comms_data if comms_source:isFriendly(comms_target) then - return friendlyComms(comms_data) + return friendlyComms() end if comms_source:isEnemy(comms_target) and comms_target:isFriendOrFoeIdentifiedBy(comms_source) then - return enemyComms(comms_data) + return enemyComms() end - return neutralComms(comms_data) + return neutralComms() end -function friendlyComms(comms_data) - if comms_data.friendlyness < 20 then +function friendlyComms() + if comms_target.comms_data.friendlyness < 20 then setCommsMessage(_("shipAssist-comms", "What do you want?")); else setCommsMessage(_("shipAssist-comms", "Sir, how can we assist?")); @@ -2498,7 +2562,7 @@ function friendlyComms(comms_data) end end end) - if comms_data.friendlyness > 0.2 then + if comms_target.comms_data.friendlyness > 0.2 then addCommsReply(_("shipAssist-comms", "Assist me"), function() setCommsMessage(_("shipAssist-comms", "Heading toward you to assist.")); comms_target:orderDefendTarget(comms_source) @@ -2509,19 +2573,19 @@ function friendlyComms(comms_data) msg = string.format(_("shipAssist-comms", "Hull: %d%%\n"), math.floor(comms_target:getHull() / comms_target:getHullMax() * 100)) shields = comms_target:getShieldCount() if shields == 1 then - msg = msg .. string.format(_("shipAssist-comms", "Shield: %d%%\n"), math.floor(comms_target:getShieldLevel(0) / comms_target:getShieldMax(0) * 100)) + msg = string.format(_("shipAssist-comms", "%sShield: %d%%\n"),msg, math.floor(comms_target:getShieldLevel(0) / comms_target:getShieldMax(0) * 100)) elseif shields == 2 then - msg = msg .. string.format(_("shipAssist-comms", "Front Shield: %d%%\n"), math.floor(comms_target:getShieldLevel(0) / comms_target:getShieldMax(0) * 100)) - msg = msg .. string.format(_("shipAssist-comms", "Rear Shield: %d%%\n"), math.floor(comms_target:getShieldLevel(1) / comms_target:getShieldMax(1) * 100)) + msg = string.format(_("shipAssist-comms", "%sFront Shield: %d%%\n"),msg, math.floor(comms_target:getShieldLevel(0) / comms_target:getShieldMax(0) * 100)) + msg = string.format(_("shipAssist-comms", "%sRear Shield: %d%%\n"),msg, math.floor(comms_target:getShieldLevel(1) / comms_target:getShieldMax(1) * 100)) else for n=0,shields-1 do - msg = msg .. string.format(_("shipAssist-comms", "Shield %s: %d%%\n"), n, math.floor(comms_target:getShieldLevel(n) / comms_target:getShieldMax(n) * 100)) + msg = string.format(_("shipAssist-comms", "%sShield %s: %d%%\n"),msg, n, math.floor(comms_target:getShieldLevel(n) / comms_target:getShieldMax(n) * 100)) end end local missile_types = {'Homing', 'Nuke', 'Mine', 'EMP', 'HVLI'} for i, missile_type in ipairs(missile_types) do if comms_target:getWeaponStorageMax(missile_type) > 0 then - msg = msg .. string.format(_("shipAssist-comms", "%s Missiles: %d/%d\n"), missile_type, math.floor(comms_target:getWeaponStorage(missile_type)), math.floor(comms_target:getWeaponStorageMax(missile_type))) + msg = string.format(_("shipAssist-comms", "%s%s Missiles: %d/%d\n"),msg, missile_type, math.floor(comms_target:getWeaponStorage(missile_type)), math.floor(comms_target:getWeaponStorageMax(missile_type))) end end setCommsMessage(msg); @@ -2538,9 +2602,9 @@ function friendlyComms(comms_data) end return true end -function enemyComms(comms_data) +function enemyComms() if comms_target.owner == nil then - if comms_data.friendlyness > 50 then + if comms_target.comms_data.friendlyness > 50 then faction = comms_target:getFaction() taunt_option = _("shipEnemy-comms", "We will see to your destruction!") taunt_success_reply = _("shipEnemy-comms", "Your bloodline will end here!") @@ -2564,7 +2628,7 @@ function enemyComms(comms_data) else setCommsMessage(_("shipEnemy-comms", "Mind your own business!")); end - comms_data.friendlyness = comms_data.friendlyness - random(0, 10) + comms_target.comms_data.friendlyness = comms_target.comms_data.friendlyness - random(0, 10) addCommsReply(taunt_option, function() if random(0, 100) < 30 then comms_target:orderAttack(comms_source) @@ -2576,15 +2640,15 @@ function enemyComms(comms_data) return true end else - setCommsMessage(_("shipEnemy-comms", "I belong to ") .. comms_target.owner) + setCommsMessage(string.format(_("shipEnemy-comms", "I belong to %s"),comms_target.owner)) addCommsReply(_("Back"), commsShip) end return false end -function neutralComms(comms_data) +function neutralComms() shipType = comms_target:getTypeName() if shipType:find("Freighter") ~= nil then - if comms_data.friendlyness > 66 then + if comms_target.comms_data.friendlyness > 66 then setCommsMessage(_("trade-comms", "Yes?")) -- Offer destination information addCommsReply(_("trade-comms", "Where are you headed?"), function() @@ -2652,7 +2716,7 @@ function neutralComms(comms_data) until(gi > #goods[comms_target]) end end - elseif comms_data.friendlyness > 33 then + elseif comms_target.comms_data.friendlyness > 33 then setCommsMessage(_("shipAssist-comms", "What do you want?")) -- Offer to sell destination information destRep = random(1,5) @@ -2752,7 +2816,7 @@ function neutralComms(comms_data) end end else - if comms_data.friendlyness > 50 then + if comms_target.comms_data.friendlyness > 50 then setCommsMessage(_("ship-comms", "Sorry, we have no time to chat with you.\nWe are on an important mission.")); else setCommsMessage(_("ship-comms", "We have nothing for you.\nGood day.")); @@ -2968,34 +3032,6 @@ function competeResults() else gMsg = _("msgMainscreen","Nobody finished the race.") end --- previous method (deprecated) ---[[ - fastestPlayer(10) - victoryAccount = false - fastestPlayer(5) - if playerCount > 2 then - gMsg = gMsg .. "\n\n\n" - fastestPlayer(3) - victoryAccount = true - end - if playerCount > 3 then - fastestPlayer(1) - end - if playerCount > 4 then - for pl=1,#playerList do - if playerList[pl].timePoints == nil then - playerList[pl].timePoints = 0 - gMsg = gMsg .. string.format(_("msgMainscreen", "\n%s time: %.2f seconds. Time rank: %s. Placement points: 0"),playerList[pl]:getCallSign(),playerList[pl].raceTime,playerList[pl].timeRank) - end - end - end - if not victoryAccount then - gMsg = gMsg .. "\n\n\n" - end - droneTally() - gMsg = gMsg .. "\n" - unorderedFinalTally() ---]] end function fastestPlayer(reward) shortestTime = 999999 @@ -3178,9 +3214,6 @@ function gatherStats(final_score) table.sort(sorted_score_list,function(a,b) return a.rank > b.rank end) --- for i,item in ipairs(sorted_score_list) do --- print(item.name, item.drone_points, item.rank) --- end if sorted_score_list ~= nil and #sorted_score_list > 0 and player_count > 0 then local prev_value = sorted_score_list[1].rank local place_index = 1 @@ -3191,7 +3224,6 @@ function gatherStats(final_score) end local reward = reward_grid[player_count][reward_index] stat_list.ship[item.name].rank_points = reward --- stat_list.ship[item.name].score = reward + item.drone_points stat_list.ship[item.name].time = item.time place_index = place_index + 1 prev_value = item.rank @@ -3211,7 +3243,10 @@ function gatherStats(final_score) table.insert(sorted_stat_list,{name=name,lap_count=details.lap_count,waypoint_goal=details.waypoint_goal,score=details.score,rank_points=details.rank_points,drone_points=details.drone_points,time=details.time}) end table.sort(sorted_stat_list,function(a,b) - return a.score > b.score + return + a.score > b.score or + (a.score == b.score and a.lap_count > b.lap_count) or + (a.score == b.score and a.lap_count == b.lap_count and a.time < b.time) end) print("Score","Place","Drones","Name","Laps","WP Goal") for i, item in ipairs(sorted_stat_list) do @@ -3351,7 +3386,12 @@ function update(delta) for p1idx=1,32 do local p1 = getPlayerShip(p1idx) if p1 ~= nil and p1:isValid() then - p1:addToShipLog(_("raceOrders-shipLog", "Race starts in 10 minutes. Be at waypoint 1 on time or forfeit"),"Magenta") + local delay_minutes = math.floor(original_race_start_delay/60) + if delay_minutes > 1 then + p1:addToShipLog(string.format(_("raceOrders-shipLog", "Race starts in %i minutes. Be at waypoint 1 on time or forfeit"),delay_minutes),"Magenta") + else + p1:addToShipLog(string.format(_("raceOrders-shipLog", "Race starts in %i minute. Be at waypoint 1 on time or forfeit"),delay_minutes),"Magenta") + end p1:addToShipLog(string.format(_("raceOrders-shipLog", "Today's race length: %.1f units"),raceLength),"Magenta") end end @@ -3381,6 +3421,33 @@ function update(delta) end end end + if beep_3 == nil and raceStartDelay > 2 and raceStartDelay < 3 then + playSoundFile("audio/scenario/58/sa_58_beep.ogg") + start_zone:setColor(255,0,0) + beep_3 = "played" + end + if reset_3 == nil and raceStartDelay > 2 and raceStartDelay < 2.5 then + start_zone:setColor(0,64,0) + reset_3 = "reset" + end + if beep_2 == nil and raceStartDelay > 1 and raceStartDelay < 2 then + playSoundFile("audio/scenario/58/sa_58_beep.ogg") + start_zone:setColor(255,0,0) + beep_2 = "played" + end + if reset_2 == nil and raceStartDelay > 1 and raceStartDelay < 1.5 then + start_zone:setColor(0,64,0) + reset_2 = "reset" + end + if beep_1 == nil and raceStartDelay < 1 then + playSoundFile("audio/scenario/58/sa_58_beep.ogg") + start_zone:setColor(255,0,0) + beep_1 = "played" + end + if reset_1 == nil and raceStartDelay > 0 and raceStartDelay < .5 then + start_zone:setColor(0,64,0) + reset_1 = "reset" + end end else game_state = "race" @@ -3409,6 +3476,11 @@ function update(delta) end end end + playSoundFile(start_sound_file) + start_zone:setColor(0,128,0) + point_2_zone:setColor(0,128,0) + point_3_zone:setColor(0,128,0) + point_4_zone:setColor(0,128,0) droneList = {} for p4idx=1,32 do --make some target drones p4 = getPlayerShip(p4idx) @@ -3446,38 +3518,40 @@ function update(delta) end if follow_up_message == nil then follow_up_message = "sent" - local msg = _("race-", "The race has begun!") + local msg = _("race-shipLog", "The race has begun!") for name, p in pairs(player_start_list) do p:addToShipLog(msg,"Magenta") end if player_count == original_player_count then - msg = string.format(_("race-", "With %i racers, we have the following points awarded for final race place:"),player_count) + msg = string.format(_("race-shipLog", "With %i racers, we have the following points awarded for final race place:"),player_count) else - msg = string.format(_("race-", "With %i racers remaining from the original %i registrants, we have the following points awarded for final race place:"),player_count,original_player_count) + msg = string.format(_("race-shipLog", "With %i racers remaining from the original %i registrants, we have the following points awarded for final race place:"),player_count,original_player_count) end for name, p in pairs(player_start_list) do p:addToShipLog(msg,"Magenta") end msg = "" local place_name = { - "First", - "Second", - "Third", - "Fourth", - "Fifth", - "Sixth", - "Seventh", - "Eighth", - "Ninth", - "Tenth", + _("race-shipLog","First"), + _("race-shipLog","Second"), + _("race-shipLog","Third"), + _("race-shipLog","Fourth"), + _("race-shipLog","Fifth"), + _("race-shipLog","Sixth"), + _("race-shipLog","Seventh"), + _("race-shipLog","Eighth"), + _("race-shipLog","Ninth"), + _("race-shipLog","Tenth"), } if player_count > 0 then for i=1,#reward_grid[player_count] do if reward_grid[player_count][i] > 0 then if i > 1 then - msg = msg .. ", " .. place_name[i] .. ":" .. reward_grid[player_count][i] + msg = string.format(_("race-shipLog","%s, %s:%s"),msg,place_name[i],reward_grid[player_count][i]) +-- msg = msg .. ", " .. place_name[i] .. ":" .. reward_grid[player_count][i] else - msg = place_name[i] .. ":" .. reward_grid[player_count][i] + msg = string.format(_("race-shipLog","%s:%s"),place_name[i],reward_grid[player_count][i]) +-- msg = place_name[i] .. ":" .. reward_grid[player_count][i] end else break