KAZIK/docs/BOWLING.md
Artvasil09 3150d217b5 feat: add playable bowling match mode and calibrate rooftop character scaling
- Add playable ten-frame bowling against bot with two timing gates (direction/power) and fixed-step physics

- Add lane match interaction, shaded ball surface, pin collisions, bonus balls, and live score sheet

- Scale rooftop terrace visitor sprites to eye level according to the taller rooftop standing eye height

- Resolve mode and interaction ID conflicts with Hell FPS (MODE_BOWLING=30, INTERACT_BOWL_PLAY=56)

- Update launcher hash, installer package, and expansion regression test suites
2026-11-01 22:50:33 +03:00

96 lines
5.3 KiB
Markdown

# Bowling Lounge
The bowling lounge is a walkable room with playable ten-frame bowling against a bot.
Enter through the wide opening in the north wall of the main casino, near the
slot-machine side of the hall. Walk through to enter or leave; no interaction
button or timed stair/elevator animation is used.
## Room
- Eight lanes with wooden approaches, gutters, ten pins and overhead displays.
- Three occupied lanes and five free lanes.
- Paired sofas, ball returns, dining booths, a staffed bar and circulating guests.
- All ten visitors use the shared character cast, including seated, drinking,
walking, pick-up, throwing and return animations. See `SHARED_CHARACTERS.md`.
- E sits on an available lounge seat or gets up. W/S also gets up.
- The bar uses the existing drink purchase flow and restores the room camera.
All room geometry, rendering, input, scoring and visitor simulation run in MASM.
Furniture is built from fixed world-space surfaces, not rotating room billboards.
Human sprites retain the game's existing 2.5D presentation.
## Player Game
Approach a free lane's foul line and press E on the play prompt. Occupied visitor
lanes stay unavailable. There is no entry fee or bankroll change. The camera and
room position are restored on exit; leaving abandons the current lane match.
The throw has two separate timing gates, both accepting either left mouse click
or a fresh Space press. First stop the oscillating direction arrow on its curved
horizontal scale. Then stop the vertical power indicator. The second press
commits the launch. Holding Space cannot accidentally consume both stages.
The arrow and meter update from elapsed time, not frame count. The ball follows
the committed parameters without additional random error.
Player and bot alternate complete frames. A second ball uses the remaining rack;
strikes, spares and tenth-frame bonuses use the shared native bowling scorer.
The lane monitor shows the two scores and current phase. Tab toggles a cumulative
ten-frame score sheet; unresolved bonuses stay blank rather than inventing a total.
The sheet pauses the current throw. Escape or the Exit command returns to the room.
After a completed match, click or Space starts a fresh match.
The player game uses an arcade, not regulation-grade, collision approximation:
16-ms fixed steps, a rolling ball disc, ten pin discs, transferred pin impulses
and pin friction. Gutters latch once entered. Pins knocked by the ball can knock
other pins; removed pins cannot be scored again. The opponent uses the identical
solver, with private lane RNG choosing only its launch aim and power. The camera
follows the rolling ball; the bot uses a full-body shared-cast throwing animation.
The blue ball is a native shaded sphere with a procedural marble surface and
rotating finger-hole details, not a new neural or image runtime.
## Visitor Simulation
Each occupied lane owns a timer, rack mask, two players, frame counters and roll
history. The sequence is pick-up, approach/release, ball travel, pin impact,
pinsetter sweep, return and a pause before the next attempt/player.
Scoreboards use native ten-frame bowling scoring, including strike/spare bonuses
and tenth-frame bonus balls. These exhibition games do not change the bankroll.
The room owns its random state; visitor games do not consume the casino RNG.
Simulation pauses when the player is in an unrelated room. Artwork is loaded on
the first visible entrance/visit, retained for subsequent visits and freed with
the other hall assets. No city mesh or rooftop OpenGL pass is used here.
## Sources And Rebuild
- `src_graphics/bowling*.inc`: native room and lane simulation.
- `tools/generators/pack_bowling.py`: offline atlas packing, frame normalization,
in-between frames and furniture/collision tables.
- `assets/sprites/bowling/`: retained image-generation sources.
- `assets/animations/bowling/`: packed shipping assets.
Image-generation source briefs: twelve bowling-room material swatches (maple,
teal/coral textile, acoustic panels, mural, marble, metal and ball-return front);
a whole-body male approach/underarm-release/pick-up sequence; the corresponding
female bowler sequence; four distinct seated adult visitors in idle and
conversation/drinking poses. The edited female sheet preserves transparency.
These are original generated assets, not extracted FNAF artwork.
Run the offline packer with Python, then build the MASM executable normally.
## Checks
`tools/tests/check_hall_expansion.py --bowling-only` compiles fresh assembly and
checks entrance visibility, walkable access, both room transitions, lane/furniture
collision, sitting/restoration, 600 simulated seconds of lane lifecycles, perfect
game/all-spare/open-frame score vectors, and captures room/throw screenshots.
The additional `bowling_play_test.inc` covers LMB/Space input through native window
events, stage separation, deterministic impacts at two frame deltas, gutters,
empty/remaining racks, alternating turns, spare feedback, perfect games and the
tenth-frame bonuses, unresolved score cells, scene captures and exit restoration.
The complete hall suite includes the same bowling checks alongside existing
stairs, doors, rooftop, fortune-room, bar and cabaret regressions. `--parity`
compares the tested procedures with the shipping assembly object.
Screenshots are native framebuffer captures, not a substitute for final manual
playtesting on the target laptop.