.data bwTestEntrance db "build\hall-expansion\bowling-entrance.bmp",0 bwTestOverview db "build\hall-expansion\bowling-overview.bmp",0 bwTestRestaurant db "build\hall-expansion\bowling-restaurant.bmp",0 bwTestLanes db "build\hall-expansion\bowling-lanes.bmp",0 bwTestBar db "build\hall-expansion\bowling-bar.bmp",0 bwTestExit db "build\hall-expansion\bowling-exit.bmp",0 bwTestThrow0 db "build\hall-expansion\bowling-throw-0.bmp",0 bwTestThrow1 db "build\hall-expansion\bowling-throw-1.bmp",0 bwTestThrow2 db "build\hall-expansion\bowling-throw-2.bmp",0 bwTestThrow3 db "build\hall-expansion\bowling-throw-3.bmp",0 bwTestThrowPaths dd OFFSET bwTestThrow0,OFFSET bwTestThrow1,OFFSET bwTestThrow2,OFFSET bwTestThrow3 .code BowlingNativeTests PROC uses ebx esi edi local bank:DWORD mov expansionStage,120 mov eax,bankroll mov bank,eax call InitBowling3D call LoadBowling3D cmp bwArt3D.frames,14 jne bw_test_fail mov expansionStage,131 cmp characterCast3D.frames,CAST_COUNT*CAST_STRIDE jne bw_test_fail mov expansionStage,132 ; Standard ten-frame scoring vectors, including tenth-frame bonuses. lea edi,bwRolls3D mov eax,10 mov ecx,12 rep stosd mov bwRollCount3D,12 invoke BowlingScore3D,0 cmp eax,300 jne bw_test_fail lea edi,bwRolls3D mov eax,5 mov ecx,21 rep stosd mov bwRollCount3D,21 invoke BowlingScore3D,0 cmp eax,150 jne bw_test_fail lea edi,bwRolls3D mov eax,1 mov ecx,20 rep stosd mov bwRollCount3D,20 invoke BowlingScore3D,0 cmp eax,20 jne bw_test_fail call InitBowling3D invoke BowlingRegisterRoll3D,0,5 cmp bwBall3D,1 jne bw_test_fail cmp bwFrames3D,0 jne bw_test_fail invoke BowlingRegisterRoll3D,0,5 cmp bwFrames3D,1 jne bw_test_fail cmp bwFrameDone3D,1 jne bw_test_fail call InitBowling3D mov bwFrames3D,9 invoke BowlingRegisterRoll3D,0,10 cmp bwBall3D,1 jne bw_test_fail invoke BowlingRegisterRoll3D,0,10 cmp bwBall3D,2 jne bw_test_fail invoke BowlingRegisterRoll3D,0,10 cmp bwFrames3D,10 jne bw_test_fail mov expansionStage,121 call InitBowling3D mov hallLevel3D,0 mov engineMode,MODE_WALK mov worldMap3D,OFFSET casinoMap mov playerX,5*FP_1 mov playerY,5*FP_1 mov playerAngle,384 call UpdateInteriorEye3D mov esi,5*FP_1 bw_test_entrance_walk: invoke CanWalk3D,5*FP_1,esi test eax,eax jz bw_test_fail sub esi,FP_1/10 cmp esi,FP_1*14/10 jae bw_test_entrance_walk call ExpansionFrame invoke ExpansionSnapshot,OFFSET bwTestEntrance cmp portalPixelsWritten3D,1000 jb bw_test_fail mov expansionStage,125 mov playerY,FP_1*14/10 call BowlingTravel3D cmp hallLevel3D,HALL_BOWLING jne bw_test_fail cmp playerX,17*FP_1 jne bw_test_fail cmp playerY,FP_1*304/10 jne bw_test_fail cmp viewCeiling3D,6*FP_1 jne bw_test_fail mov expansionStage,126 invoke CanWalk3D,18*FP_1,25*FP_1 test eax,eax jz bw_test_fail invoke CanWalk3D,8*FP_1,10*FP_1 test eax,eax jnz bw_test_fail invoke CanWalk3D,22*FP_1,12*FP_1 test eax,eax jnz bw_test_fail mov expansionStage,122 mov esi,12000 bw_test_simulate: mov deltaTime3D,50 add animationClock3D,50 call UpdateBowling3D xor edi,edi bw_test_bounds: cmp bwRollCount3D[edi*4],21 ja bw_test_fail cmp bwFrames3D[edi*4],10 ja bw_test_fail cmp bwScores3D[edi*4],300 ja bw_test_fail inc edi cmp edi,16 jb bw_test_bounds dec esi jnz bw_test_simulate mov expansionStage,123 mov playerX,17*FP_1 mov playerY,FP_1*301/10 mov playerAngle,350 call UpdateInteriorEye3D call UpdateCamera3D call RenderBowling3D invoke ExpansionSnapshot,OFFSET bwTestOverview mov playerX,18*FP_1 mov playerY,24*FP_1 mov playerAngle,330 call UpdateCamera3D call RenderBowling3D invoke ExpansionSnapshot,OFFSET bwTestLanes mov playerX,21*FP_1 mov playerY,26*FP_1 mov playerAngle,420 call UpdateCamera3D call RenderBowling3D invoke ExpansionSnapshot,OFFSET bwTestRestaurant mov playerX,23*FP_1 mov playerY,8*FP_1 mov playerAngle,420 call UpdateCamera3D call RenderBowling3D invoke ExpansionSnapshot,OFFSET bwTestBar mov expansionStage,124 mov playerX,6*FP_1 mov playerY,FP_1*277/10 mov playerAngle,350 mov bwState3D,2 xor esi,esi bw_test_throw_frames: imul eax,esi,650 mov bwTime3D,eax call UpdateCamera3D call RenderBowling3D invoke ExpansionSnapshot,bwTestThrowPaths[esi*4] inc esi cmp esi,4 jb bw_test_throw_frames mov bwSeatTarget3D,0 mov interactTargetId,INTERACT_BOWL_SEAT call TryBowlingInteraction3D cmp bwSeat3D,1 jne bw_test_fail cmp viewEye3D,FP_1*12/10 jne bw_test_fail mov interactTargetId,INTERACT_BOWL_SEAT call TryBowlingInteraction3D cmp bwSeat3D,0 jne bw_test_fail cmp playerX,6*FP_1 jne bw_test_fail mov expansionStage,127 mov edi,4 bw_test_bar_visits: mov engineMode,MODE_BAR mov barPhase3D,0 invoke BuyBarDrink3D,2 call RenderBar3D cmp playerX,6*FP_1 jne bw_test_fail cmp playerY,FP_1*277/10 jne bw_test_fail cmp playerAngle,350 jne bw_test_fail mov deltaTime3D,3000 call HandleBar3D call RenderBar3D mov deltaTime3D,2400 call HandleBar3D mov engineMode,MODE_WALK call UpdateInteriorEye3D cmp viewEye3D,HALL_STANDING_EYE jne bw_test_fail cmp viewCeiling3D,6*FP_1 jne bw_test_fail dec edi jnz bw_test_bar_visits mov expansionStage,124 mov playerX,17*FP_1 mov playerY,29*FP_1 mov playerAngle,128 call UpdateCamera3D call RenderBowling3D invoke ExpansionSnapshot,OFFSET bwTestExit mov playerY,FP_1*306/10 call BowlingTravel3D cmp hallLevel3D,0 jne bw_test_fail cmp playerX,5*FP_1 jne bw_test_fail cmp playerY,FP_1*16/10 jne bw_test_fail mov eax,bankroll cmp eax,bank jne bw_test_fail mov engineMode,MODE_WALK call ClearKeys3D call CharacterCastNativeTests ret bw_test_fail: invoke ExitProcess,expansionStage ret BowlingNativeTests ENDP