- 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
5.3 KiB
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.