- 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
149 lines
3.1 KiB
PHP
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
|