KAZIK/tools/tests/presentation_test.inc
Игорь Федосеев 24d66ddf0e feat: add startup briefing and entry music
Sequence studio, texture AI disclosure and MASM code comparison before arrival. Show a typed hall briefing after admission.

Start the jukebox at 50% user volume on hall entry. Apply positional gain before playback to avoid a full-volume startup burst.
2026-11-02 01:04:11 +03:00

368 lines
9.9 KiB
PHP

; Exercise the shipping ASM startup, admission, overlay and input procedures.
.data
presTestStage dd 1
presTestIo dd 0
presTestPath db 'build\scratch\presentation-00.bgra',0
presTestWindow db 'build\scratch\presentation-window.bgra',0
presTestTimes dd 0,100,200,300,450,600,1200,2400,10000
presTestX dd 0
presTestY dd 0
presTestAngle dd 0
presTestBank dd 0
presTestRng dd 0
presTestMusicMode db 'status jboxmusic mode',0
presTestMusicVolume db 'status jboxmusic volume',0
presTestMusicPosition db 'status jboxmusic position',0
presTestMusicSeek db 'seek jboxmusic to 5000',0
presTestMusicReply db 64 dup(0)
.code
PresTestMusicNumber PROC uses esi ebx command:DWORD
invoke mciSendStringA,command,OFFSET presTestMusicReply,64,0
test eax,eax
jnz pres_music_number_failed
xor eax,eax
lea esi,presTestMusicReply
pres_music_number_digit:
movzx ebx,BYTE PTR [esi]
test ebx,ebx
jz pres_music_number_done
sub ebx,'0'
cmp ebx,9
ja pres_music_number_failed
imul eax,10
add eax,ebx
inc esi
jmp pres_music_number_digit
pres_music_number_failed:
mov eax,-1
pres_music_number_done:
ret
PresTestMusicNumber ENDP
PresTestCapture PROC uses ebx path:DWORD
invoke CreateFileA,path,40000000h,0,0,2,80h,0
cmp eax,-1
je pres_capture_failed
mov ebx,eax
invoke WriteFile,ebx,OFFSET screenBuffer,SCREEN_SIZE*4,OFFSET presTestIo,0
push eax
invoke CloseHandle,ebx
pop eax
ret
pres_capture_failed:
xor eax,eax
ret
PresTestCapture ENDP
RunPresentationTest3D PROC uses esi edi ebx
call InitPaths3D
call InitHall3D
call LoadTextures3D
call LoadHallAssets3D
call InitializeCasinoSprites3D
mov rngSeed3D,12345678h
mov bankroll,12345
mov keys3D[57h],1
call BeginStartup3D
cmp startupPage3D,STARTUP_STUDIO
jne pres_test_failed
cmp keys3D[57h],0
jne pres_test_failed
mov startupElapsed3D,2500
call RenderStartup3D
invoke PresTestCapture,OFFSET presTestPath
mov presTestStage,2
; No early transition. At the boundary, studio -> AI (not arrival).
mov startupElapsed3D,6999
mov deltaTime3D,0
call HandleStartupInput3D
cmp startupPage3D,STARTUP_STUDIO
jne pres_test_failed
mov deltaTime3D,1
call HandleStartupInput3D
cmp startupPage3D,STARTUP_AI
jne pres_test_failed
cmp startupElapsed3D,0
jne pres_test_failed
cmp engineMode,MODE_INTRO
jne pres_test_failed
mov startupElapsed3D,1000
call RenderStartup3D
mov presTestPath[28],'1'
invoke PresTestCapture,OFFSET presTestPath
; Enter skips only this page, and held movement keys cannot leak through.
mov keys3D[57h],1
mov pressedKeys3D[0Dh],1
mov deltaTime3D,0
call HandleStartupInput3D
cmp startupPage3D,STARTUP_CODE
jne pres_test_failed
cmp keys3D[57h],0
jne pres_test_failed
mov startupElapsed3D,1500
call RenderStartup3D
mov presTestPath[28],'2'
invoke PresTestCapture,OFFSET presTestPath
mov presTestStage,3
mov startupElapsed3D,11000
call HandleStartupInput3D
cmp engineMode,MODE_ARRIVAL
jne pres_test_failed
cmp arrivalState3D,ARRIVAL_WALK
jne pres_test_failed
cmp cityPhase3D,CITY_BLACK
jne pres_test_failed
cmp welcomeActive3D,0
jne pres_test_failed
cmp jboxIsPlaying,0
jne pres_test_failed
cmp startupPixels3D,0
jne pres_test_failed
cmp startupSequence3D,0
jne pres_test_failed
; Full automatic order, followed by a fresh-launch reset and Escape path.
call BeginStartup3D
mov deltaTime3D,7000
call HandleStartupInput3D
mov deltaTime3D,10000
call HandleStartupInput3D
cmp startupPage3D,STARTUP_CODE
jne pres_test_failed
mov deltaTime3D,11000
call HandleStartupInput3D
cmp engineMode,MODE_ARRIVAL
jne pres_test_failed
call BeginStartup3D
cmp startupPage3D,STARTUP_STUDIO
jne pres_test_failed
call FinishStartup3D
cmp engineMode,MODE_ARRIVAL
jne pres_test_failed
mov presTestStage,4
; Guest profile -> admission -> hall triggers the modal only after entry.
mov arrivalState3D,ARRIVAL_PROFILE
mov arrivalSelected3D,0
mov deltaTime3D,0
mov pressedKeys3D[0Dh],1
call HandleArrival3D
cmp arrivalConfirmed3D,1
jne pres_test_failed
cmp welcomeActive3D,0
jne pres_test_failed
cmp jboxIsPlaying,0
jne pres_test_failed
mov deltaTime3D,1200
call HandleArrival3D
cmp arrivalState3D,ARRIVAL_ENTER
jne pres_test_failed
cmp welcomeActive3D,0
jne pres_test_failed
cmp jboxIsPlaying,0
jne pres_test_failed
mov deltaTime3D,1400
call HandleArrival3D
cmp engineMode,MODE_WALK
jne pres_test_failed
cmp welcomeActive3D,1
jne pres_test_failed
cmp welcomeElapsed3D,0
jne pres_test_failed
mov presTestStage,41
cmp jboxIsPlaying,1
jne pres_test_failed
cmp jboxCurrentTrack,0
jne pres_test_failed
cmp jboxUserVolume,5
jne pres_test_failed
mov presTestStage,42
invoke mciSendStringA,OFFSET presTestMusicMode,OFFSET presTestMusicReply,64,0
test eax,eax
jnz pres_test_failed
cmp DWORD PTR presTestMusicReply,79616C70h ; "play" in "playing"
jne pres_test_failed
mov presTestStage,43
invoke PresTestMusicNumber,OFFSET presTestMusicVolume
cmp eax,-1
je pres_test_failed
cmp eax,500
ja pres_test_failed
test eax,eax
jz pres_test_failed
; Windows MCI rounds through device gain; allow a few units out of 1000.
sub eax,jboxEffectiveVolume
jns @F
neg eax
@@:
cmp eax,4
ja pres_test_failed
mov eax,playerX
mov presTestX,eax
mov eax,playerY
mov presTestY,eax
mov eax,playerAngle
mov presTestAngle,eax
mov eax,bankroll
mov presTestBank,eax
mov eax,rngSeed3D
mov presTestRng,eax
mov presTestStage,5
xor esi,esi
pres_test_overlay_frames:
mov eax,presTestTimes[esi*4]
mov welcomeElapsed3D,eax
mov deltaTime3D,0
call HandleWelcome3D
call RenderWelcomeScene3D
mov eax,esi
add al,'3'
cmp al,'9'
jbe @F
sub al,10
mov presTestPath[27],'1'
@@:
mov presTestPath[28],al
invoke PresTestCapture,OFFSET presTestPath
test eax,eax
jz pres_test_failed
inc esi
cmp esi,9
jb pres_test_overlay_frames
mov eax,presTestX
cmp eax,playerX
jne pres_test_failed
mov eax,presTestY
cmp eax,playerY
jne pres_test_failed
mov eax,presTestAngle
cmp eax,playerAngle
jne pres_test_failed
mov eax,presTestRng
cmp eax,rngSeed3D
jne pres_test_failed
mov eax,presTestBank
cmp eax,bankroll
jne pres_test_failed
mov presTestStage,6
; Put playback past zero: closing/reopening the modal must not restart it.
invoke mciSendStringA,OFFSET presTestMusicSeek,0,0,0
test eax,eax
jnz pres_test_failed
invoke mciSendStringA,OFFSET jboxPlayCmd,0,0,0
test eax,eax
jnz pres_test_failed
mov pressedKeys3D[0BDh],1
call HandleJukeboxKeys3D
cmp jboxUserVolume,4
jne pres_test_failed
; Early input cannot skip the deployment; typing completion is persistent.
call BeginWelcome3D
mov deltaTime3D,100
mov pressedKeys3D[0Dh],1
call HandleWelcome3D
cmp welcomeActive3D,1
jne pres_test_failed
cmp welcomeChars3D,0
jne pres_test_failed
call ClearKeys3D
mov deltaTime3D,700
call HandleWelcome3D
cmp welcomeChars3D,0
je pres_test_failed
cmp welcomeChars3D,welcomeTextLength3D
jae pres_test_failed
mov pressedKeys3D[0Dh],1
mov keys3D[57h],1
call HandleWelcome3D
cmp welcomeActive3D,1
jne pres_test_failed
cmp welcomeChars3D,welcomeTextLength3D
jne pres_test_failed
cmp keys3D[57h],0
jne pres_test_failed
mov deltaTime3D,1
call HandleWelcome3D
cmp welcomeChars3D,welcomeTextLength3D
jne pres_test_failed
mov pressedKeys3D[0Dh],1
call HandleWelcome3D
cmp welcomeActive3D,0
jne pres_test_failed
cmp pressedKeys3D[0Dh],0
jne pres_test_failed
cmp jboxUserVolume,4
jne pres_test_failed
invoke PresTestMusicNumber,OFFSET presTestMusicPosition
cmp eax,-1
je pres_test_failed
cmp eax,5000
jb pres_test_failed
; Escape uses the same clean close; click stays inside the button.
call BeginWelcome3D
call CloseWelcome3D
cmp welcomeActive3D,0
jne pres_test_failed
cmp paused3D,0
jne pres_test_failed
call BeginWelcome3D
mov welcomeElapsed3D,10000
mov mouseX3D,220
mov mouseY3D,190
mov mouseClick3D,1
call HandleWelcome3D
cmp welcomeActive3D,0
jne pres_test_failed
IFDEF PRESENTATION_WINDOW_TEST
mov presTestStage,7
call Create3DWindow
test eax,eax
jz pres_test_failed
cmp fullscreen3D,0
je @F
call ToggleFullscreen3D
@@:
invoke SetWindowPos,h3DWnd,0,80,80,800,640,14h
call BeginWelcome3D
invoke ShowWindow,h3DWnd,4
mov esi,150
pres_test_window_frame:
invoke PeekMessageA,OFFSET msg3D,0,0,0,PM_REMOVE
test eax,eax
jz pres_test_window_tick
invoke TranslateMessage,OFFSET msg3D
invoke DispatchMessageA,OFFSET msg3D
jmp pres_test_window_frame
pres_test_window_tick:
mov deltaTime3D,50
call HandleWelcome3D
call RenderWelcomeScene3D
call Present3D
invoke Sleep,17
dec esi
jnz pres_test_window_frame
invoke PresTestCapture,OFFSET presTestWindow
call CloseWelcome3D
invoke DestroyWindow,h3DWnd
ENDIF
mov presTestStage,8
; Manual track switching and Stop still work after automatic entry playback.
invoke PlayJukeboxTrack3D,1
cmp jboxIsPlaying,1
jne pres_test_failed
cmp jboxCurrentTrack,1
jne pres_test_failed
cmp jboxUserVolume,4
jne pres_test_failed
call StopJukeboxTrack3D
cmp jboxIsPlaying,0
jne pres_test_failed
cmp jboxCurrentTrack,-1
jne pres_test_failed
call FreeStartupAssets3D
call FreeArrivalAssets3D
xor eax,eax
ret
pres_test_failed:
call StopJukeboxTrack3D
mov eax,presTestStage
ret
RunPresentationTest3D ENDP