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