; 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