Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
f096804
feat(runner): add cinematic run intro presentation
juanpflores Oct 11, 2026
331fa70
feat(code-city): add armed locomotion and mini-boss sprite sheets
juanpflores Oct 11, 2026
60973b3
fix(brawl): turn Hoppy for the next swing after a mid-swing direction…
juanpflores Oct 11, 2026
73fd3b6
feat(code-city): district mini-bosses that end in a victory hop and r…
juanpflores Oct 11, 2026
ca77fd5
feat(beatemup): add victory celebration and cinematic knockout
juanpflores Oct 11, 2026
d0d005e
refactor(runner): remove the automatic turn phase and keep the corrid…
juanpflores Oct 11, 2026
120ac84
test(brawl): cover district mini-bosses and turning between swings
juanpflores Oct 11, 2026
451fa90
docs(code-city): district bosses, turning between swings, celebration…
juanpflores Oct 11, 2026
ba7bbe5
feat(runner): add the run intro backend (contract 2.7)
juanpflores Oct 11, 2026
1632662
merge(brawl): bring in S2 armed locomotion and mini-boss sprite sheets
juanpflores Oct 11, 2026
1c8249a
merge(brawl): bring in S3 victory celebration and cinematic knockout
juanpflores Oct 11, 2026
456e767
Merge branch 'juanpflores/runner-straight-intro' into juanpflores/run…
juanpflores Oct 11, 2026
8205719
test(runner): capture intros against the real facade
juanpflores Oct 11, 2026
495b5e4
fix(runner): stop the pursuit portrait's deferred redraw resuming on …
juanpflores Oct 11, 2026
bd61735
test(runner): drain audio in the intro test, stub the intro signals i…
juanpflores Oct 11, 2026
9421727
Merge branch 'juanpflores/runner-straight-intro' into juanpflores/run…
juanpflores Oct 11, 2026
d5d8bf9
test(runner): set the pending intro mode before opening each intro te…
juanpflores Oct 11, 2026
2b046e2
Merge branch 'juanpflores/runner-straight-intro' into juanpflores/run…
juanpflores Oct 11, 2026
e32f302
fix(runner): animate intro counts from beat arrivals
juanpflores Oct 11, 2026
40faba0
fix(runner): fade skipped GO within its exit tail
juanpflores Oct 11, 2026
3da7196
feat(code-city): play the celebration between the Force Merge and the…
juanpflores Oct 11, 2026
7d2f76d
test(code-city): settle rendered smoke starts and capture the distric…
juanpflores Oct 11, 2026
c2bd915
docs(code-city): previews for the district bosses, celebration and KO…
juanpflores Oct 11, 2026
13c9cd5
fix(runner): close the intro skip at GO, keep the intro out of run ti…
juanpflores Oct 11, 2026
147a89c
fix(code-city): derive armed frame counts and validate locomotion soles
juanpflores Oct 11, 2026
b231525
Merge branch 'juanpflores/runner-straight-intro' into juanpflores/run…
juanpflores Oct 11, 2026
bfe9ae6
merge(brawl): bring in S2 armed-builder frame-count and sole checks
juanpflores Oct 11, 2026
22debbb
fix(code-city): keep the victory pose on a swing kill; district boss …
juanpflores Oct 11, 2026
82c7e19
test(code-city): capture the district-boss stills at 1280x720, the ho…
juanpflores Oct 11, 2026
8a1081b
fix(beatemup): hide gameplay HUD during victory celebration
juanpflores Oct 11, 2026
c8139d1
merge(brawl): bring in S3 celebration HUD hiding and 1280x720 captures
juanpflores Oct 11, 2026
5e3e830
docs(code-city): re-shoot the celebration without the HUD and the KO …
juanpflores Oct 11, 2026
79701b4
docs(runner): say a boss-checkpoint retry plays no run intro
juanpflores Oct 11, 2026
cd9f7b9
Merge branch 'juanpflores/runner-straight-intro' into juanpflores/run…
juanpflores Oct 11, 2026
f3e5925
fix(code-city): hide the minimap as soon as the ending starts
juanpflores Oct 11, 2026
0d1866f
test(code-city): swing-driven boss kills, district-boss music, HUD an…
juanpflores Oct 11, 2026
d0323aa
docs(code-city): district-boss music, swing-kill fix and validator fo…
juanpflores Oct 11, 2026
8da323b
merge: Endless Runner straight corridor and cinematic run intro (S4 +…
juanpflores Oct 11, 2026
f2025f4
test(brawl): share the facing checks and bound the suites' readiness …
juanpflores Oct 11, 2026
e4114e9
test(brawl): fail fast without a district boss; time the loop switch …
juanpflores Oct 11, 2026
b5e0105
test(code-city): count a visible toast as a celebration leak on its own
juanpflores Oct 11, 2026
788e8dd
test(brawl): sweep the brawl tests for unchecked polls, waits and pre…
juanpflores Oct 11, 2026
74fc5c0
test(brawl): guard the last possibly-null reads in the knockout and c…
juanpflores Oct 11, 2026
f63e0db
test(brawl): explain why the armed foot-stride check uses the largest…
juanpflores Oct 11, 2026
a88f317
merge: Code City Brawl mini-bosses, turnaround fix, armed walks, cele…
juanpflores Oct 11, 2026
8a0c74b
ci: run the mini-boss, celebration and run-intro suites
juanpflores Oct 11, 2026
f140aad
fix(runner): time the intro title from its beat arrival
juanpflores Oct 11, 2026
e50a0be
merge: time the run intro title from its beat (PR #70 review)
juanpflores Oct 11, 2026
1f344b1
fix(code-city): stabilize armed locomotion around the torso
juanpflores Oct 11, 2026
585b6e1
fix(code-city): bound capture waits and report clip cadence
juanpflores Oct 11, 2026
482cd2c
fix(audio): let the mixer release every voice before the engine exits
juanpflores Oct 11, 2026
e791897
test: fail CI when quitting with audio playing leaks at exit
juanpflores Oct 11, 2026
ebaa93f
test(exit): close the window mid-transition and time every exit
juanpflores Oct 11, 2026
f388d44
fix(runner): type the synth's mixing weights so prewarm can't crash
juanpflores Oct 11, 2026
2378d89
test(code-city): make armed motion sampling deterministic
juanpflores Oct 11, 2026
451c433
perf(runner): build the drone's typed weights once, not per sample
juanpflores Oct 11, 2026
63e0de2
merge: type the synth weights for prewarm (thread race) and make arme…
juanpflores Oct 11, 2026
edfd362
test(runner): bound and synchronise the synth-threads barrier
juanpflores Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 11 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ jobs:
run: |
suites=(
code_city_assets
code_city_celebration
code_city_logic
code_city_mini_boss
code_city_motion
code_city_smoke
controller_service
Expand All @@ -81,8 +83,11 @@ jobs:
runner_boss_validator
runner_chunk_validator
runner_logic
runner_run_intro
runner_run_intro_ui
runner_scaffold_check
runner_smoke
runner_synth_threads
runner_visual_smoke
runner_warmup_check
)
Expand All @@ -107,6 +112,12 @@ jobs:
exit 1
fi

# Quits from the hub, fights, the Code City celebration, the runner intro and mid-transition
# with their audio playing. Godot prints its exit-leak lines only after the script is gone,
# so the wrapper runs tests/exit_leak.gd once per scenario, fails on them and times the exit.
- name: Exit leaks
run: python3 tools/checks/exit_leak.py --godot ~/godot/godot

lint:
name: lint
runs-on: ubuntu-24.04
Expand Down
7 changes: 4 additions & 3 deletions ASSETS_LICENSES.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ Status key: ✅ verified · ⚠️ needs sign-off · ❌ **blocks public release
| HellDrake (extended) | `Audio/Beat'em Up/helldrake(extended).ogg` | Centurion_of_war | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) ([OpenGameArt](https://opengameart.org/content/helldrake), byte-identical). Credit: "HellDrake" by Centurion_of_war. | Code City Brawl: Security | ✅ |
| Angel Eyes (Vision II) | `Audio/Beat'em Up/kim_lightyear_-_angel_eyes_vision_ii.mp3` | Kim Lightyear (OGA: KLY) | [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) or [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) ([OpenGameArt](https://opengameart.org/content/angel-eyes-vision-ii), byte-identical). Credit: "Angel Eyes (Vision II)" by Kim Lightyear. Preserve ShareAlike terms for adaptations. | Code City Brawl: Git HQ | ⚠️ source verified; license-policy sign-off and version selection |
| The Final | `Audio/Beat'em Up/Kim Lightyear - The Final.mp3` | Kim Lightyear (OGA: KLY) | [CC BY 3.0](https://creativecommons.org/licenses/by/3.0/) ([OpenGameArt](https://opengameart.org/content/the-final), byte-identical). Credit: "The Final" by Kim Lightyear. | Code City Brawl: boss | ⚠️ source verified; license-policy sign-off |
| Boss Fight 2 | `Audio/Beat'em Up/Boss Fight 2.mp3` | Luis Zuno (ansimuz) | CC0 ([OpenGameArt](https://opengameart.org/content/boss-fight-2), byte-identical to `Boss Fight 2 Files/Boss Fight 2.mp3` inside `boss_fight_2_files.zip`). Attribution optional. | Not referenced; bundled in Code City Brawl folder | ✅ |
| MERGE SUCCESSFUL jingle and victory loop | `Audio/Beat'em Up/code_city_victory_jingle.wav`, `code_city_victory_loop.wav` | Original project compositions and square-wave synthesis; no third-party samples | CC0 1.0. The project dedicates these compositions and recordings to the public domain under the [CC0 1.0 Universal dedication](https://creativecommons.org/publicdomain/zero/1.0/). Deterministic source: `tools/build_code_city_victory_music.py`; build and playback notes: `docs/soundtrack.md`. | Code City Brawl: celebration, ending pages and results | ✅ |
| Boss Fight 2 | `Audio/Beat'em Up/Boss Fight 2.mp3` | Luis Zuno (ansimuz) | CC0 ([OpenGameArt](https://opengameart.org/content/boss-fight-2), byte-identical to `Boss Fight 2 Files/Boss Fight 2.mp3` inside `boss_fight_2_files.zip`). Attribution optional. | Code City Brawl: Stack Overflow and Zero-Day district-boss fights (`Catalog.MINI_BOSS_MUSIC`) | ✅ |
| Hero Immortal | `Audio/Beat'em Up/Hero vs Villian/Hero Immortal.mp3` | Trevor Lentz | [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) ([OpenGameArt](https://opengameart.org/content/hero-immortal), byte-identical). Credit: "Hero Immortal" by Trevor Lentz. Preserve ShareAlike terms for adaptations. | Heroes vs. Villains: Generation Floor | ⚠️ source verified; license-policy sign-off |
| 8-bit - Slay The Evil | `Audio/Beat'em Up/Hero vs Villian/8-bit_slay_the_evil.ogg` | HydroGene | CC0 ([OpenGameArt](https://opengameart.org/content/8-bit-slay-the-evil), byte-identical). Attribution optional. | Heroes vs. Villains: AI SLOP | ✅ |
| Frivolous Hero | `Audio/Beat'em Up/Hero vs Villian/frivolous_hero.ogg` | Alexandr Zhelanov | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) ([OpenGameArt](https://opengameart.org/content/frivolous-hero), byte-identical). Credit: "Frivolous Hero" by Alexandr Zhelanov; retain the supplied [creator link](https://www.youtube.com/channel/UCxmng6_DMIayDwkiWGVzVRQ?view_as=subscriber) and contact totalnomus@gmail.com. | Heroes vs. Villains: Review Gauntlet | ✅ |
Expand All @@ -37,7 +38,7 @@ Status key: ✅ verified · ⚠️ needs sign-off · ❌ **blocks public release

### Audio verification — 2026-10-09

Checked all 12 supplied OpenGameArt pages and compared the corresponding downloads with the local files using SHA-256; all 12 are byte-identical. Also located and checksum-matched `tipa16.mp3` to **moon chime** (CC0), resolving its previous unknown-source blocker. `Boss Fight 2.mp3` was missing from this table and is now listed. Runtime references place **Valor of Heroes** in Orbital Ops, not Code City Brawl; **Boss Fight 2** is bundled but has no runtime reference.
Checked all 12 supplied OpenGameArt pages and compared the corresponding downloads with the local files using SHA-256; all 12 are byte-identical. Also located and checksum-matched `tipa16.mp3` to **moon chime** (CC0), resolving its previous unknown-source blocker. `Boss Fight 2.mp3` was missing from this table and is now listed. Runtime references place **Valor of Heroes** in Orbital Ops, not Code City Brawl; **Boss Fight 2** now plays during Code City Brawl's Stack Overflow and Zero-Day district-boss fights via `Catalog.MINI_BOSS_MUSIC`.

The audio inventory is covered by the individual tracks and pack rows above, plus the eight project-original Heroes vs. Villains cues below. No additional unidentified audio files were found. Existing pack verifications are retained; this pass does not re-establish their earlier byte-match claims.

Expand All @@ -54,7 +55,7 @@ These assets were made for this project, either by hand, by procedure, or with i
| Asset | Path | Notes | Status |
|---|---|---|---|
| Hoppy 2D sprite pack | `Character/Hoppy/2D/hoppy-sprite-pack/` | Generated from internal comic references | ⚠️ brand sign-off |
| Hoppy brawler combat supplement | `code-city-brawl-player/` | Image generation; exact prompt in `PROMPT.md`, reproducible atlas packing in `tools/build_hoppy_brawler.py` | ⚠️ brand sign-off and project asset terms |
| Hoppy brawler combat supplement | `code-city-brawl-player/` | Image generation; exact combat and victory prompts in `PROMPT.md`, untouched masters `source.png` and `victory-source.png`, reproducible atlas packing in `tools/build_hoppy_brawler.py` | ⚠️ brand sign-off and project asset terms |
| Hoppy armed supplement | `hoppy-armed/` | Built-in image generation; exact prompts in each mode's `PROMPTS.md` / `refinements.json`, untouched masters in `sources/`, deterministic packing in `tools/build_hoppy_armed.py`. See its [`README.md`](hoppys-adventure-arcade/Assets/hoppy-armed/README.md). | ⚠️ brand sign-off and project asset terms |
| Beat'em-up story illustrations | `beatemup-story/` | Built-in image generation; exact prompts and regeneration history in `refinements.json`, untouched masters in `sources/`, deterministic packing in `tools/build_story_scenes.py`. | ⚠️ brand sign-off and project asset terms |
| Hoppy 3D mascot | `runner/hoppy/` | Built by `tools/blender/build_hoppy.py` | ⚠️ brand sign-off |
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ godot --headless --path hoppys-adventure-arcade --script res://tests/runner_logi
godot --headless --path hoppys-adventure-arcade --script res://tests/platformer_smoke.gd
```

CI runs every headless suite listed in `.github/workflows/ci.yml`. Add a focused regression test when you change behavior. Some suites capture screenshots when run without `--headless`; include those in the PR for visual changes. On macOS, pass `--always-on-top` for graphical runs so the capture doesn't stall when the window is covered.
CI runs every headless suite listed in `.github/workflows/ci.yml`. It also runs `python3 tools/checks/exit_leak.py --godot <godot>`, which quits from screens with audio playing and fails on Godot's "leaked at exit" lines. Add a focused regression test when you change behavior. Some suites capture screenshots when run without `--headless`; include those in the PR for visual changes. On macOS, pass `--always-on-top` for graphical runs so the capture doesn't stall when the window is covered.

Per-mode notes and test details live in [`docs/`](docs/).

Expand Down
Loading
Loading