- 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
96 lines
5.3 KiB
Markdown
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.
|