Compare commits
27
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e10673e31 | ||
|
|
f1374daf96 | ||
|
|
bcdc8ce726 | ||
|
|
df928f0378 | ||
|
|
4415ef5cfb | ||
|
|
1644535557 | ||
|
|
db87f57c4f | ||
|
|
626a37ea4b | ||
|
|
dcc4121c43 | ||
|
|
444ebda072 | ||
|
|
2055ed6d96 | ||
|
|
1a9cea452d | ||
|
|
8451a64984 | ||
|
|
f5dde931dc | ||
|
|
b82ec31f98 | ||
|
|
2ff19b3781 | ||
|
|
5278f9f2c6 | ||
|
|
be35ed4451 | ||
|
|
0a18bda341 | ||
|
|
1e2097c3dc | ||
|
|
f4e6308a5d | ||
|
|
2738f61c0d | ||
|
|
b189de00c6 | ||
|
|
f3dd0319ed | ||
|
|
077ba85e9d | ||
|
|
3c6239fe95 | ||
|
|
3bb0d82cab |
@@ -65,6 +65,7 @@ class InitialSram:
|
|||||||
equip[0x36C] = 0x18
|
equip[0x36C] = 0x18
|
||||||
equip[0x36D] = 0x18
|
equip[0x36D] = 0x18
|
||||||
equip[0x379] = 0x68
|
equip[0x379] = 0x68
|
||||||
|
self._initial_sram_bytes[0x3C0] = 0x04 # PikitItem starts as shield
|
||||||
starting_bomb_cap_upgrades = 10 if not world.bombbag[player] else 0
|
starting_bomb_cap_upgrades = 10 if not world.bombbag[player] else 0
|
||||||
starting_arrow_cap_upgrades = 30
|
starting_arrow_cap_upgrades = 30
|
||||||
starting_bombs = 0
|
starting_bombs = 0
|
||||||
|
|||||||
+4
-4
@@ -1191,10 +1191,10 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt
|
|||||||
thisbottle = random.choice(diff.bottles)
|
thisbottle = random.choice(diff.bottles)
|
||||||
pool.append(thisbottle)
|
pool.append(thisbottle)
|
||||||
|
|
||||||
if want_progressives():
|
# if want_progressives():
|
||||||
pool.extend(diff.progressiveshield)
|
# pool.extend(diff.progressiveshield)
|
||||||
else:
|
# else:
|
||||||
pool.extend(diff.basicshield)
|
# pool.extend(diff.basicshield)
|
||||||
|
|
||||||
if want_progressives():
|
if want_progressives():
|
||||||
pool.extend(diff.progressivearmor)
|
pool.extend(diff.progressivearmor)
|
||||||
|
|||||||
@@ -134,9 +134,9 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'Bow!\nJoin the archer class
|
|||||||
'Big Key (Agahnims Tower)': (False, False, 'BigKey', 0x9B, 60, 'A big key for\nAgahnim\'s Tower', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Castle Tower'),
|
'Big Key (Agahnims Tower)': (False, False, 'BigKey', 0x9B, 60, 'A big key for\nAgahnim\'s Tower', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Castle Tower'),
|
||||||
'Compass (Agahnims Tower)': (False, True, 'Compass', 0x8B, 10, 'A compass for\nAgahnim\'s Tower', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds null again', 'a compass to Castle Tower'),
|
'Compass (Agahnims Tower)': (False, True, 'Compass', 0x8B, 10, 'A compass for\nAgahnim\'s Tower', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds null again', 'a compass to Castle Tower'),
|
||||||
'Map (Agahnims Tower)': (False, True, 'Map', 0x7B, 10, 'A tightly folded map rests here', 'and the map', 'cartography kid', 'map for sale', 'a map to shrooms', 'map boy navigates again', 'a map to Castle Tower'),
|
'Map (Agahnims Tower)': (False, True, 'Map', 0x7B, 10, 'A tightly folded map rests here', 'and the map', 'cartography kid', 'map for sale', 'a map to shrooms', 'map boy navigates again', 'a map to Castle Tower'),
|
||||||
'Small Key (Palace of Darkness)': (False, False, 'SmallKey', 0xA6, 40, 'A small key for\nDark Palace', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Palace of Darkness'),
|
'Small Key (Palace of Darkness)': (False, False, 'SmallKey', 0xA6, 40, 'A small key for\nPalace of Darkness', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Palace of Darkness'),
|
||||||
'Big Key (Palace of Darkness)': (False, False, 'BigKey', 0x99, 60, 'A big key for\nDark Palace', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Palace of Darkness'),
|
'Big Key (Palace of Darkness)': (False, False, 'BigKey', 0x99, 60, 'A big key for\nPalace of Darkness', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Palace of Darkness'),
|
||||||
'Compass (Palace of Darkness)': (False, True, 'Compass', 0x89, 10, 'A compass for\nDark Palace', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds boss again', 'a compass to Palace of Darkness'),
|
'Compass (Palace of Darkness)': (False, True, 'Compass', 0x89, 10, 'A compass for\nPalace of Darkness', 'and the compass', 'the magnetic kid', 'compass for sale', 'magnetic fungus', 'compass boy finds boss again', 'a compass to Palace of Darkness'),
|
||||||
'Map (Palace of Darkness)': (False, True, 'Map', 0x79, 20, 'A tightly folded map rests here', 'and the map', 'cartography kid', 'map for sale', 'a map to shrooms', 'map boy navigates again', 'a map to Palace of Darkness'),
|
'Map (Palace of Darkness)': (False, True, 'Map', 0x79, 20, 'A tightly folded map rests here', 'and the map', 'cartography kid', 'map for sale', 'a map to shrooms', 'map boy navigates again', 'a map to Palace of Darkness'),
|
||||||
'Small Key (Thieves Town)': (False, False, 'SmallKey', 0xAB, 40, 'A small key for\nThieves Town', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Thieves\' Town'),
|
'Small Key (Thieves Town)': (False, False, 'SmallKey', 0xAB, 40, 'A small key for\nThieves Town', 'and the key', 'the unlocking kid', 'keys for sale', 'unlock the fungus', 'key boy opens door again', 'a small key to Thieves\' Town'),
|
||||||
'Big Key (Thieves Town)': (False, False, 'BigKey', 0x94, 60, 'A big key for\nThieves Town', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Thieves\' Town'),
|
'Big Key (Thieves Town)': (False, False, 'BigKey', 0x94, 60, 'A big key for\nThieves Town', 'and the big key', 'the big-unlock kid', 'big key for sale', 'face key fungus', 'key boy opens chest again', 'a big key to Thieves\' Town'),
|
||||||
|
|||||||
@@ -509,7 +509,7 @@ boots_clips = [
|
|||||||
|
|
||||||
mirror_clips_local = [
|
mirror_clips_local = [
|
||||||
('Desert East Mirror Clip', 'Mire Area', 'Desert Mouth'),
|
('Desert East Mirror Clip', 'Mire Area', 'Desert Mouth'),
|
||||||
('EDDM Mirror Clip', 'East Dark Death Mountain (Bottom Left)', 'East Dark Death Mountain (Bottom)'),
|
('EDDM Bridge Mirror Clip', 'East Dark Death Mountain (Bottom Left)', 'East Dark Death Mountain (Bottom)'),
|
||||||
('EDDM Mirror Clip', 'East Dark Death Mountain (Top)', 'Dark Death Mountain Ledge')
|
('EDDM Mirror Clip', 'East Dark Death Mountain (Top)', 'Dark Death Mountain Ledge')
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -520,4 +520,4 @@ mirror_clips = [
|
|||||||
mirror_offsets = [
|
mirror_offsets = [
|
||||||
(['DM Offset Mirror', 'DDM Offset Mirror'], ['West Death Mountain (Bottom)', 'West Dark Death Mountain (Bottom)'], ['Hyrule Castle Courtyard Northeast', 'Pyramid Crack'], ['Pyramid Area', 'Hyrule Castle Courtyard']),
|
(['DM Offset Mirror', 'DDM Offset Mirror'], ['West Death Mountain (Bottom)', 'West Dark Death Mountain (Bottom)'], ['Hyrule Castle Courtyard Northeast', 'Pyramid Crack'], ['Pyramid Area', 'Hyrule Castle Courtyard']),
|
||||||
(['DM To HC Ledge Offset Mirror', 'DDM To Pyramid Offset Mirror'], ['West Death Mountain (Bottom)', 'West Dark Death Mountain (Bottom)'], ['Hyrule Castle Ledge', 'Pyramid Area'], ['Pyramid Area', 'Hyrule Castle Area'])
|
(['DM To HC Ledge Offset Mirror', 'DDM To Pyramid Offset Mirror'], ['West Death Mountain (Bottom)', 'West Dark Death Mountain (Bottom)'], ['Hyrule Castle Ledge', 'Pyramid Area'], ['Pyramid Area', 'Hyrule Castle Area'])
|
||||||
]
|
]
|
||||||
|
|||||||
+3
-3
@@ -1178,7 +1178,7 @@ def create_shops(world, player):
|
|||||||
if (world.is_tile_swapped(0x35, player) and region_name == 'Dark Lake Hylia Shop') \
|
if (world.is_tile_swapped(0x35, player) and region_name == 'Dark Lake Hylia Shop') \
|
||||||
or (not world.is_tile_swapped(0x35, player) and region_name == 'Lake Hylia Shop'):
|
or (not world.is_tile_swapped(0x35, player) and region_name == 'Lake Hylia Shop'):
|
||||||
locked = True
|
locked = True
|
||||||
inventory = [('Blue Potion', 160), ('Blue Shield', 50), ('Bombs (10)', 50)]
|
inventory = [('Blue Potion', 160), ('Small Heart', 10), ('Bombs (10)', 50)]
|
||||||
custom = True
|
custom = True
|
||||||
region = world.get_region(region_name, player)
|
region = world.get_region(region_name, player)
|
||||||
shop = Shop(region, room_id, type, shopkeeper, custom, locked, sram)
|
shop = Shop(region, room_id, type, shopkeeper, custom, locked, sram)
|
||||||
@@ -1366,11 +1366,11 @@ bonk_table_by_location = {y: x for x, y in bonk_table_by_location_id.items()}
|
|||||||
# (room_id, type, shopkeeper, custom, locked, [items])
|
# (room_id, type, shopkeeper, custom, locked, [items])
|
||||||
# item = (item, price, max=0, replacement=None, replacement_price=0)
|
# item = (item, price, max=0, replacement=None, replacement_price=0)
|
||||||
_basic_shop_defaults = [('Red Potion', 150), ('Small Heart', 10), ('Bombs (10)', 50)]
|
_basic_shop_defaults = [('Red Potion', 150), ('Small Heart', 10), ('Bombs (10)', 50)]
|
||||||
_dark_world_shop_defaults = [('Red Potion', 150), ('Blue Shield', 50), ('Bombs (10)', 50)]
|
_dark_world_shop_defaults = [('Red Potion', 150), ('Small Heart', 10), ('Bombs (10)', 50)]
|
||||||
shop_table = {
|
shop_table = {
|
||||||
'Dark Death Mountain Shop': (0x0112, ShopType.Shop, 0xC1, False, False, _basic_shop_defaults, 0),
|
'Dark Death Mountain Shop': (0x0112, ShopType.Shop, 0xC1, False, False, _basic_shop_defaults, 0),
|
||||||
'Red Shield Shop': (0x0110, ShopType.Shop, 0xC1, False, False,
|
'Red Shield Shop': (0x0110, ShopType.Shop, 0xC1, False, False,
|
||||||
[('Red Shield', 500), ('Bee', 10), ('Arrows (10)', 30)], 3),
|
[('Bombs (10)', 50), ('Bee', 10), ('Arrows (10)', 30)], 3),
|
||||||
'Dark Lake Hylia Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 6),
|
'Dark Lake Hylia Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 6),
|
||||||
'Dark Lumberjack Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 9),
|
'Dark Lumberjack Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 9),
|
||||||
'Village of Outcasts Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 12),
|
'Village of Outcasts Shop': (0x010F, ShopType.Shop, 0xC1, False, False, _dark_world_shop_defaults, 12),
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ from Utils import int16_as_bytes, int32_as_bytes, local_path, snes_to_pc
|
|||||||
from Versions import DRVersion, GKVersion, ORVersion
|
from Versions import DRVersion, GKVersion, ORVersion
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = '100c3e1da68680a0f3d8e1fc94568de6'
|
RANDOMIZERBASEHASH = '9f8a697ae6a610c8192503b299e2cfad'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
@@ -737,8 +737,8 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
|||||||
dr_flags = DROptions.NoOptions
|
dr_flags = DROptions.NoOptions
|
||||||
if world.mirrorscroll[player] or world.doorShuffle[player] != 'vanilla':
|
if world.mirrorscroll[player] or world.doorShuffle[player] != 'vanilla':
|
||||||
dr_flags |= DROptions.Town_Portal
|
dr_flags |= DROptions.Town_Portal
|
||||||
if world.doorShuffle[player] == 'vanilla':
|
# if world.doorShuffle[player] == 'vanilla':
|
||||||
dr_flags |= DROptions.Eternal_Mini_Bosses
|
# dr_flags |= DROptions.Eternal_Mini_Bosses
|
||||||
if world.doorShuffle[player] not in ['vanilla', 'basic']:
|
if world.doorShuffle[player] not in ['vanilla', 'basic']:
|
||||||
dr_flags |= DROptions.Map_Info
|
dr_flags |= DROptions.Map_Info
|
||||||
if ((world.collection_rate[player] or world.goal[player] == 'completionist')
|
if ((world.collection_rate[player] or world.goal[player] == 'completionist')
|
||||||
@@ -948,7 +948,7 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
|||||||
rom.write_byte(cr_pc+0x1e, 0xEE) # slash
|
rom.write_byte(cr_pc+0x1e, 0xEE) # slash
|
||||||
rom.write_byte(cr_pc+0x1f, thousands_bot)
|
rom.write_byte(cr_pc+0x1f, thousands_bot)
|
||||||
# modify stat config
|
# modify stat config
|
||||||
stat_address = 0x23983E
|
stat_address = 0x239888
|
||||||
stat_pc = snes_to_pc(stat_address)
|
stat_pc = snes_to_pc(stat_address)
|
||||||
rom.write_byte(stat_pc, 0xa9) # change to pos 21 (from b1)
|
rom.write_byte(stat_pc, 0xa9) # change to pos 21 (from b1)
|
||||||
rom.write_byte(stat_pc+2, 0xc0) # change to 12 bits (from a0)
|
rom.write_byte(stat_pc+2, 0xc0) # change to 12 bits (from a0)
|
||||||
@@ -1007,6 +1007,10 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
|||||||
rom.write_bytes(0x6D31B, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E])
|
rom.write_bytes(0x6D31B, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E])
|
||||||
rom.write_bytes(0x6D323, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E])
|
rom.write_bytes(0x6D323, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E])
|
||||||
|
|
||||||
|
bridge_item = world.get_location("Hobo", player).item
|
||||||
|
if bridge_item is None or not bridge_item.name.startswith("Bottle"):
|
||||||
|
rom.write_bytes(0x1E9C0, [0xFB, 0xFF, 0x03, 0x00, 0xAB, 0x00, 0x00, 0x00])
|
||||||
|
|
||||||
# set light cones
|
# set light cones
|
||||||
if world.dark_rooms[player] == 'no_dark_rooms':
|
if world.dark_rooms[player] == 'no_dark_rooms':
|
||||||
light_cone = 0x20
|
light_cone = 0x20
|
||||||
@@ -1497,37 +1501,40 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
|||||||
loot_source = 0x09
|
loot_source = 0x09
|
||||||
if world.prizeshuffle[player] != 'none':
|
if world.prizeshuffle[player] != 'none':
|
||||||
loot_source |= 0x10
|
loot_source |= 0x10
|
||||||
if world.pottery[player] not in ['none', 'cave']:
|
if world.pottery[player] != 'none':
|
||||||
loot_source |= 0x02
|
loot_source |= 0x02
|
||||||
if world.dropshuffle[player] != 'none':
|
if world.dropshuffle[player] != 'none':
|
||||||
loot_source |= 0x04
|
loot_source |= 0x04
|
||||||
rom.write_byte(0x1CFF10, loot_source)
|
rom.write_byte(0x1CFF20, loot_source)
|
||||||
|
|
||||||
if world.loothud[player] == 'never':
|
if world.loothud[player] == 'never':
|
||||||
rom.write_byte(0x1CFF12, 0x00)
|
rom.write_bytes(0x1CFF10, [0x00, 0x00, 0x00, 0x00])
|
||||||
|
rom.write_byte(0x1CFF17, 0x00)
|
||||||
elif world.loothud[player] == 'presence':
|
elif world.loothud[player] == 'presence':
|
||||||
rom.write_byte(0x1CFF12, 0x01)
|
rom.write_bytes(0x1CFF10, [0x01, 0x01, 0x00, 0x00])
|
||||||
rom.write_bytes(0x1CFF0E, [0x01, 0x01])
|
rom.write_byte(0x1CFF17, 0x01)
|
||||||
elif world.loothud[player] == 'value':
|
elif world.loothud[player] == 'value':
|
||||||
rom.write_byte(0x1CFF12, 0x01)
|
rom.write_bytes(0x1CFF10, [0x03, 0x03, 0x00, 0x00])
|
||||||
rom.write_bytes(0x1CFF0E, [0xFF, 0xFF])
|
rom.write_byte(0x1CFF17, 0x01)
|
||||||
elif world.loothud[player] == 'dungeon_value':
|
elif world.loothud[player] == 'dungeon_value':
|
||||||
rom.write_byte(0x1CFF12, 0x01)
|
rom.write_bytes(0x1CFF10, [0x01, 0x03, 0x00, 0x00])
|
||||||
rom.write_bytes(0x1CFF0E, [0xFF, 0x01])
|
rom.write_byte(0x1CFF17, 0x01)
|
||||||
|
elif world.loothud[player] == 'cave_value':
|
||||||
|
rom.write_bytes(0x1CFF10, [0x03, 0x01, 0x00, 0x00])
|
||||||
|
rom.write_byte(0x1CFF17, 0x01)
|
||||||
|
|
||||||
if world.showloot[player] == 'never':
|
if world.showloot[player] == 'never':
|
||||||
rom.write_bytes(0x1CFF08, [0x00, 0x00, 0x00, 0x00])
|
rom.write_bytes(0x1CFF08, [0x00, 0x00, 0x00, 0x00])
|
||||||
rom.write_byte(0x1CFF11, 0x00)
|
rom.write_byte(0x1CFF0F, 0x00)
|
||||||
rom.write_byte(0x1CFF12, 0x00) # turn off hud icon too just to be safe
|
|
||||||
elif world.showloot[player] == 'presence':
|
elif world.showloot[player] == 'presence':
|
||||||
rom.write_bytes(0x1CFF08, [0x01, 0x00, 0x00, 0x00])
|
rom.write_bytes(0x1CFF08, [0x01, 0x00, 0x00, 0x00])
|
||||||
rom.write_byte(0x1CFF11, 0x00)
|
rom.write_byte(0x1CFF0F, 0x01)
|
||||||
elif world.showloot[player] == 'compass':
|
elif world.showloot[player] == 'compass':
|
||||||
rom.write_bytes(0x1CFF08, [0x01, 0x00, 0x02, 0x00])
|
rom.write_bytes(0x1CFF08, [0x02, 0x00, 0x03, 0x00])
|
||||||
rom.write_byte(0x1CFF11, 0x01)
|
rom.write_byte(0x1CFF0F, 0x01)
|
||||||
elif world.showloot[player] == 'always':
|
elif world.showloot[player] == 'always':
|
||||||
rom.write_bytes(0x1CFF08, [0x02, 0x00, 0x00, 0x00])
|
rom.write_bytes(0x1CFF08, [0x03, 0x00, 0x00, 0x00])
|
||||||
rom.write_byte(0x1CFF11, 0x00)
|
rom.write_byte(0x1CFF0F, 0x01)
|
||||||
|
|
||||||
if world.showmap[player] == 'visited':
|
if world.showmap[player] == 'visited':
|
||||||
rom.write_bytes(0x1CFF00, [0x01, 0x00, 0x00, 0x05])
|
rom.write_bytes(0x1CFF00, [0x01, 0x00, 0x00, 0x05])
|
||||||
@@ -1541,7 +1548,7 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
|||||||
rom.write_byte(loot_icons + 0x52, 0x0B) # bomb bag is major
|
rom.write_byte(loot_icons + 0x52, 0x0B) # bomb bag is major
|
||||||
|
|
||||||
triforce_piece_ids = [0x6B, 0x6C]
|
triforce_piece_ids = [0x6B, 0x6C]
|
||||||
if world.treasure_hunt_count[player] > 20:
|
if world.treasure_hunt_count[player] > 100:
|
||||||
for triforce_piece_id in triforce_piece_ids:
|
for triforce_piece_id in triforce_piece_ids:
|
||||||
rom.write_byte(loot_icons + triforce_piece_id, 0x04)
|
rom.write_byte(loot_icons + triforce_piece_id, 0x04)
|
||||||
|
|
||||||
@@ -1779,7 +1786,7 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
|||||||
rom.write_byte(0x180358, 0x01 if glitches_enabled else 0x00)
|
rom.write_byte(0x180358, 0x01 if glitches_enabled else 0x00)
|
||||||
rom.write_byte(0x18008B, 0x01 if glitches_enabled else 0x00)
|
rom.write_byte(0x18008B, 0x01 if glitches_enabled else 0x00)
|
||||||
|
|
||||||
if uncle_location.item is None or uncle_location.item.name not in ['Sword and Shield']:
|
if uncle_location.item is None or uncle_location.item.name not in ['Blue Shield', 'Red Shield', 'Mirror Shield', 'Progressive Shield', 'Sword and Shield']:
|
||||||
# remove shield from uncle
|
# remove shield from uncle
|
||||||
rom.write_bytes(0x6D253, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
rom.write_bytes(0x6D253, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||||
rom.write_bytes(0x6D25B, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
rom.write_bytes(0x6D25B, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E])
|
||||||
@@ -2485,6 +2492,15 @@ def write_strings(rom, world, player, team, is_mystery=False):
|
|||||||
|
|
||||||
# For hints, first we write hints about entrances, some from the inconvenient list others from all reasonable entrances.
|
# For hints, first we write hints about entrances, some from the inconvenient list others from all reasonable entrances.
|
||||||
if world.hints[player]:
|
if world.hints[player]:
|
||||||
|
zoraitem = world.get_location('King Zora', player).item.hint_text
|
||||||
|
if len(zoraitem) <= 15:
|
||||||
|
tt['zora_meeting'] = f"Whaddaya want?\n ≥ {zoraitem.title()}\n Nothin'{{CHOICE}}"
|
||||||
|
else:
|
||||||
|
tt['zora_meeting'] = f"Do you want {zoraitem}?\n ≥ I'll pay\n No thanks{{CHOICE}}"
|
||||||
|
|
||||||
|
bottleitem = world.get_location('Bottle Merchant', player).item.hint_text
|
||||||
|
tt['bottle_vendor_choice'] = f"Do you want {bottleitem}?\n ≥ I'll take it\n No thanks!\n{{CHOICE}}"
|
||||||
|
|
||||||
tt['sign_north_of_links_house'] = '> Randomizer The telepathic tiles can have hints!'
|
tt['sign_north_of_links_house'] = '> Randomizer The telepathic tiles can have hints!'
|
||||||
hint_locations = HintLocations.copy()
|
hint_locations = HintLocations.copy()
|
||||||
random.shuffle(hint_locations)
|
random.shuffle(hint_locations)
|
||||||
@@ -2962,7 +2978,7 @@ def write_strings(rom, world, player, team, is_mystery=False):
|
|||||||
+ "{PAUSE3} {CHANGEPIC}\nGanon has moved around all the items in Hyrule."
|
+ "{PAUSE3} {CHANGEPIC}\nGanon has moved around all the items in Hyrule."
|
||||||
+ "{PAUSE7}\nYou will have to find all the items necessary to achieve your goal."
|
+ "{PAUSE7}\nYou will have to find all the items necessary to achieve your goal."
|
||||||
+ "{PAUSE7}\nThis is your chance to be a hero."
|
+ "{PAUSE7}\nThis is your chance to be a hero."
|
||||||
+ "{PAUSE3} {CHANGEPIC}\nYou must determine and achieve your goal."
|
+ "{PAUSE3} {CHANGEPIC}\nGood luck out there, and try not to die."
|
||||||
+ "{PAUSE9} {CHANGEPIC}", False)
|
+ "{PAUSE9} {CHANGEPIC}", False)
|
||||||
elif world.mode[player] == 'inverted':
|
elif world.mode[player] == 'inverted':
|
||||||
tt['intro_main'] = CompressedTextMapper.convert(
|
tt['intro_main'] = CompressedTextMapper.convert(
|
||||||
@@ -3037,9 +3053,9 @@ def text_for_item(item, world, player, team):
|
|||||||
|
|
||||||
def init_open_mode_sram(rom):
|
def init_open_mode_sram(rom):
|
||||||
rom.initial_sram.pre_open_castle_gate()
|
rom.initial_sram.pre_open_castle_gate()
|
||||||
rom.initial_sram.set_progress_indicator(0x02)
|
rom.initial_sram.set_progress_indicator(0x00)
|
||||||
rom.initial_sram.set_progress_flags(0x14)
|
rom.initial_sram.set_progress_flags(0x04)
|
||||||
rom.initial_sram.set_starting_entrance(0x01)
|
rom.initial_sram.set_starting_entrance(0x00)
|
||||||
|
|
||||||
def init_standard_mode_sram(rom):
|
def init_standard_mode_sram(rom):
|
||||||
rom.initial_sram.set_progress_indicator(0x00)
|
rom.initial_sram.set_progress_indicator(0x00)
|
||||||
|
|||||||
@@ -376,31 +376,30 @@ Sahasrahla_names = [
|
|||||||
|
|
||||||
Kakariko_texts = ["{}'s homecoming"]
|
Kakariko_texts = ["{}'s homecoming"]
|
||||||
Blacksmiths_texts = [
|
Blacksmiths_texts = [
|
||||||
'frogs for bread',
|
"Frogs for bread",
|
||||||
'That\'s not a sword',
|
"That's not a sword",
|
||||||
'The Rupeesmiths'
|
"The rupeesmiths",
|
||||||
] * 1 + [
|
"The dwarven breadsmiths",
|
||||||
"the dwarven breadsmiths"
|
|
||||||
]
|
]
|
||||||
DeathMountain_texts = [
|
DeathMountain_texts = [
|
||||||
"the lost old man",
|
"The lost old man",
|
||||||
"gary the old man",
|
"Gary the old man",
|
||||||
"Your ad here"
|
"Your ad here",
|
||||||
]
|
]
|
||||||
LostWoods_texts = [
|
LostWoods_texts = [
|
||||||
'thieves\' stump',
|
"Thieves' stump",
|
||||||
] * 2 + [
|
"Thieves' stump",
|
||||||
"the forest thief",
|
"The forest thief",
|
||||||
"dancing pickles",
|
"Dancing pickles",
|
||||||
"flying crows",
|
"Flying crows",
|
||||||
]
|
]
|
||||||
WishingWell_texts = [
|
WishingWell_texts = [
|
||||||
"venus. queen of faeries",
|
"Venus, Queen of Faeries",
|
||||||
"Venus was her name",
|
"Venus was her name",
|
||||||
"I'm your Venus",
|
"I'm your Venus",
|
||||||
"Yeah, baby, shes got it",
|
"Yeah, baby, she's got it",
|
||||||
"Venus, I'm your fire",
|
"Venus, I'm your fire",
|
||||||
"Venus, At your desire",
|
"Venus, at your desire",
|
||||||
"Venus Love Chain",
|
"Venus Love Chain",
|
||||||
"Venus Crescent Beam",
|
"Venus Crescent Beam",
|
||||||
]
|
]
|
||||||
@@ -1566,7 +1565,6 @@ class TextTable(object):
|
|||||||
'hylian_text_2',
|
'hylian_text_2',
|
||||||
'desert_entry_translated',
|
'desert_entry_translated',
|
||||||
'uncle_dying_sewer',
|
'uncle_dying_sewer',
|
||||||
'telepathic_intro',
|
|
||||||
'desert_thief_sitting',
|
'desert_thief_sitting',
|
||||||
'desert_thief_following',
|
'desert_thief_following',
|
||||||
'desert_thief_question',
|
'desert_thief_question',
|
||||||
@@ -1610,7 +1608,7 @@ class TextTable(object):
|
|||||||
text['zelda_save_sewers'] = CompressedTextMapper.convert("You saved me!")
|
text['zelda_save_sewers'] = CompressedTextMapper.convert("You saved me!")
|
||||||
text['priest_info'] = CompressedTextMapper.convert("So, I'm the dude that will protect Zelda. Don't worry, I got this covered.")
|
text['priest_info'] = CompressedTextMapper.convert("So, I'm the dude that will protect Zelda. Don't worry, I got this covered.")
|
||||||
text['zelda_sanctuary_before_leave'] = CompressedTextMapper.convert("Be careful!")
|
text['zelda_sanctuary_before_leave'] = CompressedTextMapper.convert("Be careful!")
|
||||||
text['telepathic_intro'] = CompressedTextMapper.convert("{NOBORDER}\n{SPEED6}\nHey, come find me and help me!")
|
text['telepathic_intro'] = CompressedTextMapper.convert("{NOBORDER}\n{SPEED6}\n\nBring me shields...")
|
||||||
# 20
|
# 20
|
||||||
text['telepathic_reminder'] = CompressedTextMapper.convert("{NOBORDER}\n{SPEED6}\nI'm in the castle basement.")
|
text['telepathic_reminder'] = CompressedTextMapper.convert("{NOBORDER}\n{SPEED6}\nI'm in the castle basement.")
|
||||||
text['zelda_go_to_throne'] = CompressedTextMapper.convert("Go north to the throne.")
|
text['zelda_go_to_throne'] = CompressedTextMapper.convert("Go north to the throne.")
|
||||||
@@ -1766,7 +1764,7 @@ class TextTable(object):
|
|||||||
text['sign_catfish'] = CompressedTextMapper.convert("Toss rocks\nToss items\nToss cookies")
|
text['sign_catfish'] = CompressedTextMapper.convert("Toss rocks\nToss items\nToss cookies")
|
||||||
text['sign_north_village_of_outcasts'] = CompressedTextMapper.convert("↑ Skull Woods\n\n↓ Steve's Town")
|
text['sign_north_village_of_outcasts'] = CompressedTextMapper.convert("↑ Skull Woods\n\n↓ Steve's Town")
|
||||||
text['sign_south_of_bumper_cave'] = CompressedTextMapper.convert("\n→ Karkats cave")
|
text['sign_south_of_bumper_cave'] = CompressedTextMapper.convert("\n→ Karkats cave")
|
||||||
text['sign_east_of_pyramid'] = CompressedTextMapper.convert("\n→ Dark Palace")
|
text['sign_east_of_pyramid'] = CompressedTextMapper.convert("\n→ Palace of Darkness")
|
||||||
text['sign_east_of_bomb_shop'] = CompressedTextMapper.convert("\n← Bomb Shoppe")
|
text['sign_east_of_bomb_shop'] = CompressedTextMapper.convert("\n← Bomb Shoppe")
|
||||||
text['sign_east_of_mire'] = CompressedTextMapper.convert("\n← Misery Mire\n no way in.\n no way out.")
|
text['sign_east_of_mire'] = CompressedTextMapper.convert("\n← Misery Mire\n no way in.\n no way out.")
|
||||||
text['sign_village_of_outcasts'] = CompressedTextMapper.convert("Have a Trulie Awesome Day!")
|
text['sign_village_of_outcasts'] = CompressedTextMapper.convert("Have a Trulie Awesome Day!")
|
||||||
@@ -1870,7 +1868,7 @@ class TextTable(object):
|
|||||||
# 100
|
# 100
|
||||||
text['dark_sanctuary_no'] = CompressedTextMapper.convert("Then go away!")
|
text['dark_sanctuary_no'] = CompressedTextMapper.convert("Then go away!")
|
||||||
text['dark_sanctuary_hint_1'] = CompressedTextMapper.convert("There is a thief in the desert, he can open creepy chests that follow you. But now that we have that out of the way, Do you like my hair? I've spent eons getting it this way.")
|
text['dark_sanctuary_hint_1'] = CompressedTextMapper.convert("There is a thief in the desert, he can open creepy chests that follow you. But now that we have that out of the way, Do you like my hair? I've spent eons getting it this way.")
|
||||||
text['dark_sanctuary_yes'] = CompressedTextMapper.convert("With Crystals 5&6, you can find a great fairy in the pyramid.\n\nFlomp Flomp, Whizzle Whomp")
|
text['dark_sanctuary_yes'] = CompressedTextMapper.convert("With crystals 5 and 6, you can find a great fairy in the pyramid.\n\nFlomp Flomp, Whizzle Whomp")
|
||||||
text['dark_sanctuary_hint_2'] = CompressedTextMapper.convert(
|
text['dark_sanctuary_hint_2'] = CompressedTextMapper.convert(
|
||||||
"All I can say is that my life is pretty plain,\n"
|
"All I can say is that my life is pretty plain,\n"
|
||||||
+ "I like watchin' the puddles gather rain,\n"
|
+ "I like watchin' the puddles gather rain,\n"
|
||||||
@@ -1897,13 +1895,13 @@ class TextTable(object):
|
|||||||
+ "{PAUSE3}\n A Link to the Past"
|
+ "{PAUSE3}\n A Link to the Past"
|
||||||
+ "{PAUSE3}\n Randomizer"
|
+ "{PAUSE3}\n Randomizer"
|
||||||
+ "{PAUSE3}\n\n\n"
|
+ "{PAUSE3}\n\n\n"
|
||||||
+ "{PAUSE3}\nAfter mostly disregarding what happened in the first two games,"
|
+ "{PAUSE3}\nAfter mostly disregarding and abandoning all sense of reason,"
|
||||||
+ "{PAUSE3}\nLink awakens to his uncle leaving the house."
|
+ "{PAUSE3}\nLink awakens to find a hungry pikit."
|
||||||
+ "{PAUSE3}\nHe just runs out the door, into the rainy night."
|
+ "{PAUSE3}\n\nHe must go look for shields, out in the rainy night."
|
||||||
+ "{PAUSE3} {CHANGEPIC}\nGanon has moved around all the items in Hyrule."
|
+ "{PAUSE3} {CHANGEPIC}\n\nGanon has hidden all the items inside shields."
|
||||||
+ "{PAUSE7}\nYou will have to find all the items necessary to beat Ganon."
|
+ "{PAUSE7}\n\nYou will have to collect the shields to feed your pikit."
|
||||||
+ "{PAUSE7}\nThis is your chance to be a hero."
|
+ "{PAUSE7}\n\nThis is your chance to be a hero.\n"
|
||||||
+ "{PAUSE3} {CHANGEPIC}\nYou must get the 7 crystals to beat Ganon."
|
+ "{PAUSE3} {CHANGEPIC}\nYou must keep your pikit well-fed.\n\n"
|
||||||
+ "{PAUSE9} {CHANGEPIC}", False)
|
+ "{PAUSE9} {CHANGEPIC}", False)
|
||||||
text['intro_throne_room'] = CompressedTextMapper.convert("{IBOX}\nLook at this Stalfos on the throne.", False)
|
text['intro_throne_room'] = CompressedTextMapper.convert("{IBOX}\nLook at this Stalfos on the throne.", False)
|
||||||
text['intro_zelda_cell'] = CompressedTextMapper.convert("{IBOX}\nIt is your time to shine!", False)
|
text['intro_zelda_cell'] = CompressedTextMapper.convert("{IBOX}\nIt is your time to shine!", False)
|
||||||
@@ -2058,5 +2056,6 @@ class TextTable(object):
|
|||||||
text['ganon_phase_3_silvers'] = CompressedTextMapper.convert("Oh no! Silver! My one true weakness!")
|
text['ganon_phase_3_silvers'] = CompressedTextMapper.convert("Oh no! Silver! My one true weakness!")
|
||||||
text['murahdahla'] = CompressedTextMapper.convert("Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\ninvisibility.\n{PAUSE3}\n… … …\nWait! You can see me? I knew I should have\nhidden in a hollow tree.")
|
text['murahdahla'] = CompressedTextMapper.convert("Hello @. I\nam Murahdahla, brother of\nSahasrahla and Aginah. Behold the power of\ninvisibility.\n{PAUSE3}\n… … …\nWait! You can see me? I knew I should have\nhidden in a hollow tree.")
|
||||||
text['mastersword_pedestal_goal'] = CompressedTextMapper.convert("To claim thy reward, you must present all 3 Pendants of Virtue.")
|
text['mastersword_pedestal_goal'] = CompressedTextMapper.convert("To claim thy reward, you must present all 3 Pendants of Virtue.")
|
||||||
|
text['already_have_shield'] = CompressedTextMapper.convert("You can't carry another shield...\nCome back later.")
|
||||||
text['end_pad_data'] = bytearray([0xfb])
|
text['end_pad_data'] = bytearray([0xfb])
|
||||||
text['terminator'] = bytearray([0xFF, 0xFF])
|
text['terminator'] = bytearray([0xFF, 0xFF])
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -491,7 +491,8 @@
|
|||||||
"never",
|
"never",
|
||||||
"presence",
|
"presence",
|
||||||
"value",
|
"value",
|
||||||
"dungeon_value"
|
"dungeon_value",
|
||||||
|
"cave_value"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"showmap": {
|
"showmap": {
|
||||||
|
|||||||
@@ -1998,7 +1998,7 @@ def init_vanilla_sprites():
|
|||||||
create_sprite(0x0103, EnemySprite.Drunkard, 0x00, 0, 0x06, 0x15)
|
create_sprite(0x0103, EnemySprite.Drunkard, 0x00, 0, 0x06, 0x15)
|
||||||
create_sprite(0x0103, EnemySprite.AdultNpc, 0x00, 0, 0x0a, 0x1b)
|
create_sprite(0x0103, EnemySprite.AdultNpc, 0x00, 0, 0x0a, 0x1b)
|
||||||
create_sprite(0x0103, EnemySprite.Innkeeper, 0x00, 0, 0x17, 0x17)
|
create_sprite(0x0103, EnemySprite.Innkeeper, 0x00, 0, 0x17, 0x17)
|
||||||
create_sprite(0x0104, EnemySprite.UnclePriest, 0x00, 0, 0x1a, 0x17)
|
create_sprite(0x0104, EnemySprite.Pikit, 0x00, 0, 0x1a, 0x18, never_drop=True, fix=True)
|
||||||
create_sprite(0x0105, EnemySprite.Wiseman, 0x00, 0, 0x07, 0x18)
|
create_sprite(0x0105, EnemySprite.Wiseman, 0x00, 0, 0x07, 0x18)
|
||||||
create_sprite(0x0106, EnemySprite.Shopkeeper, 0x00, 0, 0x08, 0x1b)
|
create_sprite(0x0106, EnemySprite.Shopkeeper, 0x00, 0, 0x08, 0x1b)
|
||||||
create_sprite(0x0107, EnemySprite.BonkItem, 0x00, 0, 0x03, 0x15)
|
create_sprite(0x0107, EnemySprite.BonkItem, 0x00, 0, 0x03, 0x15)
|
||||||
|
|||||||
@@ -456,7 +456,7 @@ vanilla_sheets = [
|
|||||||
(0x47, 0x49, 0x2B, 0x2D), (0x46, 0x49, 0x1C, 0x52), (0x00, 0x49, 0x1C, 0x52), (0x5D, 0x49, 0x00, 0x52),
|
(0x47, 0x49, 0x2B, 0x2D), (0x46, 0x49, 0x1C, 0x52), (0x00, 0x49, 0x1C, 0x52), (0x5D, 0x49, 0x00, 0x52),
|
||||||
(0x46, 0x49, 0x13, 0x52), (0x4B, 0x4D, 0x4A, 0x5A), (0x47, 0x49, 0x1C, 0x52), (0x4B, 0x4D, 0x39, 0x36),
|
(0x46, 0x49, 0x13, 0x52), (0x4B, 0x4D, 0x4A, 0x5A), (0x47, 0x49, 0x1C, 0x52), (0x4B, 0x4D, 0x39, 0x36),
|
||||||
(0x1F, 0x2C, 0x2E, 0x52), (0x1F, 0x2C, 0x2E, 0x1D), (0x2F, 0x2C, 0x2E, 0x52), (0x2F, 0x2C, 0x2E, 0x31),
|
(0x1F, 0x2C, 0x2E, 0x52), (0x1F, 0x2C, 0x2E, 0x1D), (0x2F, 0x2C, 0x2E, 0x52), (0x2F, 0x2C, 0x2E, 0x31),
|
||||||
(0x1F, 0x1E, 0x30, 0x52), (0x51, 0x49, 0x13, 0x00), (0x4F, 0x49, 0x13, 0x50), (0x4F, 0x4D, 0x4A, 0x50),
|
(0x1F, 0x1E, 0x30, 0x52), (0x51, 0x49, 0x13, 0x1B), (0x4F, 0x49, 0x13, 0x50), (0x4F, 0x4D, 0x4A, 0x50),
|
||||||
|
|
||||||
(0x4B, 0x49, 0x4C, 0x2B), (0x1F, 0x20, 0x22, 0x53), (0x55, 0x3D, 0x42, 0x43), (0x1F, 0x1E, 0x23, 0x52),
|
(0x4B, 0x49, 0x4C, 0x2B), (0x1F, 0x20, 0x22, 0x53), (0x55, 0x3D, 0x42, 0x43), (0x1F, 0x1E, 0x23, 0x52),
|
||||||
(0x1F, 0x1E, 0x39, 0x3A), (0x1F, 0x1E, 0x3A, 0x3E), (0x1F, 0x1E, 0x3C, 0x3D), (0x40, 0x1E, 0x27, 0x3F),
|
(0x1F, 0x1E, 0x39, 0x3A), (0x1F, 0x1E, 0x3A, 0x3E), (0x1F, 0x1E, 0x3C, 0x3D), (0x40, 0x1E, 0x27, 0x3F),
|
||||||
@@ -566,7 +566,7 @@ def setup_required_dungeon_groups(sheets, data_tables):
|
|||||||
sheets[did(5)].add_sprite_to_sheet([75, 77, 74, 90], {0xf3, 0xff, 0x109, 0x10e, 0x10f, 0x110, 0x111, 0x112,
|
sheets[did(5)].add_sprite_to_sheet([75, 77, 74, 90], {0xf3, 0xff, 0x109, 0x10e, 0x10f, 0x110, 0x111, 0x112,
|
||||||
0x11a, 0x11c, 0x11f, 0x122})
|
0x11a, 0x11c, 0x11f, 0x122})
|
||||||
sheets[did(7)].add_sprite_to_sheet([75, 77, 57, 54], {0x8, 0x2c, 0x114, 0x115, 0x116}) # big fairies
|
sheets[did(7)].add_sprite_to_sheet([75, 77, 57, 54], {0x8, 0x2c, 0x114, 0x115, 0x116}) # big fairies
|
||||||
sheets[did(13)].add_sprite_to_sheet([81, None, None, None], {0x55, 0x102, 0x104}) # uncle, sick kid
|
sheets[did(13)].add_sprite_to_sheet([81, None, None, 27], {0x55, 0x102, 0x104}) # uncle, sick kid
|
||||||
sheets[did(14)].add_sprite_to_sheet([71, 73, 76, 80], {0x12, 0x105, 0x10a}) # wisemen
|
sheets[did(14)].add_sprite_to_sheet([71, 73, 76, 80], {0x12, 0x105, 0x10a}) # wisemen
|
||||||
sheets[did(15)].add_sprite_to_sheet([79, 77, 74, 80], {0xf4, 0xf5, 0x101, 0x103, 0x106, 0x118, 0x119}) # more npcs
|
sheets[did(15)].add_sprite_to_sheet([79, 77, 74, 80], {0xf4, 0xf5, 0x101, 0x103, 0x106, 0x118, 0x119}) # more npcs
|
||||||
sheets[did(18)].add_sprite_to_sheet([85, 61, 66, 67], {0x20, 0x30}) # aga alter, aga1
|
sheets[did(18)].add_sprite_to_sheet([85, 61, 66, 67], {0x20, 0x30}) # aga alter, aga1
|
||||||
|
|||||||
Reference in New Issue
Block a user