KAZIK/src_graphics/bowling_deck.inc
Artvasil09 7e081beeca feat: enhance bowling physics, audio, ball weight selection, and visitor cast routines
- Bowling feel: impulse contact solver, string pinsetter cycle, in-world lengthwise return rack and visible ball return lift

- Ball weights: 4/5/6/7 kg selection with equal launch work physics, momentum balance, and projected picking

- Audio: dedicated MCI channels with 7 synthesized waveaudio cues (release, rolling, impacts, applause, pinsetter, return)

- First-person animations: 33-frame player underarm throw/follow-through sequence (player-underarm-v2)

- Visitors: 10 persistent shared cast identities with exclusive reservations, activity transitions, and chair sit/rise animations

- Tests & verification: comprehensive native regression test suites and updated documentation

- Synchronize binaries and update launcher hash to 536E23BED4055562BC63871826FF44FFED037923A9BE8E0F591131DB4FBD104B
2026-11-04 18:44:12 +03:00

149 lines
3.1 KiB
PHP

; Invisible slack constraints engage only at the end of a pin's free travel.
BowlingPlayTether3D PROC uses ebx esi pin:DWORD
local deltaX:DWORD,deltaY:DWORD,length8:DWORD,nx:DWORD,ny:DWORD,outward:DWORD
mov esi,pin
mov eax,bpPinX3D[esi*4]
sub eax,bwPinX3D[esi*4]
mov deltaX,eax
sar eax,8
imul eax,eax
mov ebx,eax
mov eax,bpPinY3D[esi*4]
sub eax,bwPinY3D[esi*4]
mov deltaY,eax
sar eax,8
imul eax,eax
add eax,ebx
cmp eax,128*128
jbe bp_tether_done
invoke PoolSqrt3D,eax
mov length8,eax
mov eax,deltaX
imul eax,256
cdq
idiv length8
mov nx,eax
mov eax,deltaY
imul eax,256
cdq
idiv length8
mov ny,eax
mov eax,nx
imul eax,128
sar eax,8
add eax,bwPinX3D[esi*4]
mov bpPinX3D[esi*4],eax
mov eax,ny
imul eax,128
sar eax,8
add eax,bwPinY3D[esi*4]
mov bpPinY3D[esi*4],eax
mov eax,bpPinVX3D[esi*4]
imul nx
shrd eax,edx,16
mov ebx,eax
mov eax,bpPinVY3D[esi*4]
imul ny
shrd eax,edx,16
add eax,ebx
test eax,eax
jle bp_tether_done
imul eax,4
cdq
mov ecx,5
idiv ecx
mov outward,eax
imul nx
shrd eax,edx,16
sub bpPinVX3D[esi*4],eax
mov eax,outward
imul ny
shrd eax,edx,16
sub bpPinVY3D[esi*4],eax
bp_tether_done:
ret
BowlingPlayTether3D ENDP
; Bound the complete pin silhouette, including its horizontal neck/head.
BowlingPlayDeckBounds3D PROC uses ebx esi pin:DWORD
local extension:DWORD,lo:DWORD,hi:DWORD
mov esi,pin
mov ecx,bpPinTilt3D[esi*4]
shr ecx,8
mov eax,tableSin[ecx*4]
imul eax,35
cdq
mov ecx,100
idiv ecx
mov extension,eax
imul bpPinAxisX3D[esi*4]
shrd eax,edx,16
mov lo,-FP_1*82/100
mov hi,FP_1*82/100
test eax,eax
js bp_deck_left_extent
sub hi,eax
jmp bp_deck_x
bp_deck_left_extent:
sub lo,eax
bp_deck_x:
mov eax,bpPinX3D[esi*4]
cmp eax,lo
jge bp_deck_right
mov eax,lo
mov bpPinX3D[esi*4],eax
cmp bpPinVX3D[esi*4],0
jge bp_deck_y_extent
jmp bp_deck_bounce_x
bp_deck_right:
cmp eax,hi
jle bp_deck_y_extent
mov eax,hi
mov bpPinX3D[esi*4],eax
cmp bpPinVX3D[esi*4],0
jle bp_deck_y_extent
bp_deck_bounce_x:
mov eax,bpPinVX3D[esi*4]
neg eax
cdq
mov ecx,5
idiv ecx
mov bpPinVX3D[esi*4],eax
bp_deck_y_extent:
mov eax,extension
imul bpPinAxisY3D[esi*4]
shrd eax,edx,16
mov lo,FP_1*308/100
mov hi,FP_1*547/100
test eax,eax
js bp_deck_back_extent
sub hi,eax
jmp bp_deck_y
bp_deck_back_extent:
sub lo,eax
bp_deck_y:
mov eax,bpPinY3D[esi*4]
cmp eax,lo
jge bp_deck_front
mov eax,lo
mov bpPinY3D[esi*4],eax
cmp bpPinVY3D[esi*4],0
jge bp_deck_done
jmp bp_deck_bounce_y
bp_deck_front:
cmp eax,hi
jle bp_deck_done
mov eax,hi
mov bpPinY3D[esi*4],eax
cmp bpPinVY3D[esi*4],0
jle bp_deck_done
bp_deck_bounce_y:
mov eax,bpPinVY3D[esi*4]
neg eax
cdq
mov ecx,5
idiv ecx
mov bpPinVY3D[esi*4],eax
bp_deck_done:
ret
BowlingPlayDeckBounds3D ENDP