.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