Many updates
-Set most flags for hard mode (todo: fix shield prices) -Stop writing a flag that used to set pyramid respawns (it now messes with Cape quarter magic cost in the spike cave) -KevinCathcart's checksum fix -KevinCathcart fix for not placing Maps/Compasses
This commit is contained in:
		
							parent
							
								
									f9b456313d
								
							
						
					
					
						commit
						0ebeac5727
					
				
							
								
								
									
										50
									
								
								Rom.py
								
								
								
								
							
							
						
						
									
										50
									
								
								Rom.py
								
								
								
								
							| 
						 | 
				
			
			@ -67,8 +67,7 @@ class LocalRom(object):
 | 
			
		|||
            raise RuntimeError('Provided Base Rom unsuitable for patching. Please provide a JAP(1.0) "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc" rom to use as a base.')
 | 
			
		||||
 | 
			
		||||
    def write_crc(self):
 | 
			
		||||
        # this does not seem to work
 | 
			
		||||
        crc = sum(self.buffer[:0x7FEB] + self.buffer[0x7FF5:]) % 0xFFFF
 | 
			
		||||
        crc = (sum(self.buffer[:0x7FDC] + self.buffer[0x7FE0:]) + 0x01FE) & 0xFFFF
 | 
			
		||||
        inv = crc ^ 0xFFFF
 | 
			
		||||
        self.write_bytes(0x7FDC, [inv & 0xFF, (inv >> 8) & 0xFF, crc & 0xFF, (crc >> 8) & 0xFF])
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +85,7 @@ def patch_rom(world, rom, hashtable, beep='normal', sprite=None):
 | 
			
		|||
            # Keys in their native dungeon should use the orignal item code for keys
 | 
			
		||||
            if location.parent_region.dungeon:
 | 
			
		||||
                dungeon = location.parent_region.dungeon
 | 
			
		||||
                if location.item.key and dungeon.is_dungeon_item(location.item):
 | 
			
		||||
                if location.item is not None and location.item.key and dungeon.is_dungeon_item(location.item):
 | 
			
		||||
                    if location.item.type == "BigKey":
 | 
			
		||||
                        itemid = 0x32
 | 
			
		||||
                    if location.item.type == "SmallKey":
 | 
			
		||||
| 
						 | 
				
			
			@ -164,17 +163,46 @@ def patch_rom(world, rom, hashtable, beep='normal', sprite=None):
 | 
			
		|||
 | 
			
		||||
    # handle difficulty
 | 
			
		||||
    if world.difficulty == 'hard':
 | 
			
		||||
        # Spike Cave Damage
 | 
			
		||||
        rom.write_byte(0x180168, 0x02)
 | 
			
		||||
        # Powdered Fairies Prize
 | 
			
		||||
        rom.write_byte(0x36DD0, 0x79)  # Bee
 | 
			
		||||
        rom.write_byte(0x36DD0, 0xD8)  # One Heart
 | 
			
		||||
        # potion heal amount
 | 
			
		||||
        rom.write_byte(0x180084, 0x28)  # Five Hearts
 | 
			
		||||
        # potion magic restore amount
 | 
			
		||||
        rom.write_byte(0x180085, 0x40)  # Half Magic
 | 
			
		||||
        #Cape magic cost
 | 
			
		||||
        rom.write_bytes(0x3ADA7, [0x02, 0x02, 0x02])
 | 
			
		||||
        #Byrna residual magic cost
 | 
			
		||||
        rom.write_bytes(0x3ADA7, [0x08, 0x08, 0x08])
 | 
			
		||||
        #Disable catching fairies
 | 
			
		||||
        rom.write_byte(0x34FD6, 0x80)
 | 
			
		||||
        #To-do: Implement shield price hikes
 | 
			
		||||
    elif world.difficulty == 'expert':
 | 
			
		||||
        # Powdered Fairies Prize
 | 
			
		||||
        rom.write_byte(0x36DD0, 0x79)  # Bees
 | 
			
		||||
        # potion heal amount
 | 
			
		||||
        rom.write_byte(0x180084, 0x08)  # One Heart
 | 
			
		||||
        # potion magic restore amount
 | 
			
		||||
        rom.write_byte(0x180085, 0x20)  # Quarter Magic
 | 
			
		||||
        #Cape magic cost
 | 
			
		||||
        rom.write_bytes(0x3ADA7, [0x02, 0x02, 0x02])
 | 
			
		||||
        #Byrna residual magic cost
 | 
			
		||||
        rom.write_bytes(0x3ADA7, [0x08, 0x08, 0x08])
 | 
			
		||||
        #Disable catching fairies
 | 
			
		||||
        rom.write_byte(0x34FD6, 0x80)
 | 
			
		||||
    elif world.difficulty == 'insane':
 | 
			
		||||
        # Powdered Fairies Prize
 | 
			
		||||
        rom.write_byte(0x36DD0, 0x79)  # Bees
 | 
			
		||||
        # potion heal amount
 | 
			
		||||
        rom.write_byte(0x180084, 0x00)  # No healing
 | 
			
		||||
        # potion magic restore amount
 | 
			
		||||
        rom.write_byte(0x180085, 0x00)  # No healing
 | 
			
		||||
        #Cape magic cost
 | 
			
		||||
        rom.write_bytes(0x3ADA7, [0x02, 0x02, 0x02])
 | 
			
		||||
        #Byrna residual magic cost
 | 
			
		||||
        rom.write_bytes(0x3ADA7, [0x08, 0x08, 0x08])
 | 
			
		||||
        #Disable catching fairies
 | 
			
		||||
        rom.write_byte(0x34FD6, 0x80)
 | 
			
		||||
    else:
 | 
			
		||||
        # Spike Cave Damage
 | 
			
		||||
        rom.write_byte(0x180168, 0x08)
 | 
			
		||||
        # Powdered Fairies Prize
 | 
			
		||||
        rom.write_byte(0x36DD0, 0xE3)  # fairy
 | 
			
		||||
        # potion heal amount
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +239,7 @@ def patch_rom(world, rom, hashtable, beep='normal', sprite=None):
 | 
			
		|||
    rom.write_bytes(0x37A78, prizes)
 | 
			
		||||
 | 
			
		||||
    # prize pack drop chances
 | 
			
		||||
    if world.difficulty == 'hard':
 | 
			
		||||
    if world.difficulty in ['hard', 'expert', 'insane']:
 | 
			
		||||
        droprates = [0x01, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04]  # 50%, 25%, 3* 12.5%, 2* 6.25%
 | 
			
		||||
    else:
 | 
			
		||||
        droprates = [0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01]  # 50%
 | 
			
		||||
| 
						 | 
				
			
			@ -305,7 +333,9 @@ def patch_rom(world, rom, hashtable, beep='normal', sprite=None):
 | 
			
		|||
    rom.write_byte(0x180030, 0x00)  # Disable SRAM trace
 | 
			
		||||
    rom.write_byte(0x180036, 0x0A)  # Rupoor negative value
 | 
			
		||||
    rom.write_byte(0x180169, 0x01 if world.lock_aga_door_in_escape else 0x00)  # Lock or unlock aga tower door during escape sequence.
 | 
			
		||||
    rom.write_byte(0x180170, 0x01 if world.ganon_at_pyramid else 0x00)  # Enable respawning on pyramid after ganon death
 | 
			
		||||
# This seems to correlate to 1/4 magic Cape cost in the spike cave in v27. Important: figure out where this hack moved.
 | 
			
		||||
#    rom.write_byte(0x180170, 0x01 if world.ganon_at_pyramid else 0x00)  # Enable respawning on pyramid after ganon death
 | 
			
		||||
    rom.write_byte(0x180168, 0x08)  # Spike Cave Damage
 | 
			
		||||
    rom.write_byte(0x180086, 0x00 if world.aga_randomness else 0x01)  # set blue ball and ganon warp randomness
 | 
			
		||||
    rom.write_byte(0x1800A1, 0x01)  # enable overworld screen transition draining for water level inside swamp
 | 
			
		||||
    if world.goal in ['ganon']:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue