Take planets by killing what defends them

#211 conquest is the fight now: a planet registers the garrison its setup
authors, each defender's own death counts against it, and the last one takes
the world. The capture points - stand in a ring, wait out a timer, once per
ring - are gone, along with the editor palette that placed them.
#212 conquest opens a dialog on the surface naming the research points
recovered; the award travels with the signal, after it is banked.
#209 the prologue's charted sectors go with the breach, so the map the
survivors keep is of where they now are - and "chart 30 sectors" is no
longer complete before they have flown anywhere.
#218 enemy variety is gated on the FLEET, not on wave strength: a starting
fleet meets chasers only at any wave number, and each vessel past three
opens one more kind.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019AJMdB7iuHuLFZM1aBu3GD
This commit is contained in:
Loïc Wisniewski 2026-09-05 13:31:25 +02:00
commit 6e13b6397c
42 changed files with 540 additions and 749 deletions

View file

@ -15,8 +15,7 @@ extends SceneTree
#
# Covers:
# A. the gas giant's vent field draws behind the ships (the #91 report)
# B. the same for every other drawing feature on every profile, rocks and
# capture rings included
# B. the same for every other drawing feature on every profile
# C. the fleet's own ships are where the comparison says they are, so a
# future change that pushed the ships back instead cannot make A and B
# pass by moving the goalposts
@ -106,8 +105,14 @@ func _process(delta: float) -> bool:
return _fail("ships are at z=%d, not 0 - this test's premise moved" % ship_z)
var features: Array = _drawing_descendants(surface.get_node("SurfaceFeatures"), [])
# A profile is allowed to have no scenery of its own - the research lab
# had none but the capture rings, and #211 took those away. The rule is
# about features that EXIST, so an empty profile is skipped rather than
# failed; the run-wide check below is what stops this test quietly
# checking nothing at all.
if features.is_empty():
return _fail("%s has no drawing surface features to check" % game_state.planet_definition_id)
print("%s: no drawing surface features of its own" \
% game_state.planet_definition_id)
for feature in features:
var z: int = _effective_z(feature)
if z >= ship_z:
@ -120,6 +125,8 @@ func _process(delta: float) -> bool:
checked += features.size()
if planets.is_empty():
if checked == 0:
return _fail("no profile had a single drawing feature - this test proved nothing")
print("TEST_SURFACE_FEATURE_DEPTH: PASS (%d features checked)" % checked)
quit(0)
return true