KAZIK/src_graphics/bowling.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

352 lines
7.6 KiB
PHP

; Native room, automatic lane simulation and full-body visitors; no AI service.
InitBowling3D PROC uses esi edi
mov bpActive3D,0
mov bpWeightKg3D,6
mov bpBotWeightKg3D,6
call InitBowlingBallSurface3D
call InitBowlingSetterSurface3D
mov bwClock3D,-1
mov bwMonitorClock3D,-1
mov bwSeat3D,0
xor esi,esi
bw_init_lane:
mov bwBusy3D[esi*4],0
cmp esi,0
je bw_init_busy
cmp esi,3
je bw_init_busy
cmp esi,6
jne bw_init_state
bw_init_busy:
mov bwBusy3D[esi*4],1
bw_init_state:
mov bwState3D[esi*4],0
imul eax,esi,349
mov bwTime3D[esi*4],eax
mov bwTurn3D[esi*4],0
mov bwBall3D[esi*4],0
mov bwRack3D[esi*4],1023
mov bwHit3D[esi*4],0
mov bwNewRack3D[esi*4],0
mov bwFrameDone3D[esi*4],0
inc esi
cmp esi,BW_LANES
jb bw_init_lane
lea edi,bwFrames3D
xor eax,eax
mov ecx,16
rep stosd
lea edi,bwRollCount3D
mov ecx,16
rep stosd
lea edi,bwScores3D
mov ecx,16
rep stosd
ret
InitBowling3D ENDP
LoadBowling3D PROC
cmp bwArt3D.pixels,0
jne bw_load_done
invoke LoadAnimPack3D,OFFSET bwArt3D,OFFSET bwArtPath3D
invoke ValidateCityPack3D,OFFSET bwArt3D,256,256,14
call LoadCharacterCast3D
invoke LoadAnimPack3D,OFFSET bpHandArt3D,OFFSET bpHandPath3D
invoke ValidateCityPack3D,OFFSET bpHandArt3D,256,256,33
mov bpRackHandFrame3D,-1
mov bpRackHandKg3D,-1
call RefreshBowlingMonitors3D
bw_load_done:
ret
LoadBowling3D ENDP
FreeBowling3D PROC
call BowlingAudioClose3D
invoke FreeAnimPack3D,OFFSET bpHandArt3D
invoke FreeAnimPack3D,OFFSET bwArt3D
invoke FreeAnimPack3D,OFFSET bwMotionArt3D
invoke FreeAnimPack3D,OFFSET bwSeatedArt3D
ret
FreeBowling3D ENDP
ResolveBowlingSurface3D PROC material:DWORD
mov eax,material
cmp eax,255
jb bw_material_base
cmp eax,257
ja bw_material_missing
sub eax,254
shl eax,14
add eax,OFFSET bpBallSurface3D
mov ecx,64
mov edx,64
ret
bw_material_base:
cmp eax,254
jne @F
mov eax,OFFSET bpSetterSurface3D
mov ecx,64
mov edx,64
ret
@@:
cmp eax,253
jne @F
mov eax,OFFSET bpBallSurface3D
mov ecx,64
mov edx,64
ret
@@:
cmp eax,252
jne @F
mov eax,OFFSET bwSignPixels3D
mov ecx,128
mov edx,16
ret
@@:
cmp eax,244
jb bw_material_atlas
sub eax,244
cmp eax,7
ja bw_material_missing
shl eax,15
add eax,OFFSET bwMonitors3D
mov ecx,128
mov edx,64
ret
bw_material_atlas:
sub eax,BW_MATERIAL
cmp eax,13
ja bw_material_missing
cmp bwArt3D.pixels,0
je bw_material_missing
shl eax,18
add eax,bwArt3D.pixels
mov ecx,256
mov edx,256
ret
bw_material_missing:
xor eax,eax
ret
ResolveBowlingSurface3D ENDP
BowlingTravel3D PROC
cmp engineMode,MODE_WALK
jne bw_travel_done
cmp hallLevel3D,HALL_BOWLING
je bw_travel_out
cmp hallLevel3D,0
jne bw_travel_done
cmp playerX,3*FP_1
jb bw_travel_done
cmp playerX,7*FP_1
ja bw_travel_done
cmp playerY,FP_1*15/10
jae bw_travel_done
add playerX,12*FP_1
add playerY,29*FP_1
mov hallLevel3D,HALL_BOWLING
mov worldMap3D,OFFSET bwMap3D
mov floorTexture3D,231
call LoadBowling3D
call BowlingEye3D
ret
bw_travel_out:
cmp playerY,FP_1*305/10
jbe bw_travel_done
cmp playerX,15*FP_1
jb bw_travel_done
cmp playerX,19*FP_1
ja bw_travel_done
sub playerX,12*FP_1
sub playerY,29*FP_1
mov hallLevel3D,0
mov worldMap3D,OFFSET casinoMap
mov floorTexture3D,100
mov bwSeat3D,0
mov viewCeiling3D,FP_1*5/2
mov viewEye3D,HALL_STANDING_EYE
bw_travel_done:
ret
BowlingTravel3D ENDP
BowlingEye3D PROC
mov viewHorizon3D,HALF_H
mov viewCeiling3D,6*FP_1
mov viewEye3D,HALL_STANDING_EYE
cmp bwSeat3D,0
je @F
mov viewEye3D,FP_1*12/10
@@:
ret
BowlingEye3D ENDP
BowlingCanWalk3D PROC uses esi edi px:DWORD,py:DWORD
cmp bwSeat3D,0
jne bw_walk_block
cmp px,FP_1*12/10
jb bw_walk_block
cmp px,FP_1*308/10
ja bw_walk_block
cmp py,FP_1*12/10
jb bw_walk_block
cmp py,FP_1*308/10
ja bw_walk_block
cmp px,19*FP_1
jae bw_walk_furniture
cmp px,2*FP_1
jb bw_walk_furniture
cmp px,FP_1*173/10
ja bw_walk_furniture
cmp py,FP_1*223/10
jb bw_walk_block
bw_walk_furniture:
cmp py,FP_1*252/10
jb bw_walk_existing_props
cmp py,FP_1*266/10
ja bw_walk_existing_props
xor esi,esi
bw_walk_return_tray:
imul eax,esi,FP_1*38/10
add eax,FP_1*395/100
sub eax,px
mov edi,eax
cdq
xor eax,edx
sub eax,edx
cmp py,26*FP_1
jb @F
cmp eax,FP_1*4/10
jbe bw_walk_block
@@:
; The adjacent storage rails keep the automatic return path clear.
mov eax,edi
neg eax
cmp eax,FP_1*25/100
jl @F
cmp eax,FP_1*85/100
jle bw_walk_block
@@:
inc esi
cmp esi,4
jb bw_walk_return_tray
bw_walk_existing_props:
lea esi,bwCollision3D
mov edi,BOWL_COLLISION_COUNT
bw_walk_prop:
mov eax,px
cmp eax,[esi]
jb bw_walk_next
cmp eax,[esi+4]
ja bw_walk_next
mov eax,py
cmp eax,[esi+8]
jb bw_walk_next
cmp eax,[esi+12]
jbe bw_walk_block
bw_walk_next:
add esi,16
dec edi
jnz bw_walk_prop
mov eax,1
ret
bw_walk_block:
xor eax,eax
ret
BowlingCanWalk3D ENDP
CheckBowlingInteractions3D PROC uses esi edi
cmp bwSeat3D,0
je bw_check_seats
mov interactTargetId,INTERACT_BOWL_SEAT
mov interactPromptPtr,OFFSET bwStandPrompt3D
ret
bw_check_seats:
xor edi,edi
bw_check_play:
cmp bwBusy3D[edi*4],0
jne bw_check_play_next
imul eax,edi,BW_LANE_STEP
add eax,3*FP_1
mov interactTargetId,0
invoke HallTarget3D,eax,FP_1*237/10,INTERACT_BOWL_PLAY,OFFSET bpPlayPrompt
cmp interactTargetId,INTERACT_BOWL_PLAY
jne bw_check_play_next
mov bpTarget3D,edi
ret
bw_check_play_next:
inc edi
cmp edi,BW_LANES
jb bw_check_play
lea esi,bwSeats3D
xor edi,edi
bw_check_seat:
cmp edi,4
jb bw_check_available_seat
cmp edi,9
jne bw_check_next_seat
bw_check_available_seat:
mov interactTargetId,0
invoke HallTarget3D,[esi],[esi+4],INTERACT_BOWL_SEAT,OFFSET bwSeatPrompt3D
cmp interactTargetId,INTERACT_BOWL_SEAT
jne @F
mov bwSeatTarget3D,edi
ret
@@:
bw_check_next_seat:
add esi,12
inc edi
cmp edi,BOWL_SEAT_COUNT
jb bw_check_seat
invoke HallTarget3D,27*FP_1,FP_1*59/10,INTERACT_BAR,OFFSET bwBarName3D
ret
CheckBowlingInteractions3D ENDP
TryBowlingInteraction3D PROC uses esi
cmp hallLevel3D,HALL_BOWLING
jne bw_try_none
cmp interactTargetId,INTERACT_BOWL_PLAY
jne @F
invoke BeginBowlingPlay3D,bpTarget3D
ret
@@:
cmp interactTargetId,INTERACT_BOWL_SEAT
jne bw_try_none
cmp bwSeat3D,0
jne bw_try_stand
mov eax,playerX
mov bwReturnX3D,eax
mov eax,playerY
mov bwReturnY3D,eax
mov eax,playerAngle
mov bwReturnAngle3D,eax
mov esi,bwSeatTarget3D
imul esi,12
mov eax,bwSeats3D[esi]
mov playerX,eax
mov eax,bwSeats3D[esi+4]
mov playerY,eax
mov eax,bwSeats3D[esi+8]
mov playerAngle,eax
mov bwSeat3D,1
jmp bw_try_handled
bw_try_stand:
mov eax,bwReturnX3D
mov playerX,eax
mov eax,bwReturnY3D
mov playerY,eax
mov eax,bwReturnAngle3D
mov playerAngle,eax
mov bwSeat3D,0
bw_try_handled:
call BowlingEye3D
call ClearKeys3D
mov eax,1
ret
bw_try_none:
xor eax,eax
ret
TryBowlingInteraction3D ENDP
include src_graphics\bowling_simulation.inc
include src_graphics\bowling_render.inc
include src_graphics\bowling_play.inc