KAZIK/tools/tests/fortune_room_test.inc
Artvasil09 23dc40ee5c feat: implement native darts mini-game, AI observer mode, and fortune session assets
- Darts: native 500-point match against Max with sway/fatigue mouse aim, parabolic throw camera, raster arm animations, and 16 camera-relative flying dart views

- AI Observer: autonomous spectator mode for Hold'em, Blackjack, Durak, and Billiards with profile isolation and playback controls

- Fortune Session: raster sprite packs, mist/orb animations, tarot divination spreads, and pack tools

- Hall Integration: wall dartboard in lounge, observer terminal dispatch, and bot turn hooks

- Packaging & Verification: updated installer streaming hash, synchronized launcher, passing check suites and release smoke checks
2026-10-24 22:10:25 +03:00

377 lines
11 KiB
PHP

.data
fortuneTestClosed db "build\hall-expansion\fortune-closed.bmp",0
fortuneTestPull db "build\hall-expansion\fortune-lamp-pulled.bmp",0
fortuneTestOpen db "build\hall-expansion\fortune-open.bmp",0
fortuneTestFar db "build\hall-expansion\fortune-open-far.bmp",0
fortuneTestStairs db "build\hall-expansion\fortune-stairs.bmp",0
fortuneTestTopReturn db "build\hall-expansion\fortune-stair-return.bmp",0
fortuneTestRoom db "build\hall-expansion\fortune-room.bmp",0
fortuneTestNear db "build\hall-expansion\fortune-seer.bmp",0
fortuneTestIdle db "build\hall-expansion\fortune-seer-idle.bmp",0
fortuneTestDialog db "build\hall-expansion\fortune-unavailable.bmp",0
fortuneTestReturn db "build\hall-expansion\fortune-room-return.bmp",0
fortuneTestNorth db "build\hall-expansion\fortune-north.bmp",0
fortuneTestSouth db "build\hall-expansion\fortune-south.bmp",0
fortuneTestMissing db "build\hall-expansion\fortune-missing-art.bmp",0
fortuneTestOblique db "build\hall-expansion\fortune-oblique.bmp",0
fortuneTestFullLight db "build\hall-expansion\fortune-full-light.bmp",0
fortuneTestEast db "build\hall-expansion\fortune-east.bmp",0
fortuneTestCentered db "build\hall-expansion\fortune-doorway-centered.bmp",0
fortuneTestBank dd 0
fortuneTestView dd 0
.code
FortuneNativeTests PROC uses esi edi
mov expansionStage,60
cmp fortuneArt3D.frames,24
jne fortune_test_fail
cmp fortuneArt3D.imageWidth,256
jne fortune_test_fail
cmp fortuneMaterialArt3D.frames,4
jne fortune_test_fail
invoke ResolveCitySurface3D,132
cmp eax,fortuneMaterialArt3D.pixels
jne fortune_test_fail
invoke ResolveCitySurface3D,135
mov edx,fortuneMaterialArt3D.pixels
add edx,3*256*256*4
cmp eax,edx
jne fortune_test_fail
invoke ResolveCitySurface3D,159
mov edx,fortuneArt3D.pixels
add edx,23*256*256*4
cmp eax,edx
jne fortune_test_fail
invoke FortuneLightAt3D,216,152,26
cmp eax,174
jb fortune_test_fail
invoke FortuneLightAt3D,0,0,0
test eax,eax
jnz fortune_test_fail
mov engineMode,MODE_WALK
mov hallLevel3D,0
mov worldMap3D,OFFSET casinoMap
mov floorTexture3D,100
mov fortunePassageTime3D,0
mov fortunePassageTarget3D,0
mov deltaTime3D,100
mov playerX,3*FP_1
mov playerY,10*FP_1
mov playerAngle,256
call UpdateInteriorEye3D
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestClosed
invoke CanWalk3D,FP_1*15/10,10*FP_1
test eax,eax
jnz fortune_test_fail
mov playerX,FP_1*26/10
mov playerY,FP_1*87/10
call UpdateCamera3D
call CheckInteractions
cmp interactTargetId,INTERACT_SECRET_LAMP
jne fortune_test_fail
call Trigger3DInteraction
cmp fortunePassageTarget3D,1
jne fortune_test_fail
add animationClock3D,100
call UpdateInteriorTravel3D
cmp fortunePassageTime3D,100
jne fortune_test_fail
call UpdateFortunePassage3D
cmp fortunePassageTime3D,100
jne fortune_test_fail
add animationClock3D,100
call UpdateInteriorTravel3D
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestPull
mov esi,12
fortune_test_opening:
add animationClock3D,100
call UpdateInteriorTravel3D
dec esi
jnz fortune_test_opening
cmp fortunePassageTime3D,1400
jne fortune_test_fail
invoke CanWalk3D,FP_1*15/10,10*FP_1
cmp eax,1
jne fortune_test_fail
call CheckInteractions
cmp interactTargetId,INTERACT_SECRET_LAMP
jne fortune_test_fail
cmp interactPromptPtr,OFFSET fortuneLampReturn3D
jne fortune_test_fail
mov playerX,3*FP_1
mov playerY,10*FP_1
call ExpansionFrame
cmp portalPixelsWritten3D,1000
jb fortune_test_fail
invoke ExpansionSnapshot,OFFSET fortuneTestOpen
mov playerX,FP_1*85/10
call ExpansionFrame
cmp portalPixelsWritten3D,1000
jb fortune_test_fail
invoke ExpansionSnapshot,OFFSET fortuneTestFar
mov expansionStage,61
mov deltaTime3D,16
mov playerX,3*FP_1
mov playerY,10*FP_1
mov keys3D[57h],1
xor esi,esi
fortune_test_walk_down:
call ExpansionWalkFrame
cmp engineMode,MODE_WALK
jne @F
cmp hallLevel3D,3
je fortune_test_arrived
@@:
inc esi
cmp esi,1000
jb fortune_test_walk_down
jmp fortune_test_fail
fortune_test_arrived:
mov keys3D[57h],0
cmp worldMap3D,OFFSET fortuneRoomMap3D
jne fortune_test_fail
cmp floorTexture3D,134
jne fortune_test_fail
cmp playerY,11*FP_1
jne fortune_test_fail
mov eax,fortuneSeer3D.posY
cmp eax,playerY
jne fortune_test_fail
invoke CanWalk3D,FP_1*173/10,FP_1*103/10
cmp eax,1
jne fortune_test_fail
invoke CanWalk3D,FP_1*173/10,FP_1*117/10
cmp eax,1
jne fortune_test_fail
; Off-centre crossing preserves lateral position in both local maps.
mov playerX,FP_1*176/10
mov playerY,FP_1*115/10
call UpdateInteriorTravel3D
cmp engineMode,MODE_STAIRS
jne fortune_test_fail
cmp playerY,FP_1*105/10
jne fortune_test_fail
mov playerX,17*FP_1
call UpdateInteriorTravel3D
cmp hallLevel3D,3
jne fortune_test_fail
cmp playerY,FP_1*115/10
jne fortune_test_fail
mov playerY,11*FP_1
cmp playerAngle,256
jne fortune_test_fail
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestRoom
mov playerX,16*FP_1
mov playerY,FP_1*116/10
mov playerAngle,384
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestNorth
mov playerX,16*FP_1
mov playerY,FP_1*107/10
mov playerAngle,128
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestSouth
mov playerX,FP_1*155/10
mov playerY,FP_1*116/10
mov playerAngle,0
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestEast
invoke CanWalk3D,FP_1*146/10,FP_1*126/10
test eax,eax
jnz fortune_test_fail
invoke CanWalk3D,FP_1*163/10,FP_1*925/100
test eax,eax
jnz fortune_test_fail
mov expansionStage,62
; A mid-flight camera shows physical treads and continuous eye height.
mov engineMode,MODE_STAIRS
mov stairRoute3D,3
mov hallLevel3D,0
mov worldMap3D,OFFSET fortuneStairMap3D
mov playerX,24*FP_1
mov playerY,10*FP_1
mov playerAngle,256
call UpdateStairHeight3D
cmp viewEye3D,HALL_STANDING_EYE+FP_1*15/16
jne fortune_test_fail
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestStairs
mov playerX,28*FP_1
mov playerAngle,0
call UpdateStairHeight3D
call ExpansionFrame
cmp portalPixelsWritten3D,1000
jb fortune_test_fail
invoke ExpansionSnapshot,OFFSET fortuneTestTopReturn
; The panel cannot close over somebody still at its upper landing.
mov fortunePassageTarget3D,0
mov playerX,29*FP_1
add animationClock3D,16
call UpdateFortunePassage3D
cmp fortunePassageTime3D,1400
jne fortune_test_fail
mov playerX,24*FP_1
add animationClock3D,16
call UpdateFortunePassage3D
cmp fortunePassageTime3D,1400
jne fortune_test_fail
mov engineMode,MODE_WALK
mov hallLevel3D,3
add animationClock3D,16
call UpdateFortunePassage3D
cmp fortunePassageTime3D,1400
jne fortune_test_fail
mov fortunePassageTarget3D,1
mov engineMode,MODE_WALK
mov hallLevel3D,3
mov worldMap3D,OFFSET fortuneRoomMap3D
mov playerX,FP_1*158/10
mov playerY,11*FP_1
mov playerAngle,256
call UpdateInteriorEye3D
mov animationClock3D,6000
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestNear
call UpdateCamera3D
call RenderCeilingAndFloor
call RenderWalls
call PrepareCityDepth3D
call RenderFortuneFurnishings3D
invoke ExpansionSnapshot,OFFSET fortuneTestFullLight
call ApplyFortuneLighting3D
mov playerX,FP_1*164/10
mov playerY,FP_1*116/10
mov playerAngle,288
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestOblique
mov playerX,FP_1*158/10
mov playerY,11*FP_1
mov playerAngle,256
mov esi,fortuneMaterialArt3D.pixels
mov edi,hallArchitectureHD3D.pixels
mov fortuneMaterialArt3D.pixels,0
mov hallArchitectureHD3D.pixels,0
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestMissing
mov fortuneMaterialArt3D.pixels,esi
mov hallArchitectureHD3D.pixels,edi
call ExpansionFrame
call CheckInteractions
cmp interactTargetId,INTERACT_FORTUNE
jne fortune_test_fail
invoke CanWalk3D,FP_1*141/10,11*FP_1
test eax,eax
jnz fortune_test_fail
mov animationClock3D,5000
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestIdle
mov eax,bankroll
mov fortuneTestBank,eax
mov eax,playerX
mov fortuneTestView,eax
call Trigger3DInteraction
cmp engineMode,MODE_FORTUNE
jne fortune_test_fail
call RenderFortuneDialog3D
invoke ExpansionSnapshot,OFFSET fortuneTestDialog
mov mouseClick3D,1
mov mouseX3D,260
mov mouseY3D,232
call HandleFortuneDialog3D
cmp engineMode,MODE_WALK
jne fortune_test_fail
cmp hallLevel3D,3
jne fortune_test_fail
mov eax,bankroll
cmp eax,fortuneTestBank
jne fortune_test_fail
mov eax,playerX
cmp eax,fortuneTestView
jne fortune_test_fail
mov playerX,FP_1*1495/100
mov playerY,11*FP_1
mov playerAngle,0
call ExpansionFrame
invoke ExpansionSnapshot,OFFSET fortuneTestCentered
xor esi,esi
fortune_test_first_column:
cmp portalClipDepth3D[esi*4],0
jne fortune_test_find_last
inc esi
cmp esi,SCREEN_W
jb fortune_test_first_column
jmp fortune_test_fail
fortune_test_find_last:
mov edi,SCREEN_W-1
fortune_test_last_column:
cmp portalClipDepth3D[edi*4],0
jne fortune_test_center_mask
dec edi
jns fortune_test_last_column
jmp fortune_test_fail
fortune_test_center_mask:
add esi,edi
cmp esi,SCREEN_W-2
jb fortune_test_fail
cmp esi,SCREEN_W+2
ja fortune_test_fail
mov playerX,16*FP_1
call ExpansionFrame
cmp portalPixelsWritten3D,1000
jb fortune_test_fail
invoke ExpansionSnapshot,OFFSET fortuneTestReturn
mov expansionStage,63
mov keys3D[57h],1
xor esi,esi
fortune_test_walk_up:
call ExpansionWalkFrame
cmp engineMode,MODE_WALK
jne @F
cmp hallLevel3D,0
je fortune_test_back_hall
@@:
inc esi
cmp esi,1000
jb fortune_test_walk_up
jmp fortune_test_fail
fortune_test_back_hall:
mov keys3D[57h],0
cmp worldMap3D,OFFSET casinoMap
jne fortune_test_fail
cmp playerAngle,0
jne fortune_test_fail
cmp playerX,2*FP_1
ja fortune_test_fail
mov playerX,FP_1*26/10
mov playerY,FP_1*87/10
mov playerAngle,256
call UpdateCamera3D
call CheckInteractions
cmp interactTargetId,INTERACT_SECRET_LAMP
jne fortune_test_fail
call Trigger3DInteraction
cmp fortunePassageTarget3D,0
jne fortune_test_fail
mov deltaTime3D,100
mov esi,14
fortune_test_closing:
add animationClock3D,100
call UpdateFortunePassage3D
dec esi
jnz fortune_test_closing
cmp fortunePassageTime3D,0
jne fortune_test_fail
invoke CanWalk3D,FP_1*15/10,10*FP_1
test eax,eax
jnz fortune_test_fail
cmp scrStation3D.posX,29*FP_1
jne fortune_test_fail
cmp scrStation3D.posY,FP_1*15/2
jne fortune_test_fail
ret
fortune_test_fail:
invoke ExitProcess,expansionStage
ret
FortuneNativeTests ENDP