- 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
377 lines
11 KiB
PHP
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
|