The following bugs were found while working on this. # Armor/Weapon Cap Logic Swapped When equipping the Battle Suit, the code checks to make sure the weapons slots aren't overflowed. Roughly: ```c void Player_PickUpBattleSuit() { ... i = NumberOfWeapons; if (NumberOfWeapons >= 4) { i = 3; } ArmorInventory[i] = ARMOR_BATTLE_SUIT; NumberOfArmors = i + 1; } ``` And similarly, when picking up the Dragon Slayer: ```c void Player_PickUpDragonSlayer() { ... i = NumberOfArmors; if (NumberOfArmors >= 4) { i = 3; } WeaponInventory[i] = WEAPON_DRAGON_SLAYER; NumberOfWeapons = i + 1; } ``` This has the effect of setting the wrong index for the Dragon Slayer or Battle Suit, based on which armor/weapons you have when you equip either. This doesn't seem to truly impact the game, as there's code that checks if you have all three and then sets your inventory. But it's possible that this result in an empty item slot or prevent acquiring other armors/weapons, overwriting them when the Dragon Slayer/Battle Suit are picked up. # Bad "Can Climb" Ladder Check When checking if a ladder can be climbed from side to side, the code does this: ```asm LDA #0x3 JSR Player_CheckIfPassable ``` That _should_ be `LDX`. This function checks the direction to move in, stored in `X`. But this caller is passing in `A`, meaning the function will operate on whatever value was last in `X` instead. Probably not exploitable, but worth checking further. # First Level Loading Bug Whenever a level is loaded, there's a lookup to grab the bank where the level data lives and to then grab screen data. Both should be keyed off the index of the region of the game. However, when loading the very first screen in the game, a mistake resulted in using the resulting _bank_ as the index into the screens, rather than the _area index_. This means if you try to move the first level into another bank, you get an out-of-bounds lookup and corruption.