Merge branch 'OverworldShuffle' into GwaaKiwi
@@ -47,6 +47,7 @@ def main():
|
||||
Alternatively, can be a ALttP Rom patched with a Link
|
||||
sprite that will be extracted.
|
||||
''')
|
||||
parser.add_argument('--triforce_gfx', help='Name of the triforce graphics to use.')
|
||||
parser.add_argument('--names', default='', type=str)
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
@@ -30,9 +30,11 @@ def adjust(args):
|
||||
|
||||
if not hasattr(args,"sprite"):
|
||||
args.sprite = None
|
||||
if not hasattr(args,"triforce_gfx"):
|
||||
args.triforce_gfx = None
|
||||
|
||||
apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic,
|
||||
args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx,
|
||||
args.sprite, args.triforce_gfx, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx,
|
||||
args.shuffle_sfxinstruments, args.shuffle_songinstruments, args.msu_resume)
|
||||
|
||||
output_path.cached_path = args.outputpath
|
||||
@@ -65,10 +67,12 @@ def patch(args):
|
||||
|
||||
if not hasattr(args, "sprite"):
|
||||
args.sprite = None
|
||||
if not hasattr(args, "triforce_gfx"):
|
||||
args.triforce_gfx = None
|
||||
|
||||
apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic,
|
||||
args.sprite, args.ow_palettes, args.uw_palettes, args.reduce_flashing, args.shuffle_sfx,
|
||||
args.shuffle_sfxinstruments, args.shuffle_songinstruments, args.msu_resume)
|
||||
args.sprite, args.triforce_gfx, args.ow_palettes, args.uw_palettes, args.reduce_flashing,
|
||||
args.shuffle_sfx, args.shuffle_sfxinstruments, args.shuffle_songinstruments, args.msu_resume)
|
||||
|
||||
output_path.cached_path = args.outputpath
|
||||
rom.write_to_file(output_path('%s.sfc' % outfile_base))
|
||||
|
||||
@@ -65,7 +65,7 @@ class World(object):
|
||||
self.lock_aga_door_in_escape = False
|
||||
self.save_and_quit_from_boss = True
|
||||
self.override_bomb_check = False
|
||||
self.is_copied_world = False
|
||||
self.is_premature_copied_world = False
|
||||
self.accessibility = accessibility.copy()
|
||||
self.fix_skullwoods_exit = {}
|
||||
self.fix_palaceofdarkness_exit = {}
|
||||
@@ -81,11 +81,11 @@ class World(object):
|
||||
self.can_take_damage = {}
|
||||
self.hints = hints.copy()
|
||||
self.prizes = {}
|
||||
self.default_zelda_region = {}
|
||||
self.dynamic_regions = []
|
||||
self.dynamic_locations = []
|
||||
self.spoiler_mode = spoiler_mode
|
||||
self.spoiler = Spoiler(self)
|
||||
self.lamps_needed_for_dark_rooms = 1
|
||||
self.owedges = []
|
||||
self._owedge_cache = {}
|
||||
self.owswaps = {}
|
||||
@@ -153,12 +153,15 @@ class World(object):
|
||||
set_player_attr('bombbag', False)
|
||||
set_player_attr('flute_mode', False)
|
||||
set_player_attr('bow_mode', False)
|
||||
set_player_attr('free_lamp_cone', False)
|
||||
|
||||
set_player_attr('difficulty_requirements', None)
|
||||
set_player_attr('boss_shuffle', 'none')
|
||||
set_player_attr('enemy_shuffle', 'none')
|
||||
set_player_attr('enemy_health', 'default')
|
||||
set_player_attr('enemy_damage', 'default')
|
||||
set_player_attr('any_enemy_logic', 'allow_all')
|
||||
set_player_attr('force_enemy', None)
|
||||
set_player_attr('beemizer', '0')
|
||||
set_player_attr('escape_assist', [])
|
||||
set_player_attr('crystals_needed_for_ganon', 7)
|
||||
@@ -197,6 +200,8 @@ class World(object):
|
||||
set_player_attr('standardize_palettes', 'standardize')
|
||||
set_player_attr('force_fix', {'gt': False, 'sw': False, 'pod': False, 'tr': False})
|
||||
set_player_attr('prizes', {'dig;': [], 'pull': [0, 0, 0], 'crab': [0, 0], 'stun': 0, 'fish': 0, 'enemies': []})
|
||||
set_player_attr('default_zelda_region', 'Hyrule Dungeon Cellblock')
|
||||
set_player_attr('custom_goals', {'gtentry': None, 'ganongoal': None, 'pedgoal': None, 'murahgoal': None})
|
||||
|
||||
set_player_attr('exp_cache', defaultdict(dict))
|
||||
set_player_attr('enabled_entrances', {})
|
||||
@@ -1221,16 +1226,35 @@ class CollectionState(object):
|
||||
def item_count(self, item, player):
|
||||
return self.prog_items[item, player]
|
||||
|
||||
def everything(self, player):
|
||||
all_locations = self.world.get_filled_locations(player)
|
||||
all_locations.remove(self.world.get_location('Ganon', player))
|
||||
return (len([x for x in self.locations_checked if x.player == player])
|
||||
def everything(self, player, all_except=0):
|
||||
all_locations = [x for x in self.world.get_filled_locations(player) if not x.locked]
|
||||
return (len([x for x in self.locations_checked if x.player == player and not x.locked]) + all_except
|
||||
>= len(all_locations))
|
||||
|
||||
def has_crystals(self, count, player):
|
||||
crystals = ['Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']
|
||||
return len([crystal for crystal in crystals if self.has(crystal, player)]) >= count
|
||||
|
||||
def has_pendants(self, count, player):
|
||||
pendants = ['Green Pendant', 'Red Pendant', 'Blue Pendant']
|
||||
return len([pendant for pendant in pendants if self.has(pendant, player)]) >= count
|
||||
|
||||
def has_bosses(self, count, player, prize_type=None):
|
||||
dungeons = 'Eastern Palace', 'Desert Palace', 'Tower of Hera', 'Palace of Darkness', 'Swamp Palace', "Thieves' Town", 'Skull Woods', 'Ice Palace', 'Misery Mire', 'Turtle Rock'
|
||||
reachable_bosses = 0
|
||||
for d in dungeons:
|
||||
region = self.world.get_region(f'{d} - Boss Kill', player)
|
||||
if prize_type is None or prize_type in region.dungeon.prize.name:
|
||||
if self.can_reach(region, None, player):
|
||||
reachable_bosses += 1
|
||||
return reachable_bosses >= count
|
||||
|
||||
def has_crystal_bosses(self, count, player):
|
||||
return self.has_bosses(count, player, 'Crystal')
|
||||
|
||||
def has_pendant_bosses(self, count, player):
|
||||
return self.has_bosses(count, player, 'Pendant')
|
||||
|
||||
def can_lift_rocks(self, player):
|
||||
return self.has('Power Glove', player) or self.has('Titans Mitts', player)
|
||||
|
||||
@@ -2728,7 +2752,7 @@ class Location(object):
|
||||
self.staleness_count = 0
|
||||
self.locked = False
|
||||
self.real = True
|
||||
self.always_allow = lambda item, state: False
|
||||
self.always_allow = None
|
||||
self.access_rule = lambda state: True
|
||||
self.verbose_rule = None
|
||||
self.item_rule = lambda item: True
|
||||
@@ -2742,7 +2766,7 @@ class Location(object):
|
||||
def can_fill(self, state, item, check_access=True):
|
||||
if not self.valid_multiworld(state, item):
|
||||
return False
|
||||
return self.always_allow(state, item) or (self.parent_region.can_fill(item) and self.item_rule(item) and (not check_access or self.can_reach(state)))
|
||||
return (self.always_allow and self.always_allow(state, item)) or (self.parent_region.can_fill(item) and self.item_rule(item) and (not check_access or self.can_reach(state)))
|
||||
|
||||
def valid_multiworld(self, state, item):
|
||||
if self.type == LocationType.Pot and self.player != item.player:
|
||||
@@ -3061,6 +3085,7 @@ class Spoiler(object):
|
||||
'flute_mode': self.world.flute_mode,
|
||||
'bow_mode': self.world.bow_mode,
|
||||
'goal': self.world.goal,
|
||||
'custom_goals': self.world.custom_goals,
|
||||
'ow_shuffle': self.world.owShuffle,
|
||||
'ow_terrain': self.world.owTerrain,
|
||||
'ow_crossed': self.world.owCrossed,
|
||||
@@ -3302,8 +3327,23 @@ class Spoiler(object):
|
||||
if self.metadata['goal'][player] in ['triforcehunt', 'trinity', 'ganonhunt']:
|
||||
outfile.write('Triforce Pieces Required:'.ljust(line_width) + '%s\n' % self.metadata['triforcegoal'][player])
|
||||
outfile.write('Triforce Pieces Total:'.ljust(line_width) + '%s\n' % self.metadata['triforcepool'][player])
|
||||
outfile.write('Crystals Required for GT:'.ljust(line_width) + '%s\n' % str(self.world.crystals_gt_orig[player]))
|
||||
outfile.write('Crystals Required for Ganon:'.ljust(line_width) + '%s\n' % str(self.world.crystals_ganon_orig[player]))
|
||||
custom = self.metadata['custom_goals'][player]
|
||||
if custom['gtentry'] and 'requirements' in custom['gtentry']:
|
||||
outfile.write('GT Entry Requirement:'.ljust(line_width) + 'custom\n')
|
||||
outfile.write(' %s\n' % custom['gtentry']['goaltext'])
|
||||
else:
|
||||
outfile.write('GT Entry Requirement:'.ljust(line_width) + '%s crystals\n' % str(self.world.crystals_gt_orig[player]))
|
||||
if custom['ganongoal'] and 'requirements' in custom['ganongoal']:
|
||||
outfile.write('Ganon Requirement:'.ljust(line_width) + 'custom\n')
|
||||
outfile.write(' %s\n' % custom['ganongoal']['goaltext'])
|
||||
else:
|
||||
outfile.write('Ganon Requirement:'.ljust(line_width) + '%s crystals\n' % str(self.world.crystals_ganon_orig[player]))
|
||||
if custom['pedgoal'] and 'requirements' in custom['pedgoal']:
|
||||
outfile.write('Pedestal Requirement:'.ljust(line_width) + 'custom\n')
|
||||
outfile.write(' %s\n' % custom['pedgoal']['goaltext'])
|
||||
if custom['murahgoal'] and 'requirements' in custom['murahgoal']:
|
||||
outfile.write('Murahdahla Requirement:'.ljust(line_width) + 'custom\n')
|
||||
outfile.write(' %s\n' % custom['murahgoal']['goaltext'])
|
||||
outfile.write('Item Required for Ganon:'.ljust(line_width) + '%s\n' % str(self.world.ganon_item_orig[player]))
|
||||
outfile.write('Swords:'.ljust(line_width) + '%s\n' % self.metadata['weapons'][player])
|
||||
outfile.write('\n')
|
||||
@@ -3419,10 +3459,24 @@ class Spoiler(object):
|
||||
outfile.write(f'{dungeon}:'.ljust(line_width) + '%s Medallion\n' % medallion)
|
||||
for player in range(1, self.world.players + 1):
|
||||
player_name = '' if self.world.players == 1 else str(' (Player ' + str(player) + ')')
|
||||
if self.world.crystals_gt_orig[player] == 'random':
|
||||
goal = self.world.custom_goals[player]['gtentry']
|
||||
if goal and 'requirements' in goal and goal['requirements'][0]['condition'] != 0x00:
|
||||
pass
|
||||
# outfile.write(str('GT Entry Sign Text' + player_name + ':').ljust(line_width) + '%s\n' % goal['goaltext'])
|
||||
elif self.world.crystals_gt_orig[player] == 'random':
|
||||
outfile.write(str('Crystals Required for GT' + player_name + ':').ljust(line_width) + '%s\n' % (str(self.metadata['gt_crystals'][player])))
|
||||
if self.world.crystals_ganon_orig[player] == 'random':
|
||||
outfile.write(str('Crystals Required for Ganon' + player_name + ':').ljust(line_width) + '%s\n' % (str(self.metadata['ganon_crystals'][player])))
|
||||
goal = self.world.custom_goals[player]['ganongoal']
|
||||
if goal and 'requirements' in goal and goal['requirements'][0]['condition'] != 0x00:
|
||||
pass
|
||||
# outfile.write(str('Ganon Sign Text' + player_name + ':').ljust(line_width) + '%s\n' % goal['goaltext'])
|
||||
elif self.world.crystals_ganon_orig[player] == 'random':
|
||||
outfile.write(str('Crystals Required for Ganon' + player_name + ':').ljust(line_width) + '%s\n' % (str(self.metadata['ganon_crystals'][player])))
|
||||
# goal = self.world.custom_goals[player]['pedgoal']
|
||||
# if goal and 'requirements' in goal and goal['requirements'][0]['condition'] != 0x00:
|
||||
# outfile.write(str('Pedestal Sign Text' + player_name + ':').ljust(line_width) + '%s\n' % goal['goaltext'])
|
||||
# goal = self.world.custom_goals[player]['murahgoal']
|
||||
# if goal and 'requirements' in goal and goal['requirements'][0]['condition'] != 0x00:
|
||||
# outfile.write(str('Murahdahla Sign Text' + player_name + ':').ljust(line_width) + '%s\n' % goal['goaltext'])
|
||||
outfile.write('\n\nPrizes:\n\n')
|
||||
for dungeon, prize in self.prizes.items():
|
||||
outfile.write(str(dungeon + ':').ljust(line_width) + '%s\n' % prize)
|
||||
|
||||
@@ -1,5 +1,63 @@
|
||||
# Changelog
|
||||
|
||||
## 0.6.1.7
|
||||
- \~Merged in DR v1.5.2~
|
||||
- Reverted key count update
|
||||
|
||||
## 0.6.1.6
|
||||
- Fixed bonk drop sparkles in DW
|
||||
- \~Merged in DR v1.5.1~
|
||||
- Fixed key count issues
|
||||
|
||||
## 0.6.1.5
|
||||
- Fixed error with non-prize shuffle
|
||||
|
||||
## 0.6.1.4
|
||||
- Fixes for Glitched Rain State (Bonk Shuffle included)
|
||||
- \~Merged in DR v1.5.0~
|
||||
- GT Key Logic fix
|
||||
- New HUD key count behavior
|
||||
- Pot uncoloring on collection
|
||||
|
||||
## 0.6.1.3
|
||||
- Added new post-gen option to change Triforce Piece GFX
|
||||
- Added new GFX for 10/11 keys to replace the A/B GFX
|
||||
- Fixed issue with Follower Sprite GFX after mirroring
|
||||
- Fixed VRAM issue with Crystal Maiden cutscene
|
||||
- Some performance updates
|
||||
- \~Merged in DR v1.4.11~
|
||||
- Enemizer bans update
|
||||
|
||||
## 0.6.1.2
|
||||
- Various fixes for Custom Goal Framework
|
||||
- Added custom gfx for Pedestal and Murahdahla
|
||||
- Re-fixed purple chest follower dupe
|
||||
- Updated tournament winners texts
|
||||
|
||||
## 0.6.1.1
|
||||
- Fixed issue with Bosses goals in Custom Goal Framework
|
||||
- Fixed error when using Custom Goals with no extra values
|
||||
- Added more Custom Goal detail in Spoiler Log
|
||||
|
||||
## 0.6.1.0
|
||||
- New Custom Goal framework (see Customizer.md)
|
||||
- New 'logic' hint terminology to replace vital/useful terminology
|
||||
- Removed possibility of duplicated hints
|
||||
- New fix for hammering pot drops when at sprite limit
|
||||
- Fixed issue with incorrect Ganon silvers hint
|
||||
- Fixed issue with Locksmith despawning after purple chest if a follower is stored
|
||||
- Fixed pogdor glitch (frogdor but at PoD entrance and Kiki following)
|
||||
- Fixed issue with Duck gfx overwriting GT Cutscene gfx
|
||||
- New CLI argument to allow external generators to supply a custom ROM Header
|
||||
- Fixed error with extra argument in MultiServer call
|
||||
- Added new text if Link's House is placed at any Snitch Lady house
|
||||
|
||||
## 0.6.0.8
|
||||
- Re-fixed issue with Old Man spawning on pyramid
|
||||
- Allowing Zelda to be in TT Prison for follower shuffle escape
|
||||
- Fixed error with placing Old Man Cave in ER
|
||||
- Fixed error when plando'ing followers at locations
|
||||
|
||||
## 0.6.0.7
|
||||
- Emergency fix for GT cutscene GFX
|
||||
|
||||
|
||||
@@ -141,7 +141,7 @@ def parse_cli(argv, no_defaults=False):
|
||||
'skullwoods', 'linked_drops',
|
||||
'pseudoboots', 'mirrorscroll', 'dark_rooms', 'damage_challenge', 'shuffle_damage_table', 'crystal_book', 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters',
|
||||
'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots',
|
||||
'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor',
|
||||
'ow_palettes', 'uw_palettes', 'sprite', 'triforce_gfx', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor',
|
||||
'heartbeep', 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', 'keydropshuffle',
|
||||
'mixed_travel', 'standardize_palettes', 'code', 'reduce_flashing', 'shuffle_sfx', 'shuffle_sfxinstruments',
|
||||
'shuffle_songinstruments', 'msu_resume', 'collection_rate', 'colorizepots', 'decoupledoors', 'door_type_mode',
|
||||
@@ -269,6 +269,7 @@ def parse_settings():
|
||||
"heartcolor": "red",
|
||||
"heartbeep": "normal",
|
||||
"sprite": None,
|
||||
"triforce_gfx": None,
|
||||
"fastmenu": "normal",
|
||||
"ow_palettes": "default",
|
||||
"uw_palettes": "default",
|
||||
|
||||
@@ -291,7 +291,12 @@ def vanilla_key_logic(world, player):
|
||||
create_alternative_door_rules('Mire Map Spike Side Blue Barrier', 2, 'Misery Mire', world, player)
|
||||
create_alternative_door_rules('Mire Crystal Dead End Left Barrier', 2, 'Misery Mire', world, player)
|
||||
create_alternative_door_rules('Mire Crystal Dead End Right Barrier', 2, 'Misery Mire', world, player)
|
||||
# gt logic? I'm unsure it needs adjusting
|
||||
# gt logic
|
||||
conveyor_star_pits_door = world.key_logic[player]['Ganons Tower'].door_rules['GT Conveyor Star Pits EN']
|
||||
firesnake_door = world.key_logic[player]['Ganons Tower'].door_rules['GT Firesnake Room SW']
|
||||
firesnake_door.alternate_big_key_loc.update(conveyor_star_pits_door.alternate_big_key_loc)
|
||||
tile_door = world.key_logic[player]['Ganons Tower'].door_rules['GT Tile Room EN']
|
||||
tile_door.alternate_big_key_loc.update(conveyor_star_pits_door.alternate_big_key_loc)
|
||||
|
||||
|
||||
def create_alternative_door_rules(door, amount, dungeon, world, player):
|
||||
|
||||
@@ -1302,8 +1302,12 @@ def create_doors(world, player):
|
||||
world.get_door('Swamp Flooded Room Ladder', player).event('Swamp Drain')
|
||||
|
||||
if world.mode[player] == 'standard' and 'Zelda Herself' not in [i.name for i in world.precollected_items if i.player == player]:
|
||||
world.get_door('Hyrule Castle Throne Room Tapestry', player).event('Zelda Pickup')
|
||||
world.get_door('Hyrule Castle Tapestry Backwards', player).event('Zelda Pickup')
|
||||
if world.default_zelda_region[player] == 'Thieves Blind\'s Cell':
|
||||
zelda_location = 'Suspicious Maiden'
|
||||
else:
|
||||
zelda_location = 'Zelda Pickup'
|
||||
world.get_door('Hyrule Castle Throne Room Tapestry', player).event(zelda_location)
|
||||
world.get_door('Hyrule Castle Tapestry Backwards', player).event(zelda_location)
|
||||
|
||||
# crystal switches and barriers
|
||||
world.get_door('Hera Lobby Crystal Exit', player).c_switch()
|
||||
|
||||
@@ -586,13 +586,13 @@ def determine_paths_for_dungeon(world, player, all_regions, name):
|
||||
paths.append(portal.door.entrance.parent_region.name)
|
||||
if world.mode[player] == 'standard':
|
||||
if name == 'Hyrule Castle':
|
||||
paths.append('Hyrule Dungeon Cellblock')
|
||||
paths.append(('Hyrule Dungeon Cellblock', 'Sanctuary'))
|
||||
paths.append(world.default_zelda_region[player])
|
||||
paths.append((world.default_zelda_region[player], 'Sanctuary'))
|
||||
if name == 'Hyrule Castle Sewers':
|
||||
paths.append('Sanctuary')
|
||||
if name == 'Hyrule Castle Dungeon':
|
||||
paths.append('Hyrule Dungeon Cellblock')
|
||||
paths.append(('Hyrule Dungeon Cellblock', 'Hyrule Castle Throne Room'))
|
||||
paths.append(world.default_zelda_region[player])
|
||||
paths.append((world.default_zelda_region[player], 'Hyrule Castle Throne Room'))
|
||||
if world.doorShuffle[player] in ['basic'] and name == 'Thieves Town':
|
||||
paths.append('Thieves Attic Window')
|
||||
elif 'Thieves Attic Window' in all_r_names:
|
||||
@@ -1322,7 +1322,7 @@ def create_dungeon_builders(all_sectors, connections_tuple, world, player, dunge
|
||||
for r_name in dungeon_boss_sectors[key]:
|
||||
assign_sector(find_sector(r_name, candidate_sectors), current_dungeon, candidate_sectors, global_pole)
|
||||
if key == 'Hyrule Castle' and world.mode[player] == 'standard':
|
||||
for r_name in ['Hyrule Dungeon Cellblock', 'Sanctuary', 'Hyrule Castle Throne Room']: # need to deliver zelda
|
||||
for r_name in [world.default_zelda_region[player], 'Sanctuary', 'Hyrule Castle Throne Room']: # need to deliver zelda
|
||||
assign_sector(find_sector(r_name, candidate_sectors), current_dungeon,
|
||||
candidate_sectors, global_pole)
|
||||
if key == 'Thieves Town' and (world.get_dungeon("Thieves Town", player).boss.enemizer_name == 'Blind'
|
||||
@@ -3091,7 +3091,7 @@ def split_dungeon_builder(builder, split_list, builder_info):
|
||||
if builder.name == 'Hyrule Castle':
|
||||
assign_sector(find_sector('Hyrule Castle Throne Room', candidate_sectors),
|
||||
dungeon_map['Hyrule Castle Dungeon'], candidate_sectors, global_pole)
|
||||
assign_sector(find_sector('Hyrule Dungeon Cellblock', candidate_sectors),
|
||||
assign_sector(find_sector(world.default_zelda_region[player], candidate_sectors),
|
||||
dungeon_map['Hyrule Castle Dungeon'], candidate_sectors, global_pole)
|
||||
dungeon_map['Hyrule Castle Dungeon'].throne_door = world.get_door('Hyrule Castle Throne Room N', player)
|
||||
dungeon_map['Hyrule Castle Sewers'].sewers_access = builder.throne_door
|
||||
|
||||
@@ -183,6 +183,8 @@ def fill_restrictive(world, base_state, locations, itempool, key_pool=None, sing
|
||||
spot_to_fill = None
|
||||
|
||||
item_locations = filter_locations(item_to_place, locations, world, vanilla)
|
||||
if is_dungeon_item(item_to_place, world) and not (item_to_place.prize and world.prizeshuffle[item_to_place.player] == 'none'):
|
||||
item_locations = [l for l in item_locations if valid_dungeon_placement(item_to_place, l, world)]
|
||||
verify(item_to_place, item_locations, maximum_exploration_state, single_player_placement,
|
||||
perform_access_check, key_pool, world)
|
||||
for location in item_locations:
|
||||
|
||||
@@ -231,12 +231,18 @@ def generate_itempool(world, player):
|
||||
if world.damage_challenge[player] in ['ohko', 'gloom']:
|
||||
world.can_take_damage[player] = False
|
||||
|
||||
if world.goal[player] in ['pedestal', 'triforcehunt', 'sanctuary']:
|
||||
goal_req = None
|
||||
if world.custom_goals[player]['ganongoal'] and 'requirements' in world.custom_goals[player]['ganongoal']:
|
||||
goal_req = world.custom_goals[player]['ganongoal']['requirements'][0]
|
||||
if world.goal[player] in ['pedestal', 'triforcehunt', 'sanctuary'] or (goal_req and goal_req['condition'] == 0x00):
|
||||
set_event_item(world, player, 'Ganon', 'Nothing')
|
||||
else:
|
||||
set_event_item(world, player, 'Ganon', 'Triforce')
|
||||
|
||||
if world.goal[player] in ['triforcehunt', 'trinity']:
|
||||
goal_req = None
|
||||
if world.custom_goals[player]['murahgoal'] and 'requirements' in world.custom_goals[player]['murahgoal']:
|
||||
goal_req = world.custom_goals[player]['murahgoal']['requirements'][0]
|
||||
if world.goal[player] in ['triforcehunt', 'trinity'] or (goal_req and goal_req['condition'] != 0x00):
|
||||
region = world.get_region('Hyrule Castle Courtyard', player)
|
||||
loc = Location(player, "Murahdahla", parent=region)
|
||||
region.locations.append(loc)
|
||||
@@ -278,13 +284,13 @@ def generate_itempool(world, player):
|
||||
# set up item pool
|
||||
skip_pool_adjustments = False
|
||||
if world.customizer and world.customizer.get_item_pool() and player in world.customizer.get_item_pool():
|
||||
(pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms) = make_customizer_pool(world, player)
|
||||
(pool, placed_items, precollected_items, clock_mode) = make_customizer_pool(world, player)
|
||||
skip_pool_adjustments = True
|
||||
elif world.custom and player in world.customitemarray:
|
||||
(pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_total, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world, player, world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.bombbag[player], world.customitemarray[player])
|
||||
(pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_total, treasure_hunt_icon) = make_custom_item_pool(world, player, world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.bombbag[player], world.customitemarray[player])
|
||||
world.rupoor_cost = min(world.customitemarray[player]["rupoorcost"], 9999)
|
||||
else:
|
||||
(pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms) = get_pool_core(world, player, world.progressive, world.shuffle[player], world.difficulty[player], world.treasure_hunt_total[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.bombbag[player], world.doorShuffle[player], world.logic[player], world.flute_mode[player] == 'active' or world.is_tile_swapped(0x18, player))
|
||||
(pool, placed_items, precollected_items, clock_mode) = get_pool_core(world, player, world.progressive, world.shuffle[player], world.difficulty[player], world.treasure_hunt_total[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.bombbag[player], world.doorShuffle[player], world.logic[player], world.flute_mode[player] == 'active' or world.is_tile_swapped(0x18, player))
|
||||
|
||||
if player in world.pool_adjustment.keys() and not skip_pool_adjustments:
|
||||
amt = world.pool_adjustment[player]
|
||||
@@ -364,8 +370,6 @@ def generate_itempool(world, player):
|
||||
if item.name == 'Bomb Upgrade (+10)' and item.player == player:
|
||||
item.advancement = True
|
||||
|
||||
world.lamps_needed_for_dark_rooms = lamps_needed_for_dark_rooms
|
||||
|
||||
if clock_mode is not None:
|
||||
world.clock_mode = clock_mode
|
||||
|
||||
@@ -1109,8 +1113,6 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt
|
||||
else:
|
||||
pool.extend(basicgloves)
|
||||
|
||||
lamps_needed_for_dark_rooms = 1
|
||||
|
||||
# old insanity shuffle didn't have fake LW/DW logic so this used to be conditional
|
||||
pool.extend(['Magic Mirror', 'Moon Pearl'])
|
||||
|
||||
@@ -1162,11 +1164,17 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt
|
||||
place_item('Link\'s Uncle', swords_to_use.pop())
|
||||
place_item('Blacksmith', swords_to_use.pop())
|
||||
place_item('Pyramid Fairy - Left', swords_to_use.pop())
|
||||
if goal not in ['pedestal', 'trinity']:
|
||||
place_item('Master Sword Pedestal', swords_to_use.pop())
|
||||
else:
|
||||
place_item('Master Sword Pedestal', 'Triforce')
|
||||
if world.custom_goals[player]['pedgoal'] and 'requirements' in world.custom_goals[player]['pedgoal'] and world.custom_goals[player]['pedgoal']['requirements'][0]['condition'] == 0x00:
|
||||
place_item('Master Sword Pedestal', 'Nothing')
|
||||
world.get_location('Master Sword Pedestal', player).locked = True
|
||||
pool.append(swords_to_use.pop())
|
||||
else:
|
||||
if goal not in ['pedestal', 'trinity']:
|
||||
place_item('Master Sword Pedestal', swords_to_use.pop())
|
||||
else:
|
||||
place_item('Master Sword Pedestal', 'Triforce')
|
||||
world.get_location('Master Sword Pedestal', player).locked = True
|
||||
pool.append(swords_to_use.pop())
|
||||
else:
|
||||
pool.extend(diff.progressivesword if want_progressives() else diff.basicsword)
|
||||
if swords == 'assured':
|
||||
@@ -1194,8 +1202,12 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt
|
||||
|
||||
if goal in ['sanctuary']:
|
||||
place_item('Sanctuary', 'Triforce')
|
||||
if goal in ['pedestal', 'trinity'] and swords != 'vanilla':
|
||||
if world.custom_goals[player]['pedgoal'] and 'requirements' in world.custom_goals[player]['pedgoal'] and world.custom_goals[player]['pedgoal']['requirements'][0]['condition'] == 0x00:
|
||||
place_item('Master Sword Pedestal', 'Nothing')
|
||||
world.get_location('Master Sword Pedestal', player).locked = True
|
||||
elif goal in ['pedestal', 'trinity'] and swords != 'vanilla':
|
||||
place_item('Master Sword Pedestal', 'Triforce')
|
||||
world.get_location('Master Sword Pedestal', player).locked = True
|
||||
if world.bow_mode[player].startswith('retro'):
|
||||
pool = [item.replace('Single Arrow', 'Rupees (5)') for item in pool]
|
||||
pool = [item.replace('Arrows (10)', 'Rupees (5)') for item in pool]
|
||||
@@ -1213,7 +1225,7 @@ def get_pool_core(world, player, progressive, shuffle, difficulty, treasure_hunt
|
||||
pool.extend(['Small Key (Universal)'])
|
||||
else:
|
||||
pool.extend(['Small Key (Universal)'])
|
||||
return (pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms)
|
||||
return (pool, placed_items, precollected_items, clock_mode)
|
||||
|
||||
|
||||
item_alternates = {
|
||||
@@ -1329,8 +1341,6 @@ def make_custom_item_pool(world, player, progressive, shuffle, difficulty, timer
|
||||
|
||||
diff = difficulties[difficulty]
|
||||
|
||||
lamps_needed_for_dark_rooms = 1
|
||||
|
||||
# expert+ difficulties produce the same contents for
|
||||
# all bottles, since only one bottle is available
|
||||
if diff.same_bottle:
|
||||
@@ -1359,8 +1369,12 @@ def make_custom_item_pool(world, player, progressive, shuffle, difficulty, timer
|
||||
|
||||
if goal in ['sanctuary']:
|
||||
place_item('Sanctuary', 'Triforce')
|
||||
if goal in ['pedestal', 'trinity']:
|
||||
if world.custom_goals[player]['pedgoal'] and 'requirements' in world.custom_goals[player]['pedgoal'] and world.custom_goals[player]['pedgoal']['requirements'][0]['condition'] == 0x00:
|
||||
place_item('Master Sword Pedestal', 'Nothing')
|
||||
world.get_location('Master Sword Pedestal', player).locked = True
|
||||
elif goal in ['pedestal', 'trinity']:
|
||||
place_item('Master Sword Pedestal', 'Triforce')
|
||||
world.get_location('Master Sword Pedestal', player).locked = True
|
||||
|
||||
if mode == 'standard':
|
||||
if world.keyshuffle[player] == 'universal':
|
||||
@@ -1392,7 +1406,7 @@ def make_custom_item_pool(world, player, progressive, shuffle, difficulty, timer
|
||||
pool.remove('Fighter Sword')
|
||||
pool.append('Rupees (50)')
|
||||
|
||||
return (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_total, treasure_hunt_icon, lamps_needed_for_dark_rooms)
|
||||
return (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_total, treasure_hunt_icon)
|
||||
|
||||
def make_customizer_pool(world, player):
|
||||
pool = []
|
||||
@@ -1475,8 +1489,12 @@ def make_customizer_pool(world, player):
|
||||
|
||||
if goal in ['sanctuary']:
|
||||
place_item('Sanctuary', 'Triforce')
|
||||
if world.goal[player] in ['pedestal', 'trinity']:
|
||||
if world.custom_goals[player]['pedgoal'] and 'requirements' in world.custom_goals[player]['pedgoal'] and world.custom_goals[player]['pedgoal']['requirements'][0]['condition'] == 0x00:
|
||||
place_item('Master Sword Pedestal', 'Nothing')
|
||||
world.get_location('Master Sword Pedestal', player).locked = True
|
||||
elif world.goal[player] in ['pedestal', 'trinity']:
|
||||
place_item('Master Sword Pedestal', 'Triforce')
|
||||
world.get_location('Master Sword Pedestal', player).locked = True
|
||||
|
||||
guaranteed_items = alwaysitems + ['Magic Mirror', 'Moon Pearl']
|
||||
if world.is_tile_swapped(0x18, player) or world.flute_mode[player] == 'active':
|
||||
@@ -1539,7 +1557,7 @@ def make_customizer_pool(world, player):
|
||||
pool.remove('Fighter Sword')
|
||||
pool.append('Rupees (50)')
|
||||
|
||||
return pool, placed_items, precollected_items, clock_mode, 1
|
||||
return pool, placed_items, precollected_items, clock_mode
|
||||
|
||||
|
||||
filler_items = {
|
||||
@@ -1685,7 +1703,7 @@ def set_event_item(world, player, location_name, item_name=None):
|
||||
|
||||
|
||||
def shuffle_event_items(world, player):
|
||||
if (world.shuffle_followers[player]):
|
||||
if world.shuffle_followers[player]:
|
||||
available_quests = follower_quests.copy()
|
||||
available_pickups = [quests[0] for quests in available_quests.values()]
|
||||
|
||||
@@ -1697,11 +1715,14 @@ def shuffle_event_items(world, player):
|
||||
available_pickups.remove(loc.item.name)
|
||||
|
||||
|
||||
if world.mode[player] == 'standard':
|
||||
if 'Zelda Herself' in available_pickups:
|
||||
zelda_pickup = available_quests.pop('Zelda Pickup')[0]
|
||||
available_pickups.remove(zelda_pickup)
|
||||
set_event_item(world, player, 'Zelda Pickup', zelda_pickup)
|
||||
if world.mode[player] == 'standard' and 'Zelda Herself' in available_pickups:
|
||||
zelda_dropoff = 'Zelda Pickup'
|
||||
if world.default_zelda_region[player] == 'Thieves Blind\'s Cell':
|
||||
zelda_dropoff = 'Suspicious Maiden'
|
||||
available_quests.pop(zelda_dropoff)
|
||||
zelda_pickup = 'Zelda Herself'
|
||||
available_pickups.remove(zelda_pickup)
|
||||
set_event_item(world, player, zelda_dropoff, zelda_pickup)
|
||||
|
||||
random.shuffle(available_pickups)
|
||||
|
||||
@@ -1724,10 +1745,11 @@ def get_item_and_event_flag(item, world, player, dungeon_pool, prize_set, prize_
|
||||
item_player = player if len(item_parts) < 2 else int(item_parts[1])
|
||||
item_name = item_parts[0]
|
||||
event_flag = False
|
||||
if item_name in prize_set:
|
||||
item_player = player # prizes must be for that player
|
||||
if item_name in prize_set or item_name in follower_pickups:
|
||||
item_player = player # must be for that player
|
||||
item_to_place = ItemFactory(item_name, item_player)
|
||||
prize_pool.remove(item_name)
|
||||
if item_name in prize_set:
|
||||
prize_pool.remove(item_name)
|
||||
event_flag = True
|
||||
elif is_dungeon_item(item_name, world, item_player):
|
||||
item_to_place = next(x for x in dungeon_pool
|
||||
|
||||
@@ -1805,7 +1805,10 @@ def imp_locations_factory(world, player):
|
||||
return imp_locations
|
||||
imp_locations = ['Agahnim 1', 'Agahnim 2', 'Attic Cracked Floor', 'Suspicious Maiden']
|
||||
if world.mode[player] == 'standard':
|
||||
imp_locations.append('Zelda Pickup')
|
||||
if world.default_zelda_region[player] == 'Thieves Blinds\' Cell':
|
||||
imp_locations.append('Suspicious Maiden')
|
||||
else:
|
||||
imp_locations.append('Zelda Pickup')
|
||||
imp_locations.append('Zelda Drop Off')
|
||||
return imp_locations
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ from OverworldGlitchRules import create_owg_connections
|
||||
from PotShuffle import shuffle_pots, shuffle_pot_switches
|
||||
from Regions import create_regions, create_shops, mark_light_dark_world_regions, create_dungeon_regions, adjust_locations
|
||||
from OWEdges import create_owedges
|
||||
from OverworldShuffle import link_overworld, update_world_regions, create_dynamic_exits
|
||||
from OverworldShuffle import link_overworld, update_world_regions, create_dynamic_flute_exits, create_dynamic_mirror_exits
|
||||
from Rom import patch_rom, patch_race_rom, apply_rom_settings, LocalRom, JsonRom, get_hash_string
|
||||
from Doors import create_doors
|
||||
from DoorShuffle import link_doors, connect_portal, link_doors_prep
|
||||
@@ -40,7 +40,7 @@ from source.enemizer.DamageTables import DamageTable
|
||||
from source.enemizer.Enemizer import randomize_enemies
|
||||
from source.rom.DataTables import init_data_tables
|
||||
|
||||
version_number = '1.4.10'
|
||||
version_number = '1.5.0'
|
||||
version_branch = '-u'
|
||||
__version__ = f'{version_number}{version_branch}'
|
||||
|
||||
@@ -117,31 +117,7 @@ def main(args, seed=None, fish=None):
|
||||
if args.securerandom:
|
||||
world.seed = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(9))
|
||||
|
||||
world.crystals_needed_for_ganon = {player: random.randint(0, 7) if args.crystals_ganon[player] == 'random' else int(args.crystals_ganon[player]) for player in range(1, world.players + 1)}
|
||||
world.crystals_needed_for_gt = {player: random.randint(0, 7) if args.crystals_gt[player] == 'random' else int(args.crystals_gt[player]) for player in range(1, world.players + 1)}
|
||||
world.ganon_item = {player: random_ganon_item(args.swords[player]) if args.ganon_item[player] == 'random' else args.ganon_item[player] for player in range(1, world.players + 1)}
|
||||
|
||||
world.intensity = {player: random.randint(1, 3) if args.intensity[player] == 'random' else int(args.intensity[player]) for player in range(1, world.players + 1)}
|
||||
|
||||
world.treasure_hunt_count = {}
|
||||
world.treasure_hunt_total = {}
|
||||
for p in args.triforce_goal:
|
||||
if int(args.triforce_goal[p]) != 0 or int(args.triforce_pool[p]) != 0 or int(args.triforce_goal_min[p]) != 0 or int(args.triforce_goal_max[p]) != 0 or int(args.triforce_pool_min[p]) != 0 or int(args.triforce_pool_max[p]) != 0:
|
||||
if int(args.triforce_goal[p]) != 0:
|
||||
world.treasure_hunt_count[p] = int(args.triforce_goal[p])
|
||||
elif int(args.triforce_goal_min[p]) != 0 and int(args.triforce_goal_max[p]) != 0:
|
||||
world.treasure_hunt_count[p] = random.randint(int(args.triforce_goal_min[p]), int(args.triforce_goal_max[p]))
|
||||
else:
|
||||
world.treasure_hunt_count[p] = 8 if world.goal[p] == 'trinity' else 20
|
||||
if int(args.triforce_pool[p]) != 0:
|
||||
world.treasure_hunt_total[p] = int(args.triforce_pool[p])
|
||||
elif int(args.triforce_pool_min[p]) != 0 and int(args.triforce_pool_max[p]) != 0:
|
||||
world.treasure_hunt_total[p] = random.randint(max(int(args.triforce_pool_min[p]), world.treasure_hunt_count[p] + int(args.triforce_min_difference[p])), min(int(args.triforce_pool_max[p]), world.treasure_hunt_count[p] + int(args.triforce_max_difference[p])))
|
||||
else:
|
||||
world.treasure_hunt_total[p] = 10 if world.goal[p] == 'trinity' else 30
|
||||
else:
|
||||
# this will be handled in ItemList.py and custom item pool is used to determine the numbers
|
||||
world.treasure_hunt_count[p], world.treasure_hunt_total[p] = 0, 0
|
||||
resolve_random_settings(world, args)
|
||||
|
||||
world.rom_seeds = {player: random.randint(0, 999999999) for player in range(1, world.players + 1)}
|
||||
world.finish_init()
|
||||
@@ -215,9 +191,7 @@ def main(args, seed=None, fish=None):
|
||||
for player in range(1, world.players + 1):
|
||||
link_overworld(world, player)
|
||||
create_shops(world, player)
|
||||
update_world_regions(world, player)
|
||||
mark_light_dark_world_regions(world, player)
|
||||
create_dynamic_exits(world, player)
|
||||
|
||||
init_districts(world)
|
||||
|
||||
@@ -335,7 +309,7 @@ def main(args, seed=None, fish=None):
|
||||
for player in range(1, world.players + 1):
|
||||
rom = JsonRom() if args.jsonout else LocalRom(args.rom)
|
||||
|
||||
patch_rom(world, rom, player, team, bool(args.mystery))
|
||||
patch_rom(world, rom, player, team, bool(args.mystery), str(args.rom_header) if args.rom_header else None)
|
||||
|
||||
if args.race:
|
||||
patch_race_rom(rom)
|
||||
@@ -344,7 +318,7 @@ def main(args, seed=None, fish=None):
|
||||
world.spoiler.hashes[(player, team)] = get_hash_string(rom.hash)
|
||||
|
||||
apply_rom_settings(rom, args.heartbeep[player], args.heartcolor[player], args.quickswap[player],
|
||||
args.fastmenu[player], args.disablemusic[player], args.sprite[player],
|
||||
args.fastmenu[player], args.disablemusic[player], args.sprite[player], args.triforce_gfx[player],
|
||||
args.ow_palettes[player], args.uw_palettes[player], args.reduce_flashing[player],
|
||||
args.shuffle_sfx[player], args.shuffle_sfxinstruments[player], args.shuffle_songinstruments[player],
|
||||
args.msu_resume[player])
|
||||
@@ -548,10 +522,200 @@ def init_world(args, fish):
|
||||
world.aga_randomness = args.aga_randomness.copy()
|
||||
world.money_balance = args.money_balance.copy()
|
||||
|
||||
# custom settings - these haven't been promoted to full settings yet
|
||||
in_progress_settings = ['force_enemy', 'free_lamp_cone']
|
||||
for player in range(1, world.players + 1):
|
||||
for setting in in_progress_settings:
|
||||
if world.customizer and world.customizer.has_setting(player, setting):
|
||||
getattr(world, setting)[player] = world.customizer.get_setting(player, setting)
|
||||
|
||||
return world
|
||||
|
||||
|
||||
def resolve_random_settings(world, args):
|
||||
world.crystals_needed_for_ganon = {player: random.randint(0, 7) if args.crystals_ganon[player] == 'random' else int(args.crystals_ganon[player]) for player in range(1, world.players + 1)}
|
||||
world.crystals_needed_for_gt = {player: random.randint(0, 7) if args.crystals_gt[player] == 'random' else int(args.crystals_gt[player]) for player in range(1, world.players + 1)}
|
||||
world.ganon_item = {player: random_ganon_item(args.swords[player]) if args.ganon_item[player] == 'random' else args.ganon_item[player] for player in range(1, world.players + 1)}
|
||||
world.intensity = {player: random.randint(1, 3) if args.intensity[player] == 'random' else int(args.intensity[player]) for player in range(1, world.players + 1)}
|
||||
|
||||
world.treasure_hunt_count = {}
|
||||
world.treasure_hunt_total = {}
|
||||
for p in args.triforce_goal:
|
||||
if int(args.triforce_goal[p]) != 0 or int(args.triforce_pool[p]) != 0 or int(args.triforce_goal_min[p]) != 0 or int(args.triforce_goal_max[p]) != 0 or int(args.triforce_pool_min[p]) != 0 or int(args.triforce_pool_max[p]) != 0:
|
||||
if int(args.triforce_goal[p]) != 0:
|
||||
world.treasure_hunt_count[p] = int(args.triforce_goal[p])
|
||||
elif int(args.triforce_goal_min[p]) != 0 and int(args.triforce_goal_max[p]) != 0:
|
||||
world.treasure_hunt_count[p] = random.randint(int(args.triforce_goal_min[p]), int(args.triforce_goal_max[p]))
|
||||
else:
|
||||
world.treasure_hunt_count[p] = 8 if world.goal[p] == 'trinity' else 20
|
||||
if int(args.triforce_pool[p]) != 0:
|
||||
world.treasure_hunt_total[p] = int(args.triforce_pool[p])
|
||||
elif int(args.triforce_pool_min[p]) != 0 and int(args.triforce_pool_max[p]) != 0:
|
||||
world.treasure_hunt_total[p] = random.randint(max(int(args.triforce_pool_min[p]), world.treasure_hunt_count[p] + int(args.triforce_min_difference[p])), min(int(args.triforce_pool_max[p]), world.treasure_hunt_count[p] + int(args.triforce_max_difference[p])))
|
||||
else:
|
||||
world.treasure_hunt_total[p] = 10 if world.goal[p] == 'trinity' else 30
|
||||
else:
|
||||
# this will be handled in ItemList.py and custom item pool is used to determine the numbers
|
||||
world.treasure_hunt_count[p], world.treasure_hunt_total[p] = 0, 0
|
||||
|
||||
if world.customizer:
|
||||
def process_goal(goal_type):
|
||||
goal_input = goals[player][goal_type]
|
||||
world.custom_goals[player][goal_type] = goal = {}
|
||||
if 'cutscene_gfx' in goal_input and goal_type in ['gtentry', 'pedgoal', 'murahgoal']:
|
||||
gfx = goal_input['cutscene_gfx']
|
||||
if type(gfx) is str:
|
||||
from Tables import item_gfx_table
|
||||
if gfx.lower() == 'random':
|
||||
gfx = random.choice(list(item_gfx_table.keys()))
|
||||
if gfx in item_gfx_table:
|
||||
goal['cutscene_gfx'] = (item_gfx_table[gfx][1] + (0x8000 if not item_gfx_table[gfx][0] else 0), item_gfx_table[gfx][2])
|
||||
else:
|
||||
raise Exception(f'Invalid name "{gfx}" in customized {goal_type} cutscene gfx')
|
||||
else:
|
||||
goal['cutscene_gfx'] = gfx
|
||||
if 'requirements' in goal_input:
|
||||
if goal_type == 'ganongoal' and world.goal[player] == 'pedestal':
|
||||
goal['requirements'] = [0x00]
|
||||
goal['logic'] = False
|
||||
return
|
||||
goal['requirements'] = []
|
||||
goal['logic'] = {}
|
||||
if 'goaltext' in goal_input:
|
||||
goal['goaltext'] = goal_input['goaltext']
|
||||
else:
|
||||
raise Exception(f'Missing goal text for {goal_type}')
|
||||
|
||||
req_table = {
|
||||
'Invulnerable': 0x00,
|
||||
'Disabled': 0x00,
|
||||
'Pendants': 0x01,
|
||||
'Crystals': 0x02,
|
||||
'PendantBosses': 0x03,
|
||||
'CrystalBosses': 0x04,
|
||||
'PrizeBosses': 0x05,
|
||||
'Bosses': 0x05,
|
||||
'Agahnim1Defeated': 0x06,
|
||||
'Agahnim1': 0x06,
|
||||
'Aga1': 0x06,
|
||||
'Agahnim2Defeated': 0x07,
|
||||
'Agahnim2': 0x07,
|
||||
'Aga2': 0x07,
|
||||
'GoalItemsCollected': 0x08,
|
||||
'GoalItems': 0x08,
|
||||
'TriforcePieces': 0x08,
|
||||
'TriforceHunt': 0x08,
|
||||
'MaxCollectionRate': 0x09,
|
||||
'CollectionRate': 0x09,
|
||||
'Collection': 0x09,
|
||||
'CustomGoal': 0x0A,
|
||||
'Custom': 0x0A,
|
||||
}
|
||||
if isinstance(goal_input['requirements'], list):
|
||||
for r in list(goal_input['requirements']):
|
||||
req = {}
|
||||
try:
|
||||
if isinstance(r, str):
|
||||
req['condition'] = req_table[r]
|
||||
else:
|
||||
req['condition'] = req_table[list(r.keys())[0]]
|
||||
if req['condition'] == req_table['Invulnerable']:
|
||||
goal['requirements']= [req]
|
||||
goal['logic'] = False
|
||||
break
|
||||
elif req['condition'] == req_table['CustomGoal']:
|
||||
if isinstance(r['address'], int) and 0x7E0000 <= r['address'] <= 0x7FFFFF:
|
||||
compare_table = {
|
||||
'minimum': 0x00,
|
||||
'at least': 0x00,
|
||||
'equal': 0x01,
|
||||
'equals': 0x01,
|
||||
'equal to': 0x01,
|
||||
'any flag': 0x02,
|
||||
'all flags': 0x03,
|
||||
'flags match': 0x03,
|
||||
'count bits': 0x04,
|
||||
'count flags': 0x04,
|
||||
}
|
||||
if r['comparison'] in compare_table:
|
||||
options = compare_table[r['comparison']]
|
||||
if r['address'] >= 0x7F0000:
|
||||
options |= 0x10
|
||||
if isinstance(r['target'], int) and 0 <= r['target'] <= 0xFFFF:
|
||||
if 'size' in r and r['size'] in ['word', '16-bit', '16bit', '16 bit', '16', '2-byte', '2byte', '2 byte', '2-bytes', '2 bytes']:
|
||||
options |= 0x08
|
||||
req['target'] = r['target']
|
||||
elif 0 <= r['target'] <= 0xFF:
|
||||
req['target'] = r['target']
|
||||
else:
|
||||
raise Exception(f'Invalid custom goal target for {goal_type}, must be an 8-bit integer')
|
||||
req.update({'address': r['address'] & 0xFFFF, 'options': options})
|
||||
goal['requirements'].append(req)
|
||||
else:
|
||||
raise Exception(f'Invalid custom goal target for {goal_type}, must be a 16-bit integer')
|
||||
else:
|
||||
raise KeyError(f'Invalid custom goal comparison for {goal_type}')
|
||||
else:
|
||||
raise Exception(f'Custom goal address for {goal_type} only allows 0x7Exxxx and 0x7Fxxxx addresses')
|
||||
else:
|
||||
if req['condition'] not in [req_table['Aga1'], req_table['Aga2']]:
|
||||
if 'target' not in r:
|
||||
req['condition'] |= 0x80
|
||||
else:
|
||||
if isinstance(r['target'], int):
|
||||
if req['condition'] < req_table['TriforcePieces']:
|
||||
if 0 <= r['target'] <= 0xFF:
|
||||
req['target'] = r['target']
|
||||
else:
|
||||
raise Exception(f'Invalid {list(r.keys())[0]} requirement target for {goal_type}, must be an 8-bit integer')
|
||||
else:
|
||||
if 0 <= r['target'] <= 0xFFFF:
|
||||
req['target'] = r['target']
|
||||
else:
|
||||
raise Exception(f'Invalid {list(r.keys())[0]} requirement target for {goal_type}, must be a 16-bit integer')
|
||||
elif isinstance(r['target'], str):
|
||||
if r['target'].lower() == 'random':
|
||||
req['target'] = 'random'
|
||||
elif r['target'].endswith('%') and 1 <= int(r['target'][:-1]) <= 100:
|
||||
req['target'] = req['target']
|
||||
else:
|
||||
raise Exception(f'Invalid {list(r.keys())[0]} requirement target for {goal_type}')
|
||||
if req['condition'] & 0x7F == req_table['Pendants']:
|
||||
goal['logic']['pendants'] = req['target'] = req.get('target', 3)
|
||||
elif req['condition'] & 0x7F == req_table['Crystals']:
|
||||
goal['logic']['crystals'] = req['target'] = req.get('target', 7)
|
||||
elif req['condition'] & 0x7F == req_table['PendantBosses']:
|
||||
goal['logic']['pendant_bosses'] = req['target'] = req.get('target', 3)
|
||||
elif req['condition'] & 0x7F == req_table['CrystalBosses']:
|
||||
goal['logic']['crystal_bosses'] = req['target'] = req.get('target', 7)
|
||||
elif req['condition'] & 0x7F == req_table['PrizeBosses']:
|
||||
goal['logic']['bosses'] = req['target'] = req.get('target', 10)
|
||||
elif req['condition'] & 0x7F == req_table['Aga1']:
|
||||
goal['logic']['aga1'] = True
|
||||
elif req['condition'] & 0x7F == req_table['Aga2']:
|
||||
goal['logic']['aga2'] = True
|
||||
elif req['condition'] & 0x7F == req_table['TriforcePieces']:
|
||||
goal['logic']['goal_items'] = req['target'] = req.get('target', None)
|
||||
elif req['condition'] & 0x7F == req_table['CollectionRate']:
|
||||
goal['logic']['collection'] = req['target'] = req.get('target', None)
|
||||
goal['requirements'].append(req)
|
||||
except KeyError:
|
||||
raise KeyError(f'Invalid {goal_type} requirement: {r}')
|
||||
else:
|
||||
raise KeyError(f'Invalid {goal_type} requirement definition')
|
||||
if 'logic' in goal_input and goal['logic'] and goal['logic'] is not None:
|
||||
goal['logic'].update(goal_input['logic'])
|
||||
return
|
||||
|
||||
goals = world.customizer.get_goals()
|
||||
for player in range(1, world.players + 1):
|
||||
if goals and player in goals:
|
||||
for g in ['gtentry', 'ganongoal', 'pedgoal', 'murahgoal']:
|
||||
if g in goals[player]:
|
||||
process_goal(g)
|
||||
return
|
||||
|
||||
|
||||
def set_starting_inventory(world, args):
|
||||
for player in range(1, world.players + 1):
|
||||
if args.usestartinventory[player]:
|
||||
@@ -616,7 +780,6 @@ def copy_world(world):
|
||||
ret.can_take_damage = world.can_take_damage
|
||||
ret.difficulty_requirements = world.difficulty_requirements.copy()
|
||||
ret.fix_fake_world = world.fix_fake_world.copy()
|
||||
ret.lamps_needed_for_dark_rooms = world.lamps_needed_for_dark_rooms
|
||||
ret.mapshuffle = world.mapshuffle.copy()
|
||||
ret.compassshuffle = world.compassshuffle.copy()
|
||||
ret.keyshuffle = world.keyshuffle.copy()
|
||||
@@ -625,6 +788,7 @@ def copy_world(world):
|
||||
ret.bombbag = world.bombbag.copy()
|
||||
ret.flute_mode = world.flute_mode.copy()
|
||||
ret.bow_mode = world.bow_mode.copy()
|
||||
ret.free_lamp_cone = world.free_lamp_cone.copy()
|
||||
ret.crystals_needed_for_ganon = world.crystals_needed_for_ganon.copy()
|
||||
ret.crystals_needed_for_gt = world.crystals_needed_for_gt.copy()
|
||||
ret.ganon_item = world.ganon_item.copy()
|
||||
@@ -687,13 +851,13 @@ def copy_world(world):
|
||||
update_world_regions(ret, player)
|
||||
if world.logic[player] in ('owglitches', 'hybridglitches', 'nologic'):
|
||||
create_owg_connections(ret, player)
|
||||
create_dynamic_exits(ret, player)
|
||||
create_dungeon_regions(ret, player)
|
||||
create_owedges(ret, player)
|
||||
create_shops(ret, player)
|
||||
#create_doors(ret, player)
|
||||
create_rooms(ret, player)
|
||||
create_dungeons(ret, player)
|
||||
create_dynamic_mirror_exits(ret, player)
|
||||
create_dynamic_flute_exits(ret, player)
|
||||
|
||||
# there are region references here they must be migrated to preserve integrity
|
||||
# ret.exp_cache = world.exp_cache.copy()
|
||||
@@ -818,7 +982,7 @@ def copy_world(world):
|
||||
return ret
|
||||
|
||||
|
||||
def copy_world_premature(world, player):
|
||||
def copy_world_premature(world, player, create_flute_exits=True):
|
||||
# ToDo: Not good yet
|
||||
ret = World(world.players, world.owShuffle, world.owCrossed, world.owMixed, world.shuffle, world.doorShuffle, world.logic, world.mode, world.swords,
|
||||
world.difficulty, world.difficulty_adjustments, world.timer, world.progressive, world.goal, world.algorithm,
|
||||
@@ -843,7 +1007,6 @@ def copy_world_premature(world, player):
|
||||
ret.can_take_damage = world.can_take_damage
|
||||
ret.difficulty_requirements = world.difficulty_requirements.copy()
|
||||
ret.fix_fake_world = world.fix_fake_world.copy()
|
||||
ret.lamps_needed_for_dark_rooms = world.lamps_needed_for_dark_rooms
|
||||
ret.mapshuffle = world.mapshuffle.copy()
|
||||
ret.compassshuffle = world.compassshuffle.copy()
|
||||
ret.keyshuffle = world.keyshuffle.copy()
|
||||
@@ -852,6 +1015,7 @@ def copy_world_premature(world, player):
|
||||
ret.bombbag = world.bombbag.copy()
|
||||
ret.flute_mode = world.flute_mode.copy()
|
||||
ret.bow_mode = world.bow_mode.copy()
|
||||
ret.free_lamp_cone = world.free_lamp_cone.copy()
|
||||
ret.crystals_needed_for_ganon = world.crystals_needed_for_ganon.copy()
|
||||
ret.crystals_needed_for_gt = world.crystals_needed_for_gt.copy()
|
||||
ret.ganon_item = world.ganon_item.copy()
|
||||
@@ -910,19 +1074,21 @@ def copy_world_premature(world, player):
|
||||
ret.key_logic = world.key_logic.copy()
|
||||
ret.settings = world.settings
|
||||
|
||||
ret.is_copied_world = True
|
||||
ret.is_premature_copied_world = True
|
||||
|
||||
create_regions(ret, player)
|
||||
update_world_regions(ret, player)
|
||||
if world.logic[player] in ('owglitches', 'hybridglitches', 'nologic'):
|
||||
create_owg_connections(ret, player)
|
||||
create_dynamic_exits(ret, player)
|
||||
create_dungeon_regions(ret, player)
|
||||
create_owedges(ret, player)
|
||||
create_shops(ret, player)
|
||||
create_doors(ret, player)
|
||||
create_rooms(ret, player)
|
||||
create_dungeons(ret, player)
|
||||
create_dynamic_mirror_exits(ret, player) # assumes these have already been added to world
|
||||
if create_flute_exits:
|
||||
create_dynamic_flute_exits(ret, player)
|
||||
|
||||
if world.mode[player] == 'standard':
|
||||
parent = ret.get_region('Menu', player)
|
||||
|
||||
@@ -83,7 +83,7 @@ def notify_client(client : Client, text : str):
|
||||
logging.info("Notice (Player %s in team %d): %s" % (client.name, client.team+1, text))
|
||||
asyncio.create_task(send_msgs(client.socket, [['Print', text]]))
|
||||
|
||||
async def server(websocket, path, ctx : Context):
|
||||
async def server(websocket, ctx : Context):
|
||||
client = Client(websocket)
|
||||
ctx.clients.append(client)
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ from OWEdges import OWTileRegions, OWEdgeGroups, OWEdgeGroupsTerrain, OWExitType
|
||||
from OverworldGlitchRules import create_owg_connections
|
||||
from Utils import bidict
|
||||
|
||||
version_number = '0.6.0.7'
|
||||
version_number = '0.6.1.7'
|
||||
# branch indicator is intentionally different across branches
|
||||
version_branch = ''
|
||||
|
||||
@@ -200,6 +200,7 @@ def link_overworld(world, player):
|
||||
connect_simple(world, exitname, regionname, player)
|
||||
|
||||
categorize_world_regions(world, player)
|
||||
create_dynamic_mirror_exits(world, player)
|
||||
|
||||
if world.logic[player] in ('owglitches', 'hybridglitches', 'nologic'):
|
||||
create_owg_connections(world, player)
|
||||
@@ -424,8 +425,6 @@ def link_overworld(world, player):
|
||||
assert len(forward_set) == len(back_set)
|
||||
for (forward_edge, back_edge) in zip(forward_set, back_set):
|
||||
connect_two_way(world, forward_edge, back_edge, player, connected_edges)
|
||||
|
||||
world.owsectors[player] = build_sectors(world, player)
|
||||
else:
|
||||
if world.owKeepSimilar[player] and world.owShuffle[player] == 'parallel':
|
||||
for exitname, destname in parallelsimilar_connections:
|
||||
@@ -558,12 +557,13 @@ def link_overworld(world, player):
|
||||
remove_connected(forward_edge_sets, back_edge_sets)
|
||||
assert len(connected_edges) == len(default_connections) * 2, connected_edges
|
||||
|
||||
world.owsectors[player] = build_sectors(world, player)
|
||||
valid_layout = validate_layout(world, player)
|
||||
|
||||
tries -= 1
|
||||
assert valid_layout, 'Could not find a valid OW layout'
|
||||
|
||||
world.owsectors[player] = build_sectors(world, player)
|
||||
|
||||
# flute shuffle
|
||||
logging.getLogger('').debug('Shuffling flute spots')
|
||||
def connect_flutes(flute_destinations):
|
||||
@@ -725,6 +725,8 @@ def link_overworld(world, player):
|
||||
s[0x3a],s[0x3b],s[0x3c], s[0x3f])
|
||||
world.spoiler.set_map('flute', text_output, new_spots, player)
|
||||
|
||||
create_dynamic_flute_exits(world, player)
|
||||
|
||||
def connect_custom(world, connected_edges, groups, forced, player):
|
||||
forced_crossed, forced_noncrossed = forced
|
||||
def remove_pair_from_pool(edgename1, edgename2, is_crossed):
|
||||
@@ -1292,7 +1294,7 @@ def adjust_edge_groups(world, trimmed_groups, edges_to_swap, player):
|
||||
groups[(mode, wrld, dir, terrain, parallel, count, group_name)][i].extend(matches)
|
||||
return groups
|
||||
|
||||
def create_flute_exits(world, player):
|
||||
def create_dynamic_flute_exits(world, player):
|
||||
flute_in_pool = True if player not in world.customitemarray else any(i for i, n in world.customitemarray[player].items() if i == 'flute' and n > 0)
|
||||
if not flute_in_pool:
|
||||
return
|
||||
@@ -1303,6 +1305,7 @@ def create_flute_exits(world, player):
|
||||
exit.spot_type = 'Flute'
|
||||
exit.connect(world.get_region('Flute Sky', player))
|
||||
region.exits.append(exit)
|
||||
world.initialize_regions()
|
||||
|
||||
def get_mirror_exit_name(from_region, to_region):
|
||||
if from_region in mirror_connections and to_region in mirror_connections[from_region]:
|
||||
@@ -1329,7 +1332,7 @@ def get_mirror_edges(world, region, player):
|
||||
mirror_exits.append(tuple([get_mirror_exit_name(other_world_region_name, region.name), region.name]))
|
||||
return mirror_exits
|
||||
|
||||
def create_mirror_exits(world, player):
|
||||
def create_dynamic_mirror_exits(world, player):
|
||||
mirror_exits = set()
|
||||
for region in (r for r in world.regions if r.player == player and r.name not in ['Zoras Domain', 'Master Sword Meadow', 'Hobo Bridge']):
|
||||
if region.type == (RegionType.DarkWorld if world.mode[player] != 'inverted' else RegionType.LightWorld):
|
||||
@@ -1350,12 +1353,6 @@ def create_mirror_exits(world, player):
|
||||
region.exits.append(exit)
|
||||
|
||||
mirror_exits.add(exitname)
|
||||
elif region.terrain == Terrain.Land:
|
||||
pass
|
||||
|
||||
def create_dynamic_exits(world, player):
|
||||
create_flute_exits(world, player)
|
||||
create_mirror_exits(world, player)
|
||||
world.initialize_regions()
|
||||
|
||||
def categorize_world_regions(world, player):
|
||||
@@ -1433,7 +1430,7 @@ def build_sectors(world, player):
|
||||
# perform accessibility check on duplicate world
|
||||
for p in range(1, world.players + 1):
|
||||
world.key_logic[p] = {}
|
||||
base_world = copy_world_premature(world, player)
|
||||
base_world = copy_world_premature(world, player, create_flute_exits=False)
|
||||
|
||||
# build lists of contiguous regions accessible with full inventory (excl portals/mirror/flute/entrances)
|
||||
regions = list(OWTileRegions.copy().keys())
|
||||
@@ -1510,7 +1507,7 @@ def build_accessible_region_list(world, start_region, player, build_copy_world=F
|
||||
if build_copy_world:
|
||||
for p in range(1, world.players + 1):
|
||||
world.key_logic[p] = {}
|
||||
base_world = copy_world_premature(world, player)
|
||||
base_world = copy_world_premature(world, player, create_flute_exits=True)
|
||||
base_world.override_bomb_check = True
|
||||
else:
|
||||
base_world = world
|
||||
@@ -1554,8 +1551,6 @@ def validate_layout(world, player):
|
||||
'Pyramid Area': ['Pyramid Exit Ledge']
|
||||
}
|
||||
|
||||
from Main import copy_world_premature
|
||||
from Utils import stack_size3a
|
||||
# TODO: Find a better source for the below lists, original sourced was deprecated
|
||||
from source.overworld.EntranceData import default_dungeon_connections, default_connector_connections, default_item_connections, default_shop_connections, default_drop_connections, default_dropexit_connections
|
||||
|
||||
@@ -1567,12 +1562,11 @@ def validate_layout(world, player):
|
||||
flute_in_pool = True if player not in world.customitemarray else any(i for i, n in world.customitemarray[player].items() if i == 'flute' and n > 0)
|
||||
|
||||
def explore_region(region_name, region=None):
|
||||
if stack_size3a() > 500:
|
||||
raise GenerationException(f'Infinite loop detected for "{region_name}" located at \'validate_layout\'')
|
||||
|
||||
explored_regions.append(region_name)
|
||||
if region_name in explored_regions:
|
||||
return
|
||||
explored_regions.add(region_name)
|
||||
if not region:
|
||||
region = base_world.get_region(region_name, player)
|
||||
region = world.get_region(region_name, player)
|
||||
for exit in region.exits:
|
||||
if exit.connected_region is not None and exit.connected_region.name not in explored_regions \
|
||||
and exit.connected_region.type in [RegionType.LightWorld, RegionType.DarkWorld]:
|
||||
@@ -1587,10 +1581,7 @@ def validate_layout(world, player):
|
||||
if dest_region not in explored_regions:
|
||||
explore_region(dest_region)
|
||||
|
||||
for p in range(1, world.players + 1):
|
||||
world.key_logic[p] = {}
|
||||
base_world = copy_world_premature(world, player)
|
||||
explored_regions = list()
|
||||
explored_regions = set()
|
||||
|
||||
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull'] or not world.shufflelinks[player]:
|
||||
if not world.is_bombshop_start(player):
|
||||
@@ -1616,14 +1607,14 @@ def validate_layout(world, player):
|
||||
start_region = 'Hyrule Castle Ledge'
|
||||
explore_region(start_region)
|
||||
|
||||
unreachable_regions = OrderedDict()
|
||||
unreachable_regions = {}
|
||||
unreachable_count = -1
|
||||
while unreachable_count != len(unreachable_regions):
|
||||
# find unreachable regions
|
||||
unreachable_regions = {}
|
||||
for region_name in list(OWTileRegions.copy().keys()):
|
||||
if region_name not in explored_regions and region_name not in isolated_regions:
|
||||
region = base_world.get_region(region_name, player)
|
||||
region = world.get_region(region_name, player)
|
||||
unreachable_regions[region_name] = region
|
||||
|
||||
# loop thru unreachable regions to check if some can be excluded
|
||||
|
||||
@@ -5,7 +5,21 @@
|
||||
# Patch Notes
|
||||
|
||||
Changelog archive
|
||||
|
||||
* 1.4.11
|
||||
* Rom fixes (all thanks to Codemann, I believe)
|
||||
* Pot bug when at sprite limit
|
||||
* Kodongo AI vanilla in vanilla rooms
|
||||
* Issue with music silencing across certain room transitions
|
||||
* Glitched: Some HMG logic fixed. Thanks Muffins! (Sorry it took me forever to get this PR in)
|
||||
* Glitched: Blind fight VRAM fix. Thanks Mufffins!
|
||||
* Text: Updated tourney winners. Thanks clearmouse!
|
||||
* Enemizer: Banned Swamola enemy everywhere as they may be causing crashes
|
||||
* Enemizer: Enemy bans from Q2 and Q3. Thank you for all the reports.
|
||||
* 1.4.10
|
||||
* Logic: Changed the rule surrounding the Bumper Cave Ledge Drop (the murderdactyl) to only require Pearl AND (Cape OR Byrna OR a Sword) in OHKO mode for now. This is a temporary solution until a better way to prevent needing to use a framerule to get past the bird is invented.
|
||||
* Helmacopter Fix.
|
||||
* Fixed a bug in shopsanity that caused the generation to fail with certain prices.
|
||||
* Enemizer: fairies were invalid on the overworld (unless a bonk occurred nearby), so they will no longer be randomized there.
|
||||
* 1.4.9
|
||||
* Attempted fix for Moth conveyor room timing. Thanks for many people's input. Unsure if Helmacopter is still acceptable.
|
||||
* Mirror scroll will show up on file start screen if enabled (thanks Clearmouse!)
|
||||
|
||||
@@ -74,9 +74,9 @@ def main(args):
|
||||
logger.info('Patching ROM.')
|
||||
|
||||
rom = LocalRom(args.rom)
|
||||
patch_rom(world, rom, 1, 1, False)
|
||||
patch_rom(world, rom, 1, 1, False, str(args.rom_header) if args.rom_header else None)
|
||||
|
||||
apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, args.sprite, args.ow_palettes, args.uw_palettes)
|
||||
apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, args.sprite, args.triforce_gfx, args.ow_palettes, args.uw_palettes)
|
||||
|
||||
for textname, texttype, text in text_patches:
|
||||
if texttype == 'text':
|
||||
|
||||
@@ -141,8 +141,19 @@ These are now independent of retro mode and have three options: None, Random, an
|
||||
|
||||
# Patch Notes
|
||||
|
||||
* 1.4.10
|
||||
* Logic: Changed the rule surrounding the Bumper Cave Ledge Drop (the murderdactyl) to only require Pearl AND (Cape OR Byrna OR a Sword) in OHKO mode for now. This is a temporary solution until a better way to prevent needing to use a framerule to get past the bird is invented.
|
||||
* Helmacopter Fix.
|
||||
* Fixed a bug in shopsanity that caused the generation to fail with certain prices.
|
||||
* Enemizer: fairies were invalid on the overworld (unless a bonk occurred nearby), so they will no longer be randomized there.
|
||||
* 1.5.0
|
||||
* Logic: Fixed vanilla key logic for GT basement
|
||||
* Logic (Playthrough): Fixed an issue where enemy kill rules were not applied during playthrough calculation. (Thanks Catobat for the catch)
|
||||
* Enemy Drop: Added "spies" and shadows for hidden enemies when enemy drop shuffled is enabled
|
||||
* Pottery: Pots will uncolor when the item inside is collected next time the room is loaded
|
||||
* Keysanity/Keydrop Menu for DR:
|
||||
* Map key information is now controlled by the Dungeon Chest Counts setting. If set to always on, this information will be available right away in the menu and will be on the HUD even when the map is not obtained.
|
||||
* The key counter on the HUD for the current dungeon now accounts for keys from enemies or pots that are from vanilla key locations.
|
||||
* The first number on the HUD represents all keys collected either in that dungeon or elsewhere.
|
||||
* The second number on the HUD is the total keys that can be collected either in that dungeon or elsewhere.
|
||||
* The key counter on inside the Menu is unchanged. (At the bottom near A button items)
|
||||
* The first number in the Menu is the current number of keys in your inventory
|
||||
* The second number is how many keys left to find in chests (not those from pots/enemies unless those item pools are enabled)
|
||||
* Customizer: free_lamp_cone option added. The logic will account for this, and place the lamp without regard to dark rooms.
|
||||
* Customizer: force_enemy option added that makes all enemies the specified type if possible. There are known gfx glitches in the overworld.
|
||||
* Optimization: Improved generation performance (Thanks Catobat!)
|
||||
|
||||
@@ -44,7 +44,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings
|
||||
|
||||
|
||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||
RANDOMIZERBASEHASH = '664f23f393710f2235779dbcce78236f'
|
||||
RANDOMIZERBASEHASH = 'e188d59e5925d7ac84222b4e1cd5de6a'
|
||||
|
||||
|
||||
class JsonRom(object):
|
||||
@@ -419,7 +419,7 @@ def handle_native_dungeon(location, itemid):
|
||||
return itemid
|
||||
|
||||
|
||||
def patch_rom(world, rom, player, team, is_mystery=False):
|
||||
def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
||||
random.seed(world.rom_seeds[player])
|
||||
|
||||
# progressive bow silver arrow hint hack
|
||||
@@ -1242,8 +1242,6 @@ def patch_rom(world, rom, player, team, is_mystery=False):
|
||||
rom.write_bytes(0xE9A5, [0x7E, 0x00, 0x24]) # disable below ganon chest
|
||||
if world.is_pyramid_open(player):
|
||||
rom.initial_sram.pre_open_pyramid_hole()
|
||||
if world.crystals_needed_for_gt[player] == 0:
|
||||
rom.initial_sram.pre_open_ganons_tower()
|
||||
rom.write_byte(0x18008F, 0x01 if world.is_atgt_swapped(player) else 0x00) # AT/GT swapped
|
||||
rom.write_byte(0xF5D73, 0xF0) # bees are catchable
|
||||
rom.write_byte(0xF5F10, 0xF0) # bees are catchable
|
||||
@@ -1275,22 +1273,115 @@ def patch_rom(world, rom, player, team, is_mystery=False):
|
||||
(0x02 if 'bombs' in world.escape_assist[player] else 0x00) |
|
||||
(0x04 if 'magic' in world.escape_assist[player] else 0x00))) # Escape assist
|
||||
|
||||
if world.goal[player] in ['pedestal', 'triforcehunt', 'sanctuary']:
|
||||
rom.write_byte(0x1801A8, 0x01) # make ganon invincible
|
||||
elif world.goal[player] in ['dungeons']:
|
||||
rom.write_byte(0x1801A8, 0x02) # make ganon invincible until all dungeons are beat
|
||||
elif world.goal[player] in ['crystals', 'trinity']:
|
||||
rom.write_byte(0x1801A8, 0x04) # make ganon invincible until all crystals
|
||||
elif world.goal[player] in ['ganonhunt']:
|
||||
rom.write_byte(0x1801A8, 0x05) # make ganon invincible until all triforce pieces collected
|
||||
elif world.goal[player] in ['completionist']:
|
||||
rom.write_byte(0x1801A8, 0x0B) # make ganon invincible until everything is collected
|
||||
else:
|
||||
rom.write_byte(0x1801A8, 0x03) # make ganon invincible until all crystals and aga 2 are collected
|
||||
gt_entry, ped_pull, ganon_goal, murah_goal = [], [], [], []
|
||||
# 00: Invulnerable
|
||||
# 01: All pendants
|
||||
# 02: All crystals
|
||||
# 03: Pendant bosses
|
||||
# 04: Crystal bosses
|
||||
# 05: Prize bosses
|
||||
# 06: Agahnim 1 defeated
|
||||
# 07: Agahnim 2 defeated
|
||||
# 08: Goal items collected (ie. Triforce Pieces)
|
||||
# 09: Max collection rate
|
||||
# 0A: Custom goal
|
||||
|
||||
rom.write_byte(0x18019A, world.crystals_needed_for_gt[player])
|
||||
rom.write_byte(0x1801A6, world.crystals_needed_for_ganon[player])
|
||||
rom.write_byte(0x1801A2, 0x00) # ped requirement is vanilla, set to 0x1 for special requirements
|
||||
def get_goal_bytes(type):
|
||||
goal_bytes = []
|
||||
for req in world.custom_goals[player][type]['requirements']:
|
||||
goal_bytes += [req['condition']]
|
||||
if req['condition'] == 0x0A:
|
||||
# custom goal
|
||||
goal_bytes += [req['options']]
|
||||
goal_bytes += int16_as_bytes(req['address'])
|
||||
if 0x08 & req['options'] == 0:
|
||||
goal_bytes += [req['target']]
|
||||
else:
|
||||
goal_bytes += int16_as_bytes(req['target'])
|
||||
elif req['condition'] & 0x80 == 0:
|
||||
if req['condition'] & 0x7F == 0x06 or req['condition'] & 0x7F == 0x07:
|
||||
# agahnims have no target value
|
||||
pass
|
||||
elif req['condition'] & 0x7F < 0x08:
|
||||
goal_bytes += [req['target']]
|
||||
else:
|
||||
goal_bytes += int16_as_bytes(req['target'])
|
||||
return goal_bytes
|
||||
|
||||
if world.custom_goals[player]['gtentry'] and 'requirements' in world.custom_goals[player]['gtentry']:
|
||||
gt_entry += get_goal_bytes('gtentry')
|
||||
else:
|
||||
gt_entry += [0x02, world.crystals_needed_for_gt[player]]
|
||||
if len(gt_entry) == 0 or gt_entry == [0x02, 0x00]:
|
||||
rom.initial_sram.pre_open_ganons_tower()
|
||||
|
||||
if world.custom_goals[player]['pedgoal'] and 'requirements' in world.custom_goals[player]['pedgoal']:
|
||||
ped_pull += get_goal_bytes('pedgoal')
|
||||
else:
|
||||
ped_pull += [0x81]
|
||||
|
||||
if world.custom_goals[player]['murahgoal'] and 'requirements' in world.custom_goals[player]['murahgoal']:
|
||||
murah_goal += get_goal_bytes('murahgoal')
|
||||
else:
|
||||
if world.goal[player] in ['triforcehunt', 'trinity']:
|
||||
murah_goal += [0x88]
|
||||
else:
|
||||
murah_goal += [0x00]
|
||||
|
||||
if world.custom_goals[player]['ganongoal'] and 'requirements' in world.custom_goals[player]['ganongoal']:
|
||||
ganon_goal += get_goal_bytes('ganongoal')
|
||||
else:
|
||||
if world.goal[player] in ['pedestal', 'triforcehunt', 'sanctuary']:
|
||||
ganon_goal = [0x00]
|
||||
elif world.goal[player] in ['dungeons']:
|
||||
ganon_goal += [0x81, 0x82, 0x06, 0x07] # pendants, crystals, and agas
|
||||
elif world.goal[player] in ['crystals', 'trinity']:
|
||||
ganon_goal += [0x02, world.crystals_needed_for_ganon[player]]
|
||||
elif world.goal[player] in ['ganonhunt']:
|
||||
ganon_goal += [0x88] # triforce pieces
|
||||
elif world.goal[player] in ['completionist']:
|
||||
ganon_goal += [0x81, 0x82, 0x06, 0x07, 0x89] # AD and max collection rate
|
||||
else:
|
||||
ganon_goal += [0x02, world.crystals_needed_for_ganon[player], 0x07] # crystals and aga2
|
||||
|
||||
gt_entry += [0xFF]
|
||||
ped_pull += [0xFF]
|
||||
ganon_goal += [0xFF]
|
||||
murah_goal += [0xFF]
|
||||
start_address = 0x8198 + 8
|
||||
|
||||
write_int16(rom, 0x180198, start_address)
|
||||
rom.write_bytes(snes_to_pc(0xB00000 + start_address), gt_entry)
|
||||
start_address += len(gt_entry)
|
||||
|
||||
write_int16(rom, 0x18019A, start_address)
|
||||
rom.write_bytes(snes_to_pc(0xB00000 + start_address), ganon_goal)
|
||||
start_address += len(ganon_goal)
|
||||
|
||||
write_int16(rom, 0x18019C, start_address)
|
||||
rom.write_bytes(snes_to_pc(0xB00000 + start_address), ped_pull)
|
||||
start_address += len(ped_pull)
|
||||
|
||||
write_int16(rom, 0x18019E, start_address)
|
||||
rom.write_bytes(snes_to_pc(0xB00000 + start_address), murah_goal)
|
||||
start_address += len(murah_goal)
|
||||
|
||||
if start_address > 0x81D8:
|
||||
raise Exception("Custom Goal data too long to fit in allocated space, try reducing the amount of requirements.")
|
||||
|
||||
# goal cutscene gfx
|
||||
goals = {
|
||||
#goal: gfx addr, palette addr
|
||||
'gtentry': (0x3081D8, 0x3081E6),
|
||||
'pedgoal': (0x3081ED, 0x3081F3),
|
||||
'murahgoal': (0x3081F6, 0x3081FC),
|
||||
}
|
||||
for goal_type, gfx_addr in goals.items():
|
||||
goal = world.custom_goals[player][goal_type]
|
||||
if goal and 'cutscene_gfx' in goal:
|
||||
gfx = goal['cutscene_gfx']
|
||||
write_int16(rom, snes_to_pc(gfx_addr[0]), gfx[0])
|
||||
rom.write_byte(snes_to_pc(gfx_addr[1]), gfx[1])
|
||||
|
||||
ganon_item_byte = {
|
||||
"silver": 0x00,
|
||||
@@ -1628,6 +1719,18 @@ def patch_rom(world, rom, player, team, is_mystery=False):
|
||||
rom.write_bytes(snes_to_pc(0x09A045), [0xEA, 0xEA]) # allow super bomb to follow into UW holes
|
||||
rom.write_byte(snes_to_pc(0x09ACDF), 0x6B) # allow kiki/locksmith to follow after screen transition
|
||||
|
||||
if world.default_zelda_region[player] == 'Thieves Blind\'s Cell':
|
||||
write_int16(rom, snes_to_pc(0x02D8D6), 0x45) # change zelda spawn point to maiden cell
|
||||
rom.write_bytes(snes_to_pc(0x02D8F0), [0x08, 0x08, 0x08, 0x09, 0x0B, 0x0A, 0x0B, 0x0B])
|
||||
write_int16(rom, snes_to_pc(0x02D91C), 0x0B00)
|
||||
write_int16(rom, snes_to_pc(0x02D92A), 0x0800)
|
||||
write_int16(rom, snes_to_pc(0x02D938), 0x0860)
|
||||
write_int16(rom, snes_to_pc(0x02D946), 0x0B90)
|
||||
write_int16(rom, snes_to_pc(0x02D954), 0x0078)
|
||||
write_int16(rom, snes_to_pc(0x02D962), 0x017F)
|
||||
rom.write_byte(snes_to_pc(0x02D975), 0x00)
|
||||
rom.write_byte(snes_to_pc(0x02D98A), 0x02)
|
||||
|
||||
if world.enemy_shuffle[player] != 'none':
|
||||
# informs zelda and maiden to draw over gfx slots that are guaranteed unused
|
||||
rom.write_bytes(0x1802C1, world.data_tables[player].room_headers[0x80].free_gfx[0:2])
|
||||
@@ -1690,26 +1793,6 @@ def patch_rom(world, rom, player, team, is_mystery=False):
|
||||
randomize_damage_table(rom, world, player)
|
||||
write_strings(rom, world, player, team)
|
||||
|
||||
# gt entry
|
||||
if world.customizer:
|
||||
gtentry = world.customizer.get_gtentry()
|
||||
if gtentry and player in gtentry:
|
||||
gtentry = gtentry[player]
|
||||
if 'cutscene_gfx' in gtentry:
|
||||
gfx = gtentry['cutscene_gfx']
|
||||
if type(gfx) is str:
|
||||
from Tables import item_gfx_table
|
||||
if gfx.lower() == 'random':
|
||||
gfx = random.choice(list(item_gfx_table.keys()))
|
||||
if gfx in item_gfx_table:
|
||||
write_int16(rom, snes_to_pc(0x3081AA), item_gfx_table[gfx][1] + (0x8000 if not item_gfx_table[gfx][0] else 0))
|
||||
rom.write_byte(snes_to_pc(0x3081AC), item_gfx_table[gfx][2])
|
||||
else:
|
||||
logging.getLogger('').warning('Invalid name "%s" in customized GT entry cutscene gfx', gfx)
|
||||
else:
|
||||
write_int16(rom, snes_to_pc(0x3081AA), gfx[0])
|
||||
rom.write_byte(snes_to_pc(0x3081AC), gfx[1])
|
||||
|
||||
# write initial sram
|
||||
rom.write_initial_sram()
|
||||
|
||||
@@ -1719,8 +1802,23 @@ def patch_rom(world, rom, player, team, is_mystery=False):
|
||||
# 21 bytes
|
||||
from Main import __version__
|
||||
from OverworldShuffle import __version__ as ORVersion
|
||||
seedstring = f'{world.seed:09}' if isinstance(world.seed, int) else world.seed
|
||||
rom.name = bytearray(f'OR{__version__.split("-")[0].replace(".","")[0:3]}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21]
|
||||
if rom_header:
|
||||
if len(rom_header) > 21:
|
||||
raise Exception('ROM header too long. Max 21 bytes, found %d bytes.' % len(rom_header))
|
||||
elif '|' in rom_header:
|
||||
gen, seedstring = rom_header.split('|', 1)
|
||||
gen = f'{gen:<3}'
|
||||
seedstring = f'{int(seedstring):09}' if seedstring.isdigit() else seedstring[:9]
|
||||
rom.name = bytearray(f'OR{gen}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21]
|
||||
elif len(rom_header) <= 9:
|
||||
seedstring = f'{int(rom_header):09}' if rom_header.isdigit() else rom_header
|
||||
rom.name = bytearray(f'OR{__version__.split("-")[0].replace(".","")[0:3]}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21]
|
||||
else:
|
||||
rom.name = bytearray(rom_header, 'utf8')[:21]
|
||||
else:
|
||||
seedstring = f'{world.seed:09}' if isinstance(world.seed, int) else world.seed
|
||||
rom.name = bytearray(f'OR{__version__.split("-")[0].replace(".","")[0:3]}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21]
|
||||
|
||||
rom.name.extend([0] * (21 - len(rom.name)))
|
||||
rom.write_bytes(0x7FC0, rom.name)
|
||||
|
||||
@@ -1838,7 +1936,7 @@ def hud_format_text(text):
|
||||
return output[:32]
|
||||
|
||||
|
||||
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite,
|
||||
def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, sprite, triforce_gfx,
|
||||
ow_palettes, uw_palettes, reduce_flashing, shuffle_sfx,
|
||||
shuffle_sfxinstruments, shuffle_songinstruments, msu_resume):
|
||||
|
||||
@@ -1897,6 +1995,20 @@ def apply_rom_settings(rom, beep, color, quickswap, fastmenu, disable_music, spr
|
||||
if sprite is not None:
|
||||
write_sprite(rom, sprite)
|
||||
|
||||
if triforce_gfx is not None:
|
||||
from Tables import item_gfx_table
|
||||
if triforce_gfx in item_gfx_table.keys():
|
||||
(is_custom, address, palette, pal_addr, size) = item_gfx_table[triforce_gfx]
|
||||
address = address if is_custom else 0x8000 + address
|
||||
write_int16(rom, snes_to_pc(0xA2C600+(0x6C*2)), address)
|
||||
write_int16(rom, snes_to_pc(0xA2C800+(0x6C*2)), address)
|
||||
rom.write_byte(snes_to_pc(0xA2B100+0x6C), 0 if size == 2 else 4)
|
||||
rom.write_byte(snes_to_pc(0xA2BA00+0x6C), size)
|
||||
rom.write_byte(snes_to_pc(0xA2BB00+0x6C), size)
|
||||
rom.write_byte(snes_to_pc(0xA2BC00+0x6C), palette)
|
||||
rom.write_byte(snes_to_pc(0xA2BD00+0x6C), palette)
|
||||
write_int16(rom, snes_to_pc(0xA2BE00+(0x6C*2)), pal_addr)
|
||||
|
||||
# sprite author credits
|
||||
padded_author = sprite.author_name if sprite is not None else "Nintendo"
|
||||
padded_author = padded_author[:28] if len(padded_author) > 28 else padded_author
|
||||
@@ -2152,6 +2264,14 @@ def write_strings(rom, world, player, team):
|
||||
" ~~~2020~~~\n Linlinlin\n\n"
|
||||
" ~~~2019~~~\n Kohrek\n"
|
||||
)
|
||||
if not world.is_bombshop_start(player):
|
||||
links_house = 'Links House'
|
||||
else:
|
||||
links_house = 'Big Bomb Shop'
|
||||
links_house = world.get_region(links_house, player)
|
||||
links_house = next(e for e in links_house.entrances if e.name != 'Links House S&Q')
|
||||
if 'Snitch Lady' in links_house.name:
|
||||
tt['kakariko_alert_guards'] = CompressedTextMapper.convert("Hey @! I'm taking your house!\nk.thx.bye")
|
||||
|
||||
# Let's keep this guy's text accurate to the shuffle setting.
|
||||
if world.shuffle[player] in ['vanilla', 'dungeonsfull', 'dungeonssimple', 'lite', 'lean']:
|
||||
@@ -2270,6 +2390,7 @@ def write_strings(rom, world, player, team):
|
||||
|
||||
# Next we write a few hints for specific inconvenient locations. We don't make many because in entrance this is highly unpredictable.
|
||||
locations_to_hint = InconvenientLocations.copy()
|
||||
hinted_locations = []
|
||||
if world.doorShuffle[player] == 'vanilla':
|
||||
locations_to_hint.extend(InconvenientDungeonLocations)
|
||||
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']:
|
||||
@@ -2287,7 +2408,6 @@ def write_strings(rom, world, player, team):
|
||||
second_item = hint_text(world.get_location('Swamp Palace - West Chest', player).item)
|
||||
first_item = hint_text(world.get_location('Swamp Palace - Big Key Chest', player).item)
|
||||
this_hint = f'The westmost chests in Swamp Palace contain {first_item} and {second_item}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
elif location == 'Mire Left':
|
||||
if random.randint(0, 1) == 0:
|
||||
first_item = hint_text(world.get_location('Misery Mire - Compass Chest', player).item)
|
||||
@@ -2296,38 +2416,31 @@ def write_strings(rom, world, player, team):
|
||||
second_item = hint_text(world.get_location('Misery Mire - Compass Chest', player).item)
|
||||
first_item = hint_text(world.get_location('Misery Mire - Big Key Chest', player).item)
|
||||
this_hint = f'The westmost chests in Misery Mire contain {first_item} and {second_item}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
elif location == 'Tower of Hera - Big Key Chest':
|
||||
item = hint_text(world.get_location(location, player).item)
|
||||
this_hint = f'Waiting in the Tower of Hera basement leads to {item}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
elif location == 'Ganons Tower - Big Chest':
|
||||
item = hint_text(world.get_location(location, player).item)
|
||||
this_hint = f'The big chest in Ganon\'s Tower contains {item}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
elif location == 'Thieves\' Town - Big Chest':
|
||||
item = hint_text(world.get_location(location, player).item)
|
||||
this_hint = f'The big chest in Thieves\' Town contains {item}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
elif location == 'Ice Palace - Big Chest':
|
||||
item = hint_text(world.get_location(location, player).item)
|
||||
this_hint = f'The big chest in Ice Palace contains {item}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
elif location == 'Eastern Palace - Big Key Chest':
|
||||
item = hint_text(world.get_location(location, player).item)
|
||||
this_hint = f'The antifairy guarded chest in Eastern Palace contains {item}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
elif location == 'Sahasrahla':
|
||||
item = hint_text(world.get_location(location, player).item)
|
||||
this_hint = f'Sahasrahla seeks a green pendant for {item}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
elif location == 'Graveyard Cave':
|
||||
item = hint_text(world.get_location(location, player).item)
|
||||
this_hint = f'The cave north of the graveyard contains {item}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
else:
|
||||
this_hint = f'{location} contains {hint_text(world.get_location(location, player).item)}.'
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
hinted_locations.append(location)
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
|
||||
# Lastly we write hints to show where certain interesting items are.
|
||||
# It is done the way it is to re-use the silver code and also to give one hint per each type of item regardless
|
||||
@@ -2340,9 +2453,10 @@ def write_strings(rom, world, player, team):
|
||||
if world.owShuffle[player] != 'vanilla' or world.owMixed[player]:
|
||||
# Adding a guaranteed hint for the Flute in overworld shuffle.
|
||||
this_location = world.find_items_not_key_only(flute_item, player)
|
||||
if this_location:
|
||||
if this_location and this_location not in hinted_locations:
|
||||
this_hint = this_location[0].item.hint_text + ' can be found ' + hint_text(this_location[0]) + '.'
|
||||
this_hint = this_hint[0].upper() + this_hint[1:]
|
||||
hinted_locations.append(this_location)
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
items_to_hint.remove(flute_item)
|
||||
if world.keyshuffle[player] not in ['none', 'nearby', 'universal']:
|
||||
@@ -2358,11 +2472,12 @@ def write_strings(rom, world, player, team):
|
||||
while hint_count > 0 and len(items_to_hint) > 0:
|
||||
this_item = items_to_hint.pop(0)
|
||||
this_location = world.find_items_not_key_only(this_item, player)
|
||||
if this_location:
|
||||
if this_location and this_location not in hinted_locations:
|
||||
random.shuffle(this_location)
|
||||
item_name = this_location[0].item.hint_text
|
||||
item_name = item_name[0].upper() + item_name[1:]
|
||||
this_hint = f'{item_name} can be found {hint_text(this_location[0])}.'
|
||||
hinted_locations.append(this_location)
|
||||
tt[hint_locations.pop(0)] = this_hint
|
||||
hint_count -= 1
|
||||
|
||||
@@ -2379,13 +2494,13 @@ def write_strings(rom, world, player, team):
|
||||
for name, district in world.districts[player].items():
|
||||
hint_type = 'foolish'
|
||||
choices = []
|
||||
item_count, item_type = 0, 'useful'
|
||||
item_count, item_type = 0, 'logic'
|
||||
for loc_name in district.locations:
|
||||
location_item = world.get_location(loc_name, player).item
|
||||
if location_item.advancement:
|
||||
if 'Heart Container' in location_item.name or location_item.compass or location_item.map:
|
||||
continue
|
||||
itm_type = 'useful' if useful_item_for_hint(location_item, world) else 'vital'
|
||||
itm_type = 'logic'
|
||||
hint_type = 'path'
|
||||
if item_type == itm_type:
|
||||
choices.append(location_item)
|
||||
@@ -2588,6 +2703,23 @@ def write_strings(rom, world, player, team):
|
||||
tt['ganon_fall_in_alt'] = 'You cannot defeat me until you finish your goal!'
|
||||
tt['ganon_phase_3_alt'] = 'Got wax in\nyour ears?\nI can not die!'
|
||||
|
||||
def get_custom_goal_text(type):
|
||||
goal_text = world.custom_goals[player][type]['goaltext']
|
||||
placeholder_count = goal_text.count('%d')
|
||||
if placeholder_count > 0:
|
||||
targets = [req['target'] for req in world.custom_goals[player][type]['requirements'] if 'target' in req][:placeholder_count]
|
||||
return goal_text % tuple(targets)
|
||||
return goal_text
|
||||
|
||||
if world.custom_goals[player]['gtentry'] and 'goaltext' in world.custom_goals[player]['gtentry']:
|
||||
tt['sign_ganons_tower'] = get_custom_goal_text('gtentry')
|
||||
if world.custom_goals[player]['ganongoal'] and 'goaltext' in world.custom_goals[player]['ganongoal']:
|
||||
tt['sign_ganon'] = get_custom_goal_text('ganongoal')
|
||||
if world.custom_goals[player]['pedgoal'] and 'goaltext' in world.custom_goals[player]['pedgoal']:
|
||||
tt['mastersword_pedestal_goal'] = get_custom_goal_text('pedgoal')
|
||||
if world.custom_goals[player]['murahgoal'] and 'goaltext' in world.custom_goals[player]['murahgoal']:
|
||||
tt['murahdahla'] = get_custom_goal_text('murahgoal')
|
||||
|
||||
tt['kakariko_tavern_fisherman'] = TavernMan_texts[random.randint(0, len(TavernMan_texts) - 1)]
|
||||
|
||||
pedestalitem = world.get_location('Master Sword Pedestal', player).item
|
||||
|
||||
@@ -50,9 +50,11 @@ def set_rules(world, player):
|
||||
ow_bunny_rules(world, player)
|
||||
ow_terrain_rules(world, player)
|
||||
|
||||
if world.is_premature_copied_world:
|
||||
return
|
||||
|
||||
if world.mode[player] == 'standard':
|
||||
if not world.is_copied_world:
|
||||
standard_rules(world, player)
|
||||
standard_rules(world, player)
|
||||
else:
|
||||
misc_key_rules(world, player)
|
||||
|
||||
@@ -61,45 +63,50 @@ def set_rules(world, player):
|
||||
drop_rules(world, player)
|
||||
challenge_room_rules(world, player)
|
||||
|
||||
if world.goal[player] == 'dungeons':
|
||||
# require all dungeons to beat ganon
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.has_beaten_aga(player) and state.has('Beat Agahnim 2', player) and state.has('Beat Boss', player, 10))
|
||||
elif world.goal[player] in ['crystals', 'ganon']:
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.has_crystals(world.crystals_needed_for_ganon[player], player))
|
||||
if world.goal[player] == 'ganon':
|
||||
# require aga2 to beat ganon
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.has('Beat Agahnim 2', player))
|
||||
elif world.goal[player] in ['triforcehunt', 'trinity']:
|
||||
if world.goal[player] == 'trinity':
|
||||
if world.custom_goals[player]['ganongoal'] and 'requirements' in world.custom_goals[player]['ganongoal']:
|
||||
rule = get_goal_rule('ganongoal', world, player)
|
||||
add_rule(world.get_location('Ganon', player), rule)
|
||||
else:
|
||||
if world.goal[player] == 'dungeons':
|
||||
# require all dungeons to beat ganon
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.has_beaten_aga(player) and state.has('Beat Agahnim 2', player) and state.has('Beat Boss', player, 10))
|
||||
elif world.goal[player] in ['crystals', 'ganon']:
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.has_crystals(world.crystals_needed_for_ganon[player], player))
|
||||
for location in world.get_region('Hyrule Castle Courtyard', player).locations:
|
||||
if location.name == 'Murahdahla':
|
||||
add_rule(location, lambda state: state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) >= int(state.world.treasure_hunt_count[player]))
|
||||
elif world.goal[player] == 'ganonhunt':
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) >= int(state.world.treasure_hunt_count[player]))
|
||||
elif world.goal[player] == 'completionist':
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.everything(player))
|
||||
if world.goal[player] == 'ganon':
|
||||
# require aga2 to beat ganon
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.has('Beat Agahnim 2', player))
|
||||
elif world.goal[player] in ['triforcehunt', 'trinity']:
|
||||
if world.goal[player] == 'trinity':
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.has_crystals(world.crystals_needed_for_ganon[player], player))
|
||||
elif world.goal[player] == 'ganonhunt':
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) >= int(state.world.treasure_hunt_count[player]))
|
||||
elif world.goal[player] == 'completionist':
|
||||
add_rule(world.get_location('Ganon', player), lambda state: state.everything(player))
|
||||
|
||||
for location in world.get_region('Hyrule Castle Courtyard', player).locations:
|
||||
if location.name == 'Murahdahla':
|
||||
if world.custom_goals[player]['murahgoal'] and 'requirements' in world.custom_goals[player]['murahgoal']:
|
||||
rule = get_goal_rule('murahgoal', world, player)
|
||||
add_rule(location, rule)
|
||||
else:
|
||||
add_rule(location, lambda state: state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) >= int(state.world.treasure_hunt_count[player]))
|
||||
|
||||
if (world.flute_mode[player] != 'active' and not world.is_tile_swapped(0x18, player)
|
||||
and 'Ocarina (Activated)' not in list(map(str, [i for i in world.precollected_items if i.player == player]))):
|
||||
if not world.is_copied_world:
|
||||
# Commented out below, this would be needed for rando implementations where Inverted requires flute activation in bunny territory
|
||||
# kak_region = self.world.get_region('Kakariko Village', player)
|
||||
# add_rule(world.get_location('Flute Activation', player), lambda state: state.has('Ocarina', player) and state.is_not_bunny(kak_region, player))
|
||||
add_rule(world.get_location('Flute Activation', player), lambda state: state.has('Ocarina', player))
|
||||
# Commented out below, this would be needed for rando implementations where Inverted requires flute activation in bunny territory
|
||||
# kak_region = self.world.get_region('Kakariko Village', player)
|
||||
# add_rule(world.get_location('Flute Activation', player), lambda state: state.has('Ocarina', player) and state.is_not_bunny(kak_region, player))
|
||||
add_rule(world.get_location('Flute Activation', player), lambda state: state.has('Ocarina', player))
|
||||
|
||||
# if swamp and dam have not been moved we require mirror for swamp palace
|
||||
if not world.swamp_patch_required[player]:
|
||||
add_rule(world.get_entrance('Swamp Lobby Moat', player), lambda state: state.has_Mirror(player))
|
||||
|
||||
if not world.is_copied_world:
|
||||
set_bunny_rules(world, player, world.mode[player] == 'inverted')
|
||||
set_bunny_rules(world, player, world.mode[player] == 'inverted')
|
||||
|
||||
# These rules go here because they overwrite/add to some of the above rules
|
||||
if world.logic[player] == 'hybridglitches':
|
||||
if not world.is_copied_world:
|
||||
underworld_glitches_rules(world, player)
|
||||
underworld_glitches_rules(world, player)
|
||||
|
||||
def mirrorless_path_to_location(world, startName, targetName, player):
|
||||
# If Agahnim is defeated then the courtyard needs to be accessible without using the mirror for the mirror offset glitch.
|
||||
@@ -175,6 +182,132 @@ def add_rule(spot, rule, combine='and'):
|
||||
else:
|
||||
spot.access_rule = lambda state: rule(state) and old_rule(state)
|
||||
|
||||
|
||||
def get_goal_rule(goal_type, world, player):
|
||||
goal_data = world.custom_goals[player][goal_type]
|
||||
if goal_data['requirements'][0]['condition'] == 0x00:
|
||||
return lambda state: False
|
||||
rule = None
|
||||
def add_to_rule(new_rule):
|
||||
nonlocal rule
|
||||
if rule is None:
|
||||
rule = new_rule
|
||||
else:
|
||||
rule = and_rule(rule, new_rule)
|
||||
if 'logic' in goal_data:
|
||||
for logic, data in goal_data['logic'].items():
|
||||
if logic == 'pendants':
|
||||
pendants = int(data)
|
||||
add_to_rule(lambda state: state.has_pendants(pendants, player))
|
||||
elif logic == 'crystals':
|
||||
crystals = int(data)
|
||||
add_to_rule(lambda state: state.has_crystals(crystals, player))
|
||||
elif logic == 'pendant_bosses':
|
||||
pendant_bosses = int(data)
|
||||
add_to_rule(lambda state: state.has_pendant_bosses(pendant_bosses, player))
|
||||
elif logic == 'crystal_bosses':
|
||||
crystal_bosses = int(data)
|
||||
add_to_rule(lambda state: state.has_crystal_bosses(crystal_bosses, player))
|
||||
elif logic == 'bosses':
|
||||
bosses = int(data)
|
||||
add_to_rule(lambda state: state.has('Beat Boss', player, bosses))
|
||||
elif logic == 'aga1':
|
||||
add_to_rule(lambda state: state.has('Beat Agahnim 1', player))
|
||||
elif logic == 'aga2':
|
||||
add_to_rule(lambda state: state.has('Beat Agahnim 2', player))
|
||||
elif logic == 'goal_items':
|
||||
if data is not None:
|
||||
goal_items = int(data)
|
||||
add_to_rule(lambda state: state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) >= goal_items)
|
||||
else:
|
||||
add_to_rule(lambda state: state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) >= int(state.world.treasure_hunt_count[player]))
|
||||
elif logic == 'collection':
|
||||
if data is not None:
|
||||
all_locations = [x for x in world.get_filled_locations(player) if not x.locked]
|
||||
collection = int(data) - len(all_locations)
|
||||
add_to_rule(lambda state: state.everything(player, collection))
|
||||
else:
|
||||
add_to_rule(lambda state: state.everything(player))
|
||||
elif logic == 'item':
|
||||
for item in data:
|
||||
item_name = item
|
||||
if '(' in item_name:
|
||||
item_name, region_name = item_name.rsplit(' (', 1)
|
||||
region_name = region_name.rstrip(')')
|
||||
region = world.get_region(region_name, player)
|
||||
if region and region.dungeon:
|
||||
region_name = region.dungeon.name
|
||||
else:
|
||||
try:
|
||||
if world.get_dungeon(region_name, player):
|
||||
pass
|
||||
except:
|
||||
raise Exception(f'Invalid dungeon/region name in custom goal logic for item {item}')
|
||||
item_name = f'{item_name} ({region_name})'
|
||||
if '=' in item_name:
|
||||
item_name, count = item_name.rsplit('=', 1)
|
||||
count = int(count)
|
||||
add_to_rule(lambda state: state.has(item_name, player, count))
|
||||
else:
|
||||
add_to_rule(lambda state: state.has(item_name, player))
|
||||
elif logic == 'access':
|
||||
for region_name in data:
|
||||
region = world.get_region(region_name, player)
|
||||
if not region:
|
||||
raise Exception(f'Invalid region name in custom goal logic for region: {region_name}')
|
||||
add_to_rule(lambda state: state.can_reach(region, None, player))
|
||||
elif logic == 'ability':
|
||||
for ability in data:
|
||||
param = None
|
||||
if '(' in ability:
|
||||
ability, param = ability.split('(', 1)
|
||||
param = param.rstrip(')')
|
||||
if ability == 'FarmBombs':
|
||||
add_to_rule(lambda state: state.can_farm_bombs(player))
|
||||
elif ability == 'FarmRupees':
|
||||
add_to_rule(lambda state: state.can_farm_rupees(player))
|
||||
elif ability == 'NoBunny':
|
||||
if not param:
|
||||
raise Exception(f'NoBunny ability requires a region argument in custom goal logic')
|
||||
bunny_region = param
|
||||
region = world.get_region(bunny_region, player)
|
||||
if region:
|
||||
add_to_rule(lambda state: state.is_not_bunny(bunny_region, player))
|
||||
else:
|
||||
raise Exception(f'Invalid region name in custom goal logic for NoBunny ability: {param}')
|
||||
elif ability == 'CanUseBombs':
|
||||
add_to_rule(lambda state: state.can_use_bombs(player))
|
||||
elif ability == 'CanBonkDrop':
|
||||
add_to_rule(lambda state: state.can_collect_bonkdrops(player))
|
||||
elif ability == 'CanLift':
|
||||
add_to_rule(lambda state: state.can_lift_rocks(player))
|
||||
elif ability == 'MagicExtension':
|
||||
magic_count = 16
|
||||
if param:
|
||||
magic_count = int(param)
|
||||
add_to_rule(lambda state: state.can_extend_magic(player, magic_count))
|
||||
elif ability == 'CanStun':
|
||||
add_to_rule(lambda state: state.can_stun_enemies(player))
|
||||
elif ability == 'CanKill':
|
||||
if param:
|
||||
enemy_count = int(param)
|
||||
add_to_rule(lambda state: state.can_kill_most_things(player, enemy_count))
|
||||
else:
|
||||
add_to_rule(lambda state: state.can_kill_most_things(player))
|
||||
elif ability == 'CanShootArrows':
|
||||
add_to_rule(lambda state: state.can_shoot_arrows(player))
|
||||
elif ability == 'CanFlute':
|
||||
add_to_rule(lambda state: state.can_flute(player))
|
||||
elif ability == 'HasFire':
|
||||
add_to_rule(lambda state: state.has_fire_source(player))
|
||||
elif ability == 'CanMelt':
|
||||
add_to_rule(lambda state: state.can_melt_things(player))
|
||||
elif ability == 'HasMMMedallion':
|
||||
add_to_rule(lambda state: state.has_misery_mire_medallion(player))
|
||||
elif ability == 'HasTRMedallion':
|
||||
add_to_rule(lambda state: state.has_turtle_rock_medallion(player))
|
||||
return rule if rule is not None else lambda state: True
|
||||
|
||||
def add_bunny_rule(spot, player):
|
||||
if spot.can_cause_bunny(player):
|
||||
add_rule(spot, lambda state: state.has_Pearl(player))
|
||||
@@ -189,7 +322,7 @@ def and_rule(rule1, rule2):
|
||||
|
||||
|
||||
def add_lamp_requirement(spot, player):
|
||||
add_rule(spot, lambda state: state.world.dark_rooms[player] not in ['require_lamp'] or state.has('Lamp', player, state.world.lamps_needed_for_dark_rooms))
|
||||
add_rule(spot, lambda state: state.world.dark_rooms[player] not in ['require_lamp'] or state.has('Lamp', player))
|
||||
|
||||
|
||||
def forbid_item(location, item, player):
|
||||
@@ -244,7 +377,11 @@ def global_rules(world, player):
|
||||
set_rule(world.get_entrance('Flute Spot 8', player), lambda state: state.can_flute(player))
|
||||
|
||||
# overworld location rules
|
||||
set_rule(world.get_location('Master Sword Pedestal', player), lambda state: state.has('Red Pendant', player) and state.has('Blue Pendant', player) and state.has('Green Pendant', player))
|
||||
if world.custom_goals[player]['pedgoal'] and 'requirements' in world.custom_goals[player]['pedgoal']:
|
||||
rule = get_goal_rule('pedgoal', world, player)
|
||||
set_rule(world.get_location('Master Sword Pedestal', player), rule)
|
||||
else:
|
||||
set_rule(world.get_location('Master Sword Pedestal', player), lambda state: state.has('Red Pendant', player) and state.has('Blue Pendant', player) and state.has('Green Pendant', player))
|
||||
set_rule(world.get_location('Ether Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
|
||||
set_rule(world.get_location('Old Man', player), lambda state: state.has('Return Old Man', player))
|
||||
set_rule(world.get_location('Old Man Drop Off', player), lambda state: state.has('Escort Old Man', player))
|
||||
@@ -261,7 +398,7 @@ def global_rules(world, player):
|
||||
|
||||
# bonk items
|
||||
if world.shuffle_bonk_drops[player]:
|
||||
if not world.is_copied_world:
|
||||
if not world.is_premature_copied_world:
|
||||
from Regions import bonk_prize_table
|
||||
for location_name, (_, _, aga_required, _, _, _) in bonk_prize_table.items():
|
||||
loc = world.get_location(location_name, player)
|
||||
@@ -412,9 +549,13 @@ def global_rules(world, player):
|
||||
set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_sword(player) and state.has_misery_mire_medallion(player)) # sword required to cast magic (!)
|
||||
set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has('Turtle Opened', player))
|
||||
|
||||
if world.custom_goals[player]['gtentry'] and 'requirements' in world.custom_goals[player]['gtentry']:
|
||||
rule = get_goal_rule('gtentry', world, player)
|
||||
set_rule(world.get_entrance('Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', player), rule)
|
||||
else:
|
||||
set_rule(world.get_entrance('Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
|
||||
if not world.is_atgt_swapped(player):
|
||||
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has_beam_sword(player))
|
||||
set_rule(world.get_entrance('Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', player), lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
|
||||
|
||||
# Start of door rando rules
|
||||
# TODO: Do these need to flag off when door rando is off? - some of them, yes
|
||||
@@ -841,7 +982,7 @@ def global_rules(world, player):
|
||||
|
||||
add_key_logic_rules(world, player)
|
||||
|
||||
if world.logic[player] == 'hybridglitches' and not world.is_copied_world:
|
||||
if world.logic[player] == 'hybridglitches' and not world.is_premature_copied_world:
|
||||
add_hmg_key_logic_rules(world, player)
|
||||
# End of door rando rules.
|
||||
|
||||
@@ -1041,13 +1182,14 @@ def drop_rules(world, player):
|
||||
for super_tile, enemy_list in data_tables.uw_enemy_table.room_map.items():
|
||||
for enemy in enemy_list:
|
||||
if enemy.location:
|
||||
rule = defeat_rule_single(world, player, enemy, enemy.location.parent_region)
|
||||
if enemy.location.parent_region.name in special_rules_check:
|
||||
rule = special_rules_for_region(world, player, enemy.location.parent_region.name,
|
||||
enemy.location, rule)
|
||||
true_location = world.get_location(enemy.location.name, player)
|
||||
rule = defeat_rule_single(world, player, enemy, true_location.parent_region)
|
||||
if true_location.parent_region.name in special_rules_check:
|
||||
rule = special_rules_for_region(world, player, true_location.parent_region.name,
|
||||
true_location, rule)
|
||||
if rule.rule_lambda is None:
|
||||
raise Exception(f'Bad rule for enemy drop. Need to inspect this case: {hex(enemy.kind)}')
|
||||
add_rule_new(enemy.location, rule)
|
||||
add_rule_new(true_location, rule)
|
||||
|
||||
|
||||
def ow_inverted_rules(world, player):
|
||||
@@ -1355,7 +1497,7 @@ def no_glitches_rules(world, player):
|
||||
set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: False) # no glitches does not require block override
|
||||
set_rule(world.get_entrance('Ice Lake Northeast Pier Hop', player), lambda state: False)
|
||||
forbid_bomb_jump_requirements(world, player)
|
||||
if not world.is_copied_world:
|
||||
if not world.is_premature_copied_world:
|
||||
add_conditional_lamps(world, player)
|
||||
|
||||
|
||||
@@ -1666,17 +1808,20 @@ def standard_rules(world, player):
|
||||
add_rule(world.get_entrance(entrance, player), lambda state: state.has('Zelda Delivered', player))
|
||||
|
||||
if world.shuffle_bonk_drops[player]:
|
||||
if not world.is_copied_world:
|
||||
if not world.is_premature_copied_world:
|
||||
add_rule(world.get_location('Hyrule Castle Tree', player), lambda state: state.has('Zelda Delivered', player))
|
||||
add_rule(world.get_location('Central Bonk Rocks Tree', player), lambda state: state.has('Zelda Delivered', player))
|
||||
|
||||
if not world.is_premature_copied_world:
|
||||
add_rule(world.get_location('Hyrule Castle Courtyard Tree Pull', player), lambda state: state.has('Zelda Delivered', player))
|
||||
|
||||
# don't allow bombs to get past here before zelda is rescued
|
||||
set_rule(world.get_entrance('GT Hookshot South Entry to Ranged Crystal', player), lambda state: (state.can_use_bombs(player) and state.has('Zelda Delivered', player)) or state.has('Blue Boomerang', player) or state.has('Red Boomerang', player)) # or state.has('Cane of Somaria', player))
|
||||
|
||||
|
||||
def find_rules_for_zelda_delivery(world, player):
|
||||
# path rules for backtracking
|
||||
start_region = world.get_region('Hyrule Dungeon Cellblock', player)
|
||||
start_region = world.get_region(world.default_zelda_region[player], player)
|
||||
queue = deque([(start_region, [], [])])
|
||||
visited = {start_region}
|
||||
blank_state = CollectionState(world)
|
||||
@@ -2133,6 +2278,9 @@ def eval_small_key_door_partial_main(state, door_name, dungeon, player):
|
||||
number = min(number, door_rule.alternate_small_key)
|
||||
door_openable |= state.has_sm_key(key_logic.small_key_name, player, number)
|
||||
break
|
||||
if state.placing_items and any(lock_item == item.name for item in state.placing_items):
|
||||
number = min(number, door_rule.alternate_small_key)
|
||||
door_openable |= state.has_sm_key(key_logic.small_key_name, player, number)
|
||||
return door_openable
|
||||
|
||||
|
||||
|
||||
@@ -147,101 +147,140 @@ bonk_prize_lookup = {
|
||||
'Fairy': (0xe3, 15, None)
|
||||
}
|
||||
|
||||
# item name: (custom gfx, address offset, palette)
|
||||
# item name: (custom gfx, address offset, palette, palette address, size)
|
||||
# decompressed gfx loaded at $7F8000
|
||||
# custom gfx loaded at $228000
|
||||
item_gfx_table = {
|
||||
'Green Rupees (20)': (False, 0x0000, 0x04),
|
||||
'Pegasus Boots': (False, 0x0040, 0x01),
|
||||
'Psuedoboots': (False, 0x0040, 0x02),
|
||||
'Blue Pendant': (False, 0x0080, 0x02),
|
||||
'Red Pendant': (False, 0x0080, 0x01),
|
||||
'Warp Tile': (False, 0x00C0, 0x04),
|
||||
'Open Chest': (False, 0x0100, 0x02),
|
||||
'Chicken': (False, 0x0140, 0x04),
|
||||
'Duck': (False, 0x0180, 0x01),
|
||||
'Chest': (False, 0x0400, 0x02),
|
||||
'Frog': (False, 0x0440, 0x04),
|
||||
'Kiki (Head)': (False, 0x0480, 0x04),
|
||||
'Purple Chest': (False, 0x0500, 0x04),
|
||||
'Super Bomb': (False, 0x0540, 0x04),
|
||||
'Blacksmith': (False, 0x0580, 0x04),
|
||||
'Bug Net': (False, 0x0860, 0x01),
|
||||
'Crystal': (False, 0x08A0, 0x06),
|
||||
'Silver Arrows': (False, 0x08E0, 0x01),
|
||||
'Bow': (False, 0x0920, 0x02),
|
||||
'Bottle (Fairy)': (False, 0x0960, 0x02),
|
||||
'Bottle (Bee)': (False, 0x09A0, 0x02),
|
||||
'Piece of Heart': (False, 0x0C00, 0x01),
|
||||
'Ocarina': (False, 0x0C40, 0x02),
|
||||
'Mirror Shield': (False, 0x0C80, 0x04),
|
||||
'Rupees (100)': (False, 0x0D20, 0x04),
|
||||
'Rupees (50)': (False, 0x0D60, 0x04),
|
||||
'Rupees (300)': (False, 0x0DA0, 0x04),
|
||||
'Flippers': (False, 0x1000, 0x02),
|
||||
'Mirror': (False, 0x1040, 0x02),
|
||||
'Bomb': (False, 0x1080, 0x02),
|
||||
'Lamp': (False, 0x10C0, 0x01),
|
||||
'Psuedolamp': (False, 0x10C0, 0x02),
|
||||
'Magic Cape': (False, 0x1100, 0x01),
|
||||
'Compass': (False, 0x1140, 0x02),
|
||||
'Moon Pearl': (False, 0x1180, 0x01),
|
||||
'Ether': (False, 0x1400, 0x04),
|
||||
'Bombos': (False, 0x1440, 0x04),
|
||||
'Quake': (False, 0x1480, 0x04),
|
||||
'Bottle': (False, 0x14C0, 0x01),
|
||||
'Bottle (Red Potion)': (False, 0x1500, 0x01),
|
||||
'Bottle (Green Potion)': (False, 0x1500, 0x04),
|
||||
'Bottle (Blue Potion)': (False, 0x1500, 0x02),
|
||||
'Mushroom': (False, 0x1540, 0x04),
|
||||
'Map': (False, 0x1580, 0x04),
|
||||
'Big Key': (False, 0x15C0, 0x04),
|
||||
'Bombs (3)': (False, 0x1840, 0x02),
|
||||
'Arrows (10)': (False, 0x1880, 0x02),
|
||||
'Heart Container': (False, 0x18C0, 0x01),
|
||||
'Green Mail': (False, 0x1900, 0x04),
|
||||
'Blue Mail': (False, 0x1900, 0x02),
|
||||
'Red Mail': (False, 0x1900, 0x01),
|
||||
'Fire Sheild': (False, 0x1980, 0x04),
|
||||
'Blue Shield': (False, 0x19C0, 0x02),
|
||||
'Magic Powder': (False, 0x1CC0, 0x02),
|
||||
'Bombs (10)': (False, 0x1D00, 0x02),
|
||||
'Power Glove': (False, 0x1D40, 0x01),
|
||||
'Titans Mitts': (False, 0x1D40, 0x04),
|
||||
'Book of Mudora': (False, 0x1D80, 0x04),
|
||||
'Maiden (Head)': (False, 0x2000, 0x04),
|
||||
'Zelda (Head)': (False, 0x2080, 0x04),
|
||||
'Old Man (Head)': (False, 0x2140, 0x04),
|
||||
'Locksmith (Head)': (False, 0x2180, 0x04),
|
||||
'Fire': (False, 0x25C0, 0x04),
|
||||
'Apples': (False, 0x30A0, 0x04),
|
||||
'Fairy': (False, 0x3140, 0x01),
|
||||
'Whirlpool': (False, 0x31C0, 0x01),
|
||||
'Green Rupees (20)': (False, 0x0000, 0x04, 0x0000, 2),
|
||||
'Pegasus Boots': (False, 0x0040, 0x01, 0x0000, 2),
|
||||
'Psuedoboots': (False, 0x0040, 0x02, 0x0000, 2),
|
||||
'Blue Pendant': (False, 0x0080, 0x02, 0x0000, 2),
|
||||
'Red Pendant': (False, 0x0080, 0x01, 0x0000, 2),
|
||||
'Warp Tile': (False, 0x00C0, 0x04, 0x0000, 2),
|
||||
'Open Chest': (False, 0x0100, 0x02, 0x0000, 2),
|
||||
'Chicken': (False, 0x0140, 0x04, 0x0000, 2),
|
||||
'Duck': (False, 0x0180, 0x01, 0x0000, 2),
|
||||
'Chest': (False, 0x0400, 0x02, 0x0000, 2),
|
||||
'Frog': (False, 0x0440, 0x04, 0x0000, 2),
|
||||
'Kiki (Head)': (False, 0x0480, 0x04, 0x0000, 2),
|
||||
'Purple Chest': (False, 0x0500, 0x04, 0x0000, 2),
|
||||
'Super Bomb': (False, 0x0540, 0x04, 0x0000, 2),
|
||||
'Blacksmith': (False, 0x0580, 0x04, 0x0000, 2),
|
||||
'Bug Net': (False, 0x0860, 0x01, 0x0000, 2),
|
||||
'Crystal': (False, 0x08A0, 0x86, 0xB240, 2),
|
||||
'Silver Arrows': (False, 0x08E0, 0x01, 0x0000, 2),
|
||||
'Progressive Bow': (False, 0x0920, 0x02, 0x0000, 2),
|
||||
'Bottle (Fairy)': (False, 0x0960, 0x02, 0x0000, 2),
|
||||
'Bottle (Bee)': (False, 0x09A0, 0x02, 0x0000, 2),
|
||||
'Piece of Heart': (False, 0x0C00, 0x01, 0x0000, 2),
|
||||
'Ocarina': (False, 0x0C40, 0x02, 0x0000, 2),
|
||||
'Mirror Shield': (False, 0x0C80, 0x80, 0xB230, 2),
|
||||
'Rupees (100)': (False, 0x0D20, 0x04, 0x0000, 2),
|
||||
'Rupees (50)': (False, 0x0D60, 0x04, 0x0000, 2),
|
||||
'Rupees (300)': (False, 0x0DA0, 0x04, 0x0000, 2),
|
||||
'Flippers': (False, 0x1000, 0x02, 0x0000, 2),
|
||||
'Magic Mirror': (False, 0x1040, 0x02, 0x0000, 2),
|
||||
'Bomb': (False, 0x1080, 0x02, 0x0000, 2),
|
||||
'Lamp': (False, 0x10C0, 0x01, 0x0000, 2),
|
||||
'Psuedolamp': (False, 0x10C0, 0x02, 0x0000, 2),
|
||||
'Magic Cape': (False, 0x1100, 0x01, 0x0000, 2),
|
||||
'Compass': (False, 0x1140, 0x02, 0x0000, 2),
|
||||
'Moon Pearl': (False, 0x1180, 0x01, 0x0000, 2),
|
||||
'Ether': (False, 0x1400, 0x04, 0x0000, 2),
|
||||
'Bombos': (False, 0x1440, 0x04, 0x0000, 2),
|
||||
'Quake': (False, 0x1480, 0x04, 0x0000, 2),
|
||||
'Bottle': (False, 0x14C0, 0x01, 0x0000, 2),
|
||||
'Bottle (Red Potion)': (False, 0x1500, 0x01, 0x0000, 2),
|
||||
'Bottle (Green Potion)': (False, 0x1500, 0x04, 0x0000, 2),
|
||||
'Bottle (Blue Potion)': (False, 0x1500, 0x02, 0x0000, 2),
|
||||
'Mushroom': (False, 0x1540, 0x04, 0x0000, 2),
|
||||
'Map': (False, 0x1580, 0x04, 0x0000, 2),
|
||||
'Big Key': (False, 0x15C0, 0x04, 0x0000, 2),
|
||||
'Green Potion': (False, 0x1800, 0x04, 0x0000, 2),
|
||||
'Blue Potion': (False, 0x1800, 0x02, 0x0000, 2),
|
||||
'Red Potion': (False, 0x1800, 0x01, 0x0000, 2),
|
||||
'Bombs (3)': (False, 0x1840, 0x02, 0x0000, 2),
|
||||
'Arrows (10)': (False, 0x1880, 0x02, 0x0000, 2),
|
||||
'Heart Container': (False, 0x18C0, 0x01, 0x0000, 2),
|
||||
'Heart Container (Green)': (False, 0x18C0, 0x04, 0x0000, 2),
|
||||
'Heart Container (Blue)': (False, 0x18C0, 0x02, 0x0000, 2),
|
||||
'Green Mail': (False, 0x1900, 0x04, 0x0000, 2),
|
||||
'Blue Mail': (False, 0x1900, 0x02, 0x0000, 2),
|
||||
'Red Mail': (False, 0x1900, 0x01, 0x0000, 2),
|
||||
'Fire Shield': (False, 0x1940, 0x80, 0xB220, 2),
|
||||
'Blue Shield': (False, 0x19C0, 0x02, 0x0000, 2),
|
||||
'Magic Powder': (False, 0x1CC0, 0x02, 0x0000, 2),
|
||||
'Bombs (10)': (False, 0x1D00, 0x02, 0x0000, 2),
|
||||
'Power Glove': (False, 0x1D40, 0x01, 0x0000, 2),
|
||||
'Titans Mitt': (False, 0x1D40, 0x04, 0x0000, 2),
|
||||
'Book of Mudora': (False, 0x1D80, 0x04, 0x0000, 2),
|
||||
'Maiden (Head)': (False, 0x2000, 0x04, 0x0000, 2),
|
||||
'Zelda (Head)': (False, 0x2080, 0x04, 0x0000, 2),
|
||||
'Old Man (Head)': (False, 0x2140, 0x04, 0x0000, 2),
|
||||
'Locksmith (Head)': (False, 0x2180, 0x04, 0x0000, 2),
|
||||
'Fire': (False, 0x25C0, 0x04, 0x0000, 2),
|
||||
'Apples': (False, 0x30A0, 0x04, 0x0000, 2),
|
||||
'Fairy': (False, 0x3140, 0x01, 0x0000, 2),
|
||||
'Whirlpool': (False, 0x31C0, 0x02, 0x0000, 2),
|
||||
|
||||
'Triforce': (True, 0x0060, 0x04),
|
||||
'Fighter Sword': (True, 0x00A0, 0x02),
|
||||
'Master Sword': (True, 0x00E0, 0x02),
|
||||
'Tempered Sword': (True, 0x0120, 0x01),
|
||||
'Golden Sword': (True, 0x0160, 0x04),
|
||||
'Half Magic': (True, 0x01A0, 0x04),
|
||||
'Quarter Magic': (True, 0x01E0, 0x04),
|
||||
'Bomb Upgrade (+5)': (True, 0x0420, 0x04),
|
||||
'Bomb Upgrade (+10)': (True, 0x0460, 0x04),
|
||||
'Bomb Upgrade (50)': (True, 0x04A0, 0x04),
|
||||
'Bombbag': (True, 0x04E0, 0x02),
|
||||
'Arrow Upgrade (+5)': (True, 0x0520, 0x02),
|
||||
'Arrow Upgrade (+10)': (True, 0x0560, 0x02),
|
||||
'Arrows (70)': (True, 0x05A0, 0x02),
|
||||
'Silver Arrows (Ag)': (True, 0x05E0, 0x01),
|
||||
'Green Pendant': (True, 0x0820, 0x04),
|
||||
'Sword and Shield': (True, 0x0860, 0x02),
|
||||
'Green Potion': (True, 0x08A0, 0x04),
|
||||
'Blue Potion': (True, 0x08E0, 0x02),
|
||||
'Red Potion': (True, 0x0920, 0x01),
|
||||
'Bee Trap': (True, 0x0960, 0x02),
|
||||
'Red Crystal': (True, 0x0C60, 0x01),
|
||||
'Egg': (True, 0x1020, 0x02),
|
||||
'Master Key': (True, 0x1060, 0x02),
|
||||
'Lumberjack (Head)': (True, 0x11A0, 0x02),
|
||||
'Power Star': (True, 0x11E0, 0x04),
|
||||
'Nothing': (True, 0x0020, 0x01, 0x0000, 2),
|
||||
'Triforce': (True, 0x0060, 0x04, 0x0000, 2),
|
||||
'Fighter Sword': (True, 0x00A0, 0x02, 0x0000, 2),
|
||||
'Master Sword': (True, 0x00E0, 0x02, 0x0000, 2),
|
||||
'Tempered Sword': (True, 0x0120, 0x01, 0x0000, 2),
|
||||
'Golden Sword': (True, 0x0160, 0x04, 0x0000, 2),
|
||||
'Half Magic': (True, 0x01A0, 0x04, 0x0000, 2),
|
||||
'Quarter Magic': (True, 0x01E0, 0x04, 0x0000, 2),
|
||||
'Bomb Upgrade (+5)': (True, 0x0420, 0x04, 0x0000, 2),
|
||||
'Bomb Upgrade (+10)': (True, 0x0460, 0x04, 0x0000, 2),
|
||||
'Bomb Upgrade (50)': (True, 0x04A0, 0x04, 0x0000, 2),
|
||||
'Bombbag': (True, 0x04E0, 0x02, 0x0000, 2),
|
||||
'Arrow Upgrade (+5)': (True, 0x0520, 0x02, 0x0000, 2),
|
||||
'Arrow Upgrade (+10)': (True, 0x0560, 0x02, 0x0000, 2),
|
||||
'Arrow Upgrade (70)': (True, 0x05A0, 0x02, 0x0000, 2),
|
||||
'Silver Arrows (Ag)': (True, 0x05E0, 0x01, 0x0000, 2),
|
||||
'Green Pendant': (True, 0x0820, 0x04, 0x0000, 2),
|
||||
'Sword and Shield': (True, 0x0860, 0x02, 0xD244, 2),
|
||||
'Green Potion (G)': (True, 0x08A0, 0x04, 0x0000, 2),
|
||||
'Blue Potion (B)': (True, 0x08E0, 0x02, 0x0000, 2),
|
||||
'Red Potion (R)': (True, 0x0920, 0x01, 0x0000, 2),
|
||||
'Bee Trap': (True, 0x0960, 0x02, 0x0000, 2),
|
||||
'Red Crystal': (True, 0x0C60, 0x01, 0x0000, 2),
|
||||
'Green Clock': (True, 0x0DE0, 0x04, 0x0000, 2),
|
||||
'Blue Clock': (True, 0x0DE0, 0x02, 0x0000, 2),
|
||||
'Red Clock': (True, 0x0DE0, 0x01, 0x0000, 2),
|
||||
'Egg': (True, 0x1020, 0x02, 0x0000, 2),
|
||||
'Master Key': (True, 0x1060, 0x02, 0x0000, 2),
|
||||
'Lumberjack (Head)': (True, 0x11A0, 0x02, 0x0000, 2),
|
||||
'Power Star': (True, 0x11E0, 0x04, 0x0000, 2),
|
||||
|
||||
# Thin GFX
|
||||
'Rupee (1)': (False, 0x0800, 0x04, 0x0000, 0),
|
||||
'Rupees (5)': (False, 0x0800, 0x02, 0x0000, 0),
|
||||
'Rupees (20)': (False, 0x0800, 0x01, 0x0000, 0),
|
||||
'Blue Shield (Thin)': (False, 0x09E0, 0x02, 0x0000, 0),
|
||||
'Heart': (False, 0x0CC0, 0x01, 0x0000, 0),
|
||||
'Heart (Green)': (False, 0x0CC0, 0x04, 0x0000, 0),
|
||||
'Heart (Blue)': (False, 0x0CC0, 0x02, 0x0000, 0),
|
||||
'Small Magic': (False, 0x0CE0, 0x04, 0x0000, 0),
|
||||
'Arrow': (False, 0x0D00, 0x02, 0x0000, 0),
|
||||
'Nothing (Thin)': (False, 0x0DE0, 0x01, 0x0000, 0),
|
||||
'Master Sword (Thin)': (False, 0x11C0, 0x05, 0x0000, 0),
|
||||
'Tempered Sword (Thin)': (False, 0x11C0, 0x01, 0x0000, 0),
|
||||
'Golden Sword (Thin)': (False, 0x11C0, 0x04, 0x0000, 0),
|
||||
'Shovel': (False, 0x11E0, 0x01, 0x0000, 0),
|
||||
'Bow': (False, 0x1C00, 0x01, 0x0000, 0),
|
||||
'Fighter Sword (Thin)': (False, 0x1C20, 0x02, 0x0000, 0),
|
||||
'Somaria': (False, 0x1C40, 0x01, 0x0000, 0),
|
||||
'Byrna': (False, 0x1C40, 0x02, 0x0000, 0),
|
||||
'Hookshot': (False, 0x1C60, 0x01, 0x0000, 0),
|
||||
'Fire Rod': (False, 0x1C80, 0x01, 0x0000, 0),
|
||||
'Ice Rod': (False, 0x1C80, 0x02, 0x0000, 0),
|
||||
'Hammer': (False, 0x1CA0, 0x01, 0x0000, 0),
|
||||
'Small Key': (False, 0x1DC0, 0x04, 0x0000, 0),
|
||||
'Boomerang': (False, 0x1DE0, 0x02, 0x0000, 0),
|
||||
'Red Boomerang': (False, 0x1DE0, 0x01, 0x0000, 0),
|
||||
|
||||
'Full Magic': (True, 0x01A0, 0x04, 0x0000, 0),
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ Blind_texts = [
|
||||
"Gloves open\na handful\nof checks",
|
||||
"Red mail?\nReturn to\nsender.",
|
||||
"For sale:\nBaby boots,\nNever found",
|
||||
"SRL or rtGG?\nI prefer the\nLadder",
|
||||
"SRL or rtGG?\nI prefer the\nStepladder",
|
||||
"Ladders are\nalways up\nto something",
|
||||
"Zelda's\nfashion is\nvery chic",
|
||||
"Zombie geese\nare waterfoul.\n",
|
||||
@@ -1789,6 +1789,8 @@ class TextTable(object):
|
||||
text['hylian_text_2'] = CompressedTextMapper.convert("%%^= %==%\n ^ =%^=\n==%= ^^%^")
|
||||
text['desert_entry_translated'] = CompressedTextMapper.convert("Kneel before this stone, and magic will move around you.")
|
||||
text['telepathic_tile_under_ganon'] = CompressedTextMapper.convert("Doors Async League winners\n{HARP}\n"
|
||||
" ~~~2025~~~\nSchulzer\n\n"
|
||||
" ~~~2024~~~\nhumbugh\n\n"
|
||||
" ~~~2023~~~\nEriror\n\n"
|
||||
" ~~~2022~~~\nAndy\n\n"
|
||||
" ~~~2021~~~\nprdwong")
|
||||
@@ -1802,7 +1804,8 @@ class TextTable(object):
|
||||
text['telepathic_tile_ice_stalfos_knights_room'] = CompressedTextMapper.convert("{NOBORDER}\nKnock 'em down and then bomb them dead.")
|
||||
text['telepathic_tile_tower_of_hera_entrance'] = CompressedTextMapper.convert("{NOBORDER}\nThis is a bad place, with a guy who will make you fall…\n\n\na lot.")
|
||||
text['houlihan_room'] = CompressedTextMapper.convert("Randomizer tournament winners\n{HARP}\n"
|
||||
" ~~~2023~~~\nnGanonsGoneWild\n\n"
|
||||
" ~~~2024~~~\nGammachuu\n\n"
|
||||
" ~~~2023~~~\nGanonsGoneWild\n\n"
|
||||
" ~~~2022~~~\nObscure\n\n"
|
||||
" ~~~2021~~~\nDaaanty\n\n"
|
||||
" ~~~2019~~~\nJet082\n\n"
|
||||
@@ -2036,6 +2039,7 @@ class TextTable(object):
|
||||
text['ganon_phase_3_alt'] = CompressedTextMapper.convert("Got wax in your ears? I cannot die!")
|
||||
# 190
|
||||
text['sign_east_death_mountain_bridge'] = CompressedTextMapper.convert("Glitched\ntournament\nwinners\n{HARP}\n"
|
||||
"~~~HMG 2025~~~\nSkele\n"
|
||||
"~~~No Logic 2024~~~\ntam\n\n"
|
||||
"~~~HMG 2023~~~\ntam\n\n"
|
||||
"~~~No Logic 2022~~~\nChexhuman\n\n"
|
||||
@@ -2050,5 +2054,6 @@ class TextTable(object):
|
||||
text['ganon_phase_3_no_silvers'] = CompressedTextMapper.convert("You can't best me without silver arrows!")
|
||||
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['mastersword_pedestal_goal'] = CompressedTextMapper.convert("To claim thy reward, you must present all 3 Pendants of Virtue.")
|
||||
text['end_pad_data'] = bytearray([0xfb])
|
||||
text['terminator'] = bytearray([0xFF, 0xFF])
|
||||
|
||||
@@ -1,213 +0,0 @@
|
||||
|
||||
Dungeon_InterRoomTrans 7.2 -> (01) -> Dungeon_LoadRoom
|
||||
Dungeon_InitStarTileCh
|
||||
**Load and and Prep Here
|
||||
Dungeon_ResetSprites
|
||||
$028908 (PC: 10908) is the jump tample
|
||||
|
||||
hook points 7.2.1
|
||||
22 32 f4 a0
|
||||
$028961 (PC: 10961) 22 a4 fd 00
|
||||
22 39 d7 00
|
||||
e6 b0
|
||||
9c 00 02
|
||||
a5 a2
|
||||
48
|
||||
a5 a0
|
||||
|
||||
|
||||
|
||||
|
||||
Modules 04 and 05 skip the PaletteFiltering right above it - moving the pointers slightly might help - didn't help
|
||||
mostly for the black fade out
|
||||
|
||||
60 a5 b0 c9 07 90 ?? ??
|
||||
jsl ?? ?? ??
|
||||
jsl ?? ?? ??
|
||||
jsl 07 ?? ??
|
||||
lda b0
|
||||
jsl 00 ?? ??
|
||||
pointers!!!
|
||||
SpiralStaircase
|
||||
(00) 290C6
|
||||
(01) 28B7A
|
||||
(02) 28FA3 -> Fixed Color see 110A1-$110C6 JUMP LOCATION in Bank02 e944 is PaletteFiltering (Fade out!) (.doFiltering)
|
||||
(03) 28BE4 -> Dungeon_LoadRoom, Dungeon_InitStarTileChr, LoadTransAuxGfx, Dungeon_LoadCustomTileAttr
|
||||
(04) 28D11 -> PrepTransAuxGfx
|
||||
(05) 28D1F -> Sets $17 to #$0A
|
||||
(06) 28C12 -> Dungeon_ResetSprites
|
||||
- these guys called each other a ton
|
||||
c9* b5 ca* b5* ca* b1* b5 c6* ca b1* b5 c6* ca 96---------
|
||||
(07) 28FC9 -> 5 jumps in here, sets $a4 floor
|
||||
112B1 -> may be related to straight staircase only
|
||||
13B7B
|
||||
135DC
|
||||
10EC9
|
||||
10AB3 - right before b5
|
||||
|
||||
(08) 289CA -> calls $113F (above .copyTilemap in Bank 00)
|
||||
(09) 289B5 -> calls $11C4 (updates all tiles in a room)
|
||||
(0a) 289CA -> go through the tilemap....
|
||||
(0b) 289B1 -> runs a filter - new color?, then $11C4 (didn't see call to 289B5)
|
||||
(0c) 289C6 -> runs a filter then $113F
|
||||
(0d) 289B1 -> repeat last two steps
|
||||
(0e) 289C6
|
||||
(0f) 28F96 -> Fade in
|
||||
|
||||
(10) 2905D
|
||||
(11) 2909D
|
||||
(12) 290B7
|
||||
(13) 290DF
|
||||
SpiralStaircase -> (03) 10CE2 -> Dungeon_LoadRoom
|
||||
Dungeon_InitStarTileChr
|
||||
LoadTransAuxGfx
|
||||
Dungeon_LoadCustomTileAttr
|
||||
(04) 10E0F -> PrepTransAuxGfx
|
||||
(06) 10D10 -> Dungeon_ResetSprites
|
||||
|
||||
|
||||
; Upward floor transition
|
||||
Dungeon -> x06 -> $10C14 -> 10CE2 -> Dungeon_LoadRoom
|
||||
Dungeon_InitStarTileChr
|
||||
LoadTransAuxGfx
|
||||
Dungeon_LoadCustomTileAttr
|
||||
10E0F -> PrepTransAuxGfx
|
||||
10D10 -> Dungeon_ResetSprites
|
||||
|
||||
; Downward floor transition
|
||||
Dungeon -> x07 -> $10E27 -> 10CE2 -> Dungeon_LoadRoom
|
||||
Dungeon_InitStarTileChr
|
||||
LoadTransAuxGfx
|
||||
Dungeon_LoadCustomTileAttr
|
||||
10E0F -> PrepTransAuxGfx
|
||||
10D10 -> Dungeon_ResetSprites
|
||||
|
||||
|
||||
StraightStairs_2 -> Dungeon_LoadRoom
|
||||
-> LoadTransAuxGfx
|
||||
StraightStairs_3 -> 10E0F -> PrepTransAuxGfx
|
||||
StraightStairs_4 -> Dungeon_ResetSprites
|
||||
|
||||
|
||||
Dungeon_Teleport -> 10CE2 -> Dungeon_LoadRoom
|
||||
10CE2 -> LoadTransAuxGfx
|
||||
10D10 -> Dungeon_ResetSprites
|
||||
|
||||
|
||||
|
||||
Hook points
|
||||
org $00d6ae (PC: 56ae)
|
||||
LoadTransAuxGfx
|
||||
8b 4b ab 64 00
|
||||
|
||||
org $00df5a (PC: 5f5a)
|
||||
PrepTransAuxGfx
|
||||
a9 7e 85 02 85 05 c2 31
|
||||
|
||||
org $0ffd65 (PC: 07fd65)
|
||||
Dungeon_LoadCustomTileAttr
|
||||
8b 4b ab c2 30 ad A2 0A 29 FF 00
|
||||
|
||||
Palette_DungBgMain
|
||||
c2 21 ae b6 0a bf 1b
|
||||
; This is the palette index for a certain background
|
||||
LDX $0AB6
|
||||
|
||||
LDA $1BEC4B, X : ADC.w #$D734 : STA $00 : PHA
|
||||
|
||||
REP #$10
|
||||
|
||||
LDA.w #$0042 ; Target BP-2 through BP-7 (full)
|
||||
LDX.w #$000E ; (Length - 1) (in words) of the palettes.
|
||||
LDY.w #$0005
|
||||
|
||||
|
||||
|
||||
Trap doors:
|
||||
|
||||
0468 - flag is set when doors are down (1 = down? 0 = up?)
|
||||
$690 - 7 for open - 0 for down
|
||||
|
||||
IntraRoom: ->
|
||||
Dungeon_IntraRoomTransShutDoors (maybe should be Open)
|
||||
stz $0468
|
||||
#$07 -> $0690
|
||||
|
||||
Dungeon_IntraRoomTransOpenDoors (maybe should be Shut)
|
||||
|
||||
10D71 -> A
|
||||
A -> 0468
|
||||
0468++
|
||||
0 -> 0690
|
||||
|
||||
InterRoom:
|
||||
|
||||
pre
|
||||
01b6b5 sta $0468 (01) in this case
|
||||
01b7ce stz 468 x2
|
||||
post
|
||||
028acc inc $0468
|
||||
028ad2 stz $0690
|
||||
01d391 inc $0690 x 10 during animation
|
||||
|
||||
|
||||
Other transition stuff
|
||||
|
||||
Overworld_LoadTransGfx -> LoadTransAuxGfx
|
||||
Overworld_LoadTransGfx -> PrepTransAuxGfx
|
||||
Module_LoadFile -> Dungeon_ResetSprites
|
||||
Module_HoleToDungeon -> 10D10 -> Dungeon_ResetSprites
|
||||
|
||||
|
||||
|
||||
|
||||
Camera work:
|
||||
Places where sta $e2 happens
|
||||
02ba5d 13A31 -
|
||||
|
||||
028750 Module_Dungeon
|
||||
0286ef Module_Dungeon
|
||||
|
||||
|
||||
Stuff about big key door south
|
||||
1e -> Y
|
||||
this is at 00ce24 or pc 004e24
|
||||
org 00ce24
|
||||
dw 2ac8
|
||||
1aab1 ldx ce06,y (where y is 1e = ce24) loads 2a80, but should be 2ac8 for the gfx
|
||||
not detected as big key door - need to look into tile attributes
|
||||
|
||||
extraneous keydoors
|
||||
$5b - GT 91 idx 0
|
||||
$99 - EP 153 idx 1
|
||||
$a2 - MM 162 idx 0
|
||||
$a8 - EP 168 idx 2
|
||||
$bc - TT 188 idx 1
|
||||
|
||||
;SRAM corruption investigation
|
||||
;call stack
|
||||
; 110c7 7.e.7 (Dungeon_SpiralStaircase_7)
|
||||
; 112b1
|
||||
|
||||
; dw $8CE2 ; = $10CE2*
|
||||
; dw $8E0F ; = $10E0F*
|
||||
; dw $8E1D ; = $10E1D*
|
||||
; dw $8D10 ; = $10D10*
|
||||
; dw $90C7 ; = $110C7*
|
||||
|
||||
;bank2 line 3323 - x is d422 - comes from 048c
|
||||
|
||||
; called by 10CE2, (Dungeon_SpiralStaircase_3)
|
||||
;122f0
|
||||
|
||||
|
||||
Link's position after screen transition and auto-walk (from $02C034):
|
||||
|
||||
0C 20 30 38 48 ; down
|
||||
D4 D8 C0 C0 A8 ; up
|
||||
0C 18 28 30 40 ; right
|
||||
E4 D8 C8 C0 B0 ; left
|
||||
|
||||
Effectively indexed by $0418*#$05+$4E.
|
||||
Row ($0418) is the direction and column ($4E) determines how far to auto-walk (depends on tile attribute at edge of screen).
|
||||
From left to right: edge, inside high door, outside high door, inside low door and outside low door.
|
||||
@@ -1,47 +0,0 @@
|
||||
!add = "clc : adc"
|
||||
!addl = "clc : adc.l"
|
||||
!sub = "sec : sbc"
|
||||
!bge = "bcs"
|
||||
!blt = "bcc"
|
||||
|
||||
; Free RAM notes
|
||||
; Normal doors use $AB-AC for scrolling indicator
|
||||
; Normal doors use $FE to store the trap door indicator
|
||||
; Normal doors use $045e to store Y coordinate when transitioning to in-room stairs
|
||||
; Normal doors use $045f to determine the order in which supertile quadrants are drawn
|
||||
; Straight stairs use $046d to store X coordinate on animation start
|
||||
; Spiral doors use $045e to store stair type
|
||||
; Gfx uses $b1 to for sub-sub-sub-module thing
|
||||
|
||||
; Hooks into various routines
|
||||
incsrc drhooks.asm
|
||||
|
||||
;Main Code
|
||||
org $278000 ;138000
|
||||
db $44, $52 ;DR
|
||||
DRMode:
|
||||
dw 0
|
||||
DRFlags:
|
||||
dw 0
|
||||
DRScroll:
|
||||
db 0
|
||||
OffsetTable:
|
||||
dw -8, 8
|
||||
|
||||
incsrc normal.asm
|
||||
incsrc scroll.asm
|
||||
incsrc spiral.asm
|
||||
incsrc gfx.asm
|
||||
incsrc keydoors.asm
|
||||
incsrc overrides.asm
|
||||
incsrc edges.asm
|
||||
incsrc math.asm
|
||||
incsrc hudadditions.asm
|
||||
incsrc dr_lobby.asm
|
||||
warnpc $279C00
|
||||
|
||||
incsrc doortables.asm
|
||||
warnpc $288000
|
||||
|
||||
; deals with own hooks
|
||||
incsrc owrando.asm
|
||||
@@ -1,696 +0,0 @@
|
||||
org $279C00
|
||||
KeyDoorOffset:
|
||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
||||
dw $0000,$0001,$0003,$0000,$0006,$0000,$000b,$0000,$0000,$0000,$000c,$000d,$0010,$0011,$0012,$0000
|
||||
dw $0000,$0015,$0018,$001c,$001e,$0025,$0027,$0000,$0000,$002b,$002d,$0033,$0035,$0038,$0039,$003d
|
||||
dw $003f,$0040,$0043,$0045,$0047,$0000,$004f,$0000,$0053,$0000,$0055,$005b,$0000,$0000,$005f,$0000
|
||||
dw $0060,$0062,$0064,$0065,$0066,$0068,$006e,$0074,$007a,$007c,$007e,$0081,$0000,$0082,$0086,$0088
|
||||
dw $0089,$008a,$0000,$008b,$008e,$0092,$0096,$0000,$0000,$0099,$009d,$00a2,$00a5,$00a6,$00a8,$00aa
|
||||
dw $00ab,$00ad,$00af,$00b2,$0000,$0000,$00b5,$00b9,$00bf,$00c5,$00c9,$00ca,$00cc,$00ce,$00d1,$00d5
|
||||
dw $00d6,$00dc,$00e3,$00e9,$00ec,$00ed,$00ee,$00f2,$00f5,$0000,$00f7,$00f8,$00fc,$00ff,$0102,$0000
|
||||
dw $0000,$0103,$0106,$0107,$010a,$010c,$010e,$0112,$0000,$0000,$0000,$0114,$0117,$011b,$011e,$0121
|
||||
dw $0000,$0123,$0000,$0124,$0127,$0128,$0000,$012c,$0000,$0000,$0000,$012e,$0133,$0139,$013e,$0000
|
||||
dw $013f,$0140,$0141,$0146,$0000,$0149,$014b,$014d,$014f,$0150,$0000,$0153,$0156,$015a,$015d,$0161
|
||||
dw $0163,$0164,$0166,$016a,$016c,$016d,$0000,$0000,$0170,$0176,$017c,$0182,$0184,$0000,$0185,$0186
|
||||
dw $0188,$018b,$018f,$0197,$019c,$019d,$019e,$01a3,$01a4,$01a6,$01aa,$01ad,$01b3,$0000,$01bb,$01be
|
||||
dw $01bf,$01c2,$01ca,$01d2,$01d9,$01da,$01dd,$01e3,$01e6,$01e7,$0000,$01ec,$01ed,$0000,$01f0,$0000
|
||||
dw $01f1,$01f3,$01f7,$0000,$0000,$01f8,$01fa,$0000,$01fd,$0200,$0203,$0204,$0206,$0000,$0000,$0000
|
||||
dw $0207
|
||||
|
||||
|
||||
org $279E00
|
||||
SpiralOffset:
|
||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
||||
db $00,$01,$02,$00,$03,$00,$00,$04,$00,$05,$07,$00,$08,$00,$0b,$00
|
||||
db $00,$0c,$00,$00,$00,$0d,$0e,$0f,$00,$00,$11,$00,$13,$14,$15,$00
|
||||
db $00,$00,$00,$00,$00,$00,$16,$19,$1b,$00,$00,$00,$00,$00,$00,$00
|
||||
db $00,$1c,$00,$00,$1f,$00,$00,$00,$20,$00,$21,$00,$00,$00,$00,$22
|
||||
db $23,$24,$25,$00,$00,$26,$00,$00,$00,$00,$27,$00,$29,$2a,$2b,$00
|
||||
db $00,$00,$00,$2c,$2d,$00,$00,$00,$00,$00,$00,$00,$2e,$2f,$00,$30
|
||||
db $00,$00,$00,$35,$36,$00,$37,$00,$00,$00,$38,$3a,$3b,$00,$3c,$00
|
||||
db $3d,$40,$41,$00,$00,$00,$42,$45,$00,$00,$00,$00,$00,$00,$00,$49
|
||||
db $4a,$00,$00,$00,$00,$00,$00,$4b,$00,$00,$00,$00,$4f,$00,$53,$00
|
||||
db $00,$54,$00,$55,$00,$00,$00,$56,$57,$58,$00,$00,$00,$00,$59,$00
|
||||
db $5a,$00,$5b,$00,$00,$5c,$5d,$00,$00,$00,$00,$5e,$00,$00,$5f,$00
|
||||
db $60,$00,$00,$00,$00,$63,$64,$00,$00,$00,$00,$00,$65,$00,$66,$00
|
||||
db $67,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||
db $6a,$6d,$6e,$00,$00,$00,$00,$00,$00,$00,$6f,$00,$00,$00,$00,$00
|
||||
db $70
|
||||
|
||||
org $279F00
|
||||
DoorOffset:
|
||||
db $00,$01,$02,$00,$03,$00,$04,$00,$00,$00,$00,$00,$9A,$05,$99,$00
|
||||
db $00,$06,$07,$08,$09,$0A,$0B,$00,$00,$0C,$0D,$0E,$00,$0F,$10,$11
|
||||
db $12,$13,$14,$15,$16,$00,$17,$00,$98,$00,$18,$19,$00,$00,$1A,$00
|
||||
db $1B,$00,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$25,$00,$26,$27,$00
|
||||
db $96,$28,$97,$29,$2A,$2B,$2C,$00,$00,$2D,$2E,$2F,$30,$31,$32,$00
|
||||
db $33,$34,$35,$36,$00,$00,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F,$40
|
||||
db $41,$42,$43,$A0,$00,$00,$44,$45,$46,$00,$47,$48,$49,$4A,$4B,$00
|
||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
||||
db $00,$4C,$00,$00,$00,$4D,$4E,$9E,$00,$00,$00,$4F,$50,$51,$52,$53
|
||||
db $00,$54,$00,$9C,$9D,$55,$00,$00,$00,$00,$00,$56,$57,$58,$59,$00
|
||||
db $5A,$5B,$5C,$5D,$00,$5E,$5F,$00,$9B,$60,$00,$61,$62,$63,$64,$65
|
||||
db $66,$67,$68,$69,$6A,$6B,$00,$00,$6C,$6D,$6E,$6F,$70,$00,$71,$72
|
||||
db $00,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$00,$7F,$80
|
||||
db $00,$81,$82,$83,$84,$85,$86,$87,$88,$89,$00,$8A,$8B,$00,$8C,$00
|
||||
db $00,$8D,$8E,$00,$00,$8F,$90,$00,$91,$92,$93,$94,$95,$00,$00,$00
|
||||
db $9f
|
||||
|
||||
org $27A000
|
||||
DoorTable:
|
||||
;; NW 00 N 01 NE 02 WN 00 W 01 WS 02 SW 00 S 01 SE 02 EN 00 E 01 ES 02 - Door ruler
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Default/Garbage row
|
||||
dw $0003, $0003, $0003, $0450, $0003, $0003, $0003, $0003, $0003, $0452, $0003, $0003 ; HC Back Hall (x01)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Switches (x02)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Crystaroller
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Arghus
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Aga 2
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Secret Room
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sanc
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Pokey
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Lava Pipe
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Pipes n Ledge
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swap Canal
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod dark Maze
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Bridge
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Eye Statue
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Pre Aga
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Cross
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice BK
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x20 Aga1
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Key Rat
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Waters
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Eye Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Chest Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Statue
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; PoD Arena (x2a)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; PoD Statue (x2b)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Compass
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x30 Aga's Altar
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Dark Cross
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Lanmolas
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp West Wing
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Flooded Key
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Main Hub (x36)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Hammer Time
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp First Basement
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Drop to the Moth
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod 3 Catwalks
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Conveyor
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Minihelma
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Conveyor
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewers
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Torches
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Big Chest
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Cellblock
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Compass Loop
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull3 Torches
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Mimics 1
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Conveyor Ice
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Moldorm
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; IPBJ
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0401, $0003, $0003 ; HC West Hall (x50)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Throne Room (x51)
|
||||
dw $0003, $0003, $0003, $0401, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC East Hall (x52)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Tiles 1
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 2 Left Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 2 Right Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 1 Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 3 Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Helmasaur
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Spike Switch
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Cannonball
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Gauntlet 1
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Choice Cross
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Iced U
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC West Lobby (x60)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Main Lobby (x61)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC East Lobby (x62)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x66 Swamp Waterfall
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x67 Skull 1 Left Drop
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x68 Skull 1 Pinball
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6a Pod Rupees
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6b GT Mimics
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6c GT Lanmolas
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6d Gauntlet 2
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6e Ice Gators
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Armory
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert BK Chest
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Flooded Chests
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT DM's Tile
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Randoroom
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Warp Maze
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Freezors
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Hookpit
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Catawalk
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Right Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Left
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Hopeful Torch
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Right
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Lonely Freezor
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Vitreous (x90)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Rain
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Dark Crystals
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Blockswitch
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Fallbridge
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Torch Cross
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Darkness
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Warp Maze 2
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Invis Bridge
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Compass Room
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Big Chests
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Icy Pots
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Pre-Vitreous (xa0)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Fishbone
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Bridges
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Corner
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Trinexx (xa4)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Wizzrobes
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Compass (xa8)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Courtyard (xa9)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Map (xaa)
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Switch
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Blind
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Iced T
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Slipway
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Warpzone
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire ????
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Spikes
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Refill
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Dark Maze
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Chainchomp
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Rollers
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Big Key
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Easter Cannonball
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Dark Circle
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Hellway
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Bossway
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Blockswitch
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Backtracker
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Tiles
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Main Hub
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Big Chest
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Switch Maze
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Narrow
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Early Hub
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Floating Torches
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Armos
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT NW Quad
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT NE Quad
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Boss Drop
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire BK
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire 2
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Laser Bridge
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Main Entrance
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Eyegores
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Attic Switches
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Attic Start
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Entrance Quad
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT SE Quad
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Aga 6F
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewers Rope
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Lobby
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Lobby
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Lobby
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Lobby
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert West Lobby
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Main Lobby
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Hera Lobby
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Tower Lobby
|
||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Back Lobby
|
||||
; this should end at 27AF18 about (160 * 24 bytes = 3840 or F18)
|
||||
; some values you can hardcode for spirals
|
||||
;dw $0070, $36a0 ; ->HC Stairwell
|
||||
;dw $0072, $4ff8 ; ->HC Map Room
|
||||
;dw $0080, $1f50 ; ->zelda's cellblock
|
||||
|
||||
org $27B000
|
||||
SpiralTable: ;113 4 byte entries - should end at 27B1C4
|
||||
dw $0203, $8080 ;null row
|
||||
dw $0203, $8080 ;HC Backhallway
|
||||
dw $0203, $8080 ;Sewer Pull
|
||||
dw $0203, $8080 ;Crystaroller
|
||||
dw $0203, $8080 ;Moldorm
|
||||
dw $0203, $8080, $0203, $8080 ;Pod Basement
|
||||
dw $0203, $8080 ;Pod Stalfos
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;GT Entrance
|
||||
dw $0203, $8080 ;Ice Entrance
|
||||
dw $0203, $8080 ;Escape
|
||||
dw $0203, $8080 ;TR Pipe Ledge
|
||||
dw $0203, $8080 ;Swamp Way
|
||||
dw $0203, $8080, $0203, $8080 ;Hera Fallplace
|
||||
dw $0203, $8080, $0203, $8080 ;PoD Bridge
|
||||
dw $0203, $8080 ;GT Ice
|
||||
dw $0203, $8080 ;GT F8
|
||||
dw $0203, $8080 ;Ice Cross
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Swamp Statue
|
||||
dw $0203, $8080, $0203, $8080 ;Hera Big
|
||||
dw $0203, $8080 ;Swamp Ent
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Hera Startiles (middle value unused)
|
||||
dw $0203, $8080 ;West Swamp
|
||||
dw $0203, $8080 ;Swamp Basement
|
||||
dw $0203, $8080 ;Pod Drops
|
||||
dw $0203, $8080 ;Ice Hammer
|
||||
dw $0203, $8080 ;Aga Guards
|
||||
dw $0203, $8080 ;Sewer Begin
|
||||
dw $0203, $8080 ;Sewer Rope
|
||||
dw $0203, $8080 ;TT Cellblock
|
||||
dw $0203, $8080, $0203, $8080 ;Pod Entrance
|
||||
dw $0203, $8080 ;GT Icespike
|
||||
dw $0203, $8080 ;GT Moldorm
|
||||
dw $0203, $8080 ;IPBJ
|
||||
dw $0203, $8080 ;Desert Prep
|
||||
dw $0203, $8080 ;Swamp Attic
|
||||
dw $0203, $8080 ;GT Cannonball
|
||||
dw $0203, $8080 ;GT Gauntlet1
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;Ice U (1st three values unused)
|
||||
dw $0203, $8080 ;Desert Back
|
||||
dw $0203, $8080 ;TT Attic L
|
||||
dw $0203, $8080 ;Swamp Waterf
|
||||
dw $0203, $8080 ;Pod Rupees
|
||||
dw $0203, $8080 ;Pod Rupees
|
||||
dw $0203, $8080 ;GT Mimics
|
||||
dw $0203, $8080 ;GT Lanmo
|
||||
dw $0203, $8080 ;Ice Gators
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;HC Tiny (first value placeholder)
|
||||
dw $0203, $8080 ;HC Boomer
|
||||
dw $0203, $8080 ;HC Pits1
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Swamp Sunken
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;Hera Entrance (first value unused)
|
||||
dw $0203, $8080 ;Ice Hookshot
|
||||
dw $0203, $8080 ;HC Cellblock
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;Hera Basement (first and third values unused)
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;GT Circle (third value unused)
|
||||
dw $0203, $8080 ;Ice Last Freeze
|
||||
dw $0203, $8080 ;Mire Drops
|
||||
dw $0203, $8080 ;Mire Block
|
||||
dw $0203, $8080 ;Mire Attic
|
||||
dw $0203, $8080 ;Mire Entrance
|
||||
dw $0203, $8080 ;East Dark
|
||||
dw $0203, $8080 ;Ice Big
|
||||
dw $0203, $8080 ;Mire Previtreous
|
||||
dw $0203, $8080 ;Mire Bridges
|
||||
dw $0203, $8080 ;GT Wizzrobes
|
||||
dw $0203, $8080 ;GT Spikepit
|
||||
dw $0203, $8080 ;TT Switch
|
||||
dw $0203, $8080 ;Ice T
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Tower Usains (2nd value unused)
|
||||
dw $0203, $8080 ;TR PlatMaze
|
||||
dw $0203, $8080 ;TR Chainchomp
|
||||
dw $0203, $8080 ;TT Bossway
|
||||
dw $0203, $8080 ;Ice FallZone
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Tower Dark2 (2nd value unused)
|
||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Tower Dark1 (2nd value unused)
|
||||
dw $0203, $8080 ;Mire BK Thang
|
||||
dw $0203, $8080 ;Mire2
|
||||
dw $0203, $8080 ;East Attic Start
|
||||
dw $0203, $8080 ;Tower Entrance
|
||||
|
||||
|
||||
org $27C000 ;ends around 27C418
|
||||
PairedDoorTable:
|
||||
dw $0000 ; the bad template
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000
|
||||
|
||||
dw $0000,$0000,$8021
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $4014,$0000
|
||||
dw $8024,$8013,$0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $201a,$401a
|
||||
dw $0000,$4019,$8019,$402a,$0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
|
||||
dw $0000
|
||||
dw $2011,$0000,$0000
|
||||
dw $8032,$0000
|
||||
dw $0000,$0000
|
||||
dw $8014,$0000,$0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $4036,$0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$101a,$402b,$0000,$0000,$0000
|
||||
dw $0000,$202a,$0000,$0000
|
||||
dw $0000
|
||||
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $8022
|
||||
dw $0000
|
||||
dw $0000,$0000
|
||||
dw $2036,$0000,$0000,$0000,$0000,$0000
|
||||
dw $8037,$8026,$8035,$0000,$0000,$0000
|
||||
dw $8036,$8038,$0000,$4038,$0000,$0000
|
||||
dw $4037,$1037
|
||||
dw $0000,$0000
|
||||
dw $204a,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$804d,$0000
|
||||
dw $0000,$404e
|
||||
dw $0000
|
||||
|
||||
dw $0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$2053
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000,$8059,$0000
|
||||
dw $0000,$0000,$803a,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $203d,$0000
|
||||
dw $0000,$403e
|
||||
dw $0000 ; this is the odd extra room - shouldn't be used
|
||||
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000,$2043
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$4058,$0000,$0000,$0000
|
||||
dw $0000,$2057,$4068,$0000,$0000,$0000
|
||||
dw $2049,$0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $806b,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $805f,$0000,$0000,$0000
|
||||
dw $805e
|
||||
|
||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$2058
|
||||
dw $0000
|
||||
dw $805b,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000
|
||||
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$207c,$0000
|
||||
dw $0000,$407d,$407b,$0000
|
||||
dw $0000,$407c,$0000
|
||||
dw $808e,$0000,$0000
|
||||
dw $0000,$0000
|
||||
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000,$0000
|
||||
dw $807e
|
||||
|
||||
dw $0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$20a9,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
|
||||
dw $0000
|
||||
dw $40b1,$0000
|
||||
dw $80b2,$0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000,$80b8,$0000,$0000,$0000
|
||||
dw $0000,$0000,$4099,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000
|
||||
dw $0000
|
||||
dw $0000
|
||||
dw $0000,$0000
|
||||
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$80a1,$0000,$0000
|
||||
dw $80a2,$0000,$0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$80c6,$0000,$0000
|
||||
dw $0000
|
||||
dw $20a8,$0000
|
||||
dw $80ba,$0000,$0000,$0000
|
||||
dw $80b9,$0000,$0000
|
||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$80cc,$0000,$40cc,$0000,$0000,$0000,$0000
|
||||
dw $0000,$80bf,$0000
|
||||
dw $40be
|
||||
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$40c2,$0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $80c3,$40c1,$0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $80c2,$0000,$0000,$0000,$0000,$0000,$0000
|
||||
dw $80c5
|
||||
dw $80c4,$0000,$0000
|
||||
dw $20b6,$0000,$0000,$0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000,$0000,$0000
|
||||
dw $20cc
|
||||
dw $40bc,$10bc,$80cb
|
||||
dw $0000
|
||||
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000,$0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$0000
|
||||
dw $0000
|
||||
dw $0000,$0000,$0000,$0000
|
||||
dw $ffff ; indicates the end - we can drop this
|
||||
|
||||
; Edge Transition Table (Target Room, Flags, MultiDiv ratio for edges)
|
||||
org $27C500 ;ends around 27C5F(9) 4 bytes would be 27C649
|
||||
;I kind of want to split the 3rd byte into two
|
||||
NorthOpenEdge:
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
SouthOpenEdge:
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
WestOpenEdge:
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
EastOpenEdge:
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
||||
; Edge Info Table (Midpoint, Width, Min Coord)
|
||||
; I kind of want to add a fourth byte to help indicate quadrant info on min coord
|
||||
NorthEdgeInfo:
|
||||
db $a8,$10,$a0, $2c,$08,$28 ;HC
|
||||
db $b8,$20,$a8 ; DP West Wing
|
||||
db $38,$20,$28, $f8,$a0,$a8, $b8,$20,$a8 ; DP Main
|
||||
db $78,$20,$68 ; DP East Wing
|
||||
db $f8,$10,$f0, $7c,$18,$70 ; TT Lobby
|
||||
db $74,$18,$68, $f8,$10,$f0 ; TT Compass
|
||||
SouthEdgeInfo:
|
||||
db $a8,$10,$a0, $2c,$08,$28 ; HC
|
||||
db $b8,$20,$a8 ; DP Sandworm
|
||||
db $38,$20,$28, $f8,$a0,$a8, $b8,$20,$a8 ; DP North Hall & Dead End
|
||||
db $78,$20,$68 ; DP Arrow Pot
|
||||
db $f8,$10,$f0, $7c,$18,$70 ; TT Ambush
|
||||
db $74,$18,$68, $f8,$10,$f0 ; TT BK Corner
|
||||
WestEdgeInfo:
|
||||
db $78,$30,$60 ; TT Attic
|
||||
db $40,$20,$30 ; DP North Hall
|
||||
db $40,$20,$30 ; DP Arrow Pot
|
||||
db $84,$18,$78, $68,$10,$60 ; HC South
|
||||
db $a0,$a0,$50 ; DP East Wing
|
||||
db $58,$50,$30, $98,$50,$70 ; TT BK Corner
|
||||
db $58,$50,$30 ; TT Compass
|
||||
EastEdgeInfo:
|
||||
db $78,$30,$60 ; TT Attic
|
||||
db $40,$20,$30 ; DP Sandworm
|
||||
db $40,$20,$30 ; DP North Hall
|
||||
db $68,$10,$60, $84,$18,$78 ; HC Guards
|
||||
db $a0,$a0,$50 ; DP Main Lobby
|
||||
db $58,$50,$30, $98,$50,$70 ; TT Ambush
|
||||
db $58,$50,$30 ; TT Nook
|
||||
MultDivInfo: ; (1, 2, 3, 4, 5, 6, 10, 20)
|
||||
db $01, $02, $03, $04, $05, $06, $0a, $14
|
||||
; indices: 0-7
|
||||
|
||||
; In-room stairs in North/South pairs. From left to right:
|
||||
; PoD, IP right side, IP Freezor chest and GT
|
||||
org $27C700
|
||||
InroomStairsTable:
|
||||
dw $0003,$0003, $0003,$0003, $0003,$0003, $0003,$0003
|
||||
|
||||
org $27C720
|
||||
InroomStairsRoom:
|
||||
db $0B,$1B, $3F,$1F, $7E,$5E, $96,$3D
|
||||
InroomStairsX:
|
||||
dw $0190, $0160, $0040, $0178
|
||||
InroomStairsY:
|
||||
dw $0058, $0148, $0198, $0190
|
||||
|
||||
|
||||
org $27E000
|
||||
CutoffRooms:
|
||||
; TT Alcove, Mire Bridge Left & Right, Mire Bent Bridge, Mire Hub
|
||||
; Pod Falling & Harmless, SW Star Pits, TR Lava Escape & TR Dual Pipes, Bob's Room & GT Big Chest
|
||||
dw $00bc, $00a2, $00a3, $00c2, $001a, $0049, $0014, $008c
|
||||
; Ice Many Pots, Swamp Waterfall, GT Gauntlet 3, Eastern Push Block, Eastern Courtyard, Eastern Map Valley
|
||||
; Eastern Cannonball, HC East Hall
|
||||
dw $009f, $0066, $005d, $00a8, $00a9, $00aa, $00b9, $0052
|
||||
; HC West Hall, TR Dash Bridge, TR Hub, Pod Arena, GT Petting Zoo, Ice Spike Cross
|
||||
dw $0050, $00c5, $00c6, $0009, $0003, $002a, $007d, $005e
|
||||
; Sewer Drop, Mire Cross, GT Crystal Circles
|
||||
dw $0011, $00b2, $003d
|
||||
dw $ffff
|
||||
|
||||
; dungeon tables
|
||||
; HC HC EP DP AT SP PD MM SW IP TH TT TR GT
|
||||
org $27f000
|
||||
CompassBossIndicator:
|
||||
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
|
||||
TotalKeys: ;27f020
|
||||
db $04, $04, $02, $04, $04, $06, $06, $06, $05, $06, $01, $03, $06, $08, $00, $00
|
||||
ChestKeys: ;27f030
|
||||
db $01, $01, $00, $01, $02, $01, $06, $03, $03, $02, $01, $01, $04, $04, $00, $00
|
||||
BigKeyStatus: ;27f040 (status 2 indicate BnC guard)
|
||||
dw $0002, $0002, $0001, $0001, $0000, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0000, $0000
|
||||
DungeonReminderTable: ;27f060
|
||||
dw $2D50, $2D50, $2D51, $2D52, $2D54, $2D56, $2D55, $2D5A, $2D57, $2D59, $2D53, $2D58, $2D5B, $2D5C, $0000, $0000
|
||||
TotalLocationsLow: ;27f080
|
||||
db $08, $08, $06, $06, $02, $00, $04, $08, $08, $08, $06, $08, $02, $07, $00, $00
|
||||
TotalLocationsHigh: ;27f090
|
||||
db $00, $00, $00, $00, $00, $01, $01, $00, $00, $00, $00, $00, $01, $02, $00, $00
|
||||
org $27f0a0
|
||||
TotalLocations:
|
||||
db $08, $08, $06, $06, $02, $0a, $0e, $08, $08, $08, $06, $08, $0c, $1b, $00, $00
|
||||
; no more room here
|
||||
|
||||
; Vert 0,6,0 Horz 2,0,8
|
||||
org $27f0b0
|
||||
CoordIndex: ; Horizontal 1st
|
||||
db 2, 0 ; Coordinate Index $20-$23
|
||||
OppCoordIndex:
|
||||
db 0, 2 ; Swapped coordinate Index $20-$23 (minor optimization)
|
||||
CameraIndex: ; Horizontal 1st
|
||||
db 0, 6 ; Camera Index $e2-$ea
|
||||
CamQuadIndex: ; Horizontal 1st
|
||||
db 8, 0 ; Camera quadrants $600-$60f
|
||||
ShiftQuadIndex:
|
||||
db 2, 1 ; see ShiftQuad func (relates to $a9,$aa)
|
||||
CamBoundIndex: ; Horizontal 1st
|
||||
db 0, 4 ; Camera Bounds $0618-$61f
|
||||
OppCamBoundIndex: ; Horizontal 1st
|
||||
db 4, 0 ; Camera Bounds $0618-$61f
|
||||
CamBoundBaseLine: ; X camera stuff is 1st column todo Y camera needs more testing
|
||||
dw $007f, $0077 ; Left/Top camera bounds when at edge or layout frozen
|
||||
dw $0007, $000b ; Left/Top camera bounds when not frozen + appropriate low byte $22/$20 (preadj. by #$78/#$6c)
|
||||
dw $00ff, $010b ; Right/Bot camera bounds when not frozen + appropriate low byte $20/$22
|
||||
dw $017f, $0187 ; Right/Bot camera bound when at edge or layout frozen
|
||||
;27f0ce next free byte
|
||||
|
||||
org $27f0f0
|
||||
RemoveRainDoorsRoom:
|
||||
dw $0060, $0062, $ffff ; ffff indicates end of list
|
||||
RainDoorMatch: ; org $27f0f6 and f8 for now
|
||||
dw $0081, $0061 ; not xba'd
|
||||
BlockSanctuaryDoorInRain: ;27f0fa
|
||||
dw $0000
|
||||
|
||||
|
||||
org $27f100
|
||||
TilesetTable:
|
||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
||||
db $13,$04,$04,$06,$0d,$ff,$08,$05,$06,$07,$07,$07,$0e,$0e,$0b,$ff
|
||||
db $13,$04,$04,$0d,$0d,$0d,$08,$05,$06,$07,$07,$07,$0e,$0e,$0b,$0b
|
||||
db $04,$04,$04,$0d,$0d,$ff,$08,$05,$08,$09,$07,$07,$06,$ff,$0b,$06
|
||||
db $04,$05,$04,$12,$08,$08,$08,$08,$08,$09,$07,$07,$06,$0e,$0b,$0b
|
||||
db $04,$04,$04,$12,$0a,$0a,$08,$ff,$ff,$09,$07,$07,$0e,$0e,$0b,$0b
|
||||
db $04,$04,$04,$12,$08,$01,$09,$09,$09,$09,$07,$0e,$0e,$0e,$0b,$0b
|
||||
db $04,$04,$04,$12,$0a,$0a,$08,$09,$09,$ff,$07,$0e,$0e,$0e,$0b,$ff
|
||||
db $04,$04,$04,$12,$12,$12,$08,$05,$ff,$ff,$ff,$0e,$0e,$0e,$0b,$0b
|
||||
db $04,$04,$04,$12,$12,$12,$ff,$05,$ff,$05,$ff,$0e,$0e,$0e,$0b,$ff
|
||||
db $0c,$0c,$0c,$0c,$ff,$0e,$0e,$0c,$0c,$05,$ff,$0e,$0e,$0e,$0b,$0b
|
||||
db $0c,$0c,$0c,$0c,$0d,$0e,$0e,$05,$05,$05,$05,$0a,$0a,$ff,$0b,$0b
|
||||
db $04,$0c,$0c,$0c,$0d,$0d,$0d,$0d,$05,$05,$05,$0a,$0a,$ff,$0b,$0b
|
||||
db $04,$0c,$0c,$0c,$0d,$0d,$0d,$0d,$05,$05,$ff,$0a,$0a,$ff,$0b,$ff
|
||||
db $04,$0c,$0c,$ff,$ff,$0d,$0d,$ff,$05,$05,$05,$0a,$0a,$ff,$0b,$06
|
||||
db $04,$06,$06,$06,$06,$06,$06,$06,$06,$ff,$06,$06,$ff,$06,$06,$06
|
||||
db $06,$06,$03,$03,$03,$03,$ff,$ff,$06,$06,$06,$06,$ff,$06,$06,$06
|
||||
|
||||
;27f200
|
||||
PaletteTable:
|
||||
db $21,$00,$00,$07,$00,$08,$00,$00,$07,$00,$00,$00,$00,$00,$00,$21
|
||||
db $21,$00,$00,$00,$00,$00,$00,$00,$07,$00,$00,$00,$00,$00,$00,$00
|
||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$0e,$00,$00,$07,$00,$00,$07
|
||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$00,$00
|
||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$13
|
||||
db $00,$00,$00,$00,$00,$01,$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
|
||||
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
|
||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
||||
db $00,$00,$00,$00,$00,$00,$00,$06,$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
|
||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$14,$20
|
||||
db $00,$07,$20,$20,$07,$07,$07,$07,$07,$20,$20,$07,$20,$20,$20,$20
|
||||
db $07,$07,$02,$02,$02,$02,$07,$07,$07,$20,$20,$07,$20,$20,$20,$07
|
||||
|
||||
;27f300
|
||||
DungeonTilesets:
|
||||
db $04,$04,$05,$12,$04,$08,$07,$0C,$09,$0B,$05,$0A,$0D,$0E,$06,$06
|
||||
|
||||
;
|
||||
;org $27ff00
|
||||
|
||||
org $27fff0
|
||||
LinksHouseDarkWorld:
|
||||
dw $ffff
|
||||
SanctuaryDarkWorld:
|
||||
dw $ffff
|
||||
OldManDarkWorld:
|
||||
dw $ffff
|
||||
@@ -1,10 +0,0 @@
|
||||
CheckDarkWorldSpawn:
|
||||
STA $A0 : STA $048E ; what we wrote over
|
||||
LDA.l DRFlags : AND #$0200 : BEQ + ; skip if the flag isn't set
|
||||
LDA.l $7EF357 : AND #$00FF : BNE + ; moon pearl?
|
||||
LDA.l LinksHouseDarkWorld : CMP $A0 : BEQ ++
|
||||
LDA.l SanctuaryDarkWorld : CMP $A0 : BEQ ++
|
||||
LDA.l OldManDarkWorld : CMP $A0 : BNE +
|
||||
++ SEP #$30 : LDA #$17 : STA $5D
|
||||
INC $02E0 : LDA.b #$40 : STA !DARK_WORLD : REP #$30
|
||||
+ RTL
|
||||
@@ -1,221 +0,0 @@
|
||||
org $02b5c4 ; -- moving right routine 135c4
|
||||
jsl WarpRight
|
||||
org $02b665 ; -- moving left routine
|
||||
jsl WarpLeft
|
||||
org $02b713 ; -- moving down routine
|
||||
jsl WarpDown
|
||||
org $02b7b4 ; -- moving up routine
|
||||
jsl WarpUp
|
||||
org $02bd80
|
||||
jsl AdjustTransition
|
||||
nop
|
||||
|
||||
;turn off linking doors -- see .notRoomLinkDoor label in Bank02.asm
|
||||
org $02b5a8 ; <- 135a8 - Bank02.asm : 8368 (LDA $7EC004 : STA $A0)
|
||||
jsl CheckLinkDoorR
|
||||
bcc NotLinkDoor1
|
||||
org $02b5b6
|
||||
NotLinkDoor1:
|
||||
org $02b649 ; <- 135a8 - Bank02.asm : 8482 (LDA $7EC004 : STA $A0)
|
||||
jsl CheckLinkDoorL
|
||||
bcc NotLinkDoor2
|
||||
org $02b657
|
||||
NotLinkDoor2:
|
||||
|
||||
|
||||
; Staircase routine
|
||||
org $01c3d4 ; <- c3d4 - Bank01.asm : 9762-4 (Dungeon_DetectStaircase-> STA $A0 : LDA $063D, X)
|
||||
jsl RecordStairType : nop
|
||||
org $02a1e7 ;(PC: 121e7)
|
||||
jsl SpiralWarp
|
||||
|
||||
org $0291b3 ; <- Bank02.asm : 3303 (LDA $0462 : AND.b #$04)
|
||||
jsl SpiralPriorityHack : nop
|
||||
org $0290f9 ; <- Bank02.asm : 3188 (LDA $0462 : AND.b #$04)
|
||||
jsl SpiralPriorityHack : nop
|
||||
|
||||
org $029369 ; <- 11369 - Bank02.asm : 3610 (STX $0464 : STY $012E)
|
||||
jsl StraightStairsAdj : nop #2
|
||||
org $029383 ; <- 11384 - Bank02.asm : 3629 (.walkingDownStaircase-> ADD $20 : STA $20)
|
||||
jsl StraightStairsFix : nop
|
||||
org $0293aa ; <- 113aa - Bank02.asm : 3653 (ADD $20 : STA $20)
|
||||
jsl StraightStairsFix : nop
|
||||
org $0293d1 ; <- 113d1 - Bank02.asm : 3683 (ADD $20 : STA $20 BRANCH_IOTA)
|
||||
jsl StraightStairsFix : nop
|
||||
org $029396 ; <- 11396 - Bank02.asm : 3641 (LDA $01C322, X)
|
||||
jsl StraightStairLayerFix
|
||||
org $02c06d ; <- Bank02.asm : 9874 (LDX $0418, CMP.b #$02)
|
||||
jsl DoorToStraight : nop
|
||||
org $02c092 ; STA $0020, Y : LDX #$00
|
||||
jsl DoorToInroom : nop
|
||||
org $02c0f8 ; CMP $02C034, X
|
||||
jsl DoorToInroomEnd
|
||||
org $02941a ; <- Bank02.asm : 3748 module 7.12.11 (LDA $0464 : BNE BRANCH_$11513 : INC $B0 : RTS)
|
||||
jsl StraightStairsTrapDoor : rts
|
||||
org $028b54 ; <- Bank02.asm : 2200 (JSL UseImplicitRegIndexedLocalJumpTable)
|
||||
jsl InroomStairsTrapDoor
|
||||
|
||||
org $0289a0 ; JSL $0091C4
|
||||
jsl QuadrantLoadOrderBeforeScroll
|
||||
org $02bd9c ; JSL $0091C4
|
||||
jsl QuadrantLoadOrderAfterScroll
|
||||
|
||||
|
||||
; Graphics fix
|
||||
org $02895d ; Bank 02 line 1812 (JSL Dungeon_LoadRoom : JSL Dungeon_InitStarTileChr : JSL $00D6F9 : INC $B0)
|
||||
Splicer:
|
||||
jsl GfxFixer
|
||||
lda $b1 : beq .done
|
||||
rts
|
||||
nop #5
|
||||
.done
|
||||
|
||||
org $01b618 ; Bank01.asm : 7963 Dungeon_LoadHeader (REP #$20 : INY : LDA [$0D], Y)
|
||||
nop : jsl OverridePaletteHeader
|
||||
|
||||
org $02817e ; Bank02.asm : 414 (LDA $02811E, X)
|
||||
jsl FixAnimatedTiles
|
||||
|
||||
org $0aef43 ; UnderworldMap_RecoverGFX
|
||||
jsl FixCloseDungeonMap
|
||||
|
||||
org $028a06 ; Bank02.asm : 1941 Dungeon_ResetTorchBackgroundAndPlayer
|
||||
JSL FixWallmasterLamp
|
||||
|
||||
org $00d377 ;Bank 00 line 3185
|
||||
DecompDungAnimatedTiles:
|
||||
org $00fda4 ;Bank 00 line 8882
|
||||
Dungeon_InitStarTileCh:
|
||||
org $00d6ae ;(PC: 56ae)
|
||||
LoadTransAuxGfx:
|
||||
org $00d739 ;
|
||||
LoadTransAuxGfx_Alt:
|
||||
org $00df5a ;(PC: 5f5a)
|
||||
PrepTransAuxGfx:
|
||||
org $0ffd65 ;(PC: 07fd65)
|
||||
Dungeon_LoadCustomTileAttr:
|
||||
org $01feb0
|
||||
Dungeon_ApproachFixedColor:
|
||||
;org $01fec1
|
||||
;Dungeon_ApproachFixedColor_variable:
|
||||
;org $a0f972 ; Rando version
|
||||
;LoadRoomHook:
|
||||
org $1bee74 ;(PC: 0dee74)
|
||||
Palette_DungBgMain:
|
||||
org $1bec77
|
||||
Palette_SpriteAux3:
|
||||
org $1becc5
|
||||
Palette_SpriteAux2:
|
||||
org $1bece4
|
||||
Palette_SpriteAux1:
|
||||
|
||||
|
||||
org $0DFA53
|
||||
jsl.l LampCheckOverride
|
||||
org $028046 ; <- 10046 - Bank02.asm : 217 (JSL EnableForceBlank) (Start of Module_LoadFile)
|
||||
jsl.l OnFileLoadOverride
|
||||
org $07A93F ; < 3A93F - Bank07.asm 6548 (LDA $8A : AND.b #$40 - Mirror checks)
|
||||
jsl.l MirrorCheckOverride
|
||||
|
||||
org $05ef47
|
||||
Sprite_HeartContainer_Override: ;sprite_heart_upgrades.asm : 96-100 (LDA $040C : CMP.b #$1A : BNE .not_in_ganons_tower)
|
||||
jsl GtBossHeartCheckOverride : bcs .not_in_ganons_tower
|
||||
nop : stz $0dd0, X : rts
|
||||
.not_in_ganons_tower
|
||||
|
||||
|
||||
org $07a955 ; <- Bank07.asm : around 6564 (JP is a bit different) (STZ $05FC : STZ $05FD)
|
||||
jsl BlockEraseFix
|
||||
nop #2
|
||||
|
||||
org $02A0A8
|
||||
Mirror_SaveRoomData:
|
||||
org $07A95B ; < bank_07.asm ; #_07A95B: JSL Mirror_SaveRoomData
|
||||
jsl EGFixOnMirror
|
||||
|
||||
org $02b82a
|
||||
jsl FixShopCode
|
||||
|
||||
org $1ddeea ; <- Bank1D.asm : 286 (JSL Sprite_LoadProperties)
|
||||
jsl VitreousKeyReset
|
||||
|
||||
org $1ed024 ; f5024 sprite_guruguru_bar.asm : 27 (LDA $040C : CMP.b #$12 : INY #2
|
||||
jsl GuruguruFix : bra .next
|
||||
nop #3
|
||||
.next
|
||||
|
||||
org $028fc9
|
||||
nop #2 : jsl BlindAtticFix
|
||||
|
||||
org $028409
|
||||
jsl SuctionOverworldFix
|
||||
|
||||
org $0ded04 ; <- rando's hooks.asm line 2192 - 6ED04 - equipment.asm : 1963 (REP #$30)
|
||||
jsl DrHudDungeonItemsAdditions
|
||||
;org $098638 ; rando's hooks.asm line 2192
|
||||
;jsl CountChestKeys
|
||||
org $06D192 ; rando's hooks.asm line 457
|
||||
jsl CountAbsorbedKeys
|
||||
; rando's hooks.asm line 1020
|
||||
;org $05FC7E ; <- 2FC7E - sprite_dash_item.asm : 118 (LDA $7EF36F : INC A : STA $7EF36F)
|
||||
;jsl CountBonkItem
|
||||
|
||||
org $019dbd ; <- Bank01.asm : 4465 of Object_Draw8xN (LDA $9B52, Y : STA $7E2000, X)
|
||||
jsl CutoffEntranceRug : bra .nextTile : nop
|
||||
.nextTile
|
||||
|
||||
;maybe set 02e2 to 0
|
||||
|
||||
org $0799de ; <- Bank07.asm : 4088 (LDA.b #$15 : STA $5D)
|
||||
JSL StoreTempBunnyState
|
||||
;
|
||||
org $08c450 ; <- ancilla_receive_item.asm : 146-148 (STY $5D : STZ $02D8)
|
||||
JSL RetrieveBunnyState : NOP
|
||||
|
||||
org $02d9ce ; <- Bank02.asm : Dungeon_LoadEntrance 10829 (STA $A0 : STA $048E)
|
||||
JSL CheckDarkWorldSpawn : NOP
|
||||
|
||||
org $01891e ; <- Bank 01.asm : 991 Dungeon_LoadType2Object (LDA $00 : XBA : AND.w #$00FF)
|
||||
JSL RainPrevention : BCC + : RTS : NOP : +
|
||||
|
||||
org $1edabf ; <- sprite_energy_ball.asm : 86-7 Sprite_EnergyBall (LDA.b #$10 : LDX.b #$00)
|
||||
JSL StandardAgaDmg
|
||||
|
||||
|
||||
org $09a681 ; < - similar to talalong.asm : 1157 (JSL Main_ShowTextMessage)
|
||||
JSL BlindsAtticHint : NOP #2
|
||||
org $1cfd69
|
||||
Main_ShowTextMessage:
|
||||
|
||||
; Conditionally disable UW music changes in Door Rando
|
||||
org $028ADB ; <- Bank02.asm:2088-2095 (LDX.b #$14 : LDA $A0 ...)
|
||||
JSL.l Underworld_DoorDown_Entry : CPX #$FF
|
||||
BEQ + : db $80, $1C ; BRA $028B04
|
||||
NOP #6 : +
|
||||
|
||||
org $02C3F2 ; <- Bank02.asm:10521 Unused call
|
||||
Underworld_DoorDown_Call:
|
||||
org $02C3F3
|
||||
dw $8AD9 ; address of Bank02.asm:2085
|
||||
|
||||
; These two, if enabled together, have implications for vanilla BK doors in IP/Hera/Mire
|
||||
; IPBJ is common enough to consider not doing this. Mire is not a concern for vanilla - maybe glitched modes
|
||||
; Hera BK door back can be seen with Pot clipping - likely useful for no logic seeds
|
||||
|
||||
;Kill big key (1e) check for south doors
|
||||
;org $1aa90
|
||||
;DontCheck:
|
||||
;bra .done
|
||||
;nop #3
|
||||
;.done
|
||||
|
||||
;Enable south facing bk graphic
|
||||
;org $4e24
|
||||
;dw $2ac8
|
||||
|
||||
org $01b714 ; PC: b714
|
||||
OpenableDoors:
|
||||
jsl CheckIfDoorsOpen
|
||||
bcs .normal
|
||||
rts
|
||||
.normal
|
||||
@@ -1,299 +0,0 @@
|
||||
HorzEdge:
|
||||
cpy #$ff : beq +
|
||||
jsr DetectWestEdge : ldy #$02 : bra ++
|
||||
+ jsr DetectEastEdge
|
||||
++ cmp #$ff : beq +
|
||||
sta $00 : asl : !add $00 : tax
|
||||
cpy #$ff : beq ++
|
||||
jsr LoadWestData : bra .main
|
||||
++ jsr LoadEastData
|
||||
.main
|
||||
jsr LoadEdgeRoomHorz
|
||||
sec : rts
|
||||
+ clc : rts
|
||||
|
||||
VertEdge:
|
||||
cpy #$ff : beq +
|
||||
jsr DetectNorthEdge : bra ++
|
||||
+ jsr DetectSouthEdge
|
||||
++ cmp #$ff : beq +
|
||||
sta $00 : asl : !add $00 : tax
|
||||
cpy #$ff : beq ++
|
||||
jsr LoadNorthData : bra .main
|
||||
++ jsr LoadSouthData
|
||||
.main
|
||||
jsr LoadEdgeRoomVert
|
||||
sec : rts
|
||||
+ clc : rts
|
||||
|
||||
LoadEdgeRoomHorz:
|
||||
lda $03 : sta $a0
|
||||
sty $06
|
||||
and.b #$0f : asl a : !sub $23 : !add $06 : sta $02
|
||||
ldy #$00 : jsr ShiftVariablesMainDir
|
||||
|
||||
lda $04 : and #$80 : bne .edge
|
||||
lda $04 : sta $01 ; load up flags in $01
|
||||
jsr PrepScrollToNormal
|
||||
bra .scroll
|
||||
|
||||
.edge
|
||||
lda $04 : and #$10 : beq +
|
||||
lda #$01
|
||||
+ sta $ee ; layer stuff
|
||||
|
||||
jsr MathHorz
|
||||
|
||||
.scroll
|
||||
jsr ScrollY
|
||||
rts
|
||||
|
||||
LoadEdgeRoomVert:
|
||||
lda $03 : sta $a0
|
||||
sty $06
|
||||
and.b #$f0 : lsr #3 : !sub $21 : !add $06 : sta $02
|
||||
|
||||
lda $04 : and #$80 : bne .edge
|
||||
lda $04 : sta $01 ; load up flags in $01
|
||||
and #$03 : cmp #$03 : beq .inroom
|
||||
ldy #$01 : jsr ShiftVariablesMainDir
|
||||
jsr PrepScrollToNormal
|
||||
bra .scroll
|
||||
|
||||
.inroom
|
||||
jsr ScrollToInroomStairs
|
||||
rts
|
||||
|
||||
.edge
|
||||
ldy #$01 : jsr ShiftVariablesMainDir
|
||||
lda $04 : and #$10 : beq +
|
||||
lda #$01
|
||||
+ sta $ee ; layer stuff
|
||||
|
||||
jsr MathVert
|
||||
lda $03
|
||||
|
||||
.scroll
|
||||
jsr ScrollX
|
||||
rts
|
||||
|
||||
|
||||
MathHorz:
|
||||
jsr MathStart : lda $20
|
||||
jsr MathMid : and #$0040
|
||||
jsr MathEnd
|
||||
rts
|
||||
|
||||
MathVert:
|
||||
jsr MathStart : lda $22
|
||||
jsr MathMid : and #$0020
|
||||
jsr MathEnd
|
||||
rts
|
||||
|
||||
MathStart:
|
||||
rep #$30
|
||||
lda $08 : and #$00ff : sta $00
|
||||
rts
|
||||
|
||||
MathMid:
|
||||
and #$01ff : !sub $00 : and #$00ff : sta $00
|
||||
; nothing should be bigger than $a0 at this point
|
||||
|
||||
lda $05 : and #$00f0 : lsr #4 : tax
|
||||
lda MultDivInfo, x : and #$00ff : tay
|
||||
lda $00 : jsr MultiplyByY : sta $02
|
||||
|
||||
lda $07 : and #$00ff : jsr MultiplyByY : tax
|
||||
|
||||
lda $05 : and #$000f : tay
|
||||
lda MultDivInfo, y : and #$00ff : tay
|
||||
lda $02 : jsr DivideByY : sta $00
|
||||
lda $0c : and #$00ff : sta $02
|
||||
lda $04
|
||||
rts
|
||||
|
||||
MathEnd:
|
||||
beq +
|
||||
lda #$0100
|
||||
+ !add $02 : !add $00
|
||||
sta $04
|
||||
sep #$30
|
||||
rts
|
||||
|
||||
; don't need midpoint of edge Link is leaving (formerly in $06 - used by dir indicator)
|
||||
; don't need width of edge Link is going to (currently in $0b)
|
||||
LoadNorthData:
|
||||
lda NorthOpenEdge, x : sta $03 : inx ; target room
|
||||
lda NorthEdgeInfo, x : sta $07 ; needed for maths - (divide by 2 anyway)
|
||||
lda NorthOpenEdge, x : sta $04 : inx ; bit field
|
||||
lda NorthEdgeInfo, x : sta $08 ; needed for maths
|
||||
lda NorthOpenEdge, x : sta $05 ; ratio
|
||||
lda $04 : jsr LoadSouthMidpoint : inx ; needed now, and for nrml transition
|
||||
lda SouthEdgeInfo, x : sta $0b : inx ; probably not needed todo: remove
|
||||
lda SouthEdgeInfo, x : sta $0c ; needed for maths
|
||||
rts
|
||||
|
||||
LoadSouthMidpoint:
|
||||
and #$0f : sta $00 : asl : !add $00 : tax
|
||||
lda SouthEdgeInfo, x : sta $0a ; needed now, and for nrml transition
|
||||
rts
|
||||
|
||||
LoadSouthData:
|
||||
lda SouthOpenEdge, x : sta $03 : inx
|
||||
lda SouthEdgeInfo, x : sta $07
|
||||
lda SouthOpenEdge, x : sta $04 : inx
|
||||
lda SouthEdgeInfo, x : sta $08
|
||||
lda SouthOpenEdge, x : sta $05
|
||||
lda $04 : jsr LoadNorthMidpoint : inx
|
||||
lda NorthEdgeInfo, x : sta $0b : inx
|
||||
lda NorthEdgeInfo, x : sta $0c
|
||||
rts
|
||||
|
||||
LoadNorthMidpoint:
|
||||
and #$0f : sta $00 : asl : !add $00 : tax
|
||||
lda NorthEdgeInfo, x : sta $0a ; needed now, and for nrml transition
|
||||
rts
|
||||
|
||||
LoadWestData:
|
||||
lda WestOpenEdge, x : sta $03 : inx
|
||||
lda WestEdgeInfo, x : sta $07
|
||||
lda WestOpenEdge, x : sta $04 : inx
|
||||
lda WestEdgeInfo, x : sta $08
|
||||
lda WestOpenEdge, x : sta $05
|
||||
lda $04 : jsr LoadEastMidpoint : inx
|
||||
lda EastEdgeInfo, x : sta $0b : inx
|
||||
lda EastEdgeInfo, x : sta $0c
|
||||
rts
|
||||
|
||||
LoadEastMidpoint:
|
||||
and #$0f : sta $00 : asl : !add $00 : tax
|
||||
lda EastEdgeInfo, x : sta $0a ; needed now, and for nrml transition
|
||||
rts
|
||||
|
||||
LoadEastData:
|
||||
lda EastOpenEdge, x : sta $03 : inx
|
||||
lda EastEdgeInfo, x : sta $07
|
||||
lda EastOpenEdge, x : sta $04 : inx
|
||||
lda EastEdgeInfo, x : sta $08
|
||||
lda EastOpenEdge, x : sta $05
|
||||
lda $04 : jsr LoadWestMidpoint : inx
|
||||
lda WestEdgeInfo, x : sta $0b : inx
|
||||
lda WestEdgeInfo, x : sta $0c
|
||||
|
||||
|
||||
LoadWestMidpoint:
|
||||
and #$0f : sta $00 : asl : !add $00 : tax
|
||||
lda WestEdgeInfo, x : sta $0a ; needed now, and for nrml transition
|
||||
rts
|
||||
|
||||
|
||||
DetectNorthEdge:
|
||||
ldx #$ff
|
||||
lda $a2
|
||||
cmp #$82 : bne +
|
||||
lda $22 : cmp #$50 : bcs ++
|
||||
ldx #$01 : bra .end
|
||||
++ ldx #$00 : bra .end
|
||||
+ cmp #$83 : bne +
|
||||
ldx #$02 : bra .end
|
||||
+ cmp #$84 : bne +
|
||||
lda $a9 : beq ++
|
||||
lda $22 : cmp #$78 : bcs +++
|
||||
ldx #$04 : bra .end
|
||||
+++ ldx #$05 : bra .end
|
||||
++ lda $22 : cmp #$78 : bcs ++
|
||||
ldx #$03 : bra .end
|
||||
++ ldx #$04 : bra .end
|
||||
+ cmp #$85 : bne +
|
||||
ldx #$06 : bra .end
|
||||
+ cmp #$db : bne +
|
||||
lda $a9 : beq ++
|
||||
lda $22 : beq ++
|
||||
ldx #$08 : bra .end
|
||||
++ ldx #$07 : bra .end
|
||||
+ cmp #$dc : bne .end
|
||||
lda $a9 : bne ++
|
||||
lda $22 : cmp #$b0 : bcs ++
|
||||
ldx #$09 : bra .end
|
||||
++ ldx #$0a
|
||||
.end txa : rts
|
||||
|
||||
DetectSouthEdge:
|
||||
ldx #$ff
|
||||
lda $a2
|
||||
cmp #$72 : bne +
|
||||
lda $22 : cmp #$50 : bcs ++
|
||||
ldx #$01 : bra .end
|
||||
++ ldx #$00 : bra .end
|
||||
+ cmp #$73 : bne +
|
||||
ldx #$02 : bra .end
|
||||
+ cmp #$74 : bne +
|
||||
lda $a9 : beq ++
|
||||
lda $22 : cmp #$78 : bcs +++
|
||||
ldx #$04 : bra .end
|
||||
+++ ldx #$05 : bra .end
|
||||
++ lda $22 : cmp #$78 : bcs ++
|
||||
ldx #$03 : bra .end
|
||||
++ ldx #$04 : bra .end
|
||||
+ cmp #$75 : bne +
|
||||
ldx #$06 : bra .end
|
||||
+ cmp #$cb : bne +
|
||||
lda $a9 : beq ++
|
||||
lda $22 : beq ++
|
||||
ldx #$08 : bra .end
|
||||
++ ldx #$07 : bra .end
|
||||
+ cmp #$cc : bne .end
|
||||
lda $a9 : bne ++
|
||||
lda $22 : cmp #$b0 : bcs ++
|
||||
ldx #$09 : bra .end
|
||||
++ ldx #$0a
|
||||
.end txa : rts
|
||||
|
||||
DetectWestEdge:
|
||||
ldx #$ff
|
||||
lda $a2
|
||||
cmp #$65 : bne +
|
||||
ldx #$00 : bra .end
|
||||
+ cmp #$74 : bne +
|
||||
ldx #$01 : bra .end
|
||||
+ cmp #$75 : bne +
|
||||
ldx #$02 : bra .end
|
||||
+ cmp #$82 : bne +
|
||||
lda $aa : beq ++
|
||||
ldx #$03 : bra .end
|
||||
++ ldx #$04 : bra .end
|
||||
+ cmp #$85 : bne +
|
||||
ldx #$05 : bra .end
|
||||
+ cmp #$cc : bne +
|
||||
lda $aa : beq ++
|
||||
ldx #$06 : bra .end
|
||||
++ ldx #$07 : bra .end
|
||||
+ cmp #$dc : bne .end
|
||||
ldx #$08
|
||||
.end txa : rts
|
||||
|
||||
DetectEastEdge:
|
||||
ldx #$ff
|
||||
lda $a2
|
||||
cmp #$64 : bne +
|
||||
ldx #$00 : bra .end
|
||||
+ cmp #$73 : bne +
|
||||
ldx #$01 : bra .end
|
||||
+ cmp #$74 : bne +
|
||||
ldx #$02 : bra .end
|
||||
+ cmp #$81 : bne +
|
||||
lda $aa : beq ++
|
||||
ldx #$04 : bra .end
|
||||
++ ldx #$03 : bra .end
|
||||
+ cmp #$84 : bne +
|
||||
ldx #$05 : bra .end
|
||||
+ cmp #$cb : bne +
|
||||
lda $aa : beq ++
|
||||
ldx #$06 : bra .end
|
||||
++ ldx #$07 : bra .end
|
||||
+ cmp #$db : bne .end
|
||||
ldx #$08
|
||||
.end txa : rts
|
||||
|
||||
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
GfxFixer:
|
||||
{
|
||||
lda.l DRMode : bne +
|
||||
jsl LoadRoomHook ;this is the code we overwrote
|
||||
jsl Dungeon_InitStarTileCh
|
||||
jsl LoadTransAuxGfx_Alt
|
||||
inc $b0
|
||||
rtl
|
||||
+ lda $b1 : bne .stage2
|
||||
jsl LoadRoomHook ; this is the rando version - let's only call this guy once - may fix star tiles and slower loads
|
||||
jsl Dungeon_InitStarTileCh
|
||||
jsl LoadTransAuxGfx
|
||||
jsl Dungeon_LoadCustomTileAttr
|
||||
jsl PrepTransAuxGfx
|
||||
lda.l DRMode : cmp #$02 : bne + ; only do this in crossed mode
|
||||
ldx $a0 : lda.l TilesetTable, x
|
||||
cmp $0aa1 : beq + ; already eq no need to decomp
|
||||
sta $0aa1
|
||||
tax : lda $02802e, x : tay
|
||||
jsl DecompDungAnimatedTiles
|
||||
+
|
||||
lda #$09 : sta $17 : sta $0710
|
||||
jsl Palette_SpriteAux3
|
||||
jsl Palette_SpriteAux2
|
||||
jsl Palette_SpriteAux1
|
||||
jsl Palette_DungBgMain
|
||||
jsr CgramAuxToMain
|
||||
inc $b1
|
||||
rtl
|
||||
.stage2
|
||||
lda #$0a : sta $17 : sta $0710
|
||||
stz $b1 : inc $b0
|
||||
rtl
|
||||
}
|
||||
|
||||
FixAnimatedTiles:
|
||||
LDA.L DRMode : CMP #$02 : BNE +
|
||||
LDA $040C : CMP.b #$FF : BEQ +
|
||||
PHX
|
||||
LDX $A0 : LDA.l TilesetTable, x
|
||||
CMP $0AA1 : beq ++
|
||||
TAX : PLA : BRA +
|
||||
++
|
||||
PLX
|
||||
+ LDA $02802E, X ; what we wrote over
|
||||
RTL
|
||||
|
||||
FixCloseDungeonMap:
|
||||
LDA.l DRMode : CMP #$02 : BNE .vanilla
|
||||
LDA $040C : BMI .vanilla
|
||||
LSR : TAX
|
||||
LDA.l DungeonTilesets,x
|
||||
RTL
|
||||
.vanilla
|
||||
LDA $7EC20E
|
||||
RTL
|
||||
|
||||
FixWallmasterLamp:
|
||||
ORA $0458
|
||||
STY $1C : STA $1D : RTL ; what we wrote over
|
||||
|
||||
|
||||
CgramAuxToMain: ; ripped this from bank02 because it ended with rts
|
||||
{
|
||||
rep #$20
|
||||
ldx.b #$00
|
||||
|
||||
.loop
|
||||
lda $7EC300, X : sta $7EC500, x
|
||||
lda $7EC340, x : sta $7EC540, x
|
||||
lda $7EC380, x : sta $7EC580, x
|
||||
lda $7EC3C0, x : sta $7EC5C0, x
|
||||
lda $7EC400, x : sta $7EC600, x
|
||||
lda $7EC440, x : sta $7EC640, x
|
||||
lda $7EC480, x : sta $7EC680, x
|
||||
lda $7EC4C0, x : sta $7EC6C0, x
|
||||
|
||||
inx #2 : cpx.b #$40 : bne .loop
|
||||
sep #$20
|
||||
|
||||
; tell NMI to upload new CGRAM data
|
||||
inc $15
|
||||
rts
|
||||
}
|
||||
|
||||
OverridePaletteHeader:
|
||||
lda.l DRMode : cmp #$02 : bne +
|
||||
lda.l DRFlags : and #$20 : bne +
|
||||
cpx #$01c2 : !bge +
|
||||
rep #$20
|
||||
txa : lsr : tax
|
||||
lda.l PaletteTable, x
|
||||
iny : rtl
|
||||
+ rep #$20 : iny : lda [$0D], Y ; what we wrote over
|
||||
rtl
|
||||
@@ -1,291 +0,0 @@
|
||||
DrHudOverride:
|
||||
{
|
||||
jsl.l NewDrawHud
|
||||
jsr HudAdditions
|
||||
rtl
|
||||
}
|
||||
|
||||
HudAdditions:
|
||||
{
|
||||
LDA.l DRFlags : AND #$0008 : BNE + : JMP .end_item_count : +
|
||||
LDA.l $7EF423 : PHA : CMP #1000 : !BLT +
|
||||
JSL HexToDec4Digit_fast
|
||||
LDX.b $04 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS ; draw 1000's digit
|
||||
BRA .skip
|
||||
+ JSL HexToDec_fast
|
||||
.skip
|
||||
LDA #$207F : STA !GOAL_DRAW_ADDRESS+2 : STA !GOAL_DRAW_ADDRESS+4
|
||||
PLA : PHA : CMP.w #100 : !BLT +
|
||||
LDX.b $05 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+2 ; draw 100's digit
|
||||
+ PLA : CMP.w #10 : !BLT +
|
||||
LDX.b $06 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+4 ; draw 10's digit
|
||||
+ LDX.b $07 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+6 ; draw 1's digit
|
||||
LDA.w #$2830 : STA !GOAL_DRAW_ADDRESS+8 ; draw slash
|
||||
LDA.l DRFlags : AND #$0100 : BNE +
|
||||
LDA.l $7EF33E : CMP #1000 : !BLT .three_digit_goal
|
||||
JSL HexToDec4Digit_fast
|
||||
LDX.b $04 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+10 ; draw 1000's digit
|
||||
LDX.b $05 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+12 ; draw 100's digit
|
||||
LDX.b $06 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+14 ; draw 10's digit
|
||||
LDX.b $07 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+16 ; draw 1's digit
|
||||
BRA .end_item_count
|
||||
.three_digit_goal
|
||||
JSL HexToDec_fast
|
||||
LDX.b $05 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+10 ; draw 100's digit
|
||||
LDX.b $06 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+12 ; draw 10's digit
|
||||
LDX.b $07 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+14 ; draw 1's digit
|
||||
BRA .end_item_count
|
||||
+ LDA.w #$2405 : STA !GOAL_DRAW_ADDRESS+10 : STA !GOAL_DRAW_ADDRESS+12
|
||||
STA !GOAL_DRAW_ADDRESS+14 : STA !GOAL_DRAW_ADDRESS+16
|
||||
.end_item_count
|
||||
|
||||
LDX $1B : BNE + : RTS : + ; Skip if outdoors
|
||||
ldx $040c : cpx #$ff : bne + : rts : + ; Skip if not in dungeon
|
||||
lda.l DRMode : bne + : rts : + ; Skip if not door rando
|
||||
phb : phk : plb
|
||||
lda $7ef364 : and.l $0098c0, x : beq +
|
||||
lda.w CompassBossIndicator, x : and #$00ff : cmp $a0 : bne +
|
||||
lda $1a : and #$0010 : beq +
|
||||
lda #$345e : sta $7ec790 : bra .next
|
||||
+ lda #$207f : sta $7ec790
|
||||
.next lda.w DRMode : and #$0002 : bne + : plb : rts : +
|
||||
lda $7ef36d : and #$00ff : beq +
|
||||
lda.w DungeonReminderTable, x : bra .reminder
|
||||
+ lda #$207f
|
||||
.reminder sta $7ec702
|
||||
+ lda.w DRFlags : and #$0004 : beq .restore
|
||||
lda $7ef368 : and.l $0098c0, x : beq .restore
|
||||
txa : lsr : tax
|
||||
|
||||
lda.l GenericKeys : and #$00ff : bne +
|
||||
lda $7ef4e0, x : jsr ConvertToDisplay : sta $7ec7a2
|
||||
lda #$2830 : sta $7ec7a4
|
||||
+
|
||||
lda.w ChestKeys, x : jsr ConvertToDisplay : sta $7ec7a6
|
||||
; todo 4b0 no longer in use
|
||||
|
||||
.restore
|
||||
plb : rts
|
||||
}
|
||||
|
||||
;column distance for BK/Smalls
|
||||
HudOffsets:
|
||||
; none hc east desert aga swamp pod mire skull ice hera tt tr gt
|
||||
dw $fffe, $0000, $0006, $0008, $0002, $0010, $000e, $0018, $0012, $0016, $000a, $0014, $001a, $001e
|
||||
|
||||
; offset from 1644
|
||||
RowOffsets:
|
||||
dw $0000, $0000, $0040, $0080, $0000, $0080, $0040, $0080, $00c0, $0040, $00c0, $0000, $00c0, $0000
|
||||
|
||||
ColumnOffsets:
|
||||
dw $0000, $0000, $0000, $0000, $000a, $000a, $000a, $0014, $000a, $0014, $0000, $0014, $0014, $001e
|
||||
|
||||
|
||||
DrHudDungeonItemsAdditions:
|
||||
{
|
||||
jsl DrawHUDDungeonItems
|
||||
lda.l HUDDungeonItems : and #$ff : bne + : rtl : +
|
||||
lda.l DRMode : cmp #$02 : beq + : rtl : +
|
||||
|
||||
phx : phy : php
|
||||
rep #$30
|
||||
|
||||
lda.w #$24f5 : sta $1606 : sta $1610 : sta $161a : sta $1624
|
||||
sta $1644 : sta $164a : sta $1652 : sta $1662 : sta $1684 : sta $16c4
|
||||
ldx #$0000
|
||||
- sta $1704, x : sta $170e, x : sta $1718, x
|
||||
inx #2 : cpx #$0008 : !blt -
|
||||
|
||||
lda !HUD_FLAG : and.w #$0020 : beq + : JMP ++ : +
|
||||
lda HUDDungeonItems : and.w #$0007 : bne + : JMP ++ : +
|
||||
; bk symbols
|
||||
lda.w #$2811 : sta $1606 : sta $1610 : sta $161a : sta $1624
|
||||
; sm symbols
|
||||
lda.w #$2810 : sta $160a : sta $1614 : sta $161e : sta $16e4
|
||||
; blank out stuff
|
||||
lda.w #$24f5 : sta $1724
|
||||
|
||||
ldx #$0002
|
||||
- lda #$0000 : !addl RowOffsets,x : !addl ColumnOffsets, x : tay
|
||||
lda.l DungeonReminderTable, x : sta $1644, y : iny #2
|
||||
lda.w #$24f5 : sta $1644, y
|
||||
lda $7ef368 : and.l $0098c0, x : beq + ; must have map
|
||||
jsr BkStatus : sta $1644, y : bra .smallKey ; big key status
|
||||
+ lda $7ef366 : and.l $0098c0, x : beq .smallKey
|
||||
lda.w #$2826 : sta $1644, y
|
||||
.smallKey
|
||||
+ iny #2
|
||||
cpx #$001a : bne +
|
||||
tya : !add #$003c : tay
|
||||
+ stx $00
|
||||
txa : lsr : tax
|
||||
lda.w #$24f5 : sta $1644, y
|
||||
lda.l GenericKeys : and #$00FF : bne +
|
||||
lda.l $7ef37c, x : and #$00FF : beq +
|
||||
jsr ConvertToDisplay2 : sta $1644, y
|
||||
+ iny #2 : lda.w #$24f5 : sta $1644, y
|
||||
phx : ldx $00
|
||||
lda $7ef368 : and.l $0098c0, x : beq + ; must have map
|
||||
plx : sep #$30 : lda.l ChestKeys, x : sta $02
|
||||
lda.l GenericKeys : bne +++
|
||||
lda $02 : !sub $7ef4e0, x : sta $02
|
||||
+++ lda $02
|
||||
rep #$30
|
||||
jsr ConvertToDisplay2 : sta $1644, y ; small key totals
|
||||
bra .skipStack
|
||||
+ plx
|
||||
.skipStack iny #2
|
||||
cpx #$000d : beq +
|
||||
lda.w #$24f5 : sta $1644, y
|
||||
+
|
||||
ldx $00
|
||||
+ inx #2 : cpx #$001b : bcs ++ : JMP -
|
||||
++
|
||||
lda !HUD_FLAG : and.w #$0020 : bne + : JMP ++ : +
|
||||
lda HUDDungeonItems : and.w #$000c : bne + : JMP ++ : +
|
||||
; map symbols (do I want these) ; note compass symbol is 2c20
|
||||
lda.w #$2821 : sta $1606 : sta $1610 : sta $161a : sta $1624
|
||||
; blank out a couple thing from old hud
|
||||
lda.w #$24f5 : sta $16e4 : sta $1724
|
||||
sta $160a : sta $1614 : sta $161e ; blank out sm key indicators
|
||||
ldx #$0002
|
||||
- lda #$0000 ; start of hud area
|
||||
!addl RowOffsets, x : !addl ColumnOffsets, x : tay
|
||||
lda.l DungeonReminderTable, x : sta $1644, y
|
||||
iny #2
|
||||
lda.w #$24f5 : sta $1644, y ; blank out map spot
|
||||
lda $7ef368 : and.l $0098c0, x : beq + ; must have map
|
||||
JSR MapIndicatorShort : STA $1644, Y
|
||||
+ iny #2
|
||||
cpx #$001a : bne +
|
||||
tya : !add #$003c : tay
|
||||
+ lda $7ef364 : and.l $0098c0, x : beq + ; must have compass
|
||||
phx ; total chest counts
|
||||
txa : lsr : tax
|
||||
sep #$30
|
||||
lda.l TotalLocations, x : !sub $7EF4BF, x : JSR HudHexToDec2DigitCopy
|
||||
rep #$30
|
||||
lda $06 : jsr ConvertToDisplay2 : sta $1644, y : iny #2
|
||||
lda $07 : jsr ConvertToDisplay2 : sta $1644, y
|
||||
plx
|
||||
bra .skipBlanks
|
||||
+ lda.w #$24f5 : sta $1644, y : iny #2 : sta $1644, y
|
||||
.skipBlanks iny #2
|
||||
cpx #$001a : beq +
|
||||
lda.w #$24f5 : sta $1644, y ; blank out spot
|
||||
+ inx #2 : cpx #$001b : !bge ++ : JMP -
|
||||
++
|
||||
plp : ply : plx : rtl
|
||||
}
|
||||
|
||||
MapIndicatorLong:
|
||||
PHX
|
||||
LDA.l OldHudToNewHudTable, X : TAX
|
||||
JSR MapIndicator
|
||||
PLX
|
||||
RTL
|
||||
|
||||
MapIndicatorShort:
|
||||
PHX
|
||||
TXA : LSR : TAX
|
||||
JSR MapIndicator
|
||||
PLX
|
||||
RTS
|
||||
|
||||
OldHudToNewHudTable:
|
||||
dw 1, 2, 3, 10, 4, 6, 5, 8, 11, 9, 7, 12, 13
|
||||
|
||||
IndicatorCharacters:
|
||||
; check 1 2 3 4 5 6 7 G B R
|
||||
dw $2426, $2817, $2818, $2819, $281A, $281B, $281C, $281D, $2590, $258B, $259B
|
||||
|
||||
MapIndicator:
|
||||
LDA.l CrystalPendantFlags_3, X : AND #$00FF
|
||||
PHX
|
||||
ASL : TAX : LDA.l IndicatorCharacters, X
|
||||
PLX
|
||||
RTS
|
||||
|
||||
BkStatus:
|
||||
lda $7ef366 : and.l $0098c0, x : bne +++ ; has the bk already
|
||||
lda.l BigKeyStatus, x : bne ++
|
||||
lda #$2827 : rts ; 0/O for no BK
|
||||
++ cmp #$0002 : bne +
|
||||
lda #$2420 : rts ; symbol for BnC
|
||||
+ lda #$24f5 : rts ; black otherwise
|
||||
+++ lda #$2826 : rts ; check mark
|
||||
|
||||
ConvertToDisplay:
|
||||
and.w #$00ff : cmp #$000a : !blt +
|
||||
!add #$2553 : rts
|
||||
+ !add #$2490 : rts
|
||||
|
||||
ConvertToDisplay2:
|
||||
and.w #$00ff : beq ++
|
||||
cmp #$000a : !blt +
|
||||
!add #$2553 : rts ; todo: use 2580 with 258A as "A" for non transparent digits
|
||||
+ !add #$2816 : rts
|
||||
++ lda #$2827 : rts ; 0/O for 0 or placeholder digit ;2483
|
||||
|
||||
CountAbsorbedKeys:
|
||||
jsl IncrementSmallKeysNoPrimary : phx
|
||||
lda $040c : cmp #$ff : beq +
|
||||
lsr : tax
|
||||
lda $7ef4b0, x : inc : sta $7ef4b0, x
|
||||
+ plx : rtl
|
||||
|
||||
;================================================================================
|
||||
; 16-bit A, 8-bit X
|
||||
; in: A(b) - Byte to Convert
|
||||
; out: $04 - $07 (high - low)
|
||||
;================================================================================
|
||||
HudHexToDec4DigitCopy:
|
||||
LDY.b #$90
|
||||
-
|
||||
CMP.w #1000 : !BLT +
|
||||
INY
|
||||
SBC.w #1000 : BRA -
|
||||
+
|
||||
STY $04 : LDY #$90 ; Store 1000s digit & reset Y
|
||||
-
|
||||
CMP.w #100 : !BLT +
|
||||
INY
|
||||
SBC.w #100 : BRA -
|
||||
+
|
||||
STY $05 : LDY #$90 ; Store 100s digit & reset Y
|
||||
-
|
||||
CMP.w #10 : !BLT +
|
||||
INY
|
||||
SBC.w #10 : BRA -
|
||||
+
|
||||
STY $06 : LDY #$90 ; Store 10s digit & reset Y
|
||||
CMP.w #1 : !BLT +
|
||||
-
|
||||
INY
|
||||
DEC : BNE -
|
||||
+
|
||||
STY $07 ; Store 1s digit
|
||||
RTS
|
||||
|
||||
;================================================================================
|
||||
; 8-bit registers
|
||||
; in: A(b) - Byte to Convert
|
||||
; out: $06 - $07 (high - low)
|
||||
;================================================================================
|
||||
HudHexToDec2DigitCopy: ; modified
|
||||
PHY
|
||||
LDY.b #$00
|
||||
-
|
||||
CMP.b #10 : !BLT +
|
||||
INY
|
||||
SBC.b #10 : BRA -
|
||||
+
|
||||
STY $06 : LDY #$00 ; Store 10s digit and reset Y
|
||||
CMP.b #1 : !BLT +
|
||||
-
|
||||
INY
|
||||
DEC : BNE -
|
||||
+
|
||||
STY $07 ; Store 1s digit
|
||||
PLY
|
||||
RTS
|
||||
@@ -1,42 +0,0 @@
|
||||
; code to un-pair or re-pair doors
|
||||
|
||||
; doorlist is loaded into 19A0 but no terminator
|
||||
; new room is in A0
|
||||
; for "each" door do the following: (each could mean the first four doors?)
|
||||
; in lookup table, grab room and corresponding position
|
||||
; find the info at 7ef000, x where x is twice the paired room
|
||||
; check the corresponding bit (there are only 4)
|
||||
; set the bit in 068C
|
||||
|
||||
; Note the carry bit is used to indicate if we should aborted (set) or not
|
||||
CheckIfDoorsOpen: {
|
||||
jsr TrapDoorFixer ; see normal.asm
|
||||
; note we are 16bit mode right now
|
||||
lda.l DRMode : beq +
|
||||
lda $040c : cmp #$00ff : bne .gtg
|
||||
+ lda $a0 : dec : tax : and #$000f ; hijacked code
|
||||
sec : rtl ; set carry to indicate normal behavior
|
||||
|
||||
.gtg
|
||||
phb : phk : plb
|
||||
stx $00 : ldy #$0000
|
||||
.nextDoor
|
||||
lda $a0 : asl : tax
|
||||
lda.w KeyDoorOffset, x : beq .skipDoor
|
||||
asl : sty $05 : !add $05 : tax
|
||||
lda.w PairedDoorTable, x : beq .skipDoor
|
||||
sta $02 : and #$00ff : asl a : tax
|
||||
lda $02 : and #$ff00 : sta $03
|
||||
lda $7ef000, x : and #$f000 : and $03 : beq .skipDoor
|
||||
tyx : lda $068c : ora $0098c0,x : sta $068c
|
||||
.skipDoor
|
||||
iny #2 : cpy $00 : bne .nextDoor
|
||||
plb : clc : rtl
|
||||
}
|
||||
|
||||
; outstanding issues
|
||||
; how to indicate opening for other (non-first four doors?)
|
||||
; Bank01 Door Register stores the 4 bits in 068c to 400 (depending on type)
|
||||
; Key collision and others depend on F0-F3 attribute not sure if extendable to other numbers
|
||||
; Dungeon_ProcessTorchAndDoorInteractives.isOpenableDoor is the likely culprit for collision problems
|
||||
; Saving open status to other unused rooms is tricky -- Bank 2 13947 (line 8888)
|
||||
@@ -1,66 +0,0 @@
|
||||
;divide by 2 example
|
||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f 10--Offset Ruler
|
||||
;v 00 01 01 02 02 03 03 04 04 04 05 05 06 06 07 07 08
|
||||
|
||||
;divide by 3 example
|
||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18
|
||||
;00 00 01 01 01 02 02 02 03 03 03 04 04 04 05 05 05 06 06 06 07 07 07 08 08
|
||||
|
||||
MultiplyByY:
|
||||
.loop cpy #$0001 : beq .done
|
||||
cpy #$0003 : bne ++
|
||||
jsr MultiBy3 : bra .done
|
||||
++ cpy #$0005 : bne ++
|
||||
jsr MultiBy5 : bra .done
|
||||
++ asl : sta $00 : tya : lsr : tay : lda $00 : bra .loop
|
||||
.done rts
|
||||
|
||||
;Divisor in Y. Width of division is in X for rounding toward middle
|
||||
DivideByY:
|
||||
.loop
|
||||
cpy #$0000 : beq .done
|
||||
cpy #$0001 : beq .done
|
||||
cpy #$0003 : bne ++
|
||||
jsr DivideBy3 : bra .done
|
||||
++ cpy #$0005 : bne ++
|
||||
jsr DivideBy5 : bra .done
|
||||
++ jsr DivideBy2 : sta $00
|
||||
tya : lsr : tay
|
||||
txa : lsr : tax
|
||||
lda $00 : bra .loop
|
||||
.done rts
|
||||
|
||||
MultiBy3:
|
||||
sta $00 : asl : !add $00
|
||||
rts
|
||||
|
||||
MultiBy5:
|
||||
sta $00 : asl #2 : !add $00
|
||||
rts
|
||||
|
||||
;width of divison in x: rounds toward X/2
|
||||
DivideBy2:
|
||||
sta $00
|
||||
lsr : bcc .done
|
||||
sta $02 : txa : lsr : cmp $00 : !blt +
|
||||
lda $02 : inc : bra .done
|
||||
+ lda $02
|
||||
.done rts
|
||||
|
||||
DivideBy3:
|
||||
sta $00
|
||||
ldx #$0000
|
||||
lda #$0002
|
||||
.loop cmp $00 : !bge .store
|
||||
inx : !add #$0003 : bra .loop
|
||||
.store txa
|
||||
rts
|
||||
|
||||
DivideBy5:
|
||||
sta $00
|
||||
ldx #$0000
|
||||
lda #$0003
|
||||
.loop cmp $00 : !bge .store
|
||||
inx : !add #$0005 : bra .loop
|
||||
.store txa
|
||||
rts
|
||||
@@ -1,419 +0,0 @@
|
||||
WarpLeft:
|
||||
lda.l DRMode : beq .end
|
||||
lda $040c : cmp.b #$ff : beq .end
|
||||
lda $20 : ldx $aa
|
||||
jsr CalcIndex
|
||||
!add #$06 : ldy #$01 ; offsets in A, Y
|
||||
jsr LoadRoomHorz
|
||||
.end
|
||||
jsr Cleanup
|
||||
rtl
|
||||
|
||||
WarpRight:
|
||||
lda.l DRMode : beq .end
|
||||
lda $040c : cmp.b #$ff : beq .end
|
||||
lda $20 : ldx $aa
|
||||
jsr CalcIndex
|
||||
!add #$12 : ldy #$ff ; offsets in A, Y
|
||||
jsr LoadRoomHorz
|
||||
.end
|
||||
jsr Cleanup
|
||||
rtl
|
||||
|
||||
WarpUp:
|
||||
lda.l DRMode : beq .end
|
||||
lda $040c : cmp.b #$ff : beq .end
|
||||
lda $22 : ldx $a9
|
||||
jsr CalcIndex
|
||||
ldy #$02 ; offsets in A, Y
|
||||
jsr LoadRoomVert
|
||||
.end
|
||||
jsr Cleanup
|
||||
rtl
|
||||
|
||||
; Checks if $a0 is equal to <Room>. If it is, opens its stonewall if it's there
|
||||
macro StonewallCheck(Room)
|
||||
lda $a0 : cmp.b #<Room> : bne ?end
|
||||
lda.l <Room>*2+$7ef000 : ora #$80 : sta.l <Room>*2+$7ef000
|
||||
?end
|
||||
endmacro
|
||||
|
||||
WarpDown:
|
||||
lda.l DRMode : beq .end
|
||||
lda $040c : cmp.b #$ff : beq .end
|
||||
lda $22 : ldx $a9
|
||||
jsr CalcIndex
|
||||
!add #$0c : ldy #$ff ; offsets in A, Y
|
||||
jsr LoadRoomVert
|
||||
%StonewallCheck($43)
|
||||
.end
|
||||
jsr Cleanup
|
||||
rtl
|
||||
|
||||
; carry set = use link door like normal
|
||||
; carry clear = we are in dr mode, never use linking doors
|
||||
CheckLinkDoorR:
|
||||
lda.l DRMode : bne +
|
||||
lda $7ec004 : sta $a0 ; what we wrote over
|
||||
sec : rtl
|
||||
+ clc : rtl
|
||||
|
||||
CheckLinkDoorL:
|
||||
lda.l DRMode : bne +
|
||||
lda $7ec003 : sta $a0 ; what we wrote over
|
||||
sec : rtl
|
||||
+ clc : rtl
|
||||
|
||||
TrapDoorFixer:
|
||||
lda $fe : and #$0038 : beq .end
|
||||
xba : asl #2 : sta $00
|
||||
stz $0468 : lda $068c : ora $00 : sta $068c
|
||||
.end
|
||||
stz $fe ; clear our fe here because we don't need it anymore
|
||||
rts
|
||||
|
||||
Cleanup:
|
||||
lda.l DRFlags : and #$10 : beq +
|
||||
stz $047a
|
||||
+ inc $11
|
||||
lda $ef
|
||||
rts
|
||||
|
||||
;A needs be to the low coordinate, x needs to be either 0 for left,upper or non-zero for right,down
|
||||
; This sets A (00,02,04) and stores half that at $04 for later use, (src door)
|
||||
CalcIndex: ; A->low byte of Link's Coord, X-> Link's quadrant, DoorOffset x 2 -> A, DoorOffset -> $04 (vert/horz agnostic)
|
||||
cpx.b #00 : bne .largeDoor
|
||||
cmp.b #$d0 : bcc .smallDoor
|
||||
lda #$01 : bra .done ; Middle Door
|
||||
.smallDoor lda #$00 : bra .done
|
||||
.largeDoor lda #$02
|
||||
.done
|
||||
sta $04
|
||||
asl
|
||||
rts
|
||||
|
||||
; Y is an adjustment for main direction of travel
|
||||
; A is a door table row offset
|
||||
LoadRoomHorz:
|
||||
{
|
||||
phb : phk : plb
|
||||
sty $06 : sta $07 : lda $a0 : pha ; Store normal room on stack
|
||||
lda $07 : jsr LookupNewRoom ; New room is in A, Room Data is in $00-$01
|
||||
lda $00 : cmp #$03 : bne .gtg
|
||||
jsr HorzEdge : pla : bcs .end
|
||||
sta $a0 : bra .end ; Restore normal room, abort (straight staircases and open edges can get in this routine)
|
||||
|
||||
.gtg ;Good to Go!
|
||||
pla ; Throw away normal room (don't fill up the stack)
|
||||
lda $a0 : and.b #$0F : asl a : !sub $23 : !add $06 : sta $02
|
||||
ldy #$00 : jsr ShiftVariablesMainDir
|
||||
|
||||
lda $01 : and #$80 : beq .normal
|
||||
ldy $06 : cpy #$ff : beq +
|
||||
lda $01 : jsr LoadEastMidpoint : bra ++
|
||||
+ lda $01 : jsr LoadWestMidpoint
|
||||
++ jsr PrepScrollToEdge : bra .scroll
|
||||
|
||||
.normal
|
||||
jsr PrepScrollToNormal
|
||||
.scroll
|
||||
lda $01 : and #$40 : pha
|
||||
jsr ScrollY
|
||||
pla : beq .end
|
||||
ldy #$06 : jsr ApplyScroll
|
||||
.end
|
||||
plb ; restore db register
|
||||
rts
|
||||
}
|
||||
|
||||
; Y is an adjustment for main direction of travel (stored at $06)
|
||||
; A is a door table row offset (stored a $07)
|
||||
LoadRoomVert:
|
||||
{
|
||||
phb : phk : plb
|
||||
sty $06 : sta $07 : lda $a0 : pha ; Store normal room on stack
|
||||
lda $07 : jsr LookupNewRoom ; New room is in A, Room Data is in $00-$01
|
||||
lda $00 : cmp #$03 : bne .gtg
|
||||
jsr VertEdge : pla : bcs .end
|
||||
sta $a0 : bra .end ; Restore normal room, abort (straight staircases and open edges can get in this routine)
|
||||
.gtg ;Good to Go!
|
||||
pla ; Throw away normal room (don't fill up the stack)
|
||||
lda $a0 : and.b #$F0 : lsr #3 : !sub $21 : !add $06 : sta $02
|
||||
|
||||
lda $01 : and #$80 : beq .notEdge
|
||||
ldy #$01 : jsr ShiftVariablesMainDir
|
||||
ldy $06 : cpy #$ff : beq +
|
||||
lda $01 : jsr LoadSouthMidpoint : bra ++
|
||||
+ lda $01 : jsr LoadNorthMidpoint
|
||||
++ jsr PrepScrollToEdge : bra .scroll
|
||||
|
||||
.notEdge
|
||||
lda $01 : and #$03 : cmp #$03 : bne .normal
|
||||
jsr ScrollToInroomStairs
|
||||
stz $046d
|
||||
bra .end
|
||||
.normal
|
||||
ldy #$01 : jsr ShiftVariablesMainDir
|
||||
jsr PrepScrollToNormal
|
||||
.scroll
|
||||
lda $01 : and #$40 : sta $046d
|
||||
jsr ScrollX
|
||||
.end
|
||||
plb ; restore db register
|
||||
rts
|
||||
}
|
||||
|
||||
LookupNewRoom: ; expects data offset to be in A
|
||||
{
|
||||
rep #$30 : and #$00FF ;sanitize A reg (who knows what is in the high byte)
|
||||
sta $00 ; offset in 00
|
||||
lda $a2 : tax ; probably okay loading $a3 in the high byte
|
||||
lda.w DoorOffset,x : and #$00FF ;we only want the low byte
|
||||
asl #3 : sta $02 : !add $02 : !add $02 ;multiply by 24 (data size)
|
||||
!add $00 ; should now have the offset of the address I want to load
|
||||
tax : lda.w DoorTable,x : sta $00
|
||||
and #$00FF : sta $a0 ; assign new room
|
||||
sep #$30
|
||||
rts
|
||||
}
|
||||
|
||||
; INPUTS-- Y: Direction Index , $02: Shift Value
|
||||
; Sets high bytes of various registers
|
||||
ShiftVariablesMainDir:
|
||||
{
|
||||
lda.w CoordIndex,y : tax
|
||||
lda $21,x : !add $02 : sta $21,x ; coordinate update
|
||||
lda.w CameraIndex,y : tax
|
||||
lda $e3,x : !add $02 : sta $e3,x ; scroll register high byte
|
||||
lda.w CamQuadIndex,y : tax
|
||||
lda $0605,x : !add $02 : sta $0605,x ; high bytes of these guys
|
||||
lda $0607,x : !add $02 : sta $0607,x
|
||||
lda $0601,x : !add $02 : sta $0601,x
|
||||
lda $0603,x : !add $02 : sta $0603,x
|
||||
rts
|
||||
}
|
||||
|
||||
; Normal Flags should be in $01
|
||||
ScrollToInroomStairs:
|
||||
{
|
||||
jsr PrepScrollToInroomStairs
|
||||
ldy #$01 : jsr ShiftVariablesMainDir
|
||||
jsr ScrollX
|
||||
ldy #$00 : jsr ApplyScroll
|
||||
lda $a0 : and #$0f : cmp #$0f : bne +
|
||||
stz $e0 : stz $e2 ; special case camera fix
|
||||
lda #$1f : sta $e1 : sta $e3
|
||||
+
|
||||
rts
|
||||
}
|
||||
|
||||
; Direction should be in $06, Shift Value (see above) in $02 and other info in $01
|
||||
; Sets $02, $04, $05, $ee, $045e, $045f and things related to Y coordinate
|
||||
PrepScrollToInroomStairs:
|
||||
{
|
||||
lda $01 : and #$30 : lsr #3 : tay
|
||||
lda.w InroomStairsX,y : sta $04
|
||||
lda.w InroomStairsX+1,y : sta $05
|
||||
lda $06 : cmp #$ff : beq .south
|
||||
lda.w InroomStairsY+1,y : bne +
|
||||
inc $045f ; flag indicating special screen transition
|
||||
dec $02 ; shift variables further
|
||||
stz $aa
|
||||
lda $a8 : and #%11111101 : sta $a8
|
||||
stz $0613 ; North scroll target
|
||||
inc $0603 : inc $0607
|
||||
dec $0619 : dec $061b
|
||||
+
|
||||
lda.w InroomStairsY,y : !add #$20 : sta $20
|
||||
!sub #$38 : sta $045e
|
||||
lda $01 : and #$40 : beq +
|
||||
lda $20 : !add #$20 : sta $20
|
||||
stz $045f
|
||||
+
|
||||
dec $21
|
||||
%StonewallCheck($1b)
|
||||
bra ++
|
||||
.south
|
||||
lda.w InroomStairsY+1,y : beq +
|
||||
inc $045f ; flag indicating special screen transition
|
||||
inc $02 ; shift variables further
|
||||
lda #$02 : sta $aa
|
||||
lda $a8 : ora #%00000010 : sta $a8
|
||||
inc $0611 ; South scroll target
|
||||
dec $0603 : dec $0607
|
||||
inc $0619 : inc $061b
|
||||
+
|
||||
lda.w InroomStairsY,y : !sub #$20 : sta $20
|
||||
!add #$38 : sta $045e
|
||||
lda $01 : and #$40 : beq +
|
||||
lda $20 : !sub #$20 : sta $20
|
||||
stz $045f
|
||||
+
|
||||
inc $21
|
||||
++
|
||||
lda $01 : and #$04 : lsr #2 : sta $ee : bne +
|
||||
stz $0476
|
||||
+ rts
|
||||
}
|
||||
|
||||
; Target pixel should be in A, other info in $01
|
||||
; Sets $04 $05 and $ee
|
||||
PrepScrollToEdge:
|
||||
{
|
||||
sta $04 : lda $01 : and #$20 : beq +
|
||||
lda #01
|
||||
+ sta $05
|
||||
lda $01 : and #$10 : beq +
|
||||
lda #01
|
||||
+ sta $ee : bne +
|
||||
stz $0476
|
||||
+ rts
|
||||
}
|
||||
|
||||
; Normal Flags should be in $01
|
||||
; Sets $04 $05 and $ee, and $fe
|
||||
PrepScrollToNormal:
|
||||
{
|
||||
lda $01 : sta $fe : and #$04 : lsr #2 : sta $ee ; trap door and layer
|
||||
bne +
|
||||
stz $0476
|
||||
+ stz $05 : lda #$78 : sta $04
|
||||
lda $01 : and #$03 : beq .end
|
||||
cmp #$02 : !bge +
|
||||
lda #$f8 : sta $04 : bra .end
|
||||
+ inc $05
|
||||
.end rts
|
||||
}
|
||||
|
||||
StraightStairsAdj:
|
||||
{
|
||||
stx $0464 : sty $012e ; what we wrote over
|
||||
lda.l DRMode : beq +
|
||||
lda $045e : bne .toInroom
|
||||
lda $046d : beq .noScroll
|
||||
sta $22
|
||||
ldy #$00 : jsr ApplyScroll
|
||||
stz $046d
|
||||
.noScroll
|
||||
jsr GetTileAttribute : tax
|
||||
lda $11 : cmp #$12 : beq .goingNorth
|
||||
lda $a2 : cmp #$51 : bne ++
|
||||
rep #$20 : lda #$0018 : !add $20 : sta $20 : sep #$20 ; special fix for throne room
|
||||
jsr GetTileAttribute : tax
|
||||
++ lda.l StepAdjustmentDown, X : bra .end
|
||||
; lda $ee : beq .end
|
||||
; rep #$20 : lda #$ffe0 : !add $20 : sta $20 : sep #$20
|
||||
.goingNorth
|
||||
cpx #$00 : bne ++
|
||||
lda $a0 : cmp #$51 : bne ++
|
||||
lda #$36 : bra .end ; special fix for throne room
|
||||
++ ldy $ee : cpy #$00 : beq ++
|
||||
inx
|
||||
++ lda.l StepAdjustmentUp, X
|
||||
.end
|
||||
pha : lda $0462 : and #$04 : bne ++
|
||||
pla : !add #$f6 : pha
|
||||
++ pla : !add $0464 : sta $0464
|
||||
+ rtl
|
||||
.toInroom
|
||||
lda #$32 : sta $0464 : stz $045e
|
||||
rtl
|
||||
}
|
||||
|
||||
GetTileAttribute:
|
||||
{
|
||||
phk : pea.w .jslrtsreturn-1
|
||||
pea.w $02802c
|
||||
jml $02c11d ; mucks with x/y sets a to Tile Attribute, I think
|
||||
.jslrtsreturn
|
||||
rts
|
||||
}
|
||||
|
||||
; 0 open edge
|
||||
; 1 nrm door high
|
||||
; 2 straight str
|
||||
; 3 nrm door low
|
||||
; 4 trap door high
|
||||
; 5 trap door low (none of these exist on North direction)
|
||||
StepAdjustmentUp: ; really North Stairs
|
||||
db $00, $f6, $1a, $18, $16, $38
|
||||
StepAdjustmentDown: ; really South Stairs
|
||||
db $d0, $f6, $10, $1a, $f0, $00
|
||||
|
||||
StraightStairsFix:
|
||||
{
|
||||
pha
|
||||
lda.l DRMode : bne +
|
||||
pla : !add $20 : sta $20 : rtl ;what we wrote over
|
||||
+ pla : rtl
|
||||
}
|
||||
|
||||
StraightStairLayerFix:
|
||||
{
|
||||
lda.l DRMode : beq +
|
||||
lda $ee : rtl
|
||||
+ lda $01c322, x : rtl ; what we wrote over
|
||||
}
|
||||
|
||||
DoorToStraight:
|
||||
{
|
||||
pha
|
||||
lda.l DRMode : beq .skip
|
||||
pla : bne .end
|
||||
pha
|
||||
lda $a0 : cmp #$51 : bne .skip
|
||||
lda #$04 : sta $4e
|
||||
.skip pla
|
||||
.end ldx $0418 : cmp #$02 ;what we wrote over
|
||||
rtl
|
||||
}
|
||||
|
||||
DoorToInroom:
|
||||
{
|
||||
ldx $045e : bne .end
|
||||
sta $0020, y ; what we wrote over
|
||||
.end
|
||||
ldx #$00 ; what we wrote over
|
||||
rtl
|
||||
}
|
||||
|
||||
DoorToInroomEnd:
|
||||
{
|
||||
ldy $045e : beq .vanilla
|
||||
cmp $045e : bne .return
|
||||
stz $045e ; clear
|
||||
.return
|
||||
rtl
|
||||
.vanilla
|
||||
cmp $02c034, x ; what we wrote over
|
||||
rtl
|
||||
}
|
||||
|
||||
StraightStairsTrapDoor:
|
||||
{
|
||||
lda $0464 : bne +
|
||||
; reset function
|
||||
.reset phk : pea.w .jslrtsreturn-1
|
||||
pea.w $02802c
|
||||
jml $028c73 ; $10D71 .reset label of Bank02
|
||||
.jslrtsreturn
|
||||
lda $0468 : bne ++
|
||||
lda $a0 : cmp.b #$ac : bne .animateTraps
|
||||
lda $0403 : and.b #$20 : bne .animateTraps
|
||||
lda $0403 : and.b #$10 : beq ++
|
||||
.animateTraps
|
||||
lda #$05 : sta $11
|
||||
inc $0468 : stz $068e : stz $0690
|
||||
++ JSL Underworld_DoorDown_Call : rtl
|
||||
+ JML Dungeon_ApproachFixedColor ; what we wrote over
|
||||
}
|
||||
|
||||
InroomStairsTrapDoor:
|
||||
{
|
||||
lda $0200 : cmp #$05 : beq .reset
|
||||
lda $b0 : jml $008781 ; what we wrote over (essentially)
|
||||
.reset
|
||||
pla : pla : pla
|
||||
jsl StraightStairsTrapDoor_reset
|
||||
jml $028b15 ; just some RTS in bank 02
|
||||
}
|
||||
@@ -1,154 +0,0 @@
|
||||
;================================================================================
|
||||
; Lamp Mantle & Light Cone Fix
|
||||
;--------------------------------------------------------------------------------
|
||||
; Output: 0 for darkness, 1 for lamp cone
|
||||
;--------------------------------------------------------------------------------
|
||||
LampCheckOverride:
|
||||
LDA $7F50C4 : CMP.b #$01 : BNE + : RTL : +
|
||||
CMP.b #$FF : BNE + : INC : RTL : +
|
||||
|
||||
LDA $7EF34A : BNE .done ; skip if we already have lantern
|
||||
|
||||
LDA $7EF3CA : BNE +
|
||||
.lightWorld
|
||||
LDA $040C : CMP.b #$04 : !BGE ++ ; check if we're in HC
|
||||
LDA LampConeSewers : BRA .done
|
||||
++
|
||||
LDA LampConeLightWorld : BRA .done
|
||||
+
|
||||
.darkWorld
|
||||
LDA LampConeDarkWorld
|
||||
.done
|
||||
;BNE + : STZ $1D : + ; remember to turn cone off after a torch
|
||||
RTL
|
||||
|
||||
GtBossHeartCheckOverride:
|
||||
lda $a0 : cmp #$1c : beq ++
|
||||
cmp #$6c : beq ++
|
||||
cmp #$4d : bne +
|
||||
++ lda.l DRFlags : and #$01 : bne ++ ;skip if flag on
|
||||
lda $403 : ora #$80 : sta $403
|
||||
++ clc
|
||||
rtl
|
||||
+ sec
|
||||
rtl
|
||||
|
||||
OnFileLoadOverride:
|
||||
jsl OnFileLoad ; what I wrote over
|
||||
+ lda.l DRFlags : and #$02 : beq + ; Mirror Scroll
|
||||
lda $7ef353 : bne +
|
||||
lda #$01 : sta $7ef353
|
||||
+ rtl
|
||||
|
||||
MirrorCheckOverride:
|
||||
lda.l DRFlags : and #$02 : beq ++
|
||||
lda $7ef353 : cmp #$01 : beq +
|
||||
++ lda $8A : and #$40 ; what I wrote over
|
||||
rtl
|
||||
+ lda.l DRScroll : rtl
|
||||
|
||||
EGFixOnMirror:
|
||||
lda.l DRFlags : and #$10 : beq +
|
||||
stz $047a
|
||||
+ jsl Mirror_SaveRoomData
|
||||
rtl
|
||||
|
||||
BlockEraseFix:
|
||||
lda $7ef353 : and #$02 : beq +
|
||||
stz $05fc : stz $05fd
|
||||
+ rtl
|
||||
|
||||
FixShopCode:
|
||||
cpx #$300 : !bge +
|
||||
sta $7ef000, x
|
||||
+ rtl
|
||||
|
||||
VitreousKeyReset:
|
||||
lda.l DRMode : beq +
|
||||
stz $0cba, x
|
||||
+ JML $0db818 ;restore old code
|
||||
|
||||
GuruguruFix:
|
||||
lda $a0 : cmp #$df : !bge +
|
||||
and #$0f : cmp #$0e : !blt +
|
||||
iny #2
|
||||
+ rtl
|
||||
|
||||
BlindAtticFix:
|
||||
lda.l DRMode : beq +
|
||||
lda #$01 : rtl
|
||||
+ lda $7EF3CC : cmp.b #$06
|
||||
rtl
|
||||
|
||||
SuctionOverworldFix:
|
||||
stz $50 : stz $5e
|
||||
lda.l DRMode : beq +
|
||||
stz $49
|
||||
+ rtl
|
||||
|
||||
!CutoffTable = "$27E000"
|
||||
|
||||
CutoffEntranceRug:
|
||||
PHA : PHX
|
||||
LDA.l DRMode : BEQ .norm
|
||||
LDA $04 : cmp #$000A : BEQ + ; only affect A & C objects
|
||||
cmp #$000C : BNE .norm
|
||||
+ LDX #$0000 : LDA !CutoffTable, x
|
||||
- CMP.W $A0 : BEQ .check
|
||||
INX #2 : LDA !CutoffTable, x : CMP.w #$FFFF : BNE -
|
||||
.norm PLX : PLA : LDA $9B52, y : STA $7E2000, x ; what we wrote over
|
||||
RTL
|
||||
.check
|
||||
LDA $0c : CMP #$0004 : !BGE .skip
|
||||
LDA $0e : CMP #$0008 : !BGE .skip
|
||||
CMP.l #$0004 : !BLT .skip
|
||||
BRA .norm
|
||||
.skip PLX : PLA : RTL
|
||||
|
||||
StoreTempBunnyState:
|
||||
LDA $5D : CMP #$1C : BNE +
|
||||
STA $5F
|
||||
+ LDA #$15 : STA $5D ; what we wrote over
|
||||
RTL
|
||||
|
||||
RetrieveBunnyState:
|
||||
STY $5D : STZ $02D8 ; what we wrote over
|
||||
LDA $5F : BEQ +
|
||||
STA $5D
|
||||
+ RTL
|
||||
|
||||
RainPrevention:
|
||||
LDA $00 : XBA : AND #$00FF : STA.b $0A ; what we wrote over
|
||||
PHA
|
||||
LDA $7EF3C5 : AND #$00FF : CMP #$0002 : !BGE .done ; only in rain states (0 or 1)
|
||||
LDA.l $7EF3C6 : AND #$0004 : BNE .done ; zelda's been rescued
|
||||
LDA.l BlockSanctuaryDoorInRain : BEQ .done ;flagged
|
||||
LDA $A0 : CMP #$0012 : BNE + ;we're in the sanctuary
|
||||
LDA.l $7EF3CC : AND #$00FF : CMP #$0001 : BEQ .done ; zelda is following
|
||||
LDA $00 : AND #$00FF : CMP #$00A1 : BNE .done ; position is a1
|
||||
PLA : LDA #$0008 : RTL
|
||||
+ LDA.l BlockCastleDoorsInRain : AND #$00FF : BEQ .done ;flagged
|
||||
LDX #$FFFE
|
||||
- INX #2 : LDA.l RemoveRainDoorsRoom, X : CMP #$FFFF : BEQ .done
|
||||
CMP $A0 : BNE -
|
||||
SEP #$20 : LDA.l RainDoorMatch, X : CMP $00 : BNE .continue
|
||||
REP #$20 : PLA : SEC : RTL
|
||||
.continue
|
||||
REP #$20 : BRA -
|
||||
.done PLA : CLC : RTL
|
||||
|
||||
; A should be how much dmg to do to Aga when leaving this function
|
||||
StandardAgaDmg:
|
||||
LDX.b #$00 ; part of what we wrote over
|
||||
LDA.l $7EF3C6 : AND #$04 : BEQ + ; zelda's not been rescued
|
||||
LDA.b #$10 ; hurt him!
|
||||
+ RTL ; A is zero if the AND results in zero and then Agahnim's invincible!
|
||||
|
||||
; note: this skips both maiden dialog triggers if the hole is open
|
||||
BlindsAtticHint:
|
||||
REP #$20
|
||||
CMP.w #$0122 : BNE +
|
||||
LDA $7EF0CA : AND.w #$0100 : BEQ +
|
||||
SEP #$20 : RTL ; skip the dialog box if the hole is already open
|
||||
+ SEP #$20 : JML Main_ShowTextMessage
|
||||
|
||||
@@ -1,222 +0,0 @@
|
||||
AdjustTransition:
|
||||
{
|
||||
lda $ab : and #$01ff : beq .reset
|
||||
phy : ldy #$06 ; operating on vertical registers during horizontal trans
|
||||
cpx.b #$02 : bcs .horizontalScrolling
|
||||
ldy #$00 ; operate on horizontal regs during vert trans
|
||||
.horizontalScrolling
|
||||
cmp #$0008 : bcs +
|
||||
pha : lda $ab : and #$0200 : beq ++
|
||||
pla : bra .add
|
||||
++ pla : eor #$ffff : inc ; convert to negative
|
||||
.add jsr AdjustCamAdd : ply : bra .reset
|
||||
+ lda $ab : and #$0200 : xba : tax
|
||||
lda.l OffsetTable,x : jsr AdjustCamAdd
|
||||
lda $ab : !sub #$0008 : sta $ab
|
||||
ply : bra .done
|
||||
.reset ; clear the $ab variable so to not disturb intra-tile doors
|
||||
stz $ab
|
||||
.done
|
||||
lda $00 : and #$01fc
|
||||
rtl
|
||||
}
|
||||
|
||||
AdjustCamAdd:
|
||||
!add $00E2,y : pha
|
||||
and #$01ff : cmp #$0111 : !blt +
|
||||
cmp #$01f8 : !bge ++
|
||||
pla : and #$ff10 : pha : bra +
|
||||
++ pla : and #$ff00 : !add #$0100 : pha
|
||||
+ pla : sta $00E2,y : sta $00E0,y : rts
|
||||
|
||||
; expects target quad in $05 (either 0 or 1) and target pixel in $04, target room should be in $a0
|
||||
; $06 is either $ff or $01/02
|
||||
; uses $00-$03 and $0e for calculation
|
||||
; also set up $ac
|
||||
ScrollY: ;change the Y offset variables
|
||||
lda $a0 : and.b #$f0 : lsr #3 : sta $0603 : inc : sta $0607
|
||||
|
||||
lda $05 : bne +
|
||||
lda $603 : sta $00 : stz $01 : bra ++
|
||||
+ lda $607 : sta $00 : lda #$02 : sta $01
|
||||
++ ; $01 now contains 0 or 2 and $00 contains the correct lat
|
||||
|
||||
stz $0e
|
||||
rep #$30
|
||||
lda $00 : pha
|
||||
|
||||
lda $e8 : and #$01ff : sta $02
|
||||
lda $04 : jsr LimitYCamera : sta $00
|
||||
jsr CheckRoomLayoutY : bcc +
|
||||
lda $00 : cmp #$0080 : !bge ++
|
||||
cmp #$0010 : !blt .cmpSrll
|
||||
lda #$0010 : bra .cmpSrll
|
||||
++ cmp #$0100 : !bge .cmpSrll
|
||||
lda #$0100
|
||||
.cmpSrll sta $00
|
||||
|
||||
; figures out scroll amt
|
||||
+ lda $00 : cmp $02 : bne +
|
||||
lda #$0000 : bra .next
|
||||
+ !blt +
|
||||
!sub $02 : inc $0e : bra .next
|
||||
+ lda $02 : !sub $00
|
||||
|
||||
.next
|
||||
sta $ab
|
||||
jsr AdjustCameraBoundsY
|
||||
|
||||
pla : sta $00
|
||||
sep #$30
|
||||
lda $04 : sta $20
|
||||
lda $00 : sta $21 : sta $0601 : sta $0605
|
||||
lda $01 : sta $aa
|
||||
lda $0e : asl : ora $ac : sta $ac
|
||||
lda $e9 : and #$01 : asl #2 : tax : lda $0603, x : sta $e9
|
||||
rts
|
||||
|
||||
LimitYCamera:
|
||||
cmp #$006c : !bge +
|
||||
lda #$0000 : bra .end
|
||||
+ cmp #$017d : !blt +
|
||||
lda #$0110 : bra .end
|
||||
+ !sub #$006c
|
||||
.end rts
|
||||
|
||||
CheckRoomLayoutY:
|
||||
jsr LoadRoomLayout ;switches to 8-bit
|
||||
cmp #$00 : beq .lock
|
||||
cmp #$07 : beq .free
|
||||
cmp #$01 : beq .free
|
||||
cmp #$04 : !bge .lock
|
||||
cmp #$02 : bne +
|
||||
lda $06 : cmp #$ff : beq .lock
|
||||
+ cmp #$03 : bne .free
|
||||
lda $06 : cmp #$ff : bne .lock
|
||||
.free rep #$30 : clc : rts
|
||||
.lock rep #$30 : sec : rts
|
||||
|
||||
AdjustCameraBoundsY:
|
||||
jsr CheckRoomLayoutY : bcc .free
|
||||
|
||||
; layouts that are camera locked (quads only)
|
||||
lda $04 : and #$00ff : cmp #$007d : !blt +
|
||||
lda #$0088 : bra ++
|
||||
+ cmp #$006d : !bge +
|
||||
lda #$0078 : bra ++
|
||||
+ !add #$000b
|
||||
|
||||
; I think we no longer need the $02 variable
|
||||
++ sta $02 : lda $04 : and #$0100 : !add $02 : bra .setBounds
|
||||
|
||||
; layouts where the camera is free
|
||||
.free lda $04 : cmp #$006c : !bge +
|
||||
lda #$0077 : bra .setBounds
|
||||
+ cmp #$017c : !blt +
|
||||
lda #$0187 : bra .setBounds
|
||||
+ !add #$000b
|
||||
.setBounds sta $0618 : inc #2 : sta $061a
|
||||
rts
|
||||
|
||||
LoadRoomLayout:
|
||||
lda $a0 : asl : !add $a0 : tax
|
||||
lda $1f8001, x : sta $b8
|
||||
lda $1f8000, x : sta $b7
|
||||
sep #$30
|
||||
ldy #$01 : lda [$b7], y : and #$1c : lsr #2
|
||||
rts
|
||||
|
||||
; expects target quad in $05 (either 0 or 1) and target pixel in $04, target room should be in $a0
|
||||
; uses $00-$03 and $0e for calculation
|
||||
; also set up $ac
|
||||
ScrollX: ;change the X offset variables
|
||||
lda $a0 : and.b #$0f : asl : sta $060b : inc : sta $060f
|
||||
|
||||
lda $05 : bne +
|
||||
lda $60b : sta $00 : stz $01 : bra ++
|
||||
+ lda $60f : sta $00 : lda #$01 : sta $01
|
||||
++ ; $01 now contains 0 or 1 and $00 contains the correct long
|
||||
|
||||
stz $0e ; pos/neg indicator
|
||||
rep #$30
|
||||
lda $00 : pha
|
||||
|
||||
lda $e2 : and #$01ff : sta $02
|
||||
lda $04 : jsr LimitXCamera : sta $00
|
||||
jsr CheckRoomLayoutX : bcc +
|
||||
lda $00 : cmp #$0080 : !bge ++
|
||||
lda #$0000 : bra .cmpSrll
|
||||
++ lda #$0100
|
||||
.cmpSrll sta $00
|
||||
|
||||
;figures out scroll amt
|
||||
+ lda $00 : cmp $02 : bne +
|
||||
lda #$0000 : bra .next
|
||||
+ !blt +
|
||||
!sub $02 : inc $0e : bra .next
|
||||
+ lda $02 : !sub $00
|
||||
|
||||
.next
|
||||
sta $ab : lda $04
|
||||
|
||||
cmp #$0078 : !bge +
|
||||
lda #$007f : bra ++
|
||||
+ cmp #$0178 : !blt +
|
||||
lda #$017f : bra ++
|
||||
+ !add #$0007
|
||||
++ sta $061c : inc #2 : sta $061e
|
||||
|
||||
pla : sta $00
|
||||
sep #$30
|
||||
lda $04 : ldx $046d : bne .straight
|
||||
sta $22 : bra +
|
||||
.straight
|
||||
sta $046d ; set X position later
|
||||
+
|
||||
lda $00 : sta $23 : sta $0609 : sta $060d
|
||||
lda $01 : sta $a9
|
||||
lda $0e : asl : ora $ac : sta $ac
|
||||
lda $e3 : and #$01 : asl #2 : tax : lda $060b, x : sta $e3
|
||||
|
||||
rts
|
||||
|
||||
LimitXCamera:
|
||||
cmp #$0079 : !bge +
|
||||
lda #$0000 : bra .end
|
||||
+ cmp #$0178 : !blt +
|
||||
lda #$0178
|
||||
+ !sub #$0078
|
||||
.end rts
|
||||
|
||||
CheckRoomLayoutX:
|
||||
jsr LoadRoomLayout ;switches to 8-bit
|
||||
cmp #$04 : !blt .lock
|
||||
cmp #$05 : bne +
|
||||
lda $06 : cmp #$ff : beq .lock
|
||||
+ cmp #$06 : bne .free
|
||||
lda $06 : cmp #$ff : bne .lock
|
||||
.free rep #$30 : clc : rts
|
||||
.lock rep #$30 : sec : rts
|
||||
|
||||
ApplyScroll:
|
||||
rep #$30
|
||||
lda $ab : and #$01ff : sta $00
|
||||
lda $ab : and #$0200 : beq +
|
||||
lda $00e2, y : !add $00 : bra .end
|
||||
+ lda $00e2, y : !sub $00
|
||||
.end
|
||||
sta $00e2, y
|
||||
sta $00e0, y
|
||||
stz $ab : sep #$30 : rts
|
||||
|
||||
QuadrantLoadOrderBeforeScroll:
|
||||
lda $045f : beq .end
|
||||
lda #$08 : sta $045c ; start with opposite quadrant row
|
||||
.end
|
||||
JML $0091c4 ; what we overwrote
|
||||
|
||||
QuadrantLoadOrderAfterScroll:
|
||||
lda $045f : beq .end
|
||||
stz $045c : stz $045f ; draw other row and clear flag
|
||||
.end
|
||||
JML $0091c4 ; what we overwrote
|
||||
@@ -1,332 +0,0 @@
|
||||
RecordStairType: {
|
||||
pha
|
||||
lda.l DRMode : beq .norm
|
||||
lda $040c : cmp #$ff : beq .norm
|
||||
lda $0e
|
||||
cmp #$25 : bcc ++ ; don't record straight staircases
|
||||
sta $045e
|
||||
++ pla : bra +
|
||||
.norm pla : sta $a0
|
||||
+ lda $063d, x
|
||||
rtl
|
||||
}
|
||||
|
||||
SpiralWarp: {
|
||||
lda.l DRMode : beq .abort ; abort if not DR
|
||||
lda $040c : cmp.b #$ff : beq .abort ; abort if not in dungeon
|
||||
lda $045e : cmp #$5e : beq .gtg ; abort if not spiral - intended room is in A!
|
||||
cmp #$5f : beq .gtg
|
||||
cmp #$26 : beq .inroom
|
||||
.abort
|
||||
stz $045e : lda $a2 : and #$0f : rtl ; clear,run hijacked code and get out
|
||||
.inroom
|
||||
jsr InroomStairsWarp
|
||||
lda $a2 : and #$0f ; this is the code we are hijacking
|
||||
rtl
|
||||
|
||||
.gtg
|
||||
phb : phk : plb : phx : phy ; push stuff
|
||||
jsr LookupSpiralOffset
|
||||
rep #$30 : and #$00FF : asl #2 : tax
|
||||
lda.w SpiralTable, x : sta $00
|
||||
lda.w SpiralTable+2, x : sta $02
|
||||
sep #$30
|
||||
lda $00 : sta $a0
|
||||
; shift quadrant if necessary
|
||||
stz $07 ; this is a x quad adjuster for those blasted staircase on the edges
|
||||
lda $01 : and #$01 : !sub $a9
|
||||
bne .xQuad
|
||||
lda $0462 : and #$04 : bne .xqCont
|
||||
inc $07
|
||||
.xqCont lda $22 : bne .skipXQuad ; this is an edge case
|
||||
dec $23 : bra .skipXQuad ; need to -1 if $22 is 0
|
||||
.xQuad sta $06 : !add $a9 : sta $a9
|
||||
lda $0462 : and #$04 : bne .xCont
|
||||
inc $07 ; up stairs are going to -1 the quad anyway during transition, need to add this back
|
||||
.xCont ldy #$00 : jsr ShiftQuadSimple
|
||||
|
||||
.skipXQuad
|
||||
lda $aa : lsr : sta $06 : lda $01 : and #$02 : lsr : !sub $06
|
||||
beq .skipYQuad
|
||||
sta $06 : asl : !add $aa : sta $aa
|
||||
ldy #$01 : jsr ShiftQuadSimple
|
||||
|
||||
.skipYQuad
|
||||
lda $01 : and #$04 : lsr : sta $048a ;fix layer calc 0->0 2->1
|
||||
lda $01 : and #$08 : lsr #2 : sta $0492 ;fix from layer calc 0->0 2->1
|
||||
; shift lower coordinates
|
||||
lda $02 : sta $22 : bne .adjY : lda $23 : !add $07 : sta $23
|
||||
.adjY lda $03 : sta $20 : bne .upDownAdj : inc $21
|
||||
.upDownAdj ldx #$08
|
||||
lda $0462 : and #$04 : beq .upStairs
|
||||
ldx #$fd
|
||||
lda $01 : and #$80 : bne .set53
|
||||
; if target is also down adjust by (6,-15)
|
||||
lda #$06 : !add $20 : sta $20 : lda #$eb : !add $22 : sta $22 : bra .set53
|
||||
.upStairs
|
||||
lda $01 : and #$80 : beq .set53
|
||||
; if target is also up adjust by (-6, 14)
|
||||
lda #$fa : !add $20 : sta $20 : lda #$14 : !add $22 : sta $22
|
||||
bne .set53 : inc $23
|
||||
.set53
|
||||
txa : !add $22 : sta $53
|
||||
|
||||
lda $01 : and #$10 : sta $07 ; zeroHzCam check
|
||||
ldy #$00 : jsr SetCamera
|
||||
lda $01 : and #$20 : sta $07 ; zeroVtCam check
|
||||
ldy #$01 : jsr SetCamera
|
||||
|
||||
jsr StairCleanup
|
||||
ply : plx : plb ; pull the stuff we pushed
|
||||
lda $a2 : and #$0f ; this is the code we are hijacking
|
||||
rtl
|
||||
}
|
||||
|
||||
StairCleanup: {
|
||||
stz $045e ; clear the staircase flag
|
||||
|
||||
; animated tiles fix
|
||||
lda.l DRMode : cmp #$02 : bne + ; only do this in crossed mode
|
||||
ldx $a0 : lda.l TilesetTable, x
|
||||
cmp $0aa1 : beq + ; already eq no need to decomp
|
||||
sta $0aa1
|
||||
tax : lda $02802e, x : tay
|
||||
jsl DecompDungAnimatedTiles
|
||||
+
|
||||
stz $047a
|
||||
rts
|
||||
}
|
||||
|
||||
;Sets the offset in A
|
||||
LookupSpiralOffset: {
|
||||
;where link currently is in $a2: quad in a8 & #$03
|
||||
;count doors
|
||||
stz $00 : ldx #$00 : stz $01
|
||||
|
||||
.loop
|
||||
lda $047e, x : cmp $00 : bcc .continue
|
||||
sta $00
|
||||
.continue inx #2
|
||||
cpx #$08 : bcc .loop
|
||||
|
||||
lda $00 : lsr
|
||||
cmp #$01 : beq .done
|
||||
|
||||
; look up the quad
|
||||
lda $a9 : ora $aa : and #$03 : beq .quad0
|
||||
cmp #$01 : beq .quad1
|
||||
cmp #$02 : beq .quad2
|
||||
bra .quad3
|
||||
.quad0
|
||||
inc $01 : lda $a2
|
||||
cmp #$0c : beq .q0diff ;gt ent
|
||||
cmp #$70 : bne .done ;hc stairwell
|
||||
.q0diff lda $22 : cmp #$00 : beq .secondDoor
|
||||
cmp #$98 : bcc .done ;gt ent and hc stairwell
|
||||
.secondDoor inc $01 : bra .done
|
||||
.quad1
|
||||
lda $a2
|
||||
cmp #$1a : beq .q1diff ;pod compass
|
||||
cmp #$26 : beq .q1diff ;swamp elbows
|
||||
cmp #$6a : beq .q1diff ;pod dark basement
|
||||
cmp #$76 : bne .done ;swamp drain
|
||||
.q1diff lda $22 : cmp #$98 : bcc .done
|
||||
inc $01 : bra .done
|
||||
.quad2
|
||||
lda #$03 : sta $01 : lda $a2
|
||||
cmp #$5f : beq .iceu ;ice u room
|
||||
cmp #$3f : bne .done ;hammer ice exception
|
||||
stz $01 : bra .done
|
||||
.iceu lda $22 : cmp #$78 : bcc .done
|
||||
inc $01 : bra .done
|
||||
.quad3
|
||||
lda $a2 : cmp #$40 : beq .done ; top of aga exception
|
||||
lda #$02 : sta $01 ; always 2
|
||||
|
||||
.done
|
||||
lda $a2 : tax : lda.w SpiralOffset,x
|
||||
!add $01 ;add a thing (0 in easy case)
|
||||
rts
|
||||
}
|
||||
|
||||
InroomStairsWarp: {
|
||||
phb : phk : plb : phx : phy ; push stuff
|
||||
; find stairs by room and store index in X
|
||||
lda $a0 : ldx #$07
|
||||
.loop
|
||||
cmp.w InroomStairsRoom,x
|
||||
beq .found
|
||||
dex
|
||||
bne .loop
|
||||
.found
|
||||
rep #$30
|
||||
txa : and #$00ff : asl : tay
|
||||
lda.w InroomStairsTable,y : sta $00
|
||||
sep #$30
|
||||
sta $a0
|
||||
|
||||
; set position and everything else based on target door type
|
||||
txa : and #$01 : eor #$01 : sta $07
|
||||
; should be the same as lda $0462 : and #$04 : lsr #2 : eor #$01 : sta $07
|
||||
lda $01 : and #$80 : beq .notEdge
|
||||
lda $07 : sta $03 : beq +
|
||||
lda $01 : jsr LoadSouthMidpoint : sta $22 : lda #$f4
|
||||
bra ++
|
||||
+
|
||||
lda $01 : jsr LoadNorthMidpoint : sta $22 : dec $21 : lda #$f7
|
||||
++
|
||||
sta $20
|
||||
lda $01 : and #$20 : beq +
|
||||
lda #$01
|
||||
+
|
||||
sta $02
|
||||
stz $07
|
||||
lda $01 : and #$10 : lsr #4
|
||||
JMP .layer
|
||||
.notEdge
|
||||
lda $01 : and #$03 : cmp #$03 : bne .normal
|
||||
txa : and #$06 : sta $07
|
||||
lda $01 : and #$30 : lsr #3 : tay
|
||||
lda.w InroomStairsX+1,y : sta $02
|
||||
lda.w InroomStairsY+1,y : sta $03
|
||||
cpy $07 : beq .vanillaTransition
|
||||
lda.w InroomStairsX,y : sta $22
|
||||
lda.w InroomStairsY,y
|
||||
ldy $07 : beq +
|
||||
!add #$07
|
||||
+
|
||||
sta $20
|
||||
inc $07
|
||||
bra ++
|
||||
.vanillaTransition
|
||||
lda #$c0 : sta $07 ; leave camera
|
||||
++
|
||||
%StonewallCheck($1b)
|
||||
lda $01 : and #$04 : lsr #2
|
||||
bra .layer
|
||||
.normal
|
||||
lda $01 : sta $fe ; trap door
|
||||
lda $07 : sta $03 : beq +
|
||||
ldy $a0 : cpy #$51 : beq .specialFix ; throne room
|
||||
cpy #$02 : beq .specialFix ; sewers pull switch
|
||||
cpy #$71 : beq .specialFix ; castle armory
|
||||
lda #$e0
|
||||
bra ++
|
||||
.specialFix
|
||||
lda #$c8
|
||||
bra ++
|
||||
+
|
||||
%StonewallCheck($43)
|
||||
lda #$1b
|
||||
++
|
||||
sta $20
|
||||
inc $07 : stz $02 : lda #$78 : sta $22
|
||||
lda $01 : and #$03 : beq ++
|
||||
cmp #$02 : !bge +
|
||||
lda #$f8 : sta $22 : stz $07 : bra ++
|
||||
+ inc $02
|
||||
++
|
||||
lda $01 : and #$04 : lsr #2
|
||||
|
||||
.layer
|
||||
sta $ee
|
||||
bne +
|
||||
stz $0476
|
||||
+
|
||||
|
||||
lda $02 : !sub $a9
|
||||
beq .skipXQuad
|
||||
sta $06 : !add $a9 : sta $a9
|
||||
ldy #$00 : jsr ShiftQuadSimple
|
||||
.skipXQuad
|
||||
lda $aa : lsr : sta $06 : lda $03 : !sub $06
|
||||
beq .skipYQuad
|
||||
sta $06 : asl : !add $aa : sta $aa
|
||||
ldy #$01 : jsr ShiftQuadSimple
|
||||
.skipYQuad
|
||||
|
||||
lda $07 : bmi .skipCamera
|
||||
ldy #$00 : jsr SetCamera ; horizontal camera
|
||||
ldy #$01 : sty $07 : jsr SetCamera ; vertical camera
|
||||
lda $20 : cmp #$e0 : bcc +
|
||||
lda $e8 : bne +
|
||||
lda #$10 : sta $e8 ; adjust vertical camera at bottom
|
||||
+
|
||||
.skipCamera
|
||||
|
||||
jsr StairCleanup
|
||||
ply : plx : plb ; pull the stuff we pushed
|
||||
rts
|
||||
}
|
||||
|
||||
ShiftQuadSimple: {
|
||||
lda.w CoordIndex,y : tax
|
||||
lda $20,x : beq .skip
|
||||
lda $21,x : !add $06 : sta $21,x ; coordinate update
|
||||
.skip
|
||||
lda.w CamQuadIndex,y : tax
|
||||
lda $0601,x : !add $06 : sta $0601,x
|
||||
lda $0605,x : !add $06 : sta $0605,x ; high bytes of these guys
|
||||
rts
|
||||
}
|
||||
|
||||
SetCamera: {
|
||||
stz $04
|
||||
tyx : lda $a9,x : bne .nonZeroHalf
|
||||
lda.w CamQuadIndex,y : tax : lda $607,x : pha
|
||||
lda.w CameraIndex,y : tax : pla : cmp $e3, x : bne .noQuadAdj
|
||||
dec $e3,x
|
||||
|
||||
.noQuadAdj
|
||||
lda $07 : bne .adj0
|
||||
lda.w CoordIndex,y : tax
|
||||
lda $20,x : beq .oddQuad
|
||||
cmp #$79 : bcc .adj0
|
||||
!sub #$78 : sta $04
|
||||
tya : asl : !add #$04 : tax : jsr AdjCamBounds : bra .done
|
||||
.oddQuad
|
||||
lda #$80 : sta $04 : bra .adj1 ; this is such a weird case - quad cross boundary
|
||||
.adj0
|
||||
tya : asl : tax : jsr AdjCamBounds : bra .done
|
||||
|
||||
.nonZeroHalf ;meaning either right half or bottom half
|
||||
lda $07 : bne .setQuad
|
||||
lda.w CoordIndex,y : tax
|
||||
lda $20,x : cmp #$78 : bcs .setQuad
|
||||
!add #$78 : sta $04
|
||||
lda.w CamQuadIndex,y : tax : lda $0603, x : pha
|
||||
lda.w CameraIndex,y : tax : pla : sta $e3, x
|
||||
.adj1
|
||||
tya : asl : !add #$08 : tax : jsr AdjCamBounds : bra .done
|
||||
|
||||
.setQuad
|
||||
lda.w CamQuadIndex,y : tax : lda $0607, x : pha
|
||||
lda.w CameraIndex,y : tax : pla : sta $e3, x
|
||||
tya : asl : !add #$0c : tax : jsr AdjCamBounds : bra .done
|
||||
|
||||
.done
|
||||
lda.w CameraIndex,y : tax
|
||||
lda $04 : sta $e2, x
|
||||
rts
|
||||
}
|
||||
|
||||
; input, expects X to be an appropriate offset into the CamBoundBaseLine table
|
||||
; when $04 is 0 no coordinate are added
|
||||
AdjCamBounds: {
|
||||
rep #$20 : lda.w CamBoundBaseLine, x : sta $05
|
||||
lda $04 : and #$00ff : beq .common
|
||||
lda.w CoordIndex,y : tax
|
||||
lda $20, x : and #$00ff : !add $05 : sta $05
|
||||
.common
|
||||
lda.w OppCamBoundIndex,y : tax
|
||||
lda $05 : sta $0618, x
|
||||
inc #2 : sta $061A, x : sep #$20
|
||||
rts
|
||||
}
|
||||
|
||||
SpiralPriorityHack: {
|
||||
lda.l DRMode : beq +
|
||||
lda #$01 : rtl ; always skip the priority code - until I figure out how to fix it
|
||||
+ lda $0462 : and #$04 ; what we wrote over
|
||||
rtl
|
||||
}
|
||||
@@ -1,227 +0,0 @@
|
||||
org $27A000
|
||||
DoorTable:
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Ganon
|
||||
dw $8000, $8000, $8000, $0450, $8000, $8000, $8000, $8000, $8000, $0452, $8000, $8000 ; HC Back Hall (x01)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $0112, $8000, $8000, $8000, $8000 ; Sewer Switches (x02)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x10
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x20
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;PoD Arena (x2a)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $0161, $8000, $8000, $8000, $8000, $8000, $8000 ;PoD Statue (x2b)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x30
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $0061 ; Swamp Main (x36)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x40
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $0061, $8000, $8000 ;HC West Hall (x50)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;HC Throne Room (x51)
|
||||
dw $8000, $8000, $8000, $0401, $8000, $8000, $0462, $0162, $8000, $8000, $8000, $8000 ;HC East Hall (x52)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $0550, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $0061, $0561, $8000 ;HC West Lobby (x60)
|
||||
dw $8000, $8000, $8000, $0236, $00a9, $8000, $8000, $8000, $8000, $8000, $062b, $8000 ;HC Main Lobby (x61)
|
||||
dw $0452, $0152, $8000, $8000, $0561, $8000, $8000, $8000, $8000, $0203, $0203, $0203 ;HC East Lobby (x62)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;Desert Back (x63)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;TT Attic L (x64)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;TT Attic R (x65)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x66
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x67
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x68
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x69
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6a
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6b
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6c
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6d
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6e
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6f
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x70
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; HC Cellblock (x80)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Vitreous (x90)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Mire Pre-Vitreous (xa0)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Trinexx (xa4)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Eastern Compass (xa8)
|
||||
dw $8000, $8000, $8000, $04a8, $00a8, $8000, $8000, $8000, $8000, $0161, $00aa, $8000 ; Eastern Courtyard (xa9)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Eastern Map (xaa)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xb0
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xc0
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xd0
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xe0
|
||||
@@ -1,227 +0,0 @@
|
||||
org $27A000
|
||||
DoorTable:
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Ganon
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; HC Back Hall (x01)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Sewer Switches (x02)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x10
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x20
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;PoD Arena (x2a)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;PoD Statue (x2b)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x30
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Swamp Main (x36)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x40
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;HC West Hall (x50)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;HC Throne Room (x51)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;HC East Hall (x52)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;HC West Lobby (x60)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;HC Main Lobby (x61)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;HC East Lobby (x62)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;Desert Back (x63)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;TT Attic L (x64)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;TT Attic R (x65)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x66
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x67
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x68
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x69
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6a
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6b
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6c
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6d
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6e
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6f
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x70
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; HC Cellblock (x80)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Vitreous (x90)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Mire Pre-Vitreous (xa0)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Trinexx (xa4)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Eastern Compass (xa8)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Eastern Courtyard (xa9)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Eastern Map (xaa)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xb0
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xc0
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xd0
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xe0
|
||||
@@ -1,227 +0,0 @@
|
||||
org $27A000
|
||||
DoorTable:
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Ganon
|
||||
dw $8000, $8000, $8000, $0450, $8000, $8000, $8000, $8000, $8000, $0452, $8000, $8000 ; HC Back Hall (x01)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $0112, $8000, $8000, $8000, $8000 ; Sewer Switches (x02)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x10
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x20
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;PoD Arena (x2a)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $0161, $8000, $8000, $8000, $8000, $8000, $8000 ;PoD Statue (x2b)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x30
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $0061 ; Swamp Main (x36)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; x40
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $0462, $0061, $8000, $8000 ;HC West Hall (x50)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;HC Throne Room (x51)
|
||||
dw $8000, $8000, $8000, $0401, $8000, $8000, $0162, $0660, $8000, $8000, $8000, $8000 ;HC East Hall (x52)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $0152, $8000, $8000, $8000, $8000, $8000, $8000, $0061, $0561, $8000 ;HC West Lobby (x60)
|
||||
dw $8000, $8000, $8000, $0236, $0160, $8000, $8000, $8000, $8000, $8000, $0162, $8000 ;HC Main Lobby (x61)
|
||||
dw $0650, $0452, $8000, $8000, $0561, $8000, $8000, $8000, $8000, $0203, $0203, $0203 ;HC East Lobby (x62)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;Desert Back (x63)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;TT Attic L (x64)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;TT Attic R (x65)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x66
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x67
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x68
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x69
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6a
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6b
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6c
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6d
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6e
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x6f
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ;x70
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; HC Cellblock (x80)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Vitreous (x90)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Mire Pre-Vitreous (xa0)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Trinexx (xa4)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Eastern Compass (xa8)
|
||||
dw $8000, $8000, $8000, $04a8, $00a8, $8000, $8000, $8000, $8000, $0161, $00aa, $8000 ; Eastern Courtyard (xa9)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; Eastern Map (xaa)
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xb0
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xc0
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xd0
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000
|
||||
dw $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000, $8000 ; xe0
|
||||
|
After Width: | Height: | Size: 268 B |
|
After Width: | Height: | Size: 260 B |
|
After Width: | Height: | Size: 260 B |
|
After Width: | Height: | Size: 263 B |
|
After Width: | Height: | Size: 194 B |
|
After Width: | Height: | Size: 266 B |
|
After Width: | Height: | Size: 254 B |
|
After Width: | Height: | Size: 287 B |
|
After Width: | Height: | Size: 330 B |
|
After Width: | Height: | Size: 288 B |
|
After Width: | Height: | Size: 313 B |
|
After Width: | Height: | Size: 301 B |
|
After Width: | Height: | Size: 310 B |
|
After Width: | Height: | Size: 320 B |
|
After Width: | Height: | Size: 301 B |
|
After Width: | Height: | Size: 190 B |
|
After Width: | Height: | Size: 212 B |
|
After Width: | Height: | Size: 292 B |
|
After Width: | Height: | Size: 296 B |
|
After Width: | Height: | Size: 291 B |
|
After Width: | Height: | Size: 269 B |
|
After Width: | Height: | Size: 305 B |
|
After Width: | Height: | Size: 271 B |
|
After Width: | Height: | Size: 296 B |
|
After Width: | Height: | Size: 326 B |
|
After Width: | Height: | Size: 292 B |
|
After Width: | Height: | Size: 167 B |
|
After Width: | Height: | Size: 277 B |
|
After Width: | Height: | Size: 287 B |
|
After Width: | Height: | Size: 297 B |
|
After Width: | Height: | Size: 287 B |
|
After Width: | Height: | Size: 287 B |
|
After Width: | Height: | Size: 247 B |
|
After Width: | Height: | Size: 188 B |
|
After Width: | Height: | Size: 295 B |
|
After Width: | Height: | Size: 189 B |
|
After Width: | Height: | Size: 289 B |
|
After Width: | Height: | Size: 329 B |
|
After Width: | Height: | Size: 333 B |
|
After Width: | Height: | Size: 230 B |
|
After Width: | Height: | Size: 297 B |
|
After Width: | Height: | Size: 231 B |
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 336 B |
|
After Width: | Height: | Size: 154 B |
|
After Width: | Height: | Size: 233 B |
|
After Width: | Height: | Size: 215 B |
|
After Width: | Height: | Size: 254 B |
|
After Width: | Height: | Size: 292 B |
|
After Width: | Height: | Size: 306 B |
|
After Width: | Height: | Size: 342 B |
|
After Width: | Height: | Size: 209 B |
|
After Width: | Height: | Size: 180 B |
|
After Width: | Height: | Size: 283 B |
|
After Width: | Height: | Size: 288 B |
|
After Width: | Height: | Size: 313 B |
|
After Width: | Height: | Size: 301 B |
|
After Width: | Height: | Size: 326 B |
|
After Width: | Height: | Size: 316 B |
|
After Width: | Height: | Size: 301 B |