.data fortuneTestClosed db "build\hall-expansion\fortune-closed.bmp",0 fortuneTestPull db "build\hall-expansion\fortune-lamp-pulled.bmp",0 fortuneTestOpen db "build\hall-expansion\fortune-open.bmp",0 fortuneTestFar db "build\hall-expansion\fortune-open-far.bmp",0 fortuneTestStairs db "build\hall-expansion\fortune-stairs.bmp",0 fortuneTestTopReturn db "build\hall-expansion\fortune-stair-return.bmp",0 fortuneTestRoom db "build\hall-expansion\fortune-room.bmp",0 fortuneTestNear db "build\hall-expansion\fortune-seer.bmp",0 fortuneTestIdle db "build\hall-expansion\fortune-seer-idle.bmp",0 fortuneTestDialog db "build\hall-expansion\fortune-unavailable.bmp",0 fortuneTestReturn db "build\hall-expansion\fortune-room-return.bmp",0 fortuneTestNorth db "build\hall-expansion\fortune-north.bmp",0 fortuneTestSouth db "build\hall-expansion\fortune-south.bmp",0 fortuneTestMissing db "build\hall-expansion\fortune-missing-art.bmp",0 fortuneTestOblique db "build\hall-expansion\fortune-oblique.bmp",0 fortuneTestFullLight db "build\hall-expansion\fortune-full-light.bmp",0 fortuneTestEast db "build\hall-expansion\fortune-east.bmp",0 fortuneTestCentered db "build\hall-expansion\fortune-doorway-centered.bmp",0 fortuneTestBank dd 0 fortuneTestView dd 0 .code FortuneNativeTests PROC uses esi edi mov expansionStage,60 cmp fortuneArt3D.frames,24 jne fortune_test_fail cmp fortuneArt3D.imageWidth,256 jne fortune_test_fail cmp fortuneMaterialArt3D.frames,4 jne fortune_test_fail invoke ResolveCitySurface3D,132 cmp eax,fortuneMaterialArt3D.pixels jne fortune_test_fail invoke ResolveCitySurface3D,135 mov edx,fortuneMaterialArt3D.pixels add edx,3*256*256*4 cmp eax,edx jne fortune_test_fail invoke ResolveCitySurface3D,159 mov edx,fortuneArt3D.pixels add edx,23*256*256*4 cmp eax,edx jne fortune_test_fail invoke FortuneLightAt3D,216,152,26 cmp eax,174 jb fortune_test_fail invoke FortuneLightAt3D,0,0,0 test eax,eax jnz fortune_test_fail mov engineMode,MODE_WALK mov hallLevel3D,0 mov worldMap3D,OFFSET casinoMap mov floorTexture3D,100 mov fortunePassageTime3D,0 mov fortunePassageTarget3D,0 mov deltaTime3D,100 mov playerX,3*FP_1 mov playerY,10*FP_1 mov playerAngle,256 call UpdateInteriorEye3D call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestClosed invoke CanWalk3D,FP_1*15/10,10*FP_1 test eax,eax jnz fortune_test_fail mov playerX,FP_1*26/10 mov playerY,FP_1*87/10 call UpdateCamera3D call CheckInteractions cmp interactTargetId,INTERACT_SECRET_LAMP jne fortune_test_fail call Trigger3DInteraction cmp fortunePassageTarget3D,1 jne fortune_test_fail add animationClock3D,100 call UpdateInteriorTravel3D cmp fortunePassageTime3D,100 jne fortune_test_fail call UpdateFortunePassage3D cmp fortunePassageTime3D,100 jne fortune_test_fail add animationClock3D,100 call UpdateInteriorTravel3D call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestPull mov esi,12 fortune_test_opening: add animationClock3D,100 call UpdateInteriorTravel3D dec esi jnz fortune_test_opening cmp fortunePassageTime3D,1400 jne fortune_test_fail invoke CanWalk3D,FP_1*15/10,10*FP_1 cmp eax,1 jne fortune_test_fail call CheckInteractions cmp interactTargetId,INTERACT_SECRET_LAMP jne fortune_test_fail cmp interactPromptPtr,OFFSET fortuneLampReturn3D jne fortune_test_fail mov playerX,3*FP_1 mov playerY,10*FP_1 call ExpansionFrame cmp portalPixelsWritten3D,1000 jb fortune_test_fail invoke ExpansionSnapshot,OFFSET fortuneTestOpen mov playerX,FP_1*85/10 call ExpansionFrame cmp portalPixelsWritten3D,1000 jb fortune_test_fail invoke ExpansionSnapshot,OFFSET fortuneTestFar mov expansionStage,61 mov deltaTime3D,16 mov playerX,3*FP_1 mov playerY,10*FP_1 mov keys3D[57h],1 xor esi,esi fortune_test_walk_down: call ExpansionWalkFrame cmp engineMode,MODE_WALK jne @F cmp hallLevel3D,3 je fortune_test_arrived @@: inc esi cmp esi,1000 jb fortune_test_walk_down jmp fortune_test_fail fortune_test_arrived: mov keys3D[57h],0 cmp worldMap3D,OFFSET fortuneRoomMap3D jne fortune_test_fail cmp floorTexture3D,134 jne fortune_test_fail cmp playerY,11*FP_1 jne fortune_test_fail mov eax,fortuneSeer3D.posY cmp eax,playerY jne fortune_test_fail invoke CanWalk3D,FP_1*173/10,FP_1*103/10 cmp eax,1 jne fortune_test_fail invoke CanWalk3D,FP_1*173/10,FP_1*117/10 cmp eax,1 jne fortune_test_fail ; Off-centre crossing preserves lateral position in both local maps. mov playerX,FP_1*176/10 mov playerY,FP_1*115/10 call UpdateInteriorTravel3D cmp engineMode,MODE_STAIRS jne fortune_test_fail cmp playerY,FP_1*105/10 jne fortune_test_fail mov playerX,17*FP_1 call UpdateInteriorTravel3D cmp hallLevel3D,3 jne fortune_test_fail cmp playerY,FP_1*115/10 jne fortune_test_fail mov playerY,11*FP_1 cmp playerAngle,256 jne fortune_test_fail call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestRoom mov playerX,16*FP_1 mov playerY,FP_1*116/10 mov playerAngle,384 call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestNorth mov playerX,16*FP_1 mov playerY,FP_1*107/10 mov playerAngle,128 call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestSouth mov playerX,FP_1*155/10 mov playerY,FP_1*116/10 mov playerAngle,0 call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestEast invoke CanWalk3D,FP_1*146/10,FP_1*126/10 test eax,eax jnz fortune_test_fail invoke CanWalk3D,FP_1*163/10,FP_1*925/100 test eax,eax jnz fortune_test_fail mov expansionStage,62 ; A mid-flight camera shows physical treads and continuous eye height. mov engineMode,MODE_STAIRS mov stairRoute3D,3 mov hallLevel3D,0 mov worldMap3D,OFFSET fortuneStairMap3D mov playerX,24*FP_1 mov playerY,10*FP_1 mov playerAngle,256 call UpdateStairHeight3D cmp viewEye3D,HALL_STANDING_EYE+FP_1*15/16 jne fortune_test_fail call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestStairs mov playerX,28*FP_1 mov playerAngle,0 call UpdateStairHeight3D call ExpansionFrame cmp portalPixelsWritten3D,1000 jb fortune_test_fail invoke ExpansionSnapshot,OFFSET fortuneTestTopReturn ; The panel cannot close over somebody still at its upper landing. mov fortunePassageTarget3D,0 mov playerX,29*FP_1 add animationClock3D,16 call UpdateFortunePassage3D cmp fortunePassageTime3D,1400 jne fortune_test_fail mov playerX,24*FP_1 add animationClock3D,16 call UpdateFortunePassage3D cmp fortunePassageTime3D,1400 jne fortune_test_fail mov engineMode,MODE_WALK mov hallLevel3D,3 add animationClock3D,16 call UpdateFortunePassage3D cmp fortunePassageTime3D,1400 jne fortune_test_fail mov fortunePassageTarget3D,1 mov engineMode,MODE_WALK mov hallLevel3D,3 mov worldMap3D,OFFSET fortuneRoomMap3D mov playerX,FP_1*158/10 mov playerY,11*FP_1 mov playerAngle,256 call UpdateInteriorEye3D mov animationClock3D,6000 call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestNear call UpdateCamera3D call RenderCeilingAndFloor call RenderWalls call PrepareCityDepth3D call RenderFortuneFurnishings3D invoke ExpansionSnapshot,OFFSET fortuneTestFullLight call ApplyFortuneLighting3D mov playerX,FP_1*164/10 mov playerY,FP_1*116/10 mov playerAngle,288 call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestOblique mov playerX,FP_1*158/10 mov playerY,11*FP_1 mov playerAngle,256 mov esi,fortuneMaterialArt3D.pixels mov edi,hallArchitectureHD3D.pixels mov fortuneMaterialArt3D.pixels,0 mov hallArchitectureHD3D.pixels,0 call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestMissing mov fortuneMaterialArt3D.pixels,esi mov hallArchitectureHD3D.pixels,edi call ExpansionFrame call CheckInteractions cmp interactTargetId,INTERACT_FORTUNE jne fortune_test_fail invoke CanWalk3D,FP_1*141/10,11*FP_1 test eax,eax jnz fortune_test_fail mov animationClock3D,5000 call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestIdle mov eax,bankroll mov fortuneTestBank,eax mov eax,playerX mov fortuneTestView,eax call Trigger3DInteraction cmp engineMode,MODE_FORTUNE jne fortune_test_fail call RenderFortuneDialog3D invoke ExpansionSnapshot,OFFSET fortuneTestDialog mov mouseClick3D,1 mov mouseX3D,260 mov mouseY3D,232 call HandleFortuneDialog3D cmp engineMode,MODE_WALK jne fortune_test_fail cmp hallLevel3D,3 jne fortune_test_fail mov eax,bankroll cmp eax,fortuneTestBank jne fortune_test_fail mov eax,playerX cmp eax,fortuneTestView jne fortune_test_fail mov playerX,FP_1*1495/100 mov playerY,11*FP_1 mov playerAngle,0 call ExpansionFrame invoke ExpansionSnapshot,OFFSET fortuneTestCentered xor esi,esi fortune_test_first_column: cmp portalClipDepth3D[esi*4],0 jne fortune_test_find_last inc esi cmp esi,SCREEN_W jb fortune_test_first_column jmp fortune_test_fail fortune_test_find_last: mov edi,SCREEN_W-1 fortune_test_last_column: cmp portalClipDepth3D[edi*4],0 jne fortune_test_center_mask dec edi jns fortune_test_last_column jmp fortune_test_fail fortune_test_center_mask: add esi,edi cmp esi,SCREEN_W-2 jb fortune_test_fail cmp esi,SCREEN_W+2 ja fortune_test_fail mov playerX,16*FP_1 call ExpansionFrame cmp portalPixelsWritten3D,1000 jb fortune_test_fail invoke ExpansionSnapshot,OFFSET fortuneTestReturn mov expansionStage,63 mov keys3D[57h],1 xor esi,esi fortune_test_walk_up: call ExpansionWalkFrame cmp engineMode,MODE_WALK jne @F cmp hallLevel3D,0 je fortune_test_back_hall @@: inc esi cmp esi,1000 jb fortune_test_walk_up jmp fortune_test_fail fortune_test_back_hall: mov keys3D[57h],0 cmp worldMap3D,OFFSET casinoMap jne fortune_test_fail cmp playerAngle,0 jne fortune_test_fail cmp playerX,2*FP_1 ja fortune_test_fail mov playerX,FP_1*26/10 mov playerY,FP_1*87/10 mov playerAngle,256 call UpdateCamera3D call CheckInteractions cmp interactTargetId,INTERACT_SECRET_LAMP jne fortune_test_fail call Trigger3DInteraction cmp fortunePassageTarget3D,0 jne fortune_test_fail mov deltaTime3D,100 mov esi,14 fortune_test_closing: add animationClock3D,100 call UpdateFortunePassage3D dec esi jnz fortune_test_closing cmp fortunePassageTime3D,0 jne fortune_test_fail invoke CanWalk3D,FP_1*15/10,10*FP_1 test eax,eax jnz fortune_test_fail cmp scrStation3D.posX,29*FP_1 jne fortune_test_fail cmp scrStation3D.posY,FP_1*15/2 jne fortune_test_fail ret fortune_test_fail: invoke ExitProcess,expansionStage ret FortuneNativeTests ENDP