- 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
93 lines
4.9 KiB
Markdown
93 lines
4.9 KiB
Markdown
# 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.
|