; Run-local relics. Never serialized; all stakes still use the profile bankroll. ResetTowerRelics3D PROC mov towerHeartUses3D,0 mov towerSealUses3D,0 mov towerSealStage3D,0 mov towerBulletUses3D,0 mov towerBustUses3D,0 mov towerEye3D,0 mov towerPurseUses3D,0 mov towerRewardPending3D,0 mov towerRewardSelection3D,0 mov towerEntryBank3D,0 mov towerRewardOffers3D,0 mov towerRewardOffers3D[4],0 mov towerRewardOffers3D[8],0 ret ResetTowerRelics3D ENDP PrepareTowerReward3D PROC mov towerRewardPending3D,1 mov towerRewardSelection3D,0 mov towerRewardOffers3D,0 mov towerRewardOffers3D[8],5 mov eax,towerStage cmp towerFloorState,TOWER_STATE_CLEAR jne @F inc eax @@: mov towerSealStage3D,eax mov towerSealUses3D,0 mov ecx,1 cmp eax,3 jne @F mov ecx,3 @@: cmp eax,4 jne @F mov ecx,2 @@: cmp eax,6 jne @F mov ecx,4 @@: mov towerRewardOffers3D[4],ecx call ClearKeys3D mov mouseClick3D,0 ret PrepareTowerReward3D ENDP ChooseTowerRelic3D PROC index:DWORD cmp towerRewardPending3D,1 jne tower_choose_done mov ecx,index cmp ecx,2 ja tower_choose_done mov eax,towerRewardOffers3D[ecx*4] cmp eax,0 jne @F inc towerHeartUses3D @@: cmp eax,1 jne @F mov towerSealUses3D,2 @@: cmp eax,2 jne @F add towerBulletUses3D,2 @@: cmp eax,3 jne @F add towerBustUses3D,2 @@: cmp eax,4 jne @F mov towerEye3D,1 @@: cmp eax,5 jne @F add towerPurseUses3D,2 @@: mov towerRewardPending3D,0 call ClearKeys3D mov mouseClick3D,0 tower_choose_done: ret ChooseTowerRelic3D ENDP HandleTowerReward3D PROC invoke Pressed3D,1Bh test eax,eax jz @F call TowerExitToHall ret @@: invoke Pressed3D,25h test eax,eax jz @F cmp towerRewardSelection3D,0 je @F dec towerRewardSelection3D @@: invoke Pressed3D,27h test eax,eax jz @F cmp towerRewardSelection3D,2 jae @F inc towerRewardSelection3D @@: cmp mouseClick3D,0 je tower_reward_keys mov mouseClick3D,0 cmp mouseY3D,73 jb tower_reward_keys cmp mouseY3D,183 jae tower_reward_keys mov eax,mouseX3D sub eax,8 js tower_reward_keys xor edx,edx mov ecx,102 div ecx cmp eax,2 ja tower_reward_keys mov towerRewardSelection3D,eax invoke ChooseTowerRelic3D,eax ret tower_reward_keys: invoke Pressed3D,31h test eax,eax jz @F invoke ChooseTowerRelic3D,0 ret @@: invoke Pressed3D,32h test eax,eax jz @F invoke ChooseTowerRelic3D,1 ret @@: invoke Pressed3D,33h test eax,eax jz @F invoke ChooseTowerRelic3D,2 ret @@: invoke Pressed3D,0Dh test eax,eax jnz tower_reward_confirm invoke Pressed3D,20h test eax,eax jz tower_reward_done tower_reward_confirm: invoke ChooseTowerRelic3D,towerRewardSelection3D tower_reward_done: ret HandleTowerReward3D ENDP RenderTowerReward3D PROC uses ebx esi edi local x:DWORD,y:DWORD invoke DrawBox,0,0,320,240,000C080Bh invoke DrawBoxBorder,4,24,312,192,0014090Dh,00D08030h,2 invoke DrawString8x8,16,32,OFFSET towerRewardTitle3D,00FFD080h invoke DrawString8x8,16,47,OFFSET towerRewardHint3D,00CCCCBBh xor ebx,ebx mov x,8 tower_reward_card: mov edx,00604430h cmp ebx,towerRewardSelection3D jne @F mov edx,00FFCC66h @@: invoke DrawBoxBorder,x,73,100,110,002A1717h,edx,2 mov esi,towerRewardOffers3D[ebx*4] mov eax,x add eax,4 invoke DrawString8x8,eax,83,towerRelicNames3D[esi*4],00FFDD88h mov edi,towerRelicDescriptions3D[esi*4] mov y,105 push ebx mov ebx,3 @@: mov eax,x add eax,4 invoke DrawString8x8,eax,y,edi,00DDD3CCh tower_reward_text_end: cmp BYTE PTR [edi],0 je tower_reward_text_next inc edi jmp tower_reward_text_end tower_reward_text_next: inc edi add y,13 dec ebx jnz @B pop ebx mov eax,x add eax,4 invoke DrawString8x8,eax,161,OFFSET towerRunOnly3D,00AA9999h add x,102 inc ebx cmp ebx,3 jb tower_reward_card invoke DrawString8x8,16,195,OFFSET towerRewardKeys3D,00FFDD88h call RenderTowerRelicStock3D ret RenderTowerReward3D ENDP ; Six compact counters remain visible between floors and during play. RenderTowerRelicStock3D PROC uses ebx esi local x:DWORD,y:DWORD,stepX:DWORD mov x,4 mov y,229 mov stepX,52 cmp engineMode,MODE_HELL_TOWER je tower_stock_menu ; Keep table action buttons at the bottom unobscured. invoke DrawBox,100,4,216,26,0014090Dh mov x,104 mov y,7 mov stepX,70 jmp tower_stock_start tower_stock_menu: invoke DrawBox,0,226,320,14,0014090Dh tower_stock_start: xor ebx,ebx tower_stock_counter: invoke DrawString8x8,x,y,towerStockLabels3D[ebx*4],00CCAA88h mov esi,towerStockValues3D[ebx*4] invoke FormatNumber,DWORD PTR [esi],OFFSET towerRelicNum3D mov eax,x add eax,26 invoke DrawString8x8,eax,y,OFFSET towerRelicNum3D,00FFFFFFh mov eax,stepX add x,eax inc ebx cmp ebx,3 jne @F cmp engineMode,MODE_HELL_TOWER je @F mov x,104 add y,12 @@: cmp ebx,6 jb tower_stock_counter ret RenderTowerRelicStock3D ENDP TryTowerBustSave3D PROC cmp tournamentMode,1 jne tower_bust_none cmp towerBustUses3D,0 je tower_bust_none dec towerBustUses3D dec cbPlayerCount3D invoke NativeBJScore3D,OFFSET cbPlayer3D,cbPlayerCount3D mov cbPlayerScore3D,eax invoke CopyString3D,OFFSET towerBustMessage3D,OFFSET flashMessage mov flashTimer,140 mov eax,1 ret tower_bust_none: xor eax,eax ret TryTowerBustSave3D ENDP UpdateTowerEye3D PROC cmp tournamentMode,1 jne tower_eye_done cmp towerEye3D,1 jne tower_eye_done mov eax,bs3d_shellIndex cmp eax,bs3d_shellCount jae tower_eye_done mov eax,bs3d_shells[eax*4] mov bs3d_known,eax tower_eye_done: ret UpdateTowerEye3D ENDP