Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions data/events.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,24 @@
"description": "Fine regolith infiltrated the greenhouse seals.",
"effects": { "food": -6, "morale": -3 },
"minDay": 14
},
{
"id": "array_burnout",
"title": "Array Burnout",
"description": "A voltage spike scorched the primary collector. Daily output halved until repaired.",
"effects": {},
"damageBuilding": "solar_array",
"requiresBuilding": "solar_array",
"minDay": 18,
"weight": 1
},
{
"id": "systems_fault",
"title": "Systems Fault",
"description": "An untraced fault took down a key facility. Output halved until the crew gets to it.",
"effects": { "morale": -4 },
"damageRandomBuilt": true,
"minDay": 15,
"weight": 1
}
]
71 changes: 71 additions & 0 deletions internal/game/damage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,74 @@ func TestRepairBuilding_ClearsDamageAndChargesByLevel(t *testing.T) {
t.Fatalf("Credits = %d, want %d", s.Credits, 100-wantCost)
}
}

func TestDamageEvent_SolarArrayDamagedViaApplyEventByID(t *testing.T) {
content, err := LoadEmbeddedContent()
if err != nil {
t.Fatalf("LoadEmbeddedContent: %v", err)
}
s := NewState(content)
s.Buildings["solar_array"] = Building{DefID: "solar_array", Level: 2}
s.Day = 10

// Find an event that damages solar_array
var damageEventID string
for _, e := range s.Content.Events {
if e.DamageBuilding == "solar_array" {
damageEventID = e.ID
break
}
}
if damageEventID == "" {
t.Skip("no solar_array damage event in events.json — add one first")
}

s.applyEventByID(damageEventID)
if !s.Buildings["solar_array"].Damaged {
t.Fatal("solar_array should be Damaged after damage event")
}

// Daily output should be halved
def, _ := s.FindBuilding("solar_array")
effects := dailyEffectsScaled(def, s.Buildings["solar_array"])
b := s.Buildings["solar_array"]
b.Damaged = false
fullEffects := dailyEffectsScaled(def, b)
if effects["power"] != fullEffects["power"]/2 {
t.Fatalf("damaged power %d want %d (half of %d)", effects["power"], fullEffects["power"]/2, fullEffects["power"])
}
}

func TestDamageEvent_RandomBuilt_DamagesBuiltFacility(t *testing.T) {
content, err := LoadEmbeddedContent()
if err != nil {
t.Fatalf("LoadEmbeddedContent: %v", err)
}
s := NewState(content)
s.Buildings["solar_array"] = Building{DefID: "solar_array", Level: 1}
s.Day = 20

var randDamageEventID string
for _, e := range s.Content.Events {
if e.DamageRandomBuilt {
randDamageEventID = e.ID
break
}
}
if randDamageEventID == "" {
t.Skip("no damageRandomBuilt event in events.json — add one first")
}

s.applyEventByID(randDamageEventID)
// at least one built building should be damaged
anyDamaged := false
for _, b := range s.Buildings {
if b.Damaged {
anyDamaged = true
break
}
}
if !anyDamaged {
t.Fatal("expected at least one building damaged after damageRandomBuilt event")
}
}
38 changes: 37 additions & 1 deletion scripts/survival_45.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "build",
"building_id": "workshop"
Expand All @@ -42,6 +45,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "build",
"building_id": "hydroponics"
Expand All @@ -65,6 +71,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "next_day"
},
Expand All @@ -91,6 +100,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "next_day"
},
Expand All @@ -100,6 +112,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "next_day"
},
Expand All @@ -109,6 +124,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "next_day"
},
Expand All @@ -118,6 +136,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "next_day"
},
Expand All @@ -127,6 +148,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "next_day"
},
Expand All @@ -136,6 +160,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "next_day"
},
Expand All @@ -145,6 +172,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "next_day"
},
Expand All @@ -154,6 +184,9 @@
{
"type": "next_day"
},
{
"type": "repair"
},
{
"type": "next_day"
},
Expand All @@ -162,6 +195,9 @@
},
{
"type": "next_day"
},
{
"type": "repair"
}
]
}
}