include tools\tests\clover_fixtures.inc .data clpTestStage3D dd 0 clpTestReady db "build\actions\clover-ready.bmp",0 clpTestSpin db "build\actions\clover-spin.bmp",0 clpTestStopped db "build\actions\clover-stopped.bmp",0 clpTestWin db "build\actions\clover-win.bmp",0 clpTestNext db "build\actions\clover-next.bmp",0 clpTestPay db "build\actions\clover-paytable.bmp",0 .code RunCloverTest3D PROC uses ebx esi edi local oldBank:DWORD,oldMode:DWORD,oldSeed:DWORD,iterations:DWORD local fixture:DWORD,expected:DWORD,rngSnapshot:DWORD,previous:DWORD,ticks:DWORD mov eax,bankroll mov oldBank,eax mov eax,engineMode mov oldMode,eax mov eax,rngSeed3D mov oldSeed,eax mov clpTestStage3D,1 mov engineMode,MODE_WALK mov interactTargetId,INTERACT_SLOTS_CLOVER call Trigger3DInteraction cmp engineMode,MODE_CLOVER jne clp_test_fail call TableBusy3D test eax,eax jnz clp_test_fail call RenderNativeClover3D invoke WriteActionSnapshot3D,OFFSET clpTestReady test eax,eax jz clp_test_fail mov clpTestStage3D,2 lea ebx,clpFixtures3D mov iterations,clpFixtureCount3D clp_test_fixture: mov fixture,ebx mov esi,ebx lea edi,clpGrid3D mov ecx,15 rep movsd call CloverEvaluate3D mov ebx,fixture mov eax,[ebx+60] cmp clpTotal3D,eax jne clp_test_fail mov eax,[ebx+64] cmp clpCount3D,eax jne clp_test_fail mov eax,[ebx+68] cmp clpWinMask3D,eax jne clp_test_fail mov eax,[ebx+72] cmp clpJackpot3D,eax jne clp_test_fail xor esi,esi xor edi,edi clp_test_combo_sum: cmp esi,clpCount3D jae @F add edi,clpMults3D[esi*4] mov eax,clpMasks3D[esi*4] test eax,eax jz clp_test_fail and eax,clpWinMask3D cmp eax,clpMasks3D[esi*4] jne clp_test_fail inc esi jmp clp_test_combo_sum @@: cmp edi,clpTotal3D jne clp_test_fail add ebx,76 dec iterations jnz clp_test_fixture mov clpGrid3D,7 call CloverEvaluate3D cmp clpTotal3D,0 jne clp_test_fail cmp clpCount3D,0 jne clp_test_fail mov clpGrid3D,0 mov clpTestStage3D,3 mov clpBet3D,50 mov bankroll,49 mov clpState3D,SLOT_READY mov eax,rngSeed3D mov rngSnapshot,eax call StartNativeClover3D cmp bankroll,49 jne clp_test_fail mov eax,rngSnapshot cmp rngSeed3D,eax jne clp_test_fail mov iterations,500 clp_test_round: call ClearKeys3D mov engineMode,MODE_CLOVER mov clpState3D,SLOT_READY mov clpBet3D,100 mov bankroll,100000 call StartNativeClover3D cmp bankroll,99900 jne clp_test_fail cmp clpState3D,SLOT_SPIN jne clp_test_fail mov eax,rngSeed3D mov rngSnapshot,eax call CloverEvaluate3D mov eax,clpTotal3D imul eax,100 add eax,99900 mov expected,eax mov clpCount3D,0 mov clpTotal3D,0 call StartNativeClover3D cmp bankroll,99900 jne clp_test_fail mov eax,iterations and eax,3 mov eax,slotsTestRates[eax*4] mov deltaTime3D,eax mov ticks,0 ; Queue exit for half the rounds, without cancelling or repaying. test iterations,1 jz @F call CardTableEscape3D @@: clp_test_round_tick: mov pressedKeys3D[57h],1 mov pressedKeys3D[20h],1 call HandleNativeClover3D call ClearKeys3D cmp clpBet3D,100 jne clp_test_fail mov eax,rngSnapshot cmp rngSeed3D,eax jne clp_test_fail inc ticks cmp ticks,220 ja clp_test_fail cmp clpState3D,SLOT_SPIN je clp_test_round_tick mov eax,expected cmp bankroll,eax jne clp_test_fail call SettleNativeClover3D mov eax,expected cmp bankroll,eax jne clp_test_fail test iterations,1 jz @F cmp engineMode,MODE_WALK jne clp_test_fail @@: xor esi,esi clp_test_final_column: mov ebx,esi shl ebx,8 mov ecx,clpSteps3D[esi*4] lea ebx,clpTape3D[ebx+ecx*4] xor edi,edi clp_test_final_row: mov ecx,edi imul ecx,5 add ecx,esi mov eax,[ebx+edi*4] cmp eax,clpGrid3D[ecx*4] jne clp_test_fail inc edi cmp edi,3 jb clp_test_final_row inc esi cmp esi,5 jb clp_test_final_column dec iterations jnz clp_test_round mov clpTestStage3D,4 mov clpState3D,SLOT_SPIN xor esi,esi clp_test_monotonic_column: mov clpTimer3D,0 mov previous,0 clp_test_monotonic_tick: invoke CloverReelPosition3D,esi cmp eax,previous jb clp_test_fail mov previous,eax inc clpTimer3D cmp clpTimer3D,3400 jbe clp_test_monotonic_tick mov eax,clpSteps3D[esi*4] imul eax,CLP_CELL cmp eax,previous jne clp_test_fail inc esi cmp esi,5 jb clp_test_monotonic_column mov clpTestStage3D,5 mov clpState3D,SLOT_READY mov bankroll,100000 call StartNativeClover3D mov clpTimer3D,900 mov eax,rngSeed3D mov rngSnapshot,eax call RenderNativeClover3D mov eax,rngSnapshot cmp rngSeed3D,eax jne clp_test_fail cmp bankroll,99900 jne clp_test_fail invoke WriteActionSnapshot3D,OFFSET clpTestSpin mov clpTimer3D,2200 call RenderNativeClover3D invoke WriteActionSnapshot3D,OFFSET clpTestStopped ; Force an all-seven jackpot and inspect distinct paid masks. lea edi,clpGrid3D mov eax,6 mov ecx,15 rep stosd mov clpLeave3D,0 mov engineMode,MODE_CLOVER call SettleNativeClover3D cmp clpJackpot3D,1 jne clp_test_fail cmp clpCount3D,2 jb clp_test_fail call RenderNativeClover3D invoke WriteActionSnapshot3D,OFFSET clpTestWin mov pressedKeys3D[27h],1 call HandleNativeClover3D cmp clpSelected3D,1 jne clp_test_fail call RenderNativeClover3D invoke WriteActionSnapshot3D,OFFSET clpTestNext mov clpPaytable3D,1 call RenderNativeClover3D invoke WriteActionSnapshot3D,OFFSET clpTestPay call CardTableEscape3D cmp engineMode,MODE_CLOVER jne clp_test_fail cmp clpPaytable3D,0 jne clp_test_fail call CardTableEscape3D cmp engineMode,MODE_WALK jne clp_test_fail mov clpTestStage3D,6 mov clpState3D,SLOT_SPIN mov clpStake3D,10000 mov bankroll,999999999 call SettleNativeClover3D cmp bankroll,1000000000 jne clp_test_fail cmp clpGross3D,1 jne clp_test_fail call SettleNativeClover3D cmp bankroll,1000000000 jne clp_test_fail mov eax,oldBank mov bankroll,eax mov eax,oldMode mov engineMode,eax mov eax,oldSeed mov rngSeed3D,eax call ClearKeys3D call FreeNativeClover3D xor eax,eax ret clp_test_fail: mov eax,clpTestStage3D add eax,860 ret RunCloverTest3D ENDP