- 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
352 lines
7.6 KiB
PHP
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
|