Commit Graph

146 Commits

Author SHA1 Message Date
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 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 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
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
Josh Creek bca08d266e feat(*): Log live goal rate to TensorBoard during training 2026-07-28 21:33:41 +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
Josh Creek 1afdc301ab feat(training): add airborne_penalty and a stage-6 "unmask" curriculum run
Stage 5 (aggression) passed (41-47 vs grounded curric-s2-defend, within
the lenient gate but not yet a clear win). Rather than keep the locomotion
mask on indefinitely, stage 6 reopens full 3D controls on top of the
aggression retune and pairs it with a new dense airborne_penalty (scaled
by height above the floor) so the policy learns to prefer staying grounded
through incentives instead of a hard mask — same regime shift that
regressed stage 3, but this time with a mitigation and ~12x the training
time (~240M timesteps / ~24h vs ~20M / ~2h) to actually re-converge
instead of stalling mid-shift.

airborne_penalty follows the existing SHIP_AI_OVERRIDES pattern: default
0 (off) on ship_ai_controller.gd, exposed via train.py's new
--airborne-penalty flag, added to training_mode.gd's allow-list. Also adds
a per-stage timesteps override in curriculum.py (STAGES[n]["timesteps"])
since this is the first stage to need a different budget than the rest.
2026-07-22 21:22:27 +01:00
Josh Creek 0e42182cce fix(*): jitter kickoff resets to break deterministic same-model mirror matches
GameMode.reset_ball()/reset_ships() teleported to exact, identical spawn
transforms every kickoff. Combined with deterministic bot inference
(action_noise = 0 by default), two ships running the same policy from a
mirror-symmetric state produced mirrored, non-diverging play instead of a
real contest — most visible when both sides use the same exported model.

Adds a small position/yaw jitter (well under anything a player would
notice as "not a real kickoff") so kickoff-style resets stop being
bit-for-bit identical.
2026-07-22 18:01:21 +01:00
Josh Creek 8c15c466ef fix(*): apply the locomotion mask during in-game/eval inference, not just training
AIShipController (eval + real gameplay) ran the raw policy output unmasked
regardless of allow_vertical/allow_pitch_roll, while ShipAIController
(training) correctly discarded those axes for grounded curriculum stages.
A grounded-trained model's untrained vertical/pitch-roll output reached the
ship as noise during eval, understating it against models that were never
handicapped this way.
2026-07-21 22:23:09 +01:00
Josh Creek 8e3fafcc8b feat(*): add staged curriculum training with an automated stage-by-stage orchestrator 2026-07-21 12:38:51 +01:00
Josh Creek 7d69ac4a01 feat(*): retune scoring incentives and add finishing reps 2026-07-20 20:06:11 +01:00
Josh Creek 46c8275523 feat(*): add wall/ceiling surface pull and retune ball-ship materials 2026-07-20 19:33:28 +01:00
Josh Creek 3457d4ca84 feat(*): Add rounded arena boundaries and reward shaping to curb corner-camping 2026-07-20 08:20:33 +01:00
Josh Creek 240e362f2f feat(*): Add bot selection, score HUD, and winner reveal to matches, replace HUD text with aircraft-style flight instruments, and fix camera judder 2026-07-20 07:12:09 +01:00
Josh Creek 4f075b352f feat(*): Add orientation-readable team-coloured ship meshes, smooth the ball-cam orbit, and hide arena walls the camera is outside of 2026-07-19 22:18:21 +01:00
Josh Creek 4c227c24b4 feat(*): Add a distance-to-ball penalty so idling scores negative, boost ball-seeking rewards, and halve the wall-contact penalty 2026-07-19 18:04:36 +01:00
Josh Creek c8f052854c fix(*): Detect wall contact by contact normal so floor contact anywhere on the pitch is exempt from the wall penalty 2026-07-19 15:53:30 +01:00
Josh Creek 7777280062 feat(*): Exempt the floor from the wall-contact penalty, add a tilt penalty for non-upright flight, and double velocity-to-ball shaping 2026-07-19 15:34:34 +01:00
Josh Creek 772f98b7fe feat(*): Fix exported-policy action order to gymnasium's sorted-key layout, add wall-contact penalty and stronger ball-touch reward, and wire Spectate to run01 vs run02 2026-07-19 13:21:14 +01:00
Josh Creek 07217c3517 feat(*): Add bot-vs-bot Spectate mode with main-menu entry, entropy-control flags (--ent-coef, --reset-std) for resumed training runs, and a Linux/3090 remote-training guide (TRAINING_LINUX.md) 2026-07-19 10:10:32 +01:00
Josh Creek 379ef9910e feat(*): Replace the test terrain arena with an enclosed standard-size space-platform arena (shared ArenaBoundary floor/walls/ceiling scene, starfield sky, ball CCD) and derive TrainingMode placement bounds from it, dropping the out-of-bounds reward guard 2026-07-18 20:18:03 +01:00
Josh Creek 85f96eb15e feat(*): Add self-play RL training pipeline with PPO trainer, in-game GDScript policy inference, and bot opponent support in Match mode 2026-07-18 19:32:51 +01:00
Josh Creek 328831df1f refactor(*): Restructure game into reusable Arena/GameMode architecture with controller-driven ships, adding Free Play and Match modes 2026-07-18 15:34:11 +01:00
Josh Creek c3329b3280 feat(*): Add goal 2025-07-20 20:51:24 +01:00
Josh Creek 8650995c18 chore(*): Remove redundant files 2025-07-16 23:05:32 +01:00
Josh Creek 35a23f79e3 refactor(*): Make hud more performant and maintainable 2025-07-16 19:19:58 +01:00
Josh Creek 9ed5afa092 feat(*): Add basic flight data to HUD 2025-07-13 21:14:51 +01:00
Josh Creek 7fe9f8e263 docs(*): Add in physics formulae so I remember vaguely what I was trying to do 2025-07-13 21:04:24 +01:00
Josh Creek cba9a51b5f feat(*): Add much better ship controls 2025-07-13 21:01:57 +01:00
Josh Creek 709bc947f5 feat(*): Add better ball cam and movement system more like a spaceship 2025-07-13 19:10:20 +01:00
Josh Creek 5ad381cf2f feat(*): Add hud with timer 2025-07-13 18:36:48 +01:00
Josh Creek bdd0244873 fix(*): Ensure that movement vaguely works in the new area and looks vaguely at the ball 2025-07-12 20:34:03 +01:00
Josh Creek 927bbd0be7 feat(*): Add new match scene, new player scene and main menu 2025-07-12 19:20:16 +01:00
Josh Creek 58fac74683 fix(*): Fix movement for player 2 2024-03-21 20:32:25 +00:00
Josh Creek 764299d850 fix(*): Ensure moving backwards doesn't change y vector 2024-03-21 20:30:56 +00:00
Josh Creek d11c566ed9 fix(*): Change direction relative to player not the world 2024-03-21 20:23:54 +00:00
Josh Creek b7d52b7509 feat(*): Add basic 2 player splitscreen 2024-03-21 20:12:53 +00:00
Josh Creek ddfd8efb71 feat(*): Add the ability to score a goal 2024-02-23 18:26:23 +00:00
Josh Creek 80882a9c5e feat(*): Add goal with basic collision 2024-02-23 18:13:25 +00:00
Josh Creek 0fd3098f14 feat(*): Split out vehicle object 2024-02-23 18:12:59 +00:00
Josh Creek ed590bc062 feat(#3): Add a fixed ballcam behind and slightly above the vehicle 2024-02-21 18:11:00 +00:00
Josh Creek cbd9db488f feat(#2): Add the ability to move the vehicle up, down, left, right, forwards, backwards using the keyboard 2024-02-21 18:09:13 +00:00