Godot port is non-playable: missing in-mission UI, map 4, ghostcell/aegis research, playbook callsites, and team-broadcast binding #23
Labels
No labels
blocked:needs-attention
blocked:needs-decision
blocked:needs-decompose
blocked:needs-design
blocked:needs-triage
blocked:unclassified
bug
documentation
enhancement
gsd-spec
in-progress
needs-decompose
priority:high
priority:low
priority:medium
quickfix
test
triage-approved
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Mark/cybertactics#23
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
README.mdlines 206–218 describe the Godot port as system-for-system paritywith the web prototype: "TimeDirector = semi-realtime clock + command phases +
snap-focus events, unit.gd = order queue + stances, playbook_library.gd,
abilities.gd, grid_map.gd = AStarGrid2D + Bresenham LOS, scenery.gd".
The verification line says "Verified on import with Godot 4.7.2 headless
(
--importcompiles all scripts clean; a 120-frame headless run of the mainscene raises no runtime errors)."
That bar — compiles + 120 frames without runtime errors — is true. It is also
the only verification. Open
godot/scenes/main.tscnin the editor andDEPLOYfrom the title screen: the mission starts, units spawn on the grid,the hostiles patrol, abilities fire on timers, and either the squad gets wiped
or all hostiles die. Nothing else happens. The README's claim of parity
does not match what the port actually does.
AGENTS.mdline 9 callsmake cithe contract;make cirunstools/godot_import_check.sh, which only verifies scripts compile (parse +import). There is no Godot-side runtime test that exercises the title →
mission → objective flow with assertions on player inputs.
This issue enumerates the unimplemented surfaces in the Godot port. The
parallel web build is the reference contract; closing a gap here means
mirroring the web feature end-to-end (not just adding lines to a function).
What's unimplemented
1. In-mission UI is empty
godot/scenes/main.tscn(the entire scene — 9 lines):The
UICanvasLayer has no children. In a running Godot session you can:grid_map.gd)unit.gd)abilities.gdif pre-targeted(no targeting UI exists either)
poll loop in
main._process(lines 621–636)What is not yet implemented:
unit.gdhas no click handler, noselectionstate, no UI element that knows whatselectedis)PlaybookLibrary.apply()callsite)selected_teambut noconsumer reads it — see #5)
web/index.html:9–19has no Godot counterpart)saveMission/loadMission;user://ConfigFileis read once at
_readyand never written outsideset_valuecallsfor shards/roster/research, which is title-screen state only)
The web build's full battle-UI contract is captured in issue #22 (filed
just before this); closing #1 here means porting that contract.
2. Map 4 (Supply Cache / repeatable shard raid) is not in the Godot campaign
web/js/maps.jshas 4 missions. Map 3 is"Supply Cache"with"skirmish": true(line 714).tools/research.jstest 5 (line 49) asserts:This is the strategic endgame loop — the only way to keep playing after the
campaign chain is cleared.
web/js/ui.jsshowStrategic()(line 534) tagsit
SHARD RAID ↻and exposes it on the sector map.godot/scripts/maps_data.gdhas only 3 maps (const MAPS: Array = [...]ends at The Foundry). The strategic layer in the Godot port has no
repeatable node. Not yet ported — the data exists on the web side, this
is a transcription job plus a strategic-view binding.
3. Two research nodes are missing from the Godot port
web/js/data.jsRESEARCHhas 10 nodes.godot/scripts/main.gdRESEARCHhas 8 — the port omits the two capability unlocks:
ghostcellSUPPORT.smokeindata.js:64aegisPLAYBOOKS.phalanxindata.js:56The downstream code is already in place:
abilities.gd:10already wires&"smoke"as a support kind.main.gd:292already reads_research_own("ghostcell")to gate the usecount.
playbook_library.gd:32already implements&"phalanx".What's missing is the two
RESEARCHconstant entries themselves — withoutthem, the player can't purchase the unlock via the title screen, and the
gated features stay locked at zero uses / never-called.
This is not yet ported — same data on the web side, transcription job.
4. Playbook UI is still missing in-mission
godot/scripts/playbook_library.gdis a full 1:1 port of the web build'splaybook table (
breach,overwatch,pincer,hunt,fallback,phalanx). The library is callable today:There is no callsite in
main.gdbecause there are no playbook buttons inthe in-mission UI (see #1). The web build's analog is
web/js/game.js applyPlaybook()lines 718–767, invoked from the UI's#playbooksbutton row.This is not yet implemented — the function exists and is correct, but
the callsite (a button or hotkey + target resolver) needs to be added once
#1 lands.
5. Strike-team broadcast is not yet implemented
main.gd:230declaresvar selected_team := "all". The F1/F2/F3 handler(lines 644–650) updates it. Nothing in
main.gdreads it.The web build scopes orders via
teamMembers(teamId)inweb/js/teams.js:32andG.selTeaminweb/js/game.js:641–649:select team → RMB issues orders → enqueue for each member of the selected
team →
applyPlaybook()enqueues the same formation move for every teammember.
main.gd:239already hasteam_move(team_id, target)(formation-broadcastmove) — but it's not bound to a player input. F1/F2/F3 set
selected_teamto a value nothing consumes.
This is not yet implemented — the broadcast function exists, the
selection variable exists, the binding between them does not.
6. README's "Verified" line is misleading
Lines 216–218 of README.md: "Verified on import with Godot 4.7.2 headless
(
--importcompiles all scripts clean; a 120-frame headless run of the mainscene raises no runtime errors)."
This is true. It is also the only runtime check. A 120-frame headless run of
the title screen (no mission started,
_processreturns early becausestate == State.TITLE) will trivially complete. The verification does notexercise the mission state machine at all.
tools/godot_import_check.shshould probably gate on a deeper smoke before claiming parity — out of scope
for this issue, but worth noting.
Acceptance
Fixing the five gaps above lands a Godot build that:
handler +
TacGrid.world_to_tile()inverse ofworld())selected-team scope)
PlaybookLibrary.apply()(scope to team orwhole squad)
ghostcell/aegisresearch and exposesboth research nodes for purchase
make godot-smoketarget that headlessly spawns map 0 with ascripted plan and asserts the mission ends — parallel to
node tools/smoke.js 0but for the Godot runtimeSuggested order (no sub-issues unless triage approves them)
MapsData.MAPSconst can be re-extended without breaking the titlescreen).
ghostcell+aegisresearch (one-line additions to theRESEARCHconstant; exposes the gated capabilities).ui/canvas_layer.tscnwiththe 4-region layout from issue #22). Without this, none of the rest is
reachable.
apply()call from the playbook buttonpress; close-coupled to #3).
unread" loop; needs the team-broadcast order flow).
wired).
Out of scope
TacGridback toGridMap—AGENTS.md:48rules this out.Mark/veilwalkersintegration —AGENTS.md:50rules it out.web/—AGENTS.md:53rules it out.README.md:211).Refs
godot/scenes/main.tscn(entire file, 9 lines)godot/scripts/main.gdteam_move()line 239,_unhandled_input()lines639–652,
_process()lines 621–636godot/scripts/maps_data.gd(entire file, ends at The Foundry)godot/scripts/playbook_library.gd(entire file, callable but uncalled)godot/scripts/abilities.gdsmoke support already wired at line 10,gated correctly in
main.gd:292but research node missingweb/js/game.jsteamMembers()viateams.js:32,web/js/ui.jsshowStrategic()line 517,web/js/data.jsRESEARCHlines 117–127,
web/js/maps.jsmap 3 lines 711–902#2 (export presets — landed), #4 (headless import gate — landed but
surface-only)
Godot port is non-playable: no in-mission UI, missing map 4, missing ghostcell/aegis research, dead playbook library, write-only team selectionto Godot port is non-playable: missing in-mission UI, map 4, ghostcell/aegis research, playbook callsites, and team-broadcast binding