; Native room, automatic lane simulation and full-body visitors; no AI service. InitBowling3D PROC uses esi edi mov bwClock3D,-1 mov bwMonitorClock3D,-1 mov bwSeat3D,0 xor esi,esi bw_init_lane: 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 call RefreshBowlingMonitors3D bw_load_done: ret LoadBowling3D ENDP FreeBowling3D PROC invoke FreeAnimPack3D,OFFSET bwArt3D invoke FreeAnimPack3D,OFFSET bwMotionArt3D invoke FreeAnimPack3D,OFFSET bwSeatedArt3D ret FreeBowling3D ENDP ResolveBowlingSurface3D PROC material:DWORD mov eax,material 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: 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: 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_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