.data barTestMain db "build\hall-expansion\bar-camera-main.bmp",0 barTestUpper db "build\hall-expansion\bar-camera-upper.bmp",0 .code BarCameraAssert PROC cmp viewHorizon3D,HALF_H jne bar_camera_assert_fail cmp viewEye3D,HALL_STANDING_EYE jne bar_camera_assert_fail cmp playerX,12*FP_1 jne bar_camera_assert_fail cmp playerY,14*FP_1 jne bar_camera_assert_fail cmp playerAngle,384 jne bar_camera_assert_fail ret bar_camera_assert_fail: invoke ExitProcess,expansionStage ret BarCameraAssert ENDP BarCameraNativeTests PROC uses ebx esi edi local expectedBank:DWORD, oldArrival:DWORD ; Exercise real purchases without writing the player's profile. mov eax,arrivalConfirmed3D mov oldArrival,eax mov arrivalConfirmed3D,0 mov expansionStage,70 mov engineMode,MODE_WALK mov hallLevel3D,0 mov worldMap3D,OFFSET casinoMap mov playerX,12*FP_1 mov playerY,14*FP_1 mov playerAngle,384 mov viewHorizon3D,-300 mov viewEye3D,-FP_1 mov deltaTime3D,16 call UpdateHall3D call BarCameraAssert xor ebx,ebx bar_camera_level: mov hallLevel3D,ebx mov worldMap3D,OFFSET casinoMap test ebx,ebx jz @F mov worldMap3D,OFFSET upperLoungeMap3D @@: mov bankroll,10000 mov expectedBank,10000 mov esi,12 bar_camera_visit: mov expansionStage,71 mov interactTargetId,INTERACT_BAR call TriggerHallInteraction3D cmp engineMode,MODE_BAR jne bar_camera_fail xor edi,edi bar_camera_drink: mov eax,barPrice3D[edi*4] sub expectedBank,eax invoke BuyBarDrink3D,edi mov eax,expectedBank cmp bankroll,eax jne bar_camera_fail cmp barPhase3D,1 jne bar_camera_fail cmp barTime3D,0 jne bar_camera_fail ; A second click while serving must not buy another drink. invoke BuyBarDrink3D,edi mov eax,expectedBank cmp bankroll,eax jne bar_camera_fail mov deltaTime3D,2999 call HandleBar3D cmp barPhase3D,1 jne bar_camera_fail mov deltaTime3D,1 call HandleBar3D cmp barPhase3D,2 jne bar_camera_fail cmp barTime3D,0 jne bar_camera_fail mov deltaTime3D,2399 call HandleBar3D cmp barPhase3D,2 jne bar_camera_fail ; Render every drink in each bar once, checking camera restoration. cmp esi,12 jne @F call RenderBar3D call BarCameraAssert cmp engineMode,MODE_BAR jne bar_camera_fail @@: mov deltaTime3D,1 call HandleBar3D cmp barPhase3D,0 jne bar_camera_fail cmp barTime3D,0 jne bar_camera_fail call BarCameraAssert inc edi cmp edi,3 jb bar_camera_drink ; Same return-to-walking state as the menu exit, then real hall updates. mov engineMode,MODE_WALK mov deltaTime3D,16 mov edi,256 bar_camera_walk: add animationClock3D,16 call UpdateHall3D call UpdateInteriorEye3D call BarCameraAssert cmp engineMode,MODE_WALK jne bar_camera_fail dec edi jnz bar_camera_walk dec esi jnz bar_camera_visit mov expansionStage,72 mov eax,expectedBank cmp bankroll,eax jne bar_camera_fail call ExpansionFrame test ebx,ebx jnz bar_camera_upper_snapshot invoke ExpansionSnapshot,OFFSET barTestMain mov ebx,2 jmp bar_camera_level bar_camera_upper_snapshot: invoke ExpansionSnapshot,OFFSET barTestUpper mov eax,oldArrival mov arrivalConfirmed3D,eax ret bar_camera_fail: invoke ExitProcess,expansionStage ret BarCameraNativeTests ENDP