94 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from ..roomEditor import RoomEditor, Object
							 | 
						||
| 
								 | 
							
								from ..assembler import ASM
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def fixAll(rom):
							 | 
						||
| 
								 | 
							
								    # Prevent soft locking in the first mountain cave if we do not have a feather
							 | 
						||
| 
								 | 
							
								    re = RoomEditor(rom, 0x2B7)
							 | 
						||
| 
								 | 
							
								    re.removeObject(3, 3)
							 | 
						||
| 
								 | 
							
								    re.store(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Prevent getting stuck in the sidescroll room in the beginning of dungeon 5
							 | 
						||
| 
								 | 
							
								    re = RoomEditor(rom, 0x1A9)
							 | 
						||
| 
								 | 
							
								    re.objects[6].count = 7
							 | 
						||
| 
								 | 
							
								    re.store(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Cave that allows you to escape from D4 without flippers, make it no longer require a feather
							 | 
						||
| 
								 | 
							
								    re = RoomEditor(rom, 0x1EA)
							 | 
						||
| 
								 | 
							
								    re.objects[9].count = 8
							 | 
						||
| 
								 | 
							
								    re.removeObject(5, 4)
							 | 
						||
| 
								 | 
							
								    re.moveObject(4, 4, 7, 5)
							 | 
						||
| 
								 | 
							
								    re.store(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # D3 west side room requires feather to get the key. But feather is not required to unlock the door, potentially softlocking you.
							 | 
						||
| 
								 | 
							
								    re = RoomEditor(rom, 0x155)
							 | 
						||
| 
								 | 
							
								    re.changeObject(4, 1, 0xcf)
							 | 
						||
| 
								 | 
							
								    re.changeObject(4, 6, 0xd0)
							 | 
						||
| 
								 | 
							
								    re.store(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # D3 boots room requires boots to escape
							 | 
						||
| 
								 | 
							
								    re = RoomEditor(rom, 0x146)
							 | 
						||
| 
								 | 
							
								    re.removeObject(5, 6)
							 | 
						||
| 
								 | 
							
								    re.store(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    allowRaftGameWithoutFlippers(rom)
							 | 
						||
| 
								 | 
							
								    # We cannot access thes holes in logic:
							 | 
						||
| 
								 | 
							
								    # removeBirdKeyHoleDrop(rom)
							 | 
						||
| 
								 | 
							
								    fixDoghouse(rom)
							 | 
						||
| 
								 | 
							
								    flameThrowerShieldRequirement(rom)
							 | 
						||
| 
								 | 
							
								    fixLessThen3MaxHealth(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def fixDoghouse(rom):
							 | 
						||
| 
								 | 
							
								    # Fix entering the dog house from the back, and ending up out of bounds.
							 | 
						||
| 
								 | 
							
								    re = RoomEditor(rom, 0x0A1)
							 | 
						||
| 
								 | 
							
								    re.objects.append(Object(6, 2, 0x0E2))
							 | 
						||
| 
								 | 
							
								    re.objects.append(re.objects[20])  # Move the flower patch after the warp entry definition so it overrules the tile
							 | 
						||
| 
								 | 
							
								    re.objects.append(re.objects[3])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    re.objects.pop(22)
							 | 
						||
| 
								 | 
							
								    re.objects.pop(21)
							 | 
						||
| 
								 | 
							
								    re.objects.pop(20)  # Remove the flower patch at the normal entry index
							 | 
						||
| 
								 | 
							
								    re.objects.pop(11)  # Duplicate object, we can just remove it, gives room for our custom entry door
							 | 
						||
| 
								 | 
							
								    re.store(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def allowRaftGameWithoutFlippers(rom):
							 | 
						||
| 
								 | 
							
								    # Allow jumping down the waterfall in the raft game without the flippers.
							 | 
						||
| 
								 | 
							
								    rom.patch(0x02, 0x2E8F, ASM("ld a, [$DB0C]"), ASM("ld a, $01"), fill_nop=True)
							 | 
						||
| 
								 | 
							
								    # Change the room that goes back up to the raft game from the bottom, so we no longer need flippers
							 | 
						||
| 
								 | 
							
								    re = RoomEditor(rom, 0x1F7)
							 | 
						||
| 
								 | 
							
								    re.changeObject(3, 2, 0x1B)
							 | 
						||
| 
								 | 
							
								    re.changeObject(2, 3, 0x1B)
							 | 
						||
| 
								 | 
							
								    re.changeObject(3, 4, 0x1B)
							 | 
						||
| 
								 | 
							
								    re.changeObject(4, 5, 0x1B)
							 | 
						||
| 
								 | 
							
								    re.changeObject(6, 6, 0x1B)
							 | 
						||
| 
								 | 
							
								    re.store(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def removeBirdKeyHoleDrop(rom):
							 | 
						||
| 
								 | 
							
								    # Prevent the cave with the bird key from dropping you in the water
							 | 
						||
| 
								 | 
							
								    # (if you do not have flippers this would softlock you)
							 | 
						||
| 
								 | 
							
								    rom.patch(0x02, 0x1176, ASM("""
							 | 
						||
| 
								 | 
							
								        ldh a, [$F7]
							 | 
						||
| 
								 | 
							
								        cp $0A
							 | 
						||
| 
								 | 
							
								        jr nz, $30
							 | 
						||
| 
								 | 
							
								    """), ASM("""
							 | 
						||
| 
								 | 
							
								        nop
							 | 
						||
| 
								 | 
							
								        nop
							 | 
						||
| 
								 | 
							
								        nop
							 | 
						||
| 
								 | 
							
								        nop
							 | 
						||
| 
								 | 
							
								        jr $30
							 | 
						||
| 
								 | 
							
								    """))
							 | 
						||
| 
								 | 
							
								    # Remove the hole that drops you all the way from dungeon7 entrance to the water in the cave
							 | 
						||
| 
								 | 
							
								    re = RoomEditor(rom, 0x01E)
							 | 
						||
| 
								 | 
							
								    re.removeObject(5, 4)
							 | 
						||
| 
								 | 
							
								    re.store(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def flameThrowerShieldRequirement(rom):
							 | 
						||
| 
								 | 
							
								    # if you somehow get a lvl3 shield or higher, it no longer works against the flamethrower, easy fix.
							 | 
						||
| 
								 | 
							
								    rom.patch(0x03, 0x2EBA,
							 | 
						||
| 
								 | 
							
								        ASM("ld a, [$DB44]\ncp $02\nret nz"),  # if not shield level 2
							 | 
						||
| 
								 | 
							
								        ASM("ld a, [$DB44]\ncp $02\nret c"))  # if not shield level 2 or higher
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def fixLessThen3MaxHealth(rom):
							 | 
						||
| 
								 | 
							
								    # The table that starts your start HP when you die is not working for less then 3 HP, and locks the game.
							 | 
						||
| 
								 | 
							
								    rom.patch(0x01, 0x1295, "18181818", "08081018")
							 |