The general rebalances built into Survive the Storm: retuned vanilla numbers so more buildings and playstyles become viable. The deep Food page is food.html.
Base-game features the mod removes entirely: the "No ..." list. The Status column tracks each feature from design to in-game test (Planned, Confirmed, Built untested, Tested). The Base-game code column names where the feature lives; the Implementation column records how the mod removes it.
| Feature | Status | What it does | Base-game code | Implementation |
|---|---|---|---|---|
| No "Request resources" | Tested v22 | Removes the rival Contact option that has a rival ship you resources for free, costing only standing. Resources come from trading instead. | gagarin: Presets/Negotiation/RepliesGreetings.lua - "Request resources" reply, Action Send Distress Call | On ClassesBuilt/ModsReloaded, remove the reply with Action = "Send Distress Call" from the shared RepliesGreetings reply list (its array part). Every greeting inherits it, so the option is gone from all of them; no save data touched. |
| No tech exchange | Tested v22 | Removes the rival "Exchange technologies" option. The tech you handed the AI did nothing, so it was near-free research. | gagarin: RepliesGreetings.lua ("Exchange technologies"); effect RivalExchangeTechs in Presets/ClassDef-Effects.lua | Same pass: remove the only greeting reply that carries an OutcomePicker (the tech-exchange reply). Match on the picker's presence, not on PickOutcome_CoupleOfTech: that inner field reads nil via rawget (log-confirmed), so a value match silently misses. |
| No covert operations | Tested v22 | Removes the hostile rival actions: steal drones, recruit a colonist, steal tech, and sabotage. | gagarin: Code/CovertOps.lua; Presets/Negotiation/CovertOps_Initial.lua | One button. Hide the covert_ops XTemplateAction in XTemplates.POIAdditionalContent; its OnAction is the only caller of Covert Ops Start. No mystery or storyline requires covert ops, so nothing else breaks. |
Base game (Steam app 464920) plus the Space Race (gagarin.hpk) DLC,
decompiled (method:
docs/reading-surviving-mars-code.md).
The rival Contact menu options are in gagarin: Presets/Negotiation/RepliesGreetings.lua.
The COVERT OPS button is the covert_ops action in
gagarin: Presets/XTemplates/POIAdditionalContent.lua, the only entry to
Covert Ops Start. The mod requires every DLC and warns at load if any is missing
(Code/StS_RequireDlc.lua). See also
docs/rival-tech-exchange.md.
Information the game already tracks but hides, now shown on screen. This changes nothing about how the game plays, it only surfaces existing data. The last column points to where the data lives.
| Feature | Status | What it does | Base-game code |
|---|---|---|---|
| Rivals show everything | Tested v2.14 | Selecting a rival colony in the Planetary View adds a TRADE INFO section to its panel with the rival's trade-relevant facts (see notes): how many trade routes it offers now, the standing needed for its next route slot, what it trades, the advanced-resource unlock at 100 colonists with its current colonist count, Blue Sun's own funding gate, and how soon one route rerolls. In StS as Code/StS_RivalTradeInfo.lua. | gagarin: Code/RivalColonies.lua (rival data, standing), Code/TradeRoutes.lua and Presets/DumbAIDef.lua (routes); panel XTemplates.POIAdditionalContent |
When a rival colony is selected in the Planetary View, its panel gains a TRADE INFO section. Everything shown is read live from the rival object the game already keeps; no mechanic or value is changed. Implemented as Code/StS_RivalTradeInfo.lua. Requires Space Race (it no-ops without it). The section lists:
The section installs at ClassesBuilt (and on a mid-session mod reload), the same
timing the sibling No covert operations uses to edit this same panel
template. An earlier build installed it on DataLoaded, which never fires for a mod,
so nothing appeared in game; v58 moved the install to ClassesBuilt.
Space Race (gagarin.hpk) DLC, decompiled (method:
docs/reading-surviving-mars-code.md).
Current trade mechanics these reveal are documented in
trading.html.
mod-survive/Code/StS_RivalTradeInfo.lua - appends a TRADE INFO group to XTemplates.POIAdditionalContent, text bound to LandingSiteObject:GetStSTradeInfo; installed on ClassesBuilt / ModsReloadedgagarin: Code/RivalColonies.lua - RivalAIs[id], .resources (standing, colonists, funding), .sponsor, .trade_routes, .trade_route_expiration = Random(30,50) solsgagarin: Code/TradeRoutes.lua - OpenTradeRoute fills trade_routes; Initialize sets each sponsor's trade character; advanced resources enter routes at 100 colonistsgagarin: Presets/DumbAIDef.lua - trade-route AIAction: per-sponsor standing thresholds ({20,60} default, {0,20,40,60} China/Russia), Blue Sun funding gate (open 2000 / drop 500), reroll clockRetuned vanilla numbers: no single best path, so more buildings and playstyles become
viable. Status is Implemented, Built untested, or Planned. The last column points to the
base-game code, with UNVERIFIED for a spot not yet located.
| Feature | Status | What it does | Base-game code |
|---|---|---|---|
| Earthsick colonists cost applicants | Built, untested | A colonist who becomes Earthsick (Comfort hits 0, then stops working and flies back to Earth on the next rocket) now removes 2 random applicants from the pool - the same penalty a non-natural death already carries in vanilla. Without it, deliberately tanking a colonist's Comfort to offload him is free, cheesiest on a Senior who can no longer work anyway; now it costs the same as losing him to a non-natural death. No Sanity effect: the vanilla -15 "Seeing Death" hit to residence-mates stays death-only. Only Earthborn colonists are ever affected, since Martianborn, Refugees and the IMM sponsor's colonists never become Earthsick. Natural (Old Age) deaths still cost nothing, unchanged. In StS as Code/StS_EarthsickApplicantMalus.lua. | fires on the fresh-Earthsick Msg("ColonistStatusEffect") (Lua/Units/Colonist.lua:974, early-out when already affected :959-961); mirrors the non-natural death removal Lua/Units/Colonist.lua:760-768 on g_ApplicantPool (Lua/ApplicantsPool.lua); Earthsick trigger and exemptions Colonist.lua:3267-3270, Data/TraitPreset.lua:539 |
| Tourist applicant bug fixed | Built, untested | Corrects a base-game bug where a higher holiday rating could hand out fewer new tourist applicants; restores the intended rising ramp, so more stars give more applicants. In StS as Code/StS_TouristApplicantFix.lua. | Lua/HolidayRating.lua:69-86 (RewardApplicants); see tourism.html |
| Tourist Funding raised | Tested v2.9 | Raises the Funding each departing Tourist pays, set by their star rating, to a clean rising ramp: $10 / $20 / $30 / $40 / $50 / $60 / $70 M for 1, 2, 3, 3.5, 4, 4.5 and 5 stars (vanilla paid $2 / $7 / $13 / $22 / $30 / $35 / $38 M). Vanilla tourism requires a large dedicated build-up - domes, hotels, amusement buildings and RC Safari routes - relative to the modest Funding each Tourist pays, so the return is small for the investment it demands; the higher payouts make the income better reflect that investment. Only the money reward changes; the applicant counts, star breakpoints and every Funding multiplier (tourist-specific, global Funding-gains, Politician, Celebrity 10x) stay vanilla and still apply on top. In StS as Code/StS_TouristFunding.lua. | Lua/HolidayRating.lua:2-11 (reward table money), read live in RewardMoney :57-67; see tourism.html |
| Water Reclamation rebalance | Tested v2.9 | The Water Reclamation System recycles less but costs less to build, run and staff: recycling drops from up to 70% to up to 50% of the dome's Water, Concrete cost 40 to 20, Polymers 10 to 5, maintenance 3 to 1 Machine Part, and workers 2 to 1 per shift (Machine Parts build cost of 5 unchanged). In StS as Code/StS_WaterReclamation.lua. | recycling WaterReclamationSpire:GetWaterConsumptionReductionFromPerf = perf/2 (Lua/Buildings/WaterReclamation.lua:18-20), scaled by 5/7; template values (cost, maintenance_resource_amount, max_workers, description) at Data/BuildingTemplate.lua:1613-1655, patched on both BuildingTemplates and ClassTemplates.Building |
| Power Accumulator rebalance | Tested v2.9 | The Power Accumulator's three main numbers are raised +50% from vanilla: storage 200 to 300; Max output while discharging 20 to 30 and Max consumption while charging 20 to 30 (per hour). All three are set on the template (capacity, max_electricity_discharge, max_electricity_charge; the on-screen number is the value / const.ResourceScale, which is 1000). The discharge start threshold is left vanilla (a battery discharges once its stored Power reaches capacity / discharge_factor, factor 10), so it starts supplying the grid at 30 - raised +50% along with the capacity. New colony gets these on every one built; a battery already standing in a loaded save keeps its baked values. In StS as Code/StS_PowerAccumulatorStorage.lua. | Data/BuildingTemplate.lua:4402-4405 (Battery_WaterFuelCell capacity, max_electricity_charge, max_electricity_discharge); Lua/ElectricityStorage.lua:11-14,65-66; discharge threshold Lua/SupplyGrid.lua:38,163-164; const.ResourceScale (Lua/_const.lua:914-918) |
| MOXIE rebalance | Tested v2.9 | The MOXIE oxygen generator is made costlier to build and run. Build cost goes from 4 to 10 plus a new 2 ; maintenance goes from 2 to 1 (the resource type changes too); and electricity draw goes from 2 to 10 . Oxygen output (3) is unchanged. On-screen numbers are the template value / const.ResourceScale (1000), so the template values become 10000 + 2000 build, 1000 maintenance, 10000 electricity. Set on both BuildingTemplates and ClassTemplates.Building (construction reads the latter), the same two-table pattern as the Power Accumulator and Water Reclamation rebalances. In StS as Code/StS_MoxieRebalance.lua. | Data/BuildingTemplate.lua:3801-3847 (MOXIE: construction_cost_Metals 4000, maintenance_resource_type Metals / maintenance_resource_amount 2000, electricity_consumption 2000); scale const.ResourceScale = 1000 (Lua/_GameConst.lua:30) |
| Hippie garden rework | Built, untested (v63) | The Hippie trait now steers a Colonist to gardens and pays off there, instead of only giving a hidden comfort bonus he rarely reached. Vanilla Hippie did one thing: +100% comfort gain per visit at Decorations buildings and the Hanging Gardens, with zero effect on which building the Colonist picks - the service picker ranks candidates only by their flat Service Comfort stat (Tourists aside), so a garden (Service Comfort 40) loses to e.g. the Spacebar (60) on their shared Relaxation interest and the Hippie is never routed to the garden he prefers. Now, for a Hippie at a garden/park or the Hanging Gardens: (1) Service Comfort counts as +50% in the picker, so he prefers them (garden 40 -> 60 ties the Spacebar; a stronger decoration wins outright); (2) the Comfort ceiling a visit raises him toward is +50%; (3) the Comfort gained per visit is +50% (was +100%). Every other Colonist and every other building is byte-for-byte vanilla. In StS as Code/StS_HippieGardens.lua. | Lua/Buildings/Service.lua:18-24 (vanilla Hippie +100% comfort_increase); picker Lua/ServiceBase.lua:162-188 (ranks by service_comfort, Tourist x2 at 176-180); ceiling seam Lua/Buildings/Service.lua:150-156 (Extrovert precedent); selection seam Lua/Buildings/Dome.lua:2619-2661 (Dome:GetService); trait Data/TraitPreset.lua:341-350; garden and Spacebar Service Comfort Data/BuildingTemplate.lua:164-191,1215-1219 |
| 1 tech revealed per field at start | Built, untested (v2.76) | Every research field is topped up to 1 revealed tech at colony start, driven by the same reveal that Tech Anomalies use. This matches vanilla (the sponsor already reveals its initial tech per field), so it only guarantees a floor of 1 and never caps a field that starts with more; the top-up mechanism is retained at the vanilla count. Anomalies still reveal more beyond that. | Lua/Research.lua:214 (DiscoverTechInField), :526 (TechCount); vanilla per-field reveal Lua/Research.lua:171-175; anomaly reveal Lua/ClassDefs/ClassDef-Effects.generated.lua:1583 (RevealNextTechInField) |
| Food rebalance | Tested v2.9 | Food production is retuned so it draws more on life support. The Ranch's four animals (Chicken, Rabbit, Goose, Turkey) each get double the Water and Oxygen consumption. Farm and Hydroponic Farm crops are left at vanilla values (Water and Oxygen unchanged). Verified current values, the doubled targets and the mechanic are on the Food page. In StS as Code/StS_FoodRebalance.lua. | shepard: Presets/Animal.lua (animal water_consumption / air_consumption) |
| Sensor towers stack | Tested v2.14; -33% proximity balance built v2.75, untested | Every in-range working sensor tower adds to a sector's proximity scan boost, instead of only the closest one counting: closest at full, 2nd x1/2, 3rd x1/4, and so on by distance rank. The geometric sum caps proximity at 2x a single tower, so it never runs away. Each per-tower proximity boost is then scaled to 67% (-33%) to balance the stacking, and this scaling multiplies with the Sensor Towers map condition's range/boost roll: on a neutral map one tower now peaks at 261 proximity boost and a cluster at ~522 (vanilla peak is 390). The cumulative +10-per-tower part is unchanged. In StS as Code/StS_TowerStacking.lua. | Lua/Exploration.lua:284-306 (MapSector:GetTowerBoost) |
| Building maintenance +20%, half of that while idle | Tested (v2.221) | Every building accrues maintenance at 120% of the vanilla rate (a flat +20% multiply), and any building that is shut down (the on/off toggle) or whose current work shift is closed instead accrues it at half of that, 60%: so with two shifts open and one closed a building runs 120% / 120% / 60% across the day. This covers all maintenance: both the peacetime build-up (the dust / maintenance bar crawl) and every incoming dust source (dust storms, dust devils, geysers, rocket exhaust). The rate is re-checked every hour, so an open shift runs at 120% and only its closed shift (or a full shutdown) drops to 60%. Drones and rovers, which share the same maintenance bar, are not touched and stay byte-for-byte vanilla. Implemented as a 120% multiplier at the two producers, halved to 60% while idle, so it composes multiplicatively with every other maintenance and dust modifier (see maintenance.html for the vanilla rates it scales). In StS as Code/StS_MaintenanceIdleReduction.lua. | crawl RequiresMaintenance:BuildingUpdate reads maintenance_build_up_per_hr (Lua/RequiresMaintenance.lua:119-127, property default :29); dust RequiresMaintenance:AddDust (:143-151), the single entry for storm dust (Lua/DustStorm.lua:71,91); states self.ui_working (Lua/Buildings/Building.lua:2428) and ShiftsBuilding:IsClosedShift (Lua/Buildings/ShiftsBuilding.lua:154); per-parent dispatch RecursiveCall (Building.lua:712) |
| Harsher maintenance: earlier call, 1 h grace, 90% repair | Built, untested (v2.225) | Changes how every building's maintenance ("dust") bar behaves, in three ways. (1) A repair removes 90% of the full bar, not 100%. Vanilla clears the bar to empty when a Drone finishes; instead a fixed 90% of the bar's threshold is subtracted, and whatever is left over is carried into the next cycle. Because of (2) the Drone arrives with the bar between 90% and 100%, so a repair leaves between 0% (serviced right at 90%) and 10% (serviced at a full bar) still on the bar. (2) A building calls a Drone at 90% of the bar, not only at a full bar. Servicing starts earlier; the bar keeps filling underneath while the Drone is on its way, so the Drone reaches the building somewhere between 90% and 100%. (3) The grace before a full building malfunctions drops from one sol (24 h) to one hour. A building whose bar fills keeps working for 1 h, then malfunctions if no Drone has serviced it by then. Manual repairs and the Drone/Rover work the same; a Triboelectric Scrubber still cleans the bar below the leftover. Composes with the +20% maintenance rate and idle reduction above. In StS as Code/StS_HarsherMaintenance.lua. | repair reset RequiresMaintenance:ResetMaintenanceState (Lua/RequiresMaintenance.lua:369-380, vanilla zeroes accumulated_maintenance_points); auto-request RequiresMaintenance:TryRequestMaintenance (:169-176, vanilla fires only at accumulated >= threshold); breakdown grace RequiresMaintenance:BuildingUpdate (:128, GameTime() - last_maintenance_points_full_ts >= const.DayDuration); const.DayDuration = 24 h, const.HourDuration = 1 h (Lua/_GameConst.lua:3,5); see maintenance.html |
| Resource parity | Tested v2.9 | Makes every map's resource totals the same regardless of the Colony Site's resource level, while keeping the vanilla number of deposit spots - only the amount per spot changes. Each map is normalized to Water 50k surface / 150k deep, Concrete 20k, Metals 7k surface (600 loose piles + 6.4k shallow) / 13k deep, Rare Metals 3k surface / 5k deep. Concrete is scaled at the preset before generation (its yield is bound to the painted terrain patch, so it can't be raised afterward), giving an exact-on-average total; Water, Metals and Rare Metals are normalized from the actual placed deposits after generation, giving an exact per-map total that is immune to the wide count roll on the deep tiers. Deposit grade (mining speed) is left vanilla. New colonies only. Full mechanic on the Resource parity page. In StS as Code/StS_ResourceParity.lua. | Data/ResourcePreset.lua (Concrete TerrSizeVol*); Lua/Exploration.lua:1139 (MapSectorsReady), :371-375,832-837 (per-tier markers); Lua/Buildings/SubsurfaceDeposit.lua:85-86 and SurfaceDeposit.lua:91,139-142,202-206 (deposit amount); TerrainDeposit.lua:551 (concrete terrain-bound); see colony-sites.html |
| Salvage rebalance: deleting always allowed, tiered refund | Built, untested (v2.267) | Deleting a building no longer needs the Decommission Protocol tech: clearing the remains left by a salvage (or by a disaster) is always available, and the Clear button is always enabled. The salvage refund is now tiered by resource. Basic resources (Concrete, Metals, and everything that is not an advanced resource, including Rare Metals) always refund 50% of build cost, as in vanilla. Advanced resources (Polymers, Electronics, Machine Parts) refund only 25% by default, raised to 50% once Decommission Protocol is researched - so the tech now boosts advanced-resource recovery instead of gating deletion. Upgrade resources and stored resources refund as before. Amounts are exact (no rounding); the engine stores resources at 1000x, and vanilla already drops half-unit piles. In StS as Code/StS_SalvageRebalance.lua. | refund per resource Building:CalcRefundAmount = MulDivRound(total/2, salvage_modifier, 100) (Lua/Buildings/Building.lua:846-848), called from Building:GetRefundResources (:812-844); clearing gate Building:OnDemolish (:791) and Building:DestroyedClear (:1560-1564), both on IsTechResearched("DecommissionProtocol"); Clear button disable XTemplates.ipBuilding idDecommission (Lua/XTemplates/ipBuilding.lua:376); tech Data/TechPreset.lua:1511-1515; scale const.ResourceScale = 1000 (Lua/_GameConst.lua:30) |
| Large factory staffing curve | Built, untested | The three large production factories - the Machine Parts Factory, Electronics Factory and Polymer Plant - convert Performance to output on a steeper curve, so they need near-full staffing to produce well. The output multiplier becomes max(0, Performance x 150 / 100 - 50) in place of Performance / 100: at Performance 100 (a full standard shift) output is unchanged, at 50 it is 25, at about 33 it reaches 0, and above 100 it rises faster (150 gives 175, 200 gives 250). The Small Machine Parts Factory and Small Electronics Factory keep vanilla output. Input (Metals, and the others) is consumed in proportion to output, so a starved shift wastes no input; Power draw is unchanged, a working factory draws full Power. Performance is per work shift with no blending across shifts, and the on-screen per-Sol production figure uses the same curve. In StS as Code/StS_FactoryStaffingCurve.lua. | each factory's per-resource OnCalcProduction = MulDivRound(performance, amount, 100) (Lua/Buildings/Factory.lua:10-12,19-21,36-38); Performance set per shift by GetWorkshiftPerformance / UpdatePerformance (Lua/Buildings/Workplace.lua:164-196,198-208); input scales with output in Consume_Production, zero at zero output (Lua/HasConsumption.lua:278-294); on-screen prediction Lua/Buildings/BuildingComponents.lua:1109-1130 |