- 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
239 lines
5.2 KiB
PHP
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
|