KAZIK/docs/CASINO_TERMINALS.md
Artvasil09 797ee366dc feat: implement upper lounge, manual stairs, cabaret, and casino terminals
- Native player-controlled stairs, upper lounge bar, and Hell Tower infernal portal
- Cabaret stage with musical acts, audience seating, and interaction
- Dedicated cash/trophy wall terminals with native balance and achievement screens
- Projecting 3D wall lanterns with ray/plane intersection
- Six roaming guests with seated poses and card rank rendering updates
- Synchronized launcher hash and updated binaries
2026-10-18 21:36:12 +03:00

4.9 KiB

Casino Terminals and Wall Lanterns

The runtime is MASM x86 only. Python is used solely to compile art and run offline native regression fixtures, never to implement a second game runtime.

World Objects

  • Cash and achievement stations retain interaction IDs 7 and 17. They now stand against the south face of the east lounge's wall at y=13: centres (28,13.22) and (29.5,13.22), screens facing south into the hall. Their backs leave a 2 cm gap to the wall rather than intersecting it. The old floating positions (26,16) and (26,20) are no longer rendered or collidable. Interaction/minimap anchors and the visitor ATM approach move with the cabinets.
  • Each new cabinet has a 0.7 x 0.4 metre footprint, 1.6 metre height, textured dedicated walnut equipment sides/rear, a metal lid and a brass-trimmed front. Solid footprints stop the player walking through the cabinets while preserving the front approach.
  • Eight wall lanterns now have a solid glass body projecting 0.3 metres from the wall, a horizontal metal arm, a mounting plate and top/bottom surfaces. They use real ray/plane intersections and per-pixel depth, not a wall decal or a sprite that rotates towards the player. Existing baked lighting remains.

Native Screens

Both stations open the same full-screen terminal, initially showing their own page. The four pages are balance and three achievement pages. Mouse arrows and Left/Right cycle through them; Exit, E and the engine's Escape handler return to the hall without opening a console or changing a wager.

Balance shows the actual wallet, owned card backs out of 13 and unlocked achievements out of eight. No new money transfer or deposit is implied.

Eight achievements have visible conditions and progress:

Condition Saved Bit
Reach a wallet of 50,000 chips 8
Reach 100,000 chips 9
Reach 500,000 chips 10
Reach 1,000,000 chips 11
Purchase a card back 4, existing merchant bit
Own five purchased backs, excluding the default 12
Claim a visitor contract reward 13
Claim six rewards during the current visitor/journal rotation 14

Conditions are checked whenever native progress saves and when opening a kiosk. Unlocks are permanent even if the wallet falls or visitors change. Existing achievement bits are not cleared. The existing signed profile field stores the mask without a save-format change; no reward currency is granted for these achievements. Old peaks that were never recorded cannot be reconstructed.

Art

Five original generated PNG sources and the exact built-in image_gen prompts are in assets/sprites/terminals/. tools/generators/pack_terminals.py resizes the art, compiles Russian cabinet plaques using the game's CP1251 font, and writes terminals-v2.bin (four 256x512 BGRA frames) plus terminal-screen-v1.bin (one 640x480 frame). Sources remain unchanged.

The first version incorrectly reused bar-shelf material 86 on the enclosure, which exposed bottles along the cabinet edges from the rear. V2 uses dedicated material 121 for every side/rear face and a metal lid. Its source is assets/sprites/terminals/body-side-rear-v2.png, generated with the built-in image_gen tool. Existing front, lamp and screen pixels are unchanged. The old v1 pack is retained for pre-update executables, not modified in place.

Missing art leaves a safe, readable native screen; it does not block exit or change a wallet. World pack dimensions and frame counts are validated on load.

Verification

Run C:\Python314\python.exe tools/tests/check_terminals.py to compile fresh MASM handlers, geometry and interaction dispatch against the existing native test helpers. The helper object is copied with COFF visibility changes only; shipping instructions and binaries are never patched.

The fixture checks threshold/sticky unlocks, preserved unrelated bits, actual signed profile save/load in build/terminals/test-profile.sav, mouse/key paging and exit, missing art, cabinet collisions and fourteen native framebuffer captures, including the requested wall/lounging-area view, real front interaction, clear old footprints and front/side/rear views of both stations. Rear inspection uses an isolated model frame because the back is now against a solid wall in play. The former bar material is temporarily poisoned in test memory; isolated side/rear cabinet frames must remain pixel-identical. --prove-regression compiles a test-only old-material variant and asserts that this test rejects it. Shipping sources are not mutated. It cannot write the user's profile. --parity compares the tested procedures with a completed shipping object, normalizing internal/external call encoding. Do not run parity while the shipping assembler is still writing the object.

The full game is still assembled through tools/tests/build_graphics.ps1 and published through tools/tests/publish_graphics.ps1. The latter refreshes the existing C# launcher's integrity hash; that launcher is not assembly code.