; 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