Commit Graph

133 Commits

Author SHA1 Message Date
Josh Creek 3257f5cbcc feat: greeble/detail pass on nebula station and debris models
Add tools/blender/gen_nebula.py (previously nebula_decoration.blend had
no generator script, unlike ship/ball) to rebuild the station with
inset/extrude panel-line greeble and three separate emissive window
strips, and give debris its own rockier, damage-scarred materials
instead of cloning the station's hull material.
2026-08-03 23:09:50 +01:00
Josh Creek 11d81a910e chore: add missing .uid sidecars for settings_menu.gd and video_settings.gd 2026-08-03 22:41:55 +01:00
Josh Creek 1eb5a3188d feat: replace ship and ball placeholder meshes with Blender-modeled assets
Ship gets a greebled hull, tapered nose, swept canopy, twin engine nacelles,
and tail fin (built via the vendored Blender MCP, generator committed at
tools/blender/gen_ship.py) in place of the 5 flat primitives. The ball is
fully remodeled as a smooth round sphere with a crossed emissive accent
pattern (gen_ball.py), replacing the old flat-shaded gold_ball rather than
just tweaking its material.

Node names (Nose/TailFin) are preserved for Ship._apply_team_color(), and
the RigidBody3D/CollisionShape3D physics on both ship.tscn and ball.tscn are
untouched so RL-trained bots and flight feel stay valid. Each part's mesh is
extracted to a standalone .res (tools/blender/extract_meshes.gd) rather than
referenced via glb::ArrayMesh_xxx sub-paths, which don't reliably resolve
across scene files and were silently rendering both models invisible.
2026-08-03 22:39:46 +01:00
Josh Creek 50c2014361 feat: enable SDFGI/reflection probes and fresnel glass boundary
Adds sdfgi_enabled and a ReflectionProbe to all three arenas' Environment
setup so surfaces get real bounce lighting/reflections instead of flat
ambient. Converts arena_boundary.tscn's shared glass field material from
unshaded to a shaded, rim-lit material so it reads as glass (dim face-on,
highlighted at grazing angles) rather than a flat tinted overlay.
2026-08-03 21:29:59 +01:00
Josh Creek 1c08ab3566 fix: de-duplicate hero star diffraction-spike stamps in nebula sky
Every bright star in sky_nebula.png reused the exact same diffraction-
spike stamp, just relocated. Commit the generator (recovered from an
ephemeral scratchpad) to tools/textures/gen_nebula_sky.py, randomize
each hero star's rotation, arm count, spike length, and brightness,
and regenerate the texture.
2026-08-03 20:04:36 +01:00
Josh Creek 3fdf270aa9 feat: add post-processing pass and video settings menu
Enable glow/bloom, color adjustments, and MSAA+FXAA across all three
arenas so emissive ship/station accents actually bleed light and edges
read cleanly. Expose the player-facing knobs (anti-aliasing mode, glow
intensity, brightness) through a new Settings screen off the main menu,
persisted via a VideoSettings autoload that scales each arena's own
tuned Environment values on load rather than overwriting them.
2026-08-03 19:53:56 +01:00
Josh Creek 171cd4a840 feat: add Nebula and Asteroid Field arenas
Introduce arena_02 (Nebula) and arena_03 (Asteroid Field) alongside
arena_01, listed in a new ArenaRegistry (scripts/arena_registry.gd) as
the single source of truth for available arenas. Free Play lets the
player pick an arena from the main menu; Match/Spectate each pick one
at random per session; Training keeps its own fixed arena_01.

Nebula gets an RL-style visual treatment: a near-invisible glass
boundary material shared by all arenas, a baked equirect nebula sky
texture, a drifting-dust particle system, and a Blender-modeled
station/debris/planet decoration set. GameMode gains a
_get_arena_scene_path() hook so modes can instantiate their arena in
code instead of hardcoding it in the scene.
2026-08-03 19:11:13 +01:00
Josh Creek 1af3e0410d chore: vendor blender-mcp as a git submodule alongside godot-mcp
Both mcp/godot-mcp and mcp/blender-mcp were already cloned locally and
registered in .gitmodules/.mcp.json/CLAUDE.md, but neither submodule's
gitlink had actually been committed, so a fresh clone wouldn't pull
either down. Stages the two gitlinks so `git submodule update --init
--recursive` works as documented.
2026-08-03 19:11:13 +01:00
Josh Creek 4507b6dc1b feat: add main-menu difficulty picker for Match mode
Replace the raw checkpoint dropdown with curated Easy/Medium/Hard presets
that drive GameSettings' bot model/reaction_ticks/action_noise overrides.
Move raw-checkpoint testing and Spectate mode into a dev-only section
hidden via OS.is_debug_build() so they disappear from release exports.
2026-08-03 19:11:13 +01:00
CosmicClash Training Bot 20f6be7e28 chore(training): curriculum progress after 20260802-1458-curric-s4-unmask-retry1 2026-08-03 18:29:13 +01:00
CosmicClash Training Bot 5fe53b2406 chore(training): Add 20260802-1458-curric-s4-unmask-retry1 checkpoints, logs, and exported policy 2026-08-03 18:27:21 +01:00
CosmicClash Training Bot 62dc0a2981 chore(training): curriculum progress after 20260801-1131-curric-s4-unmask 2026-08-02 14:58:25 +01:00
CosmicClash Training Bot f62ddde369 chore(training): Add 20260801-1131-curric-s4-unmask checkpoints, logs, and exported policy 2026-08-02 14:56:35 +01:00
CosmicClash Training Bot fa53d72f63 chore(training): curriculum progress after 20260801-0658-curric-s3-unmask-ramp75 2026-08-01 11:31:57 +01:00
CosmicClash Training Bot e5a0df63c5 chore(training): Add 20260801-0658-curric-s3-unmask-ramp75 checkpoints, logs, and exported policy 2026-08-01 11:31:48 +01:00
CosmicClash Training Bot be1bf37e0b chore(training): curriculum progress after 20260801-0223-curric-s2-unmask-ramp50 2026-08-01 06:58:20 +01:00
CosmicClash Training Bot 1615791ee0 chore(training): Add 20260801-0223-curric-s2-unmask-ramp50 checkpoints, logs, and exported policy 2026-08-01 06:58:11 +01:00
CosmicClash Training Bot e22b4814f5 chore(training): curriculum progress after 20260731-2149-curric-s1-unmask-ramp25 2026-08-01 02:23:37 +01:00
CosmicClash Training Bot 23b2cd19df chore(training): Add 20260731-2149-curric-s1-unmask-ramp25 checkpoints, logs, and exported policy 2026-08-01 02:23:27 +01:00
Josh Creek 3fd1c00895 feat(training): Replace all-or-nothing unmask with a gradual ramp
Generation 2's single "unmask" stage (flip vertical/pitch-roll locomotion
from grounded-only to full 3D in one step) failed 3 independent 240M-step
attempts, landing at a stable 32% / 28% / 31% win rate vs curric-s5-aggression
each time -- not noise, and not fixable by more training time (attempts 2-3
each continued the same checkpoint lineage for another full 240M steps with
zero improvement). Every attempt shows train/std collapsing from ~0.30 to
~0.13-0.15 within the first ~10% of steps and never recovering: the policy
locks the newly-opened axes back down before ever meaningfully exploring
them.

Replaces the boolean allow_vertical/allow_pitch_roll mask on ShipAIController
with float vertical_ramp/pitch_roll_ramp multipliers (0.0-1.0), scaling axis
effect in set_action() instead of gating it outright -- the action space
never changes shape, so checkpoints stay resumable across ramp values. The
single unmask stage in curriculum.py becomes 4: three ungated warmup stages
(25%/50%/75% authority, airborne_penalty ramping in step) that train,
checkpoint, and always advance with no eval gate, then the measured stage at
full authority -- same reference, opponent mode, and 240M budget as the 3
failed attempts, for a direct comparison. Adds a "gated" flag/branch to
main()'s loop for the ungated stages.

This is generation 3 of the curriculum; generation 2's state is archived to
curriculum_state_gen2.json (mirroring the earlier gen1 -> gen2 archival) and
curriculum_state.json resets fresh, since its stage 0 no longer means what it
used to. See TRAINING.md's "Generation 3" section for the full postmortem,
stage table, and the open question about whether scaling action effect in
Godot (which PPO's own entropy/exploration math never sees) actually
addresses the collapse.
2026-07-31 21:47:53 +01:00
CosmicClash Training Bot 0759e1514b chore(training): curriculum progress after 20260730-1224-curric-s1-unmask-retry2 2026-07-31 16:07:16 +01:00
CosmicClash Training Bot f03037a612 chore(training): Add 20260730-1224-curric-s1-unmask-retry2 checkpoints, logs, and exported policy 2026-07-31 16:04:58 +01:00
CosmicClash Training Bot 6084991f1c chore(training): curriculum progress after 20260729-0837-curric-s1-unmask-retry1 2026-07-30 12:24:45 +01:00
CosmicClash Training Bot f41702e7ea chore(training): Add 20260729-0837-curric-s1-unmask-retry1 checkpoints, logs, and exported policy 2026-07-30 12:22:54 +01:00
Josh Creek efda6c1a05 chore(training): Resume stage 1 unmask from its own checkpoint, not foundation
Generation 2's first two real stage-1 attempts both independently restarted
from curric-s5-aggression (reset_retry_checkpoint) with identical flags and
landed at 32% and 27% win rate vs the reference -- a real regression either
way, but too much spread between "identical" runs for repeat fresh restarts
to be a controlled test of anything. The first attempt's own trajectory
(ep_rew_mean climbing from -10.86 toward ~0 by the 240M-step cutoff,
briefly touching positive) looked closer to convergence than the second's,
so retries now continue that attempt's own checkpoint for another full
timesteps budget instead of resetting to foundation again.

Drops retry1 and retry2 (checkpoints, logs, exported bots, eval_history
entries) -- retry2 never trained meaningfully before crashing on the
GoalRateCallback bug just fixed, and retry1 was the inferior of the two
real samples. curriculum_state.json rewinds to attempt 1, in_progress, so
the next run resumes 20260726-1904-curric-s1-unmask/final.zip directly.
2026-07-29 08:35:34 +01:00
Josh Creek 259b2adc07 fix(training): Guard GoalRateCallback against a missing goal_scored key
The vendored godot_rl sync bridge (Game/addons/godot_rl_agents/sync.gd,
_training_process) snapshots each agent's info dict once per tick and its
own inline comment already flags that reset-timing path as incomplete
("NEEDS REFACTOR"); at least one agent's terminal-step info can arrive
without "goal_scored" at all. Indexing it directly crashed a training run
(20260729-0607-curric-s1-unmask-retry2) within minutes of starting. Skip
episodes missing the key instead of crashing training over a
monitoring-only metric.
2026-07-29 08:35:20 +01:00
CosmicClash Training Bot 8bc16ee048 chore(training): curriculum progress after 20260729-0607-curric-s1-unmask-retry2 2026-07-29 06:09:25 +01:00
CosmicClash Training Bot a6c2ed6177 chore(training): Add 20260729-0607-curric-s1-unmask-retry2 checkpoints, logs, and exported policy 2026-07-29 06:08:10 +01:00
CosmicClash Training Bot 0d29fc44e0 chore(training): curriculum progress after 20260728-0031-curric-s1-unmask-retry1 2026-07-29 06:07:26 +01:00
CosmicClash Training Bot cb3732fcb7 chore(training): Add 20260728-0031-curric-s1-unmask-retry1 checkpoints, logs, and exported policy 2026-07-29 06:05:33 +01:00
Josh Creek bca08d266e feat(*): Log live goal rate to TensorBoard during training 2026-07-28 21:33:41 +01:00
Josh Creek c998d2271a chore(*): Update todos 2026-07-28 20:56:39 +01:00
Josh Creek 01dbfc7ede feat(*): Add exported Linux binary training path for faster parallel instances 2026-07-28 20:56:14 +01:00
Josh Creek 4408ec3ecd chore(*): Update todos 2026-07-28 19:45:14 +01:00
Josh Creek ac317cd2e1 feat(*): Add sudden-death overtime with golden goal on a draw 2026-07-28 19:44:35 +01:00
Josh Creek 09ea8d6fbc feat(*): Style the results screen and dock the heading tape under the scoreboard 2026-07-28 19:32:40 +01:00
Josh Creek a9b7b450d5 feat(*): Redesign HUD scoreboard as a single timer/score/team banner 2026-07-28 19:24:40 +01:00
Josh Creek 93f90ca6de feat(*): Add 3-2-1 kickoff countdown before play and after goals 2026-07-28 19:11:36 +01:00
CosmicClash Training Bot 2533827cf8 chore(training): curriculum progress after 20260726-1904-curric-s1-unmask 2026-07-28 00:30:59 +01:00
CosmicClash Training Bot a0b527b8cb chore(training): Add 20260726-1904-curric-s1-unmask checkpoints, logs, and exported policy 2026-07-28 00:29:06 +01:00
Josh Creek 31aa5cae8c chore(*): Remove superseded pre-curriculum and dead-branch runs 2026-07-26 19:25:22 +01:00
Josh Creek f7d03b1e74 chore(*): Remove superseded curriculum branches 2026-07-26 19:19:01 +01:00
Josh Creek 390bd18be7 feat(*): Start curriculum generation 2, seeded from curric-s5-aggression 2026-07-26 19:00:38 +01:00
CosmicClash Training Bot 33b2c23f13 chore(training): curriculum progress after curric-s6-unmask-retry2 2026-07-26 13:08:35 +01:00
CosmicClash Training Bot 653afe4040 chore(training): Add curric-s6-unmask-retry2 checkpoints, logs, and exported policy 2026-07-26 13:06:31 +01:00
CosmicClash Training Bot 28109756dd chore(training): curriculum progress after curric-s6-unmask-retry1 2026-07-25 07:41:43 +01:00
CosmicClash Training Bot 4e0efec612 chore(training): Add curric-s6-unmask-retry1 checkpoints, logs, and exported policy 2026-07-25 07:39:52 +01:00
Josh Creek 580222c139 feat(*): Promote curric-s6-unmask as the shipped "easy" bot 2026-07-24 09:18:53 +01:00
CosmicClash Training Bot 407a916b40 chore(training): curriculum progress after curric-s6-unmask 2026-07-24 02:25:37 +01:00
CosmicClash Training Bot f4dfc43d04 chore(training): Add curric-s6-unmask checkpoints, logs, and exported policy 2026-07-24 02:23:34 +01:00