Rizky RAR drop
po-runner-2026-rizky-20260907
branch master
88b4490f9b633e394805c9639915fe84a02f776c
Checkpoint: watchtowers with decks, wall hurtboxes, and spawn spacing.
Inbox: Drive folder
Two unrelated Git histories, 426 tracked files each. Same art for slide/run/land. Different game underneath: keys, slide timer, hitboxes, spawn, lives, kick, towers.
po-runner-2026-rizky-20260907
branch master
88b4490f9b633e394805c9639915fe84a02f776c
Checkpoint: watchtowers with decks, wall hurtboxes, and spawn spacing.
Inbox: Drive folder
po-runner-2026
branch fix/playable-loop
ccc194f5005cda3c92aeb434d4495ee27e8b2aab
Hut eaves slidable and board-arrow towers solid. Playtest, hanging, kick-breaks-rocks live here only.
Source inventory also on Drive: compare/2026-09-07-canonical-vs-icarus. Helios on Icarus. Intent: study only.
Why we diverged. These are process mistakes, not Rizky bugs.
Packed our zip for Rizky. Wrote CONTRACT.md, playtest_driver.gd, and walk skills against our architecture: pattern spawner, hanging, GameState.lives, kick-breaks-rocks, hut-eave-safe.
slide_into_rock, hut as platform, tower_00/02. Canonical has no hanging, no playtest, no watchtower.gd.
Writing slide to .godot/walk/command talks to the fork’s action names, not Rizky’s keys. Canonical: D jump, S kick, Down slide.
8 frames @ 15 fps ≈ 0.53s loop, still loop: true. Icarus SLIDE_DURATION = 0.65. Canonical already 0.5.
Hitboxes, spawn, lives, restart, and tower scenes do not match. Regression tooling would have measured the fork.
Same action names in Godot. Different physical keys. This is the first thing that makes walk notes lie.
Pause is absent. No gamepad map in project.godot.
Restart action absent. Escape + gamepad pause. Walk commands hit this map.
| Action | Canonical | Icarus fork |
|---|---|---|
| Jump | D, Space, Up | W, Space, Up + pad |
| Slide | Down only | S, Down + pad |
| Kick | S | D + pad |
| Pause | absent | Escape + pad |
| Restart | Enter | absent |
Art is the same clip. The timer is not. Scale is 0–0.65s (Icarus duration = 100% of this bar).
SLIDE_DURATION = 0.5. Ends when the timer hits 0. Already shorter than the looping clip, so the clock does not overrun the loop.
SLIDE_DURATION = 0.65. Ends via _try_end_slide() then _hanging_still_in_hit_area(). Timer longer than the 0.53s loop → stutter we diagnosed. Hanging linger has no canonical equivalent.
Same art SpriteFrames slide / run / land in main.tscn are byte-identical. slide still loop: true, 8 frames, speed 15. Default anim: canonical run kick, Icarus run.
| Canonical | Icarus fork | |
|---|---|---|
| End slide | timer hits 0 | _try_end_slide() + hanging linger |
| Hitboxes | swap SlideHitbox / DoubleJumpHitbox / FootCollision | resize one body+hit rect (SLIDE_HIT_H = 40) |
| Lives | player.lives + lives_changed | GameState.lose_life() |
| Kick | anim only; clears on land | stays until run kick finished; breaks Rock*; score 25 + Sfx + kick_pop |
| Hut | every hut area can drain | _hut_corner_is_safe if y < 188 |
| Idle gate | none in physics | GameState.is_running() early return |
| Hit drift | -DRIFT_SPEED | -GameState.game_speed |
| Death | freeze_world() + pause | GameState.end_game(); delayed pause |
Canonical rolls. Icarus plays a fixed 12-slot tape that includes hanging and a bridge — neither exists in the RAR game.
Interval 0.9 scaled by speed. GROUND_Y_TOWER = 121. Scripted watchtower.gd swaps textures 00/02 and 01/03. Rose chips (hanging) and gold (bridge) are fork-only.
After a hut, tower chance 1/3. After bamboo, tower chance 0.1. Four tower scenes. GROUND_Y_WATCHTOWER = 63. Interval randf_range(1.8, 3.5). No hanging. No GameState gate. No reset / seek_kind.
Same path names, different nodes. Boxes are scaled ~0.7 px per Godot unit, feet on the ground line.
Body (24, 150) + FootCollision (24, 24) + SlideHitbox (90, 40) + DoubleJumpHitbox (48, 58). _update_hitbox() toggles disabled flags.
No extra slide/foot/dj nodes. _set_crouch rewrites rectangle sizes pinned to feet. floor_snap_length = 12.
| Canonical | Icarus fork | |
|---|---|---|
| Hurtboxes | child HitArea / BodyHitArea / RoofHitArea / WallHitArea; root often collision_layer = 0 | root Area2D collision_layer = 2 |
| Hut | BodyHitArea + RoofHitArea; roof not one-way | one-way roof StaticBody2D + _hut_corner_is_safe |
| Towers | Deck + optional WallHitArea, scale ~1.2, plant y 63 | scripted posts/panels, scale 0.85, plant y 121 |
| obstacle_hit_area.gd | byte-identical @export var obstacle_type | |
Filter by substring. Rose = fork-only gameplay that Discord/walk assumed existed.
Playtest gate + hanging + sfx + world speed.
Wall towers + root HUD + graphic-development refs.
obstacle.gd: SCROLL_SPEED = 315, PROCESS_MODE_PAUSABLE, no "obstacles" grouphud.gd: score from GameState, lives from playerGameState.start_game() in main._readygenerated scripts/HUD.gd: GameState.lives; idle “PRESS JUMP”restart_run() without reload--playtest* attaches playtest_driver.gdWorking tree on the extracted drop, not in tip 88b4490:
assets/obstacles/stone_00.png (620 → 658 bytes)obstacle/bamboo_bundle.tscn (script uid + unique_id on HitArea)Do not treat these as the checkpoint. Do not merge, replace the Icarus checkout, email, pack, or git push origin on po-runner.