KAZIK/src_graphics/billiards_prediction.inc
Игорь Федосеев ca62db53e9 feat: implement native billiards, scratch tickets, first-person dice, and city wake scene
- Billiards: add native Russian Pyramid & American Eight-Ball pool with physics prediction, controls, and regression tests
- Scratch Tickets: add dedicated counter, mat presentation, elliptical coin scraping, 4 ticket types, and payout effects
- First-Person Dice: add native dice scene, hand anchor frames, throwing animation, and table perspective
- City Wake & Weather: add arrival cutscene, alley geometry, weather/rain effects, and lighter/rocker animation
- World Dressing: add hall paintings, furniture packs, hall lighting, and scene regression tests
- Build & Tooling: update build.bat for modern MSVC toolchain, update launcher hash, and refresh shipping binaries
2026-10-16 12:37:40 +03:00

239 lines
5.2 KiB
PHP

; 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