LoadTerminalArt3D PROC invoke LoadAnimPack3D,OFFSET terminalWorldArt3D,OFFSET terminalWorldPath3D invoke ValidateCityPack3D,OFFSET terminalWorldArt3D,256,512,4 invoke LoadAnimPack3D,OFFSET terminalScreenArt3D,OFFSET terminalScreenPath3D invoke ValidateCityPack3D,OFFSET terminalScreenArt3D,640,480,1 ret LoadTerminalArt3D ENDP FreeTerminalArt3D PROC invoke FreeAnimPack3D,OFFSET terminalWorldArt3D invoke FreeAnimPack3D,OFFSET terminalScreenArt3D ret FreeTerminalArt3D ENDP ResolveTerminalSurface3D PROC material:DWORD mov eax,material sub eax,118 cmp eax,4 jae terminal_surface_missing cmp terminalWorldArt3D.pixels,0 je terminal_surface_missing shl eax,19 add eax,terminalWorldArt3D.pixels mov ecx,256 mov edx,512 ret terminal_surface_missing: xor eax,eax ret ResolveTerminalSurface3D ENDP PositionTerminalStations3D PROC mov casinoSprites[15*SIZEOF SpriteObject].SpriteObject.posX,TERMINAL_CASH_X mov casinoSprites[15*SIZEOF SpriteObject].SpriteObject.posY,TERMINAL_CENTER_Y mov casinoSprites[16*SIZEOF SpriteObject].SpriteObject.posX,TERMINAL_TROPHY_X mov casinoSprites[16*SIZEOF SpriteObject].SpriteObject.posY,TERMINAL_CENTER_Y mov casinoWaypoints3D[14*SIZEOF NpcWaypoint].NpcWaypoint.posX,TERMINAL_CASH_X mov casinoWaypoints3D[14*SIZEOF NpcWaypoint].NpcWaypoint.posY,FP_1*29/2 ret PositionTerminalStations3D ENDP DrawTerminalCabinet3D PROC uses ebx esi edi wx:DWORD,wy:DWORD,material:DWORD local x0:DWORD,x1:DWORD,y0:DWORD,y1:DWORD mov eax,wx sub eax,FP_1*7/20 mov x0,eax add eax,FP_1*7/10 mov x1,eax mov eax,wy sub eax,FP_1/5 mov y0,eax add eax,FP_1*2/5 mov y1,eax invoke DrawCityBoxSides3D,x0,x1,y0,y1,0,FP_1*8/5,121 invoke DrawCityHorizontal3D,x0,x1,y0,y1,FP_1*8/5,110 mov eax,y1 add eax,FP_1/500 invoke DrawCityVertical3D,1,eax,x0,x1,0,FP_1*8/5,material ret DrawTerminalCabinet3D ENDP RenderTerminalCabinets3D PROC invoke DrawTerminalCabinet3D,TERMINAL_CASH_X,TERMINAL_CENTER_Y,118 invoke DrawTerminalCabinet3D,TERMINAL_TROPHY_X,TERMINAL_CENTER_Y,119 ret RenderTerminalCabinets3D ENDP TerminalCanWalk3D PROC uses esi px:DWORD,py:DWORD mov eax,py sub eax,TERMINAL_CENTER_Y test eax,eax jns @F neg eax @@: cmp eax,FP_1*7/20 ja terminal_walk_clear mov esi,TERMINAL_CASH_X terminal_walk_station: mov eax,px sub eax,esi test eax,eax jns @F neg eax @@: cmp eax,FP_HALF jbe terminal_walk_blocked add esi,FP_1*3/2 cmp esi,TERMINAL_TROPHY_X jbe terminal_walk_station terminal_walk_clear: mov eax,1 ret terminal_walk_blocked: xor eax,eax ret TerminalCanWalk3D ENDP ; A projecting solid bracket supports a glass body, not a plane on the wall. DrawHallLantern3D PROC uses ebx esi edi wallX:DWORD,wy:DWORD,direction:DWORD local x0:DWORD,x1:DWORD,y0:DWORD,y1:DWORD,bodyX:DWORD mov eax,wallX mov ebx,direction imul ebx,FP_1*3/10 add eax,ebx mov bodyX,eax mov eax,wy sub eax,FP_1*13/100 mov y0,eax add eax,FP_1*26/100 mov y1,eax mov eax,bodyX sub eax,FP_1*3/25 mov x0,eax add eax,FP_1*6/25 mov x1,eax invoke DrawCityBoxSides3D,x0,x1,y0,y1,FP_1*7/5,FP_1*19/10,120 invoke DrawCityHorizontal3D,x0,x1,y0,y1,FP_1*19/10,110 invoke DrawCityHorizontal3D,x0,x1,y0,y1,FP_1*7/5,110 ; A short horizontal arm and wall plate remain visible at grazing angles. mov eax,wallX mov edx,bodyX cmp eax,edx jle @F xchg eax,edx @@: mov x0,eax mov x1,edx mov eax,wy sub eax,FP_1/30 mov y0,eax add eax,FP_1/15 mov y1,eax invoke DrawCityBoxSides3D,x0,x1,y0,y1,FP_1*31/20,FP_1*8/5,110 invoke DrawCityHorizontal3D,x0,x1,y0,y1,FP_1*8/5,110 mov eax,wallX sub eax,FP_1/100 mov x0,eax add eax,FP_1/50 mov x1,eax mov eax,wy sub eax,FP_1/12 mov y0,eax add eax,FP_1/6 mov y1,eax invoke DrawCityBoxSides3D,x0,x1,y0,y1,FP_1*29/20,FP_1*7/4,110 ret DrawHallLantern3D ENDP TerminalCountBits3D PROC value:DWORD mov ecx,value xor eax,eax terminal_count_bit: test ecx,ecx jz terminal_count_done lea edx,[ecx-1] and ecx,edx inc eax jmp terminal_count_bit terminal_count_done: ret TerminalCountBits3D ENDP TerminalProgress3D PROC index:DWORD cmp index,4 jae terminal_progress_collection mov eax,bankroll ret terminal_progress_collection: cmp index,6 jae terminal_progress_quests mov eax,ownedBacks3D and eax,1FFEh invoke TerminalCountBits3D,eax ret terminal_progress_quests: mov eax,npcClaimed3D and eax,0FFFh invoke TerminalCountBits3D,eax ret TerminalProgress3D ENDP ; Existing saved achievement bits are preserved; the merchant still owns bit 4. RefreshTerminalAchievements3D PROC uses esi xor esi,esi terminal_refresh_next: invoke TerminalProgress3D,esi cmp eax,terminalGoals3D[esi*4] jb @F mov ecx,terminalBits3D[esi*4] bts achievements,ecx @@: inc esi cmp esi,8 jb terminal_refresh_next ret RefreshTerminalAchievements3D ENDP BeginTerminal3D PROC kind:DWORD mov eax,kind and eax,1 mov terminalTab3D,eax mov terminalPage3D,0 call NpcEnsureJournal3D call RefreshTerminalAchievements3D call SaveProgress3D mov engineMode,MODE_ATM call ClearKeys3D mov mouseClick3D,0 ret BeginTerminal3D ENDP HandleTerminal3D PROC cmp mouseClick3D,0 je terminal_handle_keys cmp mouseY3D,8 jb terminal_handle_keys cmp mouseY3D,25 ja terminal_handle_bottom cmp mouseX3D,248 jae terminal_close terminal_handle_bottom: cmp mouseY3D,203 jb terminal_handle_keys cmp mouseX3D,48 jb terminal_previous cmp mouseX3D,272 ja terminal_next terminal_handle_keys: invoke Pressed3D,45h test eax,eax jnz terminal_close invoke Pressed3D,25h test eax,eax jnz terminal_previous invoke Pressed3D,27h test eax,eax jnz terminal_next jmp terminal_handled terminal_previous: cmp terminalTab3D,0 je terminal_previous_from_cash cmp terminalPage3D,0 je terminal_show_cash dec terminalPage3D jmp terminal_handled terminal_previous_from_cash: mov terminalTab3D,1 mov terminalPage3D,2 jmp terminal_handled terminal_next: cmp terminalTab3D,0 je terminal_next_from_cash cmp terminalPage3D,2 jae terminal_show_cash inc terminalPage3D jmp terminal_handled terminal_next_from_cash: mov terminalTab3D,1 mov terminalPage3D,0 jmp terminal_handled terminal_show_cash: mov terminalTab3D,0 mov terminalPage3D,0 jmp terminal_handled terminal_close: mov engineMode,MODE_WALK call ClearKeys3D terminal_handled: mov mouseClick3D,0 ret HandleTerminal3D ENDP RenderTerminal3D PROC uses ebx esi edi local rowY:DWORD,opened:DWORD,progress:DWORD invoke DrawBox,0,0,320,240,000B1815h cmp terminalScreenArt3D.pixels,0 je @F invoke DrawAnimSprite3D,OFFSET terminalScreenArt3D,0,0,0,640,480 @@: mov edx,OFFSET termCash cmp terminalTab3D,0 je @F mov edx,OFFSET termTrophy @@: invoke DrawString8x8,64,12,edx,002D2116h invoke DrawBoxBorder,248,8,56,17,001A2522h,00C8AD75h,1 invoke DrawString8x8,256,12,OFFSET termClose,00F2E6C6h mov opened,0 xor esi,esi terminal_count_unlocked: mov ecx,terminalBits3D[esi*4] bt achievements,ecx jnc @F inc opened @@: inc esi cmp esi,8 jb terminal_count_unlocked cmp terminalTab3D,1 je terminal_render_achievements invoke DrawString8x8,24,45,OFFSET termAccount,00DDC99Dh invoke DrawString8x8,24,69,OFFSET termBalance,0090B19Fh invoke DrawNumber,24,87,bankroll,00F0E6C3h invoke DrawBox,24,110,272,1,00495B4Ah invoke DrawString8x8,24,128,OFFSET termCollection,0090B19Fh mov eax,ownedBacks3D and eax,1FFFh invoke TerminalCountBits3D,eax invoke DrawNumber,216,128,eax,00F0E6C3h invoke DrawString8x8,232,128,OFFSET termSlash,0090B19Fh invoke DrawNumber,248,128,13,00F0E6C3h invoke DrawString8x8,24,156,OFFSET termTrophy,0090B19Fh invoke DrawNumber,216,156,opened,00F0E6C3h invoke DrawString8x8,232,156,OFFSET termSlash,0090B19Fh invoke DrawNumber,248,156,8,00F0E6C3h jmp terminal_render_footer terminal_render_achievements: invoke DrawString8x8,24,40,OFFSET termOpened,0090B19Fh invoke DrawNumber,232,40,opened,00F0E6C3h invoke DrawString8x8,248,40,OFFSET termSlash,0090B19Fh invoke DrawNumber,264,40,8,00F0E6C3h imul esi,terminalPage3D,3 mov rowY,62 mov edi,3 terminal_render_row: cmp esi,8 jae terminal_render_footer mov ebx,0090B19Fh mov ecx,terminalBits3D[esi*4] bt achievements,ecx jnc @F mov ebx,00E7C479h invoke DrawString8x8,256,rowY,OFFSET termEarned,008CD8AFh @@: invoke DrawString8x8,24,rowY,terminalNames3D[esi*4],ebx mov eax,rowY add eax,12 invoke DrawString8x8,24,eax,terminalConditions3D[esi*4],0090B19Fh invoke TerminalProgress3D,esi mov ecx,terminalGoals3D[esi*4] cmp eax,ecx jbe @F mov eax,ecx @@: mov edx,terminalBits3D[esi*4] bt achievements,edx jnc @F mov eax,ecx @@: mov progress,eax mov eax,rowY add eax,24 invoke DrawNumber,24,eax,progress,00D2DCCEh mov eax,rowY add eax,24 invoke DrawString8x8,112,eax,OFFSET termSlash,0090B19Fh mov eax,rowY add eax,24 invoke DrawNumber,128,eax,terminalGoals3D[esi*4],00D2DCCEh mov eax,rowY add eax,35 invoke DrawBox,24,eax,272,1,00314538h add rowY,44 inc esi dec edi jnz terminal_render_row terminal_render_footer: mov eax,terminalPage3D add eax,2 cmp terminalTab3D,0 jne @F mov eax,1 @@: invoke DrawNumber,140,216,eax,00E3CCA0h invoke DrawString8x8,156,216,OFFSET termSlash,00C1A982h invoke DrawNumber,172,216,4,00E3CCA0h ret RenderTerminal3D ENDP