KAZIK/tools/tests/fortune_dialog_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

243 lines
8.2 KiB
PHP

.data
fortuneSessionBank dd 0
fortuneSessionPlayer dd 0
fortuneSessionMotion db "build\hall-expansion\fortune-session-motion-"
fortuneSessionDigits db "00.bmp",0
fortuneSessionQuestion db 193,243,228,229,242,32,235,232,32,231,224,226,242,240,224,32,228,238,230,228,252,63,0
fortuneSessionShot0 db "build\hall-expansion\fortune-session-input.bmp",0
fortuneSessionShot1 db "build\hall-expansion\fortune-session-shuffle.bmp",0
fortuneSessionShot2 db "build\hall-expansion\fortune-session-deal-one.bmp",0
fortuneSessionShot3 db "build\hall-expansion\fortune-session-deal-two.bmp",0
fortuneSessionShot4 db "build\hall-expansion\fortune-session-deal-three.bmp",0
fortuneSessionShot5 db "build\hall-expansion\fortune-session-flip-one.bmp",0
fortuneSessionShot6 db "build\hall-expansion\fortune-session-explain-one.bmp",0
fortuneSessionShot7 db "build\hall-expansion\fortune-session-flip-two.bmp",0
fortuneSessionShot8 db "build\hall-expansion\fortune-session-explain-two.bmp",0
fortuneSessionShot9 db "build\hall-expansion\fortune-session-flip-three.bmp",0
fortuneSessionShot10 db "build\hall-expansion\fortune-session-explain-three.bmp",0
fortuneSessionShot11 db "build\hall-expansion\fortune-session-summary.bmp",0
fortuneSessionShot12 db "build\hall-expansion\fortune-session-done.bmp",0
fortuneSessionShot13 db "build\hall-expansion\fortune-session-orb-rise.bmp",0
fortuneSessionShot14 db "build\hall-expansion\fortune-session-orb-mist.bmp",0
fortuneSessionShot15 db "build\hall-expansion\fortune-session-orb-final.bmp",0
fortuneSessionShots dd OFFSET fortuneSessionShot0,OFFSET fortuneSessionShot1,OFFSET fortuneSessionShot2,OFFSET fortuneSessionShot3
dd OFFSET fortuneSessionShot4,OFFSET fortuneSessionShot5,OFFSET fortuneSessionShot6,OFFSET fortuneSessionShot7
dd OFFSET fortuneSessionShot8,OFFSET fortuneSessionShot9,OFFSET fortuneSessionShot10,OFFSET fortuneSessionShot11
dd OFFSET fortuneSessionShot12
.code
FortuneSessionStepTest PROC
add animationClock3D,100
call UpdateFortuneSession3D
ret
FortuneSessionStepTest ENDP
FortuneDialogNativeTests PROC uses ebx esi edi
mov expansionStage,80
mov eax,bankroll
mov fortuneSessionBank,eax
mov eax,playerX
mov fortuneSessionPlayer,eax
call BeginFortuneDialog3D
cmp fortuneSessionShuffle3D.frames,64
jne fortune_session_fail
cmp fortuneSessionDeal3D.frames,32
jne fortune_session_fail
cmp fortuneSessionCards3D.frames,45
jne fortune_session_fail
cmp fortuneProcess3D,0
jne fortune_session_fail
cmp fortuneRead3D,0
jne fortune_session_fail
invoke WindowEvents3D,0,102h,'1',0
cmp fortuneSubMode3D,FORTUNE_SUBMODE_TAROT
jne fortune_session_fail
; Lower edge of the question box is not an Exit-button hit target.
mov mouseX3D,260
mov mouseY3D,222
mov mouseClick3D,1
call HandleFortuneDialog3D
cmp engineMode,MODE_FORTUNE
jne fortune_session_fail
call SubmitFortuneQuestion3D
cmp fortunePhase3D,0
jne fortune_session_fail
mov esi,250
fortune_session_input_limit:
invoke WindowEvents3D,0,102h,'a',0
dec esi
jnz fortune_session_input_limit
cmp fortuneQuestionLength3D,240
jne fortune_session_fail
cmp fortuneQuestion3D[240],0
jne fortune_session_fail
invoke WindowEvents3D,0,102h,8,0
cmp fortuneQuestionLength3D,239
jne fortune_session_fail
mov fortuneQuestionLength3D,0
mov fortuneQuestion3D,0
mov esi,OFFSET fortuneSessionQuestion
fortune_session_input:
movzx eax,BYTE PTR [esi]
test eax,eax
jz fortune_session_input_done
invoke WindowEvents3D,0,102h,eax,0
inc esi
jmp fortune_session_input
fortune_session_input_done:
mov fortuneSpeechTime3D,3000
call RenderFortuneDialog3D
invoke ExpansionSnapshot,OFFSET fortuneSessionShot0
call SubmitFortuneQuestion3D
cmp fortunePhase3D,1
jne fortune_session_fail
cmp fortuneDealt3D,0
jne fortune_session_fail
invoke WindowEvents3D,0,102h,'X',0
cmp fortuneQuestionLength3D,22
jne fortune_session_fail
call SubmitFortuneQuestion3D
cmp fortunePhase3D,1
jne fortune_session_fail
mov fortunePhaseTime3D,700
mov fortuneSpeechTime3D,1000
call RenderFortuneDialog3D
invoke ExpansionSnapshot,OFFSET fortuneSessionShot1
cmp fortunePhaseTime3D,700
jne fortune_session_fail
xor edi,edi
fortune_session_motion:
mov eax,edi
xor edx,edx
mov ecx,10
div ecx
add al,'0'
add dl,'0'
mov fortuneSessionDigits[0],al
mov fortuneSessionDigits[1],dl
mov eax,edi
imul eax,25
mov fortunePhaseTime3D,eax
call RenderFortuneDialog3D
invoke ExpansionSnapshot,OFFSET fortuneSessionMotion
inc edi
cmp edi,64
jb fortune_session_motion
mov ebx,1
fortune_session_phases:
mov eax,fortuneDurations3D[ebx*4]
mov fortunePhaseTime3D,eax
call FortuneSessionStepTest
inc ebx
cmp fortunePhase3D,ebx
jne fortune_session_fail
mov fortunePhaseTime3D,600
mov fortuneSpeechTime3D,3000
call RenderFortuneDialog3D
invoke ExpansionSnapshot,fortuneSessionShots[ebx*4]
cmp ebx,12
jb fortune_session_phases
cmp fortuneDealt3D,3
jne fortune_session_fail
cmp fortuneRevealed3D,3
jne fortune_session_fail
cmp fortuneQuestionLength3D,22
jne fortune_session_fail
mov eax,fortuneSpeechLength3D
cmp fortuneSpeechVisible3D,eax
jne fortune_session_fail
; Distinct underlying cards even when orientation differs.
xor esi,esi
fortune_session_unique_outer:
mov eax,fortuneDrawCards3D[esi*4]
xor edx,edx
mov ecx,22
div ecx
mov edi,edx
lea ebx,[esi+1]
fortune_session_unique_inner:
cmp ebx,3
jae fortune_session_unique_next
mov eax,fortuneDrawCards3D[ebx*4]
xor edx,edx
div ecx
cmp edx,edi
je fortune_session_fail
inc ebx
jmp fortune_session_unique_inner
fortune_session_unique_next:
inc esi
cmp esi,2
jb fortune_session_unique_outer
mov expansionStage,81
; Bubble grows as glyphs appear and cannot exceed the scene edge.
invoke SetFortuneSpeech3D,OFFSET fortuneSummary3D
mov fortuneSpeechTime3D,280
call RenderFortuneDialog3D
mov esi,fortuneSpeechWidth3D
mov fortuneSpeechTime3D,3000
call RenderFortuneDialog3D
cmp fortuneSpeechWidth3D,esi
jbe fortune_session_fail
cmp fortuneSpeechWidth3D,204
ja fortune_session_fail
cmp fortuneSpeechHeight3D,140
ja fortune_session_fail
; Return to selection, then display the neutral, non-grading orb sequence.
mov mouseX3D,200
mov mouseY3D,232
mov mouseClick3D,1
call HandleFortuneDialog3D
cmp fortuneSubMode3D,0
jne fortune_session_fail
invoke WindowEvents3D,0,102h,'2',0
cmp fortuneSubMode3D,FORTUNE_SUBMODE_ORB
jne fortune_session_fail
mov fortunePhaseTime3D,700
call RenderFortuneDialog3D
invoke ExpansionSnapshot,OFFSET fortuneSessionShot13
mov fortunePhaseTime3D,1400
call FortuneSessionStepTest
cmp fortunePhase3D,2
jne fortune_session_fail
mov fortunePhaseTime3D,1500
mov fortuneSpeechTime3D,3000
call RenderFortuneDialog3D
invoke ExpansionSnapshot,OFFSET fortuneSessionShot14
mov fortunePhaseTime3D,5000
call FortuneSessionStepTest
cmp fortunePhase3D,3
jne fortune_session_fail
mov fortuneSpeechTime3D,3000
call RenderFortuneDialog3D
invoke ExpansionSnapshot,OFFSET fortuneSessionShot15
; Exit in the middle of an animation as well as after completion.
mov mouseX3D,260
mov mouseY3D,232
mov mouseClick3D,1
call HandleFortuneDialog3D
cmp engineMode,MODE_WALK
jne fortune_session_fail
cmp fortuneSessionRoom3D.pixels,0
jne fortune_session_fail
call BeginFortuneDialog3D
invoke FortuneChar3D,'1'
invoke FortuneChar3D,'a'
call SubmitFortuneQuestion3D
mov mouseX3D,260
mov mouseY3D,232
mov mouseClick3D,1
call HandleFortuneDialog3D
cmp engineMode,MODE_WALK
jne fortune_session_fail
cmp fortuneSessionShuffle3D.pixels,0
jne fortune_session_fail
mov eax,bankroll
cmp eax,fortuneSessionBank
jne fortune_session_fail
mov eax,playerX
cmp eax,fortuneSessionPlayer
jne fortune_session_fail
ret
fortune_session_fail:
invoke ExitProcess,expansionStage
ret
FortuneDialogNativeTests ENDP