RenderChestItem:
    ldh  a, [$F1] ; active sprite
    and  $80
    jr   nz, .renderLargeItem

    ld   de, ItemSpriteTable
    call $3C77 ; RenderActiveEntitySprite
    ret
.renderLargeItem:
    ld   de, LargeItemSpriteTable
    dec  d
    dec  d
    call $3BC0 ; RenderActiveEntitySpritePair

    ; If we are an instrument
    ldh  a, [$F1]
    cp   $8E
    ret  c
    cp   $96
    ret  nc

    ; But check if we are not state >3 before that, else the fade-out at the instrument room breaks.
    ldh  a, [$F0] ; hActiveEntityState
    cp   $03
    ret  nc

    ; Call the color cycling code
    xor  a
    ld   [$DC82], a
    ld   [$DC83], a
    ld   a, $3e
    call $0AD2
    ret

GiveItemFromChestMultiworld:
    call IncreaseCheckCounter
    ; Check our "item is for other player" flag
    ld   hl, $7300
    call OffsetPointerByRoomNumber
    ld   a, [hl]
    ld   hl, $0055
    cp   [hl]
    ret nz
    
GiveItemFromChest:
    ldh  a, [$F1] ; Load active sprite variant

    rst  0 ; JUMP TABLE
    dw ChestPowerBracelet; CHEST_POWER_BRACELET
    dw ChestShield       ; CHEST_SHIELD
    dw ChestBow          ; CHEST_BOW
    dw ChestWithItem     ; CHEST_HOOKSHOT
    dw ChestWithItem     ; CHEST_MAGIC_ROD
    dw Boots             ; CHEST_PEGASUS_BOOTS
    dw ChestWithItem     ; CHEST_OCARINA
    dw ChestWithItem     ; CHEST_FEATHER
    dw ChestWithItem     ; CHEST_SHOVEL
    dw ChestMagicPowder  ; CHEST_MAGIC_POWDER_BAG
    dw ChestBomb         ; CHEST_BOMB
    dw ChestSword        ; CHEST_SWORD
    dw Flippers          ; CHEST_FLIPPERS
    dw NoItem            ; CHEST_MAGNIFYING_LENS
    dw ChestWithItem    ; Boomerang (used to be unused)
    dw SlimeKey         ; ?? right side of your trade quest item
    dw Medicine         ; CHEST_MEDICINE
    dw TailKey          ; CHEST_TAIL_KEY
    dw AnglerKey        ; CHEST_ANGLER_KEY
    dw FaceKey          ; CHEST_FACE_KEY
    dw BirdKey          ; CHEST_BIRD_KEY
    dw GoldenLeaf       ; CHEST_GOLD_LEAF
    dw ChestWithCurrentDungeonItem ; CHEST_MAP
    dw ChestWithCurrentDungeonItem ; CHEST_COMPASS
    dw ChestWithCurrentDungeonItem ; CHEST_STONE_BEAK
    dw ChestWithCurrentDungeonItem ; CHEST_NIGHTMARE_KEY
    dw ChestWithCurrentDungeonItem ; CHEST_SMALL_KEY
    dw AddRupees50      ; CHEST_RUPEES_50
    dw AddRupees20      ; CHEST_RUPEES_20
    dw AddRupees100     ; CHEST_RUPEES_100
    dw AddRupees200     ; CHEST_RUPEES_200
    dw AddRupees500     ; CHEST_RUPEES_500
    dw AddSeashell      ; CHEST_SEASHELL
    dw NoItem           ; CHEST_MESSAGE
    dw NoItem           ; CHEST_GEL
    dw AddKey ; KEY1
    dw AddKey ; KEY2
    dw AddKey ; KEY3
    dw AddKey ; KEY4
    dw AddKey ; KEY5
    dw AddKey ; KEY6
    dw AddKey ; KEY7
    dw AddKey ; KEY8
    dw AddKey ; KEY9
    dw AddMap ; MAP1
    dw AddMap ; MAP2
    dw AddMap ; MAP3
    dw AddMap ; MAP4
    dw AddMap ; MAP5
    dw AddMap ; MAP6
    dw AddMap ; MAP7
    dw AddMap ; MAP8
    dw AddMap ; MAP9
    dw AddCompass ; COMPASS1
    dw AddCompass ; COMPASS2
    dw AddCompass ; COMPASS3
    dw AddCompass ; COMPASS4
    dw AddCompass ; COMPASS5
    dw AddCompass ; COMPASS6
    dw AddCompass ; COMPASS7
    dw AddCompass ; COMPASS8
    dw AddCompass ; COMPASS9
    dw AddStoneBeak ; STONE_BEAK1
    dw AddStoneBeak ; STONE_BEAK2
    dw AddStoneBeak ; STONE_BEAK3
    dw AddStoneBeak ; STONE_BEAK4
    dw AddStoneBeak ; STONE_BEAK5
    dw AddStoneBeak ; STONE_BEAK6
    dw AddStoneBeak ; STONE_BEAK7
    dw AddStoneBeak ; STONE_BEAK8
    dw AddStoneBeak ; STONE_BEAK9
    dw AddNightmareKey ; NIGHTMARE_KEY1
    dw AddNightmareKey ; NIGHTMARE_KEY2
    dw AddNightmareKey ; NIGHTMARE_KEY3
    dw AddNightmareKey ; NIGHTMARE_KEY4
    dw AddNightmareKey ; NIGHTMARE_KEY5
    dw AddNightmareKey ; NIGHTMARE_KEY6
    dw AddNightmareKey ; NIGHTMARE_KEY7
    dw AddNightmareKey ; NIGHTMARE_KEY8
    dw AddNightmareKey ; NIGHTMARE_KEY9
    dw AddToadstool ; Toadstool
    dw NoItem ; $51
    dw NoItem ; $52
    dw NoItem ; $53
    dw NoItem ; $54
    dw NoItem ; $55
    dw NoItem ; $56
    dw NoItem ; $57
    dw NoItem ; $58
    dw NoItem ; $59
    dw NoItem ; $5A
    dw NoItem ; $5B
    dw NoItem ; $5C
    dw NoItem ; $5D
    dw NoItem ; $5E
    dw NoItem ; $5F
    dw NoItem ; $60
    dw NoItem ; $61
    dw NoItem ; $62
    dw NoItem ; $63
    dw NoItem ; $64
    dw NoItem ; $65
    dw NoItem ; $66
    dw NoItem ; $67
    dw NoItem ; $68
    dw NoItem ; $69
    dw NoItem ; $6A
    dw NoItem ; $6B
    dw NoItem ; $6C
    dw NoItem ; $6D
    dw NoItem ; $6E
    dw NoItem ; $6F
    dw NoItem ; $70
    dw NoItem ; $71
    dw NoItem ; $72
    dw NoItem ; $73
    dw NoItem ; $74
    dw NoItem ; $75
    dw NoItem ; $76
    dw NoItem ; $77
    dw NoItem ; $78
    dw NoItem ; $79
    dw NoItem ; $7A
    dw NoItem ; $7B
    dw NoItem ; $7C
    dw NoItem ; $7D
    dw NoItem ; $7E
    dw NoItem ; $7F
    dw PieceOfHeart     ; Heart piece
    dw GiveBowwow
    dw Give10Arrows
    dw Give1Arrow
    dw UpgradeMaxPowder
    dw UpgradeMaxBombs
    dw UpgradeMaxArrows
    dw GiveRedTunic
    dw GiveBlueTunic
    dw GiveExtraHeart
    dw TakeHeart
    dw GiveSong1
    dw GiveSong2
    dw GiveSong3
    dw GiveInstrument
    dw GiveInstrument
    dw GiveInstrument
    dw GiveInstrument
    dw GiveInstrument
    dw GiveInstrument
    dw GiveInstrument
    dw GiveInstrument
    dw GiveRooster
    dw GiveTradeItem1
    dw GiveTradeItem2
    dw GiveTradeItem3
    dw GiveTradeItem4
    dw GiveTradeItem5
    dw GiveTradeItem6
    dw GiveTradeItem7
    dw GiveTradeItem8
    dw GiveTradeItem9
    dw GiveTradeItem10
    dw GiveTradeItem11
    dw GiveTradeItem12
    dw GiveTradeItem13
    dw GiveTradeItem14

NoItem:
    ret

ChestPowerBracelet:
    ld   hl, $DB43 ; power bracelet level
    jr   ChestIncreaseItemLevel

ChestShield:
    ld   hl, $DB44 ; shield level
    jr   ChestIncreaseItemLevel

ChestSword:
    ld   hl, $DB4E ; sword level
    jr   ChestIncreaseItemLevel

ChestIncreaseItemLevel:
    ld   a, [hl]
    cp   $02
    jr   z, DoNotIncreaseItemLevel
    inc  [hl]
DoNotIncreaseItemLevel:
    jp   ChestWithItem

ChestBomb:
    ld   a, [$DB4D] ; bomb count
    add  a, $10
    daa
    ld   hl, $DB77 ; max bombs
    cp   [hl]
    jr   c, .bombsNotFull
    ld   a, [hl]
.bombsNotFull:
    ld   [$DB4D], a
    jp   ChestWithItem

ChestBow:
    ld   a, [$DB45]
    cp   $20
    jp   nc, ChestWithItem
    ld   a, $20
    ld   [$DB45], a
    jp   ChestWithItem

ChestMagicPowder:
    ; Reset the toadstool state
    ld   a, $0B
    ldh  [$A5], a
    xor  a
    ld   [$DB4B], a ; has toadstool

    ld   a, [$DB4C] ; powder count
    add  a, $10
    daa
    ld   hl, $DB76 ; max powder
    cp   [hl]
    jr   c, .magicPowderNotFull
    ld   a, [hl]
.magicPowderNotFull:
    ld   [$DB4C], a
    jp   ChestWithItem

Boots:
    ; We use DB6D to store which tunics we have available
    ; ...and the boots
    ld  a, [wCollectedTunics]
    or  $04
    ld  [wCollectedTunics], a
    jp  ChestWithItem

Flippers:
    ld   a, $01
    ld   [wHasFlippers], a
    ret

Medicine:
    ld   a, $01
    ld   [wHasMedicine], a
    ret

TailKey:
    ld   a, $01
    ld   [$DB11], a
    ret

AnglerKey:
    ld   a, $01
    ld   [$DB12], a
    ret

FaceKey:
    ld   a, $01
    ld   [$DB13], a
    ret

BirdKey:
    ld   a, $01
    ld   [$DB14], a
    ret

SlimeKey:
    ld   a, $01
    ld   [$DB15], a
    ret

GoldenLeaf:
    ld   hl, wGoldenLeaves
    inc  [hl]
    ret

AddSeaShell:
    ld   a, [wSeashellsCount]
    inc  a
    daa
    ld   [wSeashellsCount], a
    ret

PieceOfHeart:
#IF HARD_MODE
    ld   a, $FF
    ld   [$DB93], a
#ENDIF

    ld   a, [$DB5C]
    inc  a
    cp   $04
    jr   z, .FullHeart
    ld   [$DB5C], a
    ret
.FullHeart:
    xor  a
    ld   [$DB5C], a
    jp   GiveExtraHeart

GiveBowwow:
    ld   a, $01
    ld   [$DB56], a
    ret

ChestInventoryTable:
    db   $03 ; CHEST_POWER_BRACELET
    db   $04 ; CHEST_SHIELD
    db   $05 ; CHEST_BOW
    db   $06 ; CHEST_HOOKSHOT
    db   $07 ; CHEST_MAGIC_ROD
    db   $08 ; CHEST_PEGASUS_BOOTS
    db   $09 ; CHEST_OCARINA
    db   $0A ; CHEST_FEATHER
    db   $0B ; CHEST_SHOVEL
    db   $0C ; CHEST_MAGIC_POWDER_BAG
    db   $02 ; CHEST_BOMB
    db   $01 ; CHEST_SWORD
    db   $00 ; - (flippers slot)
    db   $00 ; - (magnifier lens slot)
    db   $0D ; Boomerang

ChestWithItem:
    ldh  a, [$F1] ; Load active sprite variant
    ld   d, $00
    ld   e, a
    ld   hl, ChestInventoryTable
    add  hl, de
    ld   d, [hl]
    call $3E6B ; Give Inventory
    ret

ChestWithCurrentDungeonItem:
    sub  $16 ; a -= CHEST_MAP
    ld   e, a
    ld   d, $00
    ld   hl, $DBCC ; hasDungeonMap
    add  hl, de
    inc  [hl]
    call $2802  ; Sync current dungeon items with dungeon specific table
    ret

AddToadstool:
    ld   d, $0E
    call $3E6B ; Give Inventory
    ret

AddKey:
    sub $23 ; Make 'A' target dungeon index
    ld   de, $0004
    jr   AddDungeonItem

AddMap:
    sub $2C ; Make 'A' target dungeon index
    ld   de, $0000
    jr   AddDungeonItem

AddCompass:
    sub $35 ; Make 'A' target dungeon index
    ld   de, $0001
    jr   AddDungeonItem

AddStoneBeak:
    sub $3E ; Make 'A' target dungeon index
    ld   de, $0002
    jr   AddDungeonItem

AddNightmareKey:
    sub $47 ; Make 'A' target dungeon index
    ld   de, $0003
    jr   AddDungeonItem

AddDungeonItem:
    cp   $08
    jr   z, .colorDungeon
    ; hl = dungeonitems + type_type + dungeon * 8
    ld   hl, $DB16
    add  hl, de
    push de
    ld   e, a
    add  hl, de
    add  hl, de
    add  hl, de
    add  hl, de
    add  hl, de
    pop  de
    inc  [hl]
    ; Check if we are in this specific dungeon, and then increase the copied counters as well.
    ld   hl, $FFF7   ; is current map == target map
    cp   [hl]
    ret  nz
    ld   a, [$DBA5] ; is indoor
    and  a
    ret  z

    ld   hl, $DBCC
    add  hl, de
    inc  [hl]
    ret
.colorDungeon:
    ; Special case for the color dungeon, which is in a different location in memory.
    ld   hl, $DDDA
    add  hl, de
    inc  [hl]
    ldh  a, [$F7]   ; is current map == color dungeon
    cp   $ff
    ret  nz
    ld   hl, $DBCC
    add  hl, de
    inc  [hl]
    ret

AddRupees20:
    ld   hl, $0014
    jr   AddRupees

AddRupees50:
    ld   hl, $0032
    jr   AddRupees

AddRupees100:
    ld   hl, $0064
    jr   AddRupees

AddRupees200:
    ld   hl, $00C8
    jr   AddRupees

AddRupees500:
    ld   hl, $01F4
    jr   AddRupees

AddRupees:
    ld  a, [$DB8F]
    ld  d, a
    ld  a, [$DB90]
    ld  e, a
    add hl, de
    ld  a, h
    ld  [$DB8F], a
    ld  a, l
    ld  [$DB90], a
    ld   a, $18
    ld   [$C3CE], a
    ret

Give1Arrow:
    ld   a, [$DB45]
    inc  a
    jp   FinishGivingArrows

Give10Arrows:
    ld   a, [$DB45]
    add  a, $0A
FinishGivingArrows:
    daa
    ld   [$DB45], a
    ld   hl, $DB78
    cp   [hl]
    ret  c
    ld   a, [hl]
    ld   [$DB45], a
    ret

UpgradeMaxPowder:
    ld   a, $40
    ld   [$DB76], a
    ; If we have no powder, we should not increase the current amount, as that would prevent
    ; The toadstool from showing up.
    ld   a, [$DB4C]
    and  a
    ret  z
    ld   a, $40
    ld   [$DB4C], a
    ret

UpgradeMaxBombs:
    ld   a, $60
    ld   [$DB77], a
    ld   [$DB4D], a
    ret

UpgradeMaxArrows:
    ld   a, $60
    ld   [$DB78], a
    ld   [$DB45], a
    ret

GiveRedTunic:
    ld  a, $01
    ld  [$DC0F], a
    ; We use DB6D to store which tunics we have available.
    ld  a, [wCollectedTunics]
    or  $01
    ld  [wCollectedTunics], a
    ret

GiveBlueTunic:
    ld  a, $02
    ld  [$DC0F], a
    ; We use DB6D to store which tunics we have available.
    ld  a, [wCollectedTunics]
    or  $02
    ld  [wCollectedTunics], a
    ret

GiveExtraHeart:
    ; Regen all health
    ld   hl, $DB93
    ld   [hl], $FF
    ; Increase max health if health is lower then 14 hearts
    ld   hl, $DB5B
    ld   a, $0E
    cp   [hl]
    ret  z
    inc  [hl]
    ret

TakeHeart:
    ; First, reduce the max HP
    ld   hl, $DB5B
    ld   a, [hl]
    cp   $01
    ret  z
    dec  a
    ld   [$DB5B], a

    ; Next, check if we need to reduce our actual HP to keep it below the maximum.
    rlca
    rlca
    rlca
    sub  $01
    ld   hl, $DB5A
    cp   [hl]
    jr   nc, .noNeedToReduceHp
    ld   [hl], a
.noNeedToReduceHp:
    ; Finally, give all health back.
    ld   hl, $DB93
    ld   [hl], $FF
    ret

GiveSong1:
    ld   hl, $DB49
    set  2, [hl]
    ld   a, $00
    ld   [$DB4A], a
    ret

GiveSong2:
    ld   hl, $DB49
    set  1, [hl]
    ld   a, $01
    ld   [$DB4A], a
    ret

GiveSong3:
    ld   hl, $DB49
    set  0, [hl]
    ld   a, $02
    ld   [$DB4A], a
    ret

GiveInstrument:
    ldh  a, [$F1] ; Load active sprite variant
    sub  $8E
    ld   d, $00
    ld   e, a
    ld   hl, $db65 ; has instrument table
    add  hl, de
    set  1, [hl]
    ret

GiveRooster:
    ld   d, $0F
    call $3E6B ; Give Inventory (rooster item)

    ;ld   a, $01
    ;ld   [$DB7B], a ; has rooster
    ldh  a, [$F9] ; do not spawn rooster in sidescroller
    and  a
    ret  z

    ld   a, $D5 ; ENTITY_ROOSTER
    call $3B86 ; SpawnNewEntity_trampoline
    ldh  a, [$98] ; LinkX
    ld   hl, $C200 ; wEntitiesPosXTable
    add  hl, de
    ld   [hl], a
    ldh  a, [$99] ; LinkY
    ld   hl, $C210 ; wEntitiesPosYTable
    add  hl, de
    ld   [hl], a

    ret

GiveTradeItem1:
    ld   hl, wTradeSequenceItem
    set  0, [hl]
    ret
GiveTradeItem2:
    ld   hl, wTradeSequenceItem
    set  1, [hl]
    ret
GiveTradeItem3:
    ld   hl, wTradeSequenceItem
    set  2, [hl]
    ret
GiveTradeItem4:
    ld   hl, wTradeSequenceItem
    set  3, [hl]
    ret
GiveTradeItem5:
    ld   hl, wTradeSequenceItem
    set  4, [hl]
    ret
GiveTradeItem6:
    ld   hl, wTradeSequenceItem
    set  5, [hl]
    ret
GiveTradeItem7:
    ld   hl, wTradeSequenceItem
    set  6, [hl]
    ret
GiveTradeItem8:
    ld   hl, wTradeSequenceItem
    set  7, [hl]
    ret
GiveTradeItem9:
    ld   hl, wTradeSequenceItem2
    set  0, [hl]
    ret
GiveTradeItem10:
    ld   hl, wTradeSequenceItem2
    set  1, [hl]
    ret
GiveTradeItem11:
    ld   hl, wTradeSequenceItem2
    set  2, [hl]
    ret
GiveTradeItem12:
    ld   hl, wTradeSequenceItem2
    set  3, [hl]
    ret
GiveTradeItem13:
    ld   hl, wTradeSequenceItem2
    set  4, [hl]
    ret
GiveTradeItem14:
    ld   hl, wTradeSequenceItem2
    set  5, [hl]
    ret

ItemMessageMultiworld:
    ; Check our "item is for other player" flag
    ld   hl, $7300
    call OffsetPointerByRoomNumber
    ld   a, [hl]
    ld   hl, $0055
    cp   [hl]
    jr   nz, ItemMessageForOtherPlayer

ItemMessage:
    ; Fill the custom message slot with this item message.
    call BuildItemMessage
    ldh  a, [$F1]
    ld   d, $00
    ld   e, a
    ld   hl, ItemMessageTable
    add  hl, de
    ld   a, [hl]
    cp   $90
    jr   z, .powerBracelet
    cp   $3D
    jr   z, .shield
    jp   $2385 ; Opendialog in $000-$0FF range

.powerBracelet:
    ; Check the power bracelet level, and give a different message when we get the lv2 bracelet
    ld   hl, $DB43 ; power bracelet level
    bit  1, [hl]
    jp   z, $2385 ; Opendialog in $000-$0FF range
    ld   a, $EE
    jp   $2385 ; Opendialog in $000-$0FF range

.shield:
    ; Check the shield level, and give a different message when we get the lv2 shield
    ld   hl, $DB44 ; shield level
    bit  1, [hl]
    jp   z, $2385 ; Opendialog in $000-$0FF range
    ld   a, $ED
    jp   $2385 ; Opendialog in $000-$0FF range

ItemMessageForOtherPlayer:
    push bc
    push hl
    push af
    call BuildRemoteItemMessage
    ld hl, SpaceFor
    call MessageCopyString
    pop af
    call MessageAddPlayerName
    pop hl
    pop bc
    ;dec  de
    ld   a, $C9
    jp   $2385 ; Opendialog in $000-$0FF range

ItemSpriteTable:
    db $82, $15        ; CHEST_POWER_BRACELET
    db $86, $15        ; CHEST_SHIELD
    db $88, $14        ; CHEST_BOW
    db $8A, $14        ; CHEST_HOOKSHOT
    db $8C, $14        ; CHEST_MAGIC_ROD
    db $98, $16        ; CHEST_PEGASUS_BOOTS
    db $10, $1F        ; CHEST_OCARINA
    db $12, $1D        ; CHEST_FEATHER
    db $96, $17        ; CHEST_SHOVEL
    db $0E, $1C        ; CHEST_MAGIC_POWDER_BAG
    db $80, $15        ; CHEST_BOMB
    db $84, $15        ; CHEST_SWORD
    db $94, $15        ; CHEST_FLIPPERS
    db $9A, $10        ; CHEST_MAGNIFYING_LENS
    db $24, $1C        ; Boomerang
    db $4E, $1C        ; Slime key
    db $A0, $14        ; CHEST_MEDICINE
    db $30, $1C        ; CHEST_TAIL_KEY
    db $32, $1C        ; CHEST_ANGLER_KEY
    db $34, $1C        ; CHEST_FACE_KEY
    db $36, $1C        ; CHEST_BIRD_KEY
    db $3A, $1C        ; CHEST_GOLD_LEAF
    db $40, $1C        ; CHEST_MAP
    db $42, $1D        ; CHEST_COMPASS
    db $44, $1C        ; CHEST_STONE_BEAK
    db $46, $1C        ; CHEST_NIGHTMARE_KEY
    db $4A, $1F        ; CHEST_SMALL_KEY
    db $A6, $15        ; CHEST_RUPEES_50 (normal blue)
    db $38, $19        ; CHEST_RUPEES_20 (red)
    db $38, $18        ; CHEST_RUPEES_100 (green)
    db $38, $1A        ; CHEST_RUPEES_200 (yellow)
    db $38, $1A        ; CHEST_RUPEES_500 (yellow)
    db $9E, $14        ; CHEST_SEASHELL
    db $8A, $14        ; CHEST_MESSAGE
    db $A0, $14        ; CHEST_GEL
    db $4A, $1D        ; KEY1
    db $4A, $1D        ; KEY2
    db $4A, $1D        ; KEY3
    db $4A, $1D        ; KEY4
    db $4A, $1D        ; KEY5
    db $4A, $1D        ; KEY6
    db $4A, $1D        ; KEY7
    db $4A, $1D        ; KEY8
    db $4A, $1D        ; KEY9
    db $40, $1C        ; MAP1
    db $40, $1C        ; MAP2
    db $40, $1C        ; MAP3
    db $40, $1C        ; MAP4
    db $40, $1C        ; MAP5
    db $40, $1C        ; MAP6
    db $40, $1C        ; MAP7
    db $40, $1C        ; MAP8
    db $40, $1C        ; MAP9
    db $42, $1D        ; COMPASS1
    db $42, $1D        ; COMPASS2
    db $42, $1D        ; COMPASS3
    db $42, $1D        ; COMPASS4
    db $42, $1D        ; COMPASS5
    db $42, $1D        ; COMPASS6
    db $42, $1D        ; COMPASS7
    db $42, $1D        ; COMPASS8
    db $42, $1D        ; COMPASS9
    db $44, $1C        ; STONE_BEAK1
    db $44, $1C        ; STONE_BEAK2
    db $44, $1C        ; STONE_BEAK3
    db $44, $1C        ; STONE_BEAK4
    db $44, $1C        ; STONE_BEAK5
    db $44, $1C        ; STONE_BEAK6
    db $44, $1C        ; STONE_BEAK7
    db $44, $1C        ; STONE_BEAK8
    db $44, $1C        ; STONE_BEAK9
    db $46, $1C        ; NIGHTMARE_KEY1
    db $46, $1C        ; NIGHTMARE_KEY2
    db $46, $1C        ; NIGHTMARE_KEY3
    db $46, $1C        ; NIGHTMARE_KEY4
    db $46, $1C        ; NIGHTMARE_KEY5
    db $46, $1C        ; NIGHTMARE_KEY6
    db $46, $1C        ; NIGHTMARE_KEY7
    db $46, $1C        ; NIGHTMARE_KEY8
    db $46, $1C        ; NIGHTMARE_KEY9
    db $4C, $1C        ; Toadstool
    db $AE, $14        ; Guardian Acorn

LargeItemSpriteTable:
    db $AC, $02, $AC, $22 ; heart piece
    db $54, $0A, $56, $0A ; bowwow
    db $2A, $41, $2A, $61 ; 10 arrows
    db $2A, $41, $2A, $61 ; single arrow
    db $0E, $1C, $22, $0C ; powder upgrade
    db $00, $0D, $22, $0C ; bomb upgrade
    db $08, $1C, $22, $0C ; arrow upgrade
    db $48, $0A, $48, $2A ; red tunic
    db $48, $0B, $48, $2B ; blue tunic
    db $2A, $0C, $2A, $2C ; heart container
    db $2A, $0F, $2A, $2F ; bad heart container
    db $70, $09, $70, $29 ; song 1
    db $72, $0B, $72, $2B ; song 2
    db $74, $08, $74, $28 ; song 3
    db $80, $0E, $82, $0E ; Instrument1
    db $84, $0E, $86, $0E ; Instrument2
    db $88, $0E, $8A, $0E ; Instrument3
    db $8C, $0E, $8E, $0E ; Instrument4
    db $90, $0E, $92, $0E ; Instrument5
    db $94, $0E, $96, $0E ; Instrument6
    db $98, $0E, $9A, $0E ; Instrument7
    db $9C, $0E, $9E, $0E ; Instrument8
    db $A6, $2B, $A4, $2B ; Rooster
    db $1A, $0E, $1C, $0E ; TradeItem1
    db $B0, $0C, $B2, $0C ; TradeItem2
    db $B4, $0C, $B6, $0C ; TradeItem3
    db $B8, $0C, $BA, $0C ; TradeItem4
    db $BC, $0C, $BE, $0C ; TradeItem5
    db $C0, $0C, $C2, $0C ; TradeItem6
    db $C4, $0C, $C6, $0C ; TradeItem7
    db $C8, $0C, $CA, $0C ; TradeItem8
    db $CC, $0C, $CE, $0C ; TradeItem9
    db $D0, $0C, $D2, $0C ; TradeItem10
    db $D4, $0D, $D6, $0D ; TradeItem11
    db $D8, $0D, $DA, $0D ; TradeItem12
    db $DC, $0D, $DE, $0D ; TradeItem13
    db $E0, $0D, $E2, $0D ; TradeItem14
    db $14, $42, $14, $62 ; Piece Of Power

ItemMessageTable:
    db $90, $3D, $89, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $D9, $A2
    db $A0, $A1, $A3, $A4, $A5, $E8, $A6, $A7, $A8, $A9, $AA, $AC, $AB, $AD, $AE, $C9
    db $EF, $BE, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9
    db $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9
    ; $40
    db $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9
    db $0F, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
    db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
    db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
    ; $80
    db $4F, $C8, $CA, $CB, $E2, $E3, $E4, $CC, $CD, $2A, $2B, $C9, $C9, $C9, $C9, $C9
    db $C9, $C9, $C9, $C9, $C9, $C9, $B8, $44, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9
    db $C9, $C9, $C9, $C9, $9D, $C9

RenderDroppedKey:
    ;TODO: See EntityInitKeyDropPoint for a few special cases to unload.

RenderHeartPiece:
    ; Check if our chest type is already loaded
    ld   hl, $C2C0
    add  hl, bc
    ld   a, [hl]
    and  a
    jr   nz, .droppedKeyTypeLoaded
    inc  [hl]

    ;Load the chest type from the chest table.
    ld   hl, $7800
    call OffsetPointerByRoomNumber

    ld   a, [hl]
    ldh  [$F1], a ; set currentEntitySpriteVariant
    call $3B0C ; SetEntitySpriteVariant

    and  $80
    ld   hl, $C340
    add  hl, bc
    ld   a, [hl]
    jr   z, .singleSprite
    ; We potentially need to fix the physics flags table to allocate 2 sprites for us
    and  $F8
    or   $02
    ld   [hl], a
    jr .droppedKeyTypeLoaded
.singleSprite:
    and  $F8
    or   $01
    ld   [hl], a
.droppedKeyTypeLoaded:
    jp RenderChestItem


OffsetPointerByRoomNumber:
    ldh  a, [$F6] ; map room
    ld   e, a
    ld   a, [$DBA5] ; is indoor
    ld   d, a
    ldh  a, [$F7]   ; mapId
    cp   $FF
    jr   nz, .notColorDungeon

    ld   d, $03
    jr   .notCavesA

.notColorDungeon:
    cp   $1A
    jr   nc, .notCavesA
    cp   $06
    jr   c, .notCavesA
    inc  d
.notCavesA:
    add  hl, de
    ret

GiveItemAndMessageForRoom:
    ;Load the chest type from the chest table.
    ld   hl, $7800
    call OffsetPointerByRoomNumber
    ld   a, [hl]
    ldh  [$F1], a
    call GiveItemFromChest
    jp ItemMessage

GiveItemAndMessageForRoomMultiworld:
    ;Load the chest type from the chest table.
    ld   hl, $7800
    call OffsetPointerByRoomNumber
    ld   a, [hl]
    ldh  [$F1], a
    call GiveItemFromChestMultiworld
    jp ItemMessageMultiworld

RenderItemForRoom:
    ;Load the chest type from the chest table.
    ld   hl, $7800
    call OffsetPointerByRoomNumber
    ld   a, [hl]
    ldh  [$F1], a
    jp   RenderChestItem

; Increase the amount of checks we completed, unless we are on the multichest room.
IncreaseCheckCounter:
    ldh  a, [$F6] ; map room
    cp   $F2
    jr   nz, .noMultiChest
    ld   a, [$DBA5] ; is indoor
    and  a
    jr   z, .noMultiChest
    ldh  a, [$F7]   ; mapId
    cp   $0A
    ret  z

.noMultiChest:
    call $27D0 ; Enable SRAM
    ld   hl, $B010
.loop:
    ld   a, [hl]
    and  a ; clear carry flag
    inc  a
    daa
    ldi  [hl], a
    ret  nc
    jr   .loop
