; A = room_id ; out A = level of loot CheckLoot: PHP REP #$30 PHB : PHX : PHY STA.b $00 LDA.b $06 : PHA LDA.b $0E : PHA STZ.b $02 ; best item class found LDA.l ShowItems_default AND.w #$00FF STA.b $0E LDA.l SaveDataWRAM, X AND.w #$000F BEQ + LDA.l ShowItems_visited_tile AND.w #$00FF CMP.b $0E BCC + STA.b $0E + LDA.b DungeonID TAX LDA.l MapField AND.l DungeonMask, X BEQ + LDA.l ShowItems_have_map AND.w #$00FF CMP.b $0E BCC + STA.b $0E + LDA.l CompassField AND.l DungeonMask, X BEQ + LDA.l ShowItems_have_compass AND.w #$00FF CMP.b $0E BCC + STA.b $0E + LDA.b $0E BEQ .done LDA.l ItemSources : BIT.w #$0001 : BEQ + JSR CheckChests + LDA.l ItemSources : BIT.w #$0002 : BEQ + JSR CheckPots + LDA.l ItemSources : BIT.w #$0004 : BEQ + JSR CheckEnemies + LDA.l ItemSources : BIT.w #$0008 : BEQ + JSR CheckBoss + LDA.l ItemSources : BIT.w #$0010 : BEQ + JSR CheckPrize + LDA.b $0E AND.w #$00FF CMP.w #$0001 BNE .done LDA.b $02 BEQ .done LDA.w #$0001 STA.b $02 .done PLA : STA.b $0E PLA : STA.b $06 PLY : PLX : PLB PLP LDA.b $02 RTL CheckChests: LDA.b $00 ASL A TAX LDA.w #($81<<8) PHA PLB : PLB LDA.w #$0008 STA.b $04 LDY.w #$FFFD .increment_mask LDA.b $04 ASL A STA.b $04 .next_chest INY #3 CPY.w #$01F8 BCS .done LDA.w RoomData_ChestItems, Y AND.w #$7FFF CMP.b $00 BNE .next_chest LDA.l SaveDataWRAM, X AND.b $04 BNE .increment_mask ; already got item LDA.w RoomData_ChestItems+2, Y AND.w #$00FF JSR GetLootClass BRA .increment_mask .done RTS CheckBoss: LDX.w #$FFFA .next_boss INX #6 LDA.l MiscLocations, X BPL .check RTS .check CMP.b $00 BNE .next_boss TXY CMP.b RoomIndex BEQ .current_room ASL A TAX LDA.l SaveDataWRAM, X BRA .continue .current_room LDA.w RoomItemsTaken ; if checking our current room, $0403 has fresher flags ASL #4 .continue STA.b $04 TYX LDA.l MiscLocations+2, X ; get bit of room data to check AND.w #$00FF ASL A TAX LDA.l DungeonMask, X TYX BIT.b $04 BNE .next_boss ; continue checking if we already got the item LDA.l MiscLocations+4, X STA.b $05 LDA.l MiscLocations+3, X STA.b $04 LDA.b [$04] AND.w #$00FF JSR GetLootClass BRA .next_boss CheckPrize: LDX.w #$FFFD .next_prize INX #3 LDA.l PrizeLocations, X BPL .check RTS .check CMP.b $00 BNE .next_prize TXY ASL A TAX LDA.l SaveDataWRAM, X TYX BIT.w #$0800 BNE .next_prize LDA.l PrizeLocations+2, X ; get which prize to look at AND.w #$00FF TAX LDA.l DungeonPrizeReceiptID, X TYX AND.w #$00FF JSR GetLootClass BRA .next_prize CheckPots: LDA.b $00 ASL A TAX LDA.l UWPotsPointers, X STA.b $04 LDA.w #bank(UWPotsData) STA.b $06 LDY.w #$0000 LDX.w #$FFFF .next_pot LDA.b [$04], Y CMP.w #$FFFF : BEQ .done INX : INY : INY BIT.w #$8000 : BNE .major_item ; marked as major item LDA.b [$04], Y AND.w #$00FF CMP.w #$0008 : BEQ .small_key INY BRA .next_pot .small_key LDA.w #$0024 BRA .continue .major_item LDA.b [$04], Y .continue PHA PHX INY TXA : ASL A EOR.w #$FFFF CLC : ADC.w #$001F ; bit mask table is in opposite order of what we want TAX LDA.l DungeonMask, X : STA.b $08 LDA.b $00 : ASL A : TAX LDA.l RoomPotData, X PLX AND.b $08 BEQ .not_obtained PLA BRA .next_pot .not_obtained PLA AND.w #$00FF JSR GetLootClass BRA .next_pot .done RTS CheckEnemies: LDA.b $00 ASL A TAX LDA.l UWSpritesPointers, X INC A ; skip the layered/unlayered indicator STA.b $04 LDA.w #bank(UWSpritesData) STA.b $06 LDY.w #$0000 LDX.w #$FFFF .next_enemy LDA.b [$04], Y AND.w #$00FF CMP.w #$00FF : BEQ .done INY : INY LDA.b [$04], Y AND.w #$00FF CMP.w #$00F8 : BEQ .major ; major item CMP.w #$00F9 : BEQ .major ; major item in other world CMP.w #$00E4 : BEQ .vanilla_key INY BRA .next_enemy .vanilla_key DEY : DEY LDA.b [$04], Y AND.w #$00FF CMP.w #$00FD ; big key BEQ .big_key CMP.w #$00FE ; small key BEQ .small_key INY #3 ; false alarm -- probably hera basement key BRA .next_enemy .small_key LDA.w #$0024 BRA .proceed .big_key LDA.w #$0032 BRA .proceed .major DEY : DEY LDA.b [$04], Y AND.w #$00FF .proceed INX INY : INY : INY PHA PHX TXA : ASL A TAX LDA.l DungeonMask, X : STA.b $08 LDA.b $00 : ASL A : TAX LDA.l SpriteDropData, X PLX AND.b $08 BEQ .not_obtained PLA BRA .next_enemy .not_obtained PLA AND.w #$00FF JSR GetLootClass BRA .next_enemy .done RTS ; A = item id ; updates "best loot" value if better GetLootClass: PHX TAX LDA.l LootTypeMapping, X AND.w #$00FF CMP.b $02 BCC + STA.b $02 + PLX RTS