; Prediction runs the shipping fixed-step integrator, without settlement or IO. ; Every field touched by PoolStep3D is saved/restored before returning. PoolPredict3D PROC uses ebx esi edi local steps:DWORD,hash:DWORD cmp poolState3D,POOL_AIM jne predict_done call PyramidDirection3D mov eax,2166136261 lea esi,poolX3D mov ecx,112 predict_hash: xor eax,[esi] imul eax,16777619 add esi,4 loop predict_hash xor eax,pyrCue3D imul eax,16777619 xor eax,poolPower3D imul eax,16777619 xor eax,pyrDirX3D imul eax,16777619 xor eax,pyrDirY3D xor eax,poolVariant3D mov hash,eax cmp poolTraceValid3D,0 je predict_refresh cmp eax,poolTraceKey3D je predict_done predict_refresh: lea esi,poolX3D lea edi,poolPhysicsBackup3D mov ecx,112 rep movsd lea esi,pyrRoll3D lea edi,poolHistoryBackup3D mov ecx,80 rep movsd mov eax,poolFirst3D mov poolScalarBackup3D,eax mov eax,poolRail3D mov poolScalarBackup3D[4],eax mov eax,poolBreakRails3D mov poolScalarBackup3D[8],eax mov eax,poolPotted3D mov poolScalarBackup3D[12],eax mov eax,poolStill3D mov poolScalarBackup3D[16],eax mov eax,pyrValidEnd3D mov poolScalarBackup3D[20],eax mov eax,pyrRailSide3D mov poolScalarBackup3D[24],eax lea edi,poolVX3D xor eax,eax mov ecx,32 rep stosd lea edi,pyrHistoryRails3D mov ecx,48 rep stosd mov poolFirst3D,-1 mov poolRail3D,0 mov poolBreakRails3D,0 mov poolPotted3D,0 mov pyrValidEnd3D,0 mov ebx,pyrCue3D mov eax,pyrDirX3D imul poolPower3D shrd eax,edx,16 mov poolVX3D[ebx*4],eax mov eax,pyrDirY3D imul poolPower3D shrd eax,edx,16 mov poolVY3D[ebx*4],eax mov poolTraceCount3D,0 mov steps,0 predict_sample: mov edi,poolTraceCount3D shl edi,6 xor esi,esi xor ebx,ebx predict_sample_ball: mov eax,poolX3D[esi*4] mov poolTraceX3D[edi],eax mov eax,poolY3D[esi*4] mov poolTraceY3D[edi],eax cmp poolActive3D[esi*4],0 je @F bts ebx,esi @@: add edi,4 inc esi cmp esi,16 jb predict_sample_ball mov ecx,poolTraceCount3D mov poolTraceActive3D[ecx*4],ebx inc poolTraceCount3D cmp steps,0 je predict_step cmp poolStill3D,1 je predict_restore cmp steps,6000 jae predict_restore predict_step: call PoolStep3D inc steps cmp poolStill3D,1 je predict_sample test steps,15 jz predict_sample jmp predict_step predict_restore: mov eax,steps mov poolTraceSteps3D,eax mov eax,poolFirst3D mov poolTraceFirst3D,eax mov pyrTarget3D,eax mov eax,poolPotted3D mov poolTracePotted3D,eax lea esi,poolX3D lea edi,poolTraceFinal3D mov ecx,112 rep movsd lea esi,poolPhysicsBackup3D lea edi,poolX3D mov ecx,112 rep movsd lea esi,poolHistoryBackup3D lea edi,pyrRoll3D mov ecx,80 rep movsd mov eax,poolScalarBackup3D mov poolFirst3D,eax mov eax,poolScalarBackup3D[4] mov poolRail3D,eax mov eax,poolScalarBackup3D[8] mov poolBreakRails3D,eax mov eax,poolScalarBackup3D[12] mov poolPotted3D,eax mov eax,poolScalarBackup3D[16] mov poolStill3D,eax mov eax,poolScalarBackup3D[20] mov pyrValidEnd3D,eax mov eax,poolScalarBackup3D[24] mov pyrRailSide3D,eax mov eax,hash mov poolTraceKey3D,eax mov poolTraceValid3D,1 predict_done: ret PoolPredict3D ENDP PoolTraceLine3D PROC uses ebx esi edi x1:DWORD,y1:DWORD,x2:DWORD,y2:DWORD,tint:DWORD local deltaX:DWORD,deltaY:DWORD,extent:DWORD mov eax,x2 sub eax,x1 mov deltaX,eax test eax,eax jns @F neg eax @@: mov extent,eax mov eax,y2 sub eax,y1 mov deltaY,eax test eax,eax jns @F neg eax @@: cmp eax,extent jbe @F mov extent,eax @@: cmp extent,0 je trace_line_done xor esi,esi trace_line_pixel: mov eax,deltaX imul esi idiv extent add eax,x1 mov ebx,eax mov eax,deltaY imul esi idiv extent add eax,y1 invoke DrawPixel,ebx,eax,tint add esi,2 cmp esi,extent jbe trace_line_pixel trace_line_done: ret PoolTraceLine3D ENDP PoolDrawPrediction3D PROC uses ebx esi edi local sx:DWORD,sy:DWORD,ex:DWORD,ey:DWORD,tint:DWORD call PoolPredict3D xor ebx,ebx trace_draw_ball: cmp ebx,pyrCue3D je trace_draw_selected cmp ebx,poolTraceFirst3D jne trace_draw_next trace_draw_selected: mov tint,008DB5A9h cmp ebx,pyrCue3D jne @F mov tint,00E8EBD5h @@: mov esi,1 trace_draw_segment: cmp esi,poolTraceCount3D jae trace_draw_next mov edi,esi dec edi mov eax,poolTraceActive3D[edi*4] bt eax,ebx jnc trace_draw_next shl edi,4 add edi,ebx mov eax,poolTraceX3D[edi*4] sar eax,16 mov sx,eax mov eax,poolTraceY3D[edi*4] sar eax,16 mov sy,eax mov eax,poolTraceX3D[edi*4+64] sar eax,16 mov ex,eax mov eax,poolTraceY3D[edi*4+64] sar eax,16 mov ey,eax invoke PoolTraceLine3D,sx,sy,ex,ey,tint inc esi jmp trace_draw_segment trace_draw_next: inc ebx cmp ebx,16 jb trace_draw_ball ret PoolDrawPrediction3D ENDP