; Native render-only probe. Links the action-tested game object, not a renderer ; reimplementation. It never loads or writes the player's profile. .386 .model flat option casemap:none ExitProcess PROTO STDCALL :DWORD wsprintfA PROTO C :DWORD,:DWORD,:VARARG InitPaths3D PROTO STDCALL BeginScratch3D PROTO STDCALL BuyScratch3D PROTO STDCALL HandleScratch3D PROTO STDCALL RenderScratch3D PROTO STDCALL LoadAnimPack3D PROTO STDCALL :DWORD,:DWORD FreeAnimPack3D PROTO STDCALL :DWORD WriteActionSnapshot3D PROTO STDCALL :DWORD LoadTextures3D PROTO STDCALL LoadArrivalAssets3D PROTO STDCALL InitializeCasinoSprites3D PROTO STDCALL InitHall3D PROTO STDCALL LoadHallAssets3D PROTO STDCALL UpdateCamera3D PROTO STDCALL RenderCeilingAndFloor PROTO STDCALL RenderWalls PROTO STDCALL PrepareCityDepth3D PROTO STDCALL RenderSprites PROTO STDCALL RenderHall3D PROTO STDCALL CheckHallInteractions3D PROTO STDCALL TriggerHallInteraction3D PROTO STDCALL LeaveScratch3D PROTO STDCALL ScratchCanWalk3D PROTO STDCALL :DWORD,:DWORD ScratchSelectType3D PROTO STDCALL :DWORD ScratchToggleZoom3D PROTO STDCALL SettleScratchOnQuit3D PROTO STDCALL EXTERN bankroll:DWORD,rngSeed3D:DWORD,engineMode:DWORD EXTERN scrState3D:DWORD,scrPriceIndex3D:DWORD,scrHeld3D:DWORD EXTERN scrPointerValid3D:DWORD,scrPointerX3D:DWORD,scrPointerY3D:DWORD EXTERN animationClock3D:DWORD,deltaTime3D:DWORD EXTERN scrTableArt3D:DWORD EXTERN playerX:DWORD,playerY:DWORD,playerAngle:DWORD EXTERN interactTargetId:DWORD EXTERN scrType3D:DWORD,scrZoom3D:DWORD,scrCounts3D:DWORD,scrCatalog3D:DWORD EXTERN scrDealMs3D:DWORD .data scratchProbeCounter db "build\actions\scratch-counter.bmp",0 scratchProbePointer db "build\actions\scratch-pointer.bmp",0 scratchProbeFormat db "build\actions\scratch-stroke-%02u.bmp",0 scratchProbePath db 128 dup(0) scratchProbeTable db "assets\animations\scratch\table-v1.bin",0 scratchPortraitProbeFormat db "build\actions\scratch-portrait-%u-%02u.bmp",0 scratchPortraitProbeKind dd 4 scratchPortraitProbeCount dd 0 .code ScratchPortraitProbe PROC scratch_portrait_probe_kind: call SettleScratchOnQuit3D mov scrState3D,0 invoke ScratchSelectType3D,scratchPortraitProbeKind mov bankroll,10000 call BuyScratch3D mov scrDealMs3D,0 mov scrPointerValid3D,1 xor esi,esi scratch_portrait_probe_frame: mov eax,esi xor edx,edx mov ecx,13 div ecx imul eax,12 add eax,188 mov scrPointerY3D,eax test esi,1 jz @F ; Slightly offset successive strokes, not a pasted reveal animation. inc scrPointerY3D @@: imul edx,20 add edx,220 mov scrPointerX3D,edx mov scrHeld3D,1 imul eax,esi,33 mov animationClock3D,eax call HandleScratch3D call RenderScratch3D invoke wsprintfA,OFFSET scratchProbePath,OFFSET scratchPortraitProbeFormat,scratchPortraitProbeKind,esi invoke WriteActionSnapshot3D,OFFSET scratchProbePath cmp eax,1 jne scratch_portrait_probe_fail inc esi cmp esi,26 jb scratch_portrait_probe_frame xor esi,esi xor ebx,ebx scratch_portrait_probe_sum: add ebx,scrCounts3D[esi*4] inc esi cmp esi,24 jb scratch_portrait_probe_sum test ebx,ebx jz scratch_portrait_probe_fail mov scratchPortraitProbeCount,ebx call ScratchToggleZoom3D call RenderScratch3D call ScratchToggleZoom3D xor esi,esi xor ebx,ebx scratch_portrait_probe_compare: add ebx,scrCounts3D[esi*4] inc esi cmp esi,24 jb scratch_portrait_probe_compare cmp ebx,scratchPortraitProbeCount jne scratch_portrait_probe_fail inc scratchPortraitProbeKind cmp scratchPortraitProbeKind,7 jb scratch_portrait_probe_kind call SettleScratchOnQuit3D mov scrState3D,0 mov scrCatalog3D,0 mov bankroll,9950 mov eax,1 ret scratch_portrait_probe_fail: xor eax,eax ret ScratchPortraitProbe ENDP PUBLIC _ScratchProbeStart _ScratchProbeStart: call InitPaths3D mov bankroll,10000 mov rngSeed3D,47 mov scrState3D,0 mov scrPriceIndex3D,0 call BeginScratch3D invoke FreeAnimPack3D,OFFSET scrTableArt3D invoke LoadAnimPack3D,OFFSET scrTableArt3D,OFFSET scratchProbeTable call BuyScratch3D mov scrDealMs3D,0 mov scrHeld3D,1 mov scrPointerValid3D,1 mov deltaTime3D,33 xor esi,esi scratch_probe_frame: mov eax,esi xor edx,edx mov ecx,12 div ecx mov ebx,eax imul eax,15 add eax,183 mov scrPointerY3D,eax imul edx,28 test ebx,1 jz @F mov eax,308 sub eax,edx mov edx,eax @@: add edx,164 mov scrPointerX3D,edx imul eax,esi,33 mov animationClock3D,eax call HandleScratch3D call RenderScratch3D invoke wsprintfA,OFFSET scratchProbePath,OFFSET scratchProbeFormat,esi invoke WriteActionSnapshot3D,OFFSET scratchProbePath cmp eax,1 jne scratch_probe_fail inc esi cmp esi,36 jb scratch_probe_frame invoke WriteActionSnapshot3D,OFFSET scratchProbePointer call ScratchPortraitProbe cmp eax,1 jne scratch_probe_fail call LoadTextures3D call LoadArrivalAssets3D call InitializeCasinoSprites3D call InitHall3D call LoadHallAssets3D mov engineMode,0 mov playerX,29*65536 mov playerY,5*65536+32768 mov playerAngle,128 call UpdateCamera3D call RenderCeilingAndFloor call RenderWalls call PrepareCityDepth3D call RenderSprites call RenderHall3D invoke WriteActionSnapshot3D,OFFSET scratchProbeCounter cmp eax,1 jne scratch_probe_fail invoke ScratchCanWalk3D,29*65536,7*65536+32768 test eax,eax jnz scratch_probe_fail invoke ScratchCanWalk3D,20*65536,27*65536 cmp eax,1 jne scratch_probe_fail mov playerY,6*65536 call UpdateCamera3D mov interactTargetId,0 call CheckHallInteractions3D cmp interactTargetId,25 jne scratch_probe_fail call TriggerHallInteraction3D cmp eax,1 jne scratch_probe_fail cmp engineMode,22 jne scratch_probe_fail call LeaveScratch3D cmp engineMode,0 jne scratch_probe_fail cmp bankroll,9950 jne scratch_probe_fail invoke ExitProcess,0 scratch_probe_fail: invoke ExitProcess,145 end _ScratchProbeStart