diff --git a/BaseClasses.py b/BaseClasses.py index 58cfed79..81230e99 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -25,6 +25,7 @@ class World(object): self.players = players self.teams = 1 self.owShuffle = owShuffle.copy() + self.owTerrain = {} self.owCrossed = owCrossed.copy() self.owKeepSimilar = {} self.owMixed = owMixed.copy() @@ -2912,6 +2913,7 @@ class Spoiler(object): 'weapons': self.world.swords, 'goal': self.world.goal, 'ow_shuffle': self.world.owShuffle, + 'ow_terrain': self.world.owTerrain, 'ow_crossed': self.world.owCrossed, 'ow_keepsimilar': self.world.owKeepSimilar, 'ow_mixed': self.world.owMixed, @@ -3124,6 +3126,8 @@ class Spoiler(object): outfile.write('Bombbag:'.ljust(line_width) + '%s\n' % yn(self.metadata['bombbag'][player])) outfile.write('Pseudoboots:'.ljust(line_width) + '%s\n' % yn(self.metadata['pseudoboots'][player])) outfile.write('Overworld Layout Shuffle:'.ljust(line_width) + '%s\n' % self.metadata['ow_shuffle'][player]) + if self.metadata['ow_shuffle'][player] != 'vanilla': + outfile.write('Free Terrain:'.ljust(line_width) + '%s\n' % yn(self.metadata['ow_terrain'][player])) outfile.write('Crossed OW:'.ljust(line_width) + '%s\n' % self.metadata['ow_crossed'][player]) if self.metadata['ow_shuffle'][player] != 'vanilla' or self.metadata['ow_crossed'][player] != 'none': outfile.write('Keep Similar OW Edges Together:'.ljust(line_width) + '%s\n' % yn(self.metadata['ow_keepsimilar'][player])) diff --git a/CLI.py b/CLI.py index 4e7ad021..bfd09183 100644 --- a/CLI.py +++ b/CLI.py @@ -97,8 +97,8 @@ def parse_cli(argv, no_defaults=False): for player in range(1, multiargs.multi + 1): playerargs = parse_cli(shlex.split(getattr(ret, f"p{player}")), True) - for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', - 'ow_shuffle', 'ow_crossed', 'ow_keepsimilar', 'ow_mixed', 'ow_whirlpool', 'ow_fluteshuffle', + for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', 'ow_shuffle', + 'ow_terrain', 'ow_crossed', 'ow_keepsimilar', 'ow_mixed', 'ow_whirlpool', 'ow_fluteshuffle', 'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'openpyramid', 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', 'usestartinventory', 'bombbag', 'shuffleganon', 'overworld_map', 'restrict_boss_items', @@ -154,6 +154,7 @@ def parse_settings(): "openpyramid": "auto", "shuffleganon": True, "ow_shuffle": "vanilla", + "ow_terrain": False, "ow_crossed": "none", "ow_keepsimilar": False, "ow_mixed": False, diff --git a/Main.py b/Main.py index f6465a08..f1762147 100644 --- a/Main.py +++ b/Main.py @@ -88,6 +88,7 @@ def main(args, seed=None, fish=None): 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.crystals_ganon_orig = args.crystals_ganon.copy() world.crystals_gt_orig = args.crystals_gt.copy() + world.owTerrain = args.ow_terrain.copy() world.owKeepSimilar = args.ow_keepsimilar.copy() world.owWhirlpoolShuffle = args.ow_whirlpool.copy() world.owFluteShuffle = args.ow_fluteshuffle.copy() @@ -433,6 +434,7 @@ def copy_world(world): ret.crystals_needed_for_gt = world.crystals_needed_for_gt.copy() ret.crystals_ganon_orig = world.crystals_ganon_orig.copy() ret.crystals_gt_orig = world.crystals_gt_orig.copy() + ret.owTerrain = world.owTerrain.copy() ret.owKeepSimilar = world.owKeepSimilar.copy() ret.owWhirlpoolShuffle = world.owWhirlpoolShuffle.copy() ret.owFluteShuffle = world.owFluteShuffle.copy() @@ -593,6 +595,7 @@ def copy_world_limited(world): ret.crystals_needed_for_gt = world.crystals_needed_for_gt.copy() ret.crystals_ganon_orig = world.crystals_ganon_orig.copy() ret.crystals_gt_orig = world.crystals_gt_orig.copy() + ret.owTerrain = world.owTerrain.copy() ret.owKeepSimilar = world.owKeepSimilar.copy() ret.owWhirlpoolShuffle = world.owWhirlpoolShuffle.copy() ret.owFluteShuffle = world.owFluteShuffle.copy() diff --git a/Mystery.py b/Mystery.py index 9bd1235a..cf759ccc 100644 --- a/Mystery.py +++ b/Mystery.py @@ -168,6 +168,7 @@ def roll_settings(weights): overworld_shuffle = get_choice('overworld_shuffle') ret.ow_shuffle = overworld_shuffle if overworld_shuffle != 'none' else 'vanilla' + ret.ow_terrain = get_choice('overworld_terrain') == 'on' valid_options = {'none', 'polar', 'grouped', 'limited', 'chaos'} ret.ow_crossed = get_choice('overworld_crossed') ret.ow_crossed = ret.ow_crossed if ret.ow_crossed in valid_options else 'none' diff --git a/OWEdges.py b/OWEdges.py index 8c980601..f6145831 100644 --- a/OWEdges.py +++ b/OWEdges.py @@ -697,6 +697,324 @@ OWEdgeGroups = { ) } +OWEdgeGroupsTerrain = { + #(IsStandard, World, EdgeAxis, Terrain, HasParallel, NumberInGroup) + (St, LW, Vt, None, PL, 1): ( + [ + ['Hyrule Castle SW'], + ['Hyrule Castle SE'] + ], + [ + ['Central Bonk Rocks NW'], + ['Links House NE'] + ] + ), + (St, LW, Hz, None, PL, 3): ( + [ + ['Central Bonk Rocks EN', 'Central Bonk Rocks EC', 'Central Bonk Rocks ES'] + ], + [ + ['Links House WN', 'Links House WC', 'Links House WS'] + ] + ), + (Op, LW, Hz, None, PL, 1): ( + [ + ['Lost Woods EN'], + ['East Death Mountain EN'], + ['Sanctuary EC'], + ['Graveyard EC'], + ['Kakariko ES'], + ['Hyrule Castle ES'], + ['Maze Race ES'], + ['Kakariko Suburb ES'], + ['Links House ES'], + ['Flute Boy Approach EC'], + ['Dam EC'], + ['South Pass ES'], + ['West Death Mountain EN'], + ['West Death Mountain ES'] + ], + [ + ['Lumberjack WN'], + ['Death Mountain TR Pegs WN'], + ['Graveyard WC'], + ['River Bend WC'], + ['Blacksmith WS'], + ['Sand Dunes WN'], + ['Kakariko Suburb WS'], + ['Flute Boy WS'], + ['Stone Bridge WS'], + ['C Whirlpool WC'], + ['South Pass WC'], + ['Lake Hylia WS'], + ['East Death Mountain WN'], + ['East Death Mountain WS'] + ] + ), + (Op, LW, Hz, None, NP, 1): ( + [ + ['Forgotten Forest ES'], + ['Hobo EC'] + ], + [ + ['Hyrule Castle WN'], + ['Stone Bridge WC'] + ] + ), + (Op, LW, Vt, None, PL, 1): ( + [ + ['Lumberjack SW'], + ['Mountain Entry SE'], + ['Lost Woods SE'], + ['Zora Waterfall SE'], + ['Kakariko Fortune SC'], + ['Wooden Bridge SW'], + ['Kakariko SE'], + ['Sand Dunes SC'], + ['Eastern Palace SW'], + ['Eastern Palace SE'], + ['Central Bonk Rocks SW'], + ['Links House SC'], + ['Stone Bridge SC'], + ['C Whirlpool SC'], + ['Statues SC'] + ], + [ + ['Mountain Entry NW'], + ['Kakariko Pond NE'], + ['Kakariko Fortune NE'], + ['Zora Approach NE'], + ['Kakariko NE'], + ['Sand Dunes NW'], + ['Kakariko Suburb NE'], + ['Stone Bridge NC'], + ['Tree Line NW'], + ['Eastern Nook NE'], + ['C Whirlpool NW'], + ['Statues NC'], + ['Lake Hylia NW'], + ['Dam NC'], + ['South Pass NC'] + ] + ), + (Op, LW, Vt, None, NP, 1): ( + [ + ['Master Sword Meadow SC'], + ['Zoras Domain SW'] + ], + [ + ['Lost Woods NW'], + ['Zora Waterfall NE'] + ] + ), + (Op, LW, Hz, None, PL, 2): ( + [ + ['Kakariko Fortune EN', 'Kakariko Fortune ES'], + ['Kakariko Pond EN', 'Kakariko Pond ES'], + ['Desert Pass EC', 'Desert Pass ES'], + ['Potion Shop EN', 'Potion Shop EC'], + ['Lake Hylia EC', 'Lake Hylia ES'], + ['Stone Bridge EN', 'Stone Bridge EC'] + ], + [ + ['Kakariko Pond WN', 'Kakariko Pond WS'], + ['Sanctuary WN', 'Sanctuary WS'], + ['Dam WC', 'Dam WS'], + ['Zora Approach WN', 'Zora Approach WC'], + ['Octoballoon WC', 'Octoballoon WS'], + ['Tree Line WN', 'Tree Line WC'] + ] + ), + (Op, LW, Hz, None, NP, 2): ( + [ + ['Desert EC', 'Desert ES'] + ], + [ + ['Desert Pass WC', 'Desert Pass WS'] + ] + ), + (Op, LW, Vt, None, PL, 2): ( + [ + ['Lost Woods SW', 'Lost Woods SC'], + ['Lost Woods Pass SW', 'Lost Woods Pass SE'], + ['Kakariko Pond SW', 'Kakariko Pond SE'], + ['Flute Boy SW', 'Flute Boy SC'], + ['Tree Line SC', 'Tree Line SE'], + ['Ice Cave SW', 'Ice Cave SE'] + ], + [ + ['Lost Woods Pass NW', 'Lost Woods Pass NE'], + ['Kakariko NW', 'Kakariko NC'], + ['Forgotten Forest NW', 'Forgotten Forest NE'], + ['Flute Boy Approach NW', 'Flute Boy Approach NC'], + ['Lake Hylia NC', 'Lake Hylia NE'], + ['Octoballoon NW', 'Octoballoon NE'] + ] + ), + (Op, LW, Hz, None, PL, 3): ( + [ + ['River Bend EN', 'River Bend EC', 'River Bend ES'], + ['C Whirlpool EN', 'C Whirlpool EC', 'C Whirlpool ES'] + ], + [ + ['Potion Shop WN', 'Potion Shop WC', 'Potion Shop WS'], + ['Statues WN', 'Statues WC', 'Statues WS'] + ] + ), + (Op, LW, Vt, None, PL, 3): ( + [ + ['River Bend SW', 'River Bend SC', 'River Bend SE'] + ], + [ + ['Wooden Bridge NW', 'Wooden Bridge NC', 'Wooden Bridge NE'] + ] + ), + (Op, DW, Hz, None, PL, 1): ( + [ + ['Skull Woods EN'], + ['East Dark Death Mountain EN'], + ['Dark Chapel EC'], + ['Dark Graveyard EC'], + ['Village of Outcasts ES'], + ['Pyramid ES'], + ['Frog ES'], + ['Big Bomb Shop ES'], + ['Stumpy Approach EC'], + ['Swamp EC'], + ['Dark South Pass ES'], + ['West Dark Death Mountain EN'], + ['West Dark Death Mountain ES'] + ], + [ + ['Dark Lumberjack WN'], + ['Turtle Rock WN'], + ['Dark Graveyard WC'], + ['Qirn Jump WC'], + ['Hammer Pegs WS'], + ['Dark Dunes WN'], + ['Stumpy WS'], + ['Hammer Bridge WS'], + ['Dark C Whirlpool WC'], + ['Dark South Pass WC'], + ['Ice Lake WS'], + ['East Dark Death Mountain WN'], + ['East Dark Death Mountain WS'] + ] + ), + (Op, DW, Vt, None, PL, 1): ( + [ + ['Dark Lumberjack SW'], + ['Bumper Cave SE'], + ['Skull Woods SE'], + ['Catfish SE'], + ['Dark Fortune SC'], + ['Broken Bridge SW'], + ['Village of Outcasts SE'], + ['Pyramid SW'], + ['Pyramid SE'], + ['Dark Dunes SC'], + ['Palace of Darkness SW'], + ['Palace of Darkness SE'], + ['Dark Bonk Rocks SW'], + ['Big Bomb Shop SC'], + ['Hammer Bridge SC'], + ['Dark C Whirlpool SC'], + ['Hype Cave SC'] + ], + [ + ['Bumper Cave NW'], + ['Outcast Pond NE'], + ['Dark Fortune NE'], + ['Catfish Approach NE'], + ['Village of Outcasts NE'], + ['Dark Dunes NW'], + ['Frog NE'], + ['Dark Bonk Rocks NW'], + ['Big Bomb Shop NE'], + ['Hammer Bridge NC'], + ['Dark Tree Line NW'], + ['Palace of Darkness Nook NE'], + ['Dark C Whirlpool NW'], + ['Hype Cave NC'], + ['Ice Lake NW'], + ['Swamp NC'], + ['Dark South Pass NC'] + ] + ), + (Op, DW, Hz, None, NP, 1): ( + [ ], + [ ] + ), + (Op, DW, Hz, None, PL, 2): ( + [ + ['Dark Fortune EN', 'Dark Fortune ES'], + ['Outcast Pond EN', 'Outcast Pond ES'], + ['Swamp Nook EC', 'Swamp Nook ES'], + ['Dark Witch EN', 'Dark Witch EC'], + ['Ice Lake EC', 'Ice Lake ES'], + ['Hammer Bridge EN', 'Hammer Bridge EC'] + ], + [ + ['Outcast Pond WN', 'Outcast Pond WS'], + ['Dark Chapel WN', 'Dark Chapel WS'], + ['Swamp WC', 'Swamp WS'], + ['Catfish Approach WN', 'Catfish Approach WC'], + ['Bomber Corner WC', 'Bomber Corner WS'], + ['Dark Tree Line WN', 'Dark Tree Line WC'] + ] + ), + (Op, DW, Vt, None, NP, 1): ( + [ ], + [ ] + ), + (Op, DW, Hz, None, NP, 2): ( + [ + ['Dig Game EC', 'Dig Game ES'] + ], + [ + ['Frog WC', 'Frog WS'] + ] + ), + (Op, DW, Vt, None, PL, 2): ( + [ + ['Skull Woods SW', 'Skull Woods SC'], + ['Skull Woods Pass SW', 'Skull Woods Pass SE'], + ['Outcast Pond SW', 'Outcast Pond SE'], + ['Stumpy SW', 'Stumpy SC'], + ['Dark Tree Line SC', 'Dark Tree Line SE'], + ['Shopping Mall SW', 'Shopping Mall SE'] + ], + [ + ['Skull Woods Pass NW', 'Skull Woods Pass NE'], + ['Village of Outcasts NW', 'Village of Outcasts NC'], + ['Shield Shop NW', 'Shield Shop NE'], + ['Stumpy Approach NW', 'Stumpy Approach NC'], + ['Ice Lake NC', 'Ice Lake NE'], + ['Bomber Corner NW', 'Bomber Corner NE'] + ] + ), + (Op, DW, Hz, None, PL, 3): ( + [ + ['Dark Bonk Rocks EN', 'Dark Bonk Rocks EC', 'Dark Bonk Rocks ES'], + ['Qirn Jump EN', 'Qirn Jump EC', 'Qirn Jump ES'], + ['Dark C Whirlpool EN', 'Dark C Whirlpool EC', 'Dark C Whirlpool ES'] + ], + [ + ['Big Bomb Shop WN', 'Big Bomb Shop WC', 'Big Bomb Shop WS'], + ['Dark Witch WN', 'Dark Witch WC', 'Dark Witch WS'], + ['Hype Cave WN', 'Hype Cave WC', 'Hype Cave WS'] + ] + ), + (Op, DW, Vt, None, PL, 3): ( + [ + ['Qirn Jump SW', 'Qirn Jump SC', 'Qirn Jump SE'] + ], + [ + ['Broken Bridge NW', 'Broken Bridge NC', 'Broken Bridge NE'] + ] + ) +} + OWTileRegions = bidict({ 'Lost Woods West Area': 0x00, 'Lost Woods East Area': 0x00, diff --git a/OverworldShuffle.py b/OverworldShuffle.py index f881aa81..4a562d3c 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -3,7 +3,7 @@ from collections import OrderedDict, defaultdict from DungeonGenerator import GenerationException from BaseClasses import OWEdge, WorldType, RegionType, Direction, Terrain, PolSlot, Entrance from Regions import mark_dark_world_regions, mark_light_world_regions -from OWEdges import OWTileRegions, OWEdgeGroups, OWExitTypes, OpenStd, parallel_links, IsParallel +from OWEdges import OWTileRegions, OWEdgeGroups, OWEdgeGroupsTerrain, OWExitTypes, OpenStd, parallel_links, IsParallel from Utils import bidict version_number = '0.2.10.1' @@ -106,7 +106,7 @@ def link_overworld(world, player): return new_groups tile_groups = define_tile_groups(world, player, False) - trimmed_groups = copy.deepcopy(OWEdgeGroups) + trimmed_groups = copy.deepcopy(OWEdgeGroupsTerrain if world.owTerrain[player] else OWEdgeGroups) swapped_edges = list() # restructure Maze Race/Suburb/Frog/Dig Game manually due to NP/P relationship @@ -639,9 +639,9 @@ def shuffle_tiles(world, groups, result_list, do_grouped, player): if not world.owKeepSimilar[player]: parity[1] += 2*parity[2] parity[2] = 0 - # if crossed terrain: - # parity[1] += parity[3] - # parity[3] = 0 + if world.owTerrain[player]: + parity[1] += parity[3] + parity[3] = 0 parity[4] %= 2 # actual parity if (world.owCrossed[player] == 'none' or do_grouped) and parity[:5] != [0, 0, 0, 0, 0]: attempts -= 1 @@ -775,6 +775,8 @@ def reorganize_groups(world, groups, player): new_group = list(group) if world.mode[player] != "standard": new_group[0] = None + if world.owTerrain[player]: + new_group[3] = None if world.owShuffle[player] != 'parallel': new_group[4] = None if not world.owKeepSimilar[player]: diff --git a/README.md b/README.md index be396995..59d3cd5f 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,10 @@ OW Transitions are shuffled, but both worlds will have a matching layout. OW Transitions are shuffled within each world separately. +## Free Terrain (--ow_terrain) + +With OW Layout Shuffle, this allows land and water edges to be connected. + ## Crossed Options (--ow_crossed) This allows OW connections to be shuffled cross-world. @@ -102,7 +106,7 @@ Same as Limited, except that there is no limit to the number of cross-world conn ## Keep Similar Edges Together (--ow_keepsimilar) -This keeps similar edge transitions together. ie. The 2 west edges of Potion Shop will be paired to another set of two similar edges +This keeps similar edge transitions together. ie. The 2 west land edges of Potion Shop will be paired to another set of two similar edges, unless Free Terrain is also enabled, in which case these 2 edges together with the west water edge form a group of 3 similar edges. Note: This affects OW Layout Shuffle mostly, but also affects Limited and Chaos modes in Crossed OW. diff --git a/Rom.py b/Rom.py index a552ef90..03e14ef2 100644 --- a/Rom.py +++ b/Rom.py @@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '0aa072c020b0c1167c3e618b571efbbe' +RANDOMIZERBASEHASH = '4657087846e24d65cd69ff61241601fe' class JsonRom(object): diff --git a/Rules.py b/Rules.py index d18c9ae5..5d0a45b2 100644 --- a/Rules.py +++ b/Rules.py @@ -3,10 +3,11 @@ import logging from collections import deque import OverworldGlitchRules -from BaseClasses import CollectionState, RegionType, DoorType, Entrance, CrystalBarrier, KeyRuleType, LocationType +from BaseClasses import CollectionState, RegionType, DoorType, Entrance, CrystalBarrier, KeyRuleType, LocationType, Terrain from BaseClasses import PotFlags from Dungeons import dungeon_table from RoomData import DoorKind +from OWEdges import OWExitTypes from OverworldGlitchRules import overworld_glitches_rules @@ -25,6 +26,8 @@ def set_rules(world, player): ow_bunny_rules(world, player) + ow_terrain_rules(world, player) + if world.mode[player] == 'standard': if not world.is_copied_world: standard_rules(world, player) @@ -1474,6 +1477,21 @@ def ow_bunny_rules(world, player): add_bunny_rule(world.get_entrance('Bomber Corner Waterfall Water Drop', player), player) +def ow_terrain_rules(world, player): + for edge in world.owedges: + if edge.player == player and edge.dest and edge.dest.terrain == Terrain.Water: + ent = world.get_entrance(edge.name, player) + if edge.terrain == Terrain.Land: + set_rule(ent, lambda state: state.has('Flippers', player)) + if ent.parent_region.is_light_world == (world.mode[player] != 'inverted') and ent.connected_region.is_dark_world == (world.mode[player] != 'inverted'): + add_rule(ent, lambda state: state.has_Pearl(player)) + + for whirlpool_name in OWExitTypes['Whirlpool']: + ent = world.get_entrance(whirlpool_name, player) + if ent.parent_region.is_light_world == (world.mode[player] != 'inverted') and ent.connected_region.is_dark_world == (world.mode[player] != 'inverted'): + add_rule(ent, lambda state: state.has_Pearl(player)) + + def no_glitches_rules(world, player): # todo: move some dungeon rules to no glictes logic - see these for examples # add_rule(world.get_entrance('Ganons Tower (Hookshot Room)', player), lambda state: state.has('Hookshot', player) or state.has_Boots(player)) diff --git a/asm/owrando.asm b/asm/owrando.asm index c709fc43..812cec20 100644 --- a/asm/owrando.asm +++ b/asm/owrando.asm @@ -1,3 +1,10 @@ +; Free RAM notes +; $06F8-$06F9: Used to store edge table addresses +; $06FA-$06FB: Used to store target edge IDs +; $06FC-$06FD: Used for custom walk destination after transitions +; $0703: Used to flag forced transitions +; $0704-$0705: Used to store terrain type at the start of a transition + org $aa8000 ;150000 db $4f, $52 ;OR OWMode: @@ -38,6 +45,9 @@ Overworld_LoadSpecialOverworld_RoomId: org $04E8B4 Overworld_LoadSpecialOverworld: +org $07982A +Link_ResetSwimmingState: + ; mirror hooks org $02FBAB @@ -54,6 +64,8 @@ JSL OWMirrorSpriteOnMap : BRA + : NOP #6 : + ; whirlpool shuffle cross world change org $02b3bd jsl OWWhirlpoolUpdate ;JSL $02EA6C +org $02B44E +jsl OWWhirlpoolEnd ; STZ.b $11 : STZ.b $B0 ; flute menu cancel org $0ab7af ;LDA $F2 : ORA $F0 : AND #$C0 @@ -172,6 +184,8 @@ OWCameraRangeIndex: db 2, 2, 0, 0 ; For OWCameraRange OWCameraRange: dw $011E, $0100 ; Length of the range the camera can move on small screens +OWAutoWalk: +db $04, $08, $01, $02 DivideByTwoPreserveSign: { @@ -201,13 +215,21 @@ OWMapWorldCheck16: OWWhirlpoolUpdate: { jsl $02ea6c ; what we wrote over - lda.l OWFlags : and #$01 : bne + - lda.l OWMode+1 : and #$02 : beq .return - + ldx $8a : jsr OWWorldUpdate - .return + ldx $8a : ldy #$03 : jsr OWWorldTerrainUpdate rtl } +OWWhirlpoolEnd: +{ + STZ.b $B0 ; what we wrote over + LDA.w $0703 : BEQ .normal + LDA.b #$3C : STA.w $012E ; play error sound before forced transition + RTL + .normal + STZ.b $11 ; end whirlpool transition + RTL +} + OWMirrorSpriteOnMap: { lda.w $1ac0,x : bit.b #$f0 : beq .continue @@ -525,39 +547,42 @@ OWDetectSpecialTransition: { STZ.w $06FC LDA.l OWMode : BEQ .normal - LDA.l OWSpecialDestIndex,X : BIT.w #$0080 : BNE .special - STA.w $06FA - LDA.l OWEdgeDataOffset,X : STA.w $06F8 - PLA : SEP #$30 : PLA ; delete 3 bytes from stack - JSL Link_CheckForEdgeScreenTransition : BCS .return ; Link_CheckForEdgeScreenTransition - LDA.l Overworld_CheckForSpecialOverworldTrigger_Direction,X : STA.b $00 : CMP.b #$08 : BNE .hobo - LSR : STA.b $20 : STZ.b $E8 ; move Link and camera to edge - LDA.b #$06 : STA.b $02 - STZ.w $0418 - BRA .continue - .hobo - STA.b $02 : STA.w $0418 - ASL : STA.b $22 : STZ.b $E2 ; move Link and camera to edge - LDA.b #$0A : STA.b $23 : STA.b $E3 - .continue - STZ.b $03 - ; copied from DeleteCertainAncillaeStopDashing at $028A0E - JSL Ancilla_TerminateSelectInteractives - LDA.w $0372 : BEQ .not_dashing - STZ.b $4D : STZ.b $46 - LDA.b #$FF : STA.b $29 : STA.b $C7 - STZ.b $3D : STZ.b $5E : STZ.w $032B : STZ.w $0372 : STZ.b $5D - .not_dashing - PLA : REP #$31 : PLA ; delete 3 bytes from stack - LDX.b $02 - LDA.b $84 - JML OverworldHandleTransitions_SpecialTrigger+6 - .special + TXA : AND.w #$0002 : LSR + STA.w $0704 + LDA.l OWSpecialDestIndex,X : BIT.w #$0080 : BEQ .switch_to_edge AND.w #$0003 : TAY : ASL : TAX .normal JSR OWLoadSpecialArea .return RTL + + .switch_to_edge + STA.w $06FA + LDA.l OWEdgeDataOffset,X : STA.w $06F8 + PLA : SEP #$30 : PLA ; delete 3 bytes from stack + JSL Link_CheckForEdgeScreenTransition : BCS .return ; Link_CheckForEdgeScreenTransition + LDA.l Overworld_CheckForSpecialOverworldTrigger_Direction,X : STA.b $00 : CMP.b #$08 : BNE .hobo + LSR : STA.b $20 : STZ.b $E8 ; move Link and camera to edge + LDA.b #$06 : STA.b $02 + STZ.w $0418 + BRA .continue + .hobo + STA.b $02 : STA.w $0418 + ASL : STA.b $22 : STZ.b $E2 ; move Link and camera to edge + LDA.b #$0A : STA.b $23 : STA.b $E3 + .continue + STZ.b $03 + ; copied from DeleteCertainAncillaeStopDashing at $028A0E + JSL Ancilla_TerminateSelectInteractives + LDA.w $0372 : BEQ .not_dashing + STZ.b $4D : STZ.b $46 + LDA.b #$FF : STA.b $29 : STA.b $C7 + STZ.b $3D : STZ.b $5E : STZ.w $032B : STZ.w $0372 : STZ.b $5D + .not_dashing + PLA : REP #$31 : PLA ; delete 3 bytes from stack + LDX.b $02 + LDA.b $84 + JML OverworldHandleTransitions_SpecialTrigger+6 } OWEdgeTransition: { @@ -577,9 +602,16 @@ OWEdgeTransition: } OWSpecialExit: { - LDA.l OWMode+1 : AND.b #!FLAG_OW_CROSSED : BEQ .return - JSR OWWorldUpdate - .return + PHY + LDY.b #$00 + LDA.w $0418 : LSR : BNE + + LDY.w $0704 : BRA ++ + + + LDA.w $0704 : BNE ++ + LDY.b #$02 + ++ + JSR OWWorldTerrainUpdate + PLY LDA.l $7EFD40,X ; what we wrote over RTL } @@ -611,7 +643,7 @@ OWShuffle: .nextTransition pha - jsr OWSearchTransition : bcs .newDestination + jsr OWSearchTransition_entry : bcs .newDestination txa : !add #$0010 : tax pla : dec : bne .nextTransition : bra .noTransition @@ -627,6 +659,10 @@ OWShuffle: } OWSearchTransition: { + .exitloop ; moved here because of branch distance + clc : rts + + .entry ;A-16 XY-16 lda $418 : bne + ;north lda.l OWNorthEdges,x : dec @@ -634,6 +670,7 @@ OWSearchTransition: lda.l OWNorthEdges+2,x : cmp $22 : !blt .exitloop ;MATCH lda.l OWNorthEdges+14,x : tay ;y = record id of dest + lda.l OWNorthEdges+12,x ;a = current terrain ldx.w #OWSouthEdges ;x = address of table bra .matchfound + dec : bne + ;south @@ -642,6 +679,7 @@ OWSearchTransition: lda.l OWSouthEdges+2,x : cmp $22 : !blt .exitloop ;MATCH lda.l OWSouthEdges+14,x : tay ;y = record id of dest + lda.l OWSouthEdges+12,x ;a = current terrain ldx.w #OWNorthEdges ;x = address of table bra .matchfound + dec : bne + ; west @@ -650,6 +688,7 @@ OWSearchTransition: lda.l OWWestEdges+2,x : cmp $20 : !blt .exitloop ;MATCH lda.l OWWestEdges+14,x : tay ;y = record id of dest + lda.l OWWestEdges+12,x ;a = current terrain ldx.w #OWEastEdges ;x = address of table bra .matchfound + lda.l OWEastEdges,x : dec ;east @@ -657,15 +696,13 @@ OWSearchTransition: lda.l OWEastEdges+2,x : cmp $20 : !blt .exitloop ;MATCH lda.l OWEastEdges+14,x : tay ;y = record id of dest + lda.l OWEastEdges+12,x ;a = current terrain ldx.w #OWWestEdges ;x = address of table .matchfound - stx $06f8 : sty $06fa : sec : rts + stx $06f8 : sty $06fa : sta $0704 : sec : rts plx : pla : pea $0001 : phx sec : rts - - .exitloop - clc : rts } OWNewDestination: { @@ -698,6 +735,16 @@ OWNewDestination: LDA.w $000F,X : AND.w #$00FF : STA.w $06FC ; position to walk to after transition (if non-zero) + LDY.w #$0000 + LDA.w $000C,X : AND.w #$0001 : BEQ + ; check if going to water transition + LDA.w $0704 : AND.w #$0001 : BNE ++ ; check if coming from water transition + INY : BRA ++ + + + LDA.w $0704 : BEQ ++ ; check if coming from water transition + LDY.w #$0002 + ++ + STY.b $08 + pla : pla : sep #$10 : ldy $418 ldx OWCoordIndex,y : lda $20,x : and #$fe00 : pha lda $20,x : and #$01ff : pha ;s1 = relative cur, s3 = ow cur @@ -743,27 +790,37 @@ OWNewDestination: sep #$30 : lda $04 : and #$3f : !add OWOppSlotOffset,y : asl : sta $700 - ; crossed OW shuffle - lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .return - ldx $05 : jsr OWWorldUpdate + ; crossed OW shuffle and terrain + ldx $05 : ldy $08 : jsr OWWorldTerrainUpdate - .return lda $05 : sta $8a rep #$30 : rts } OWLoadSpecialArea: { LDA.l Overworld_LoadSpecialOverworld_RoomId,X : STA.b $A0 - JSL Overworld_LoadSpecialOverworld - LDA.l OWMode+1 : AND.b #!FLAG_OW_CROSSED : BEQ .return - TYX : LDA.l OWSpecialDestSlot,X : TAX - JSR OWWorldUpdate + JSL Overworld_LoadSpecialOverworld ; sets M and X flags + TYX + LDY.b #$00 + CPX.b #$01 : BNE + ; check if going to water transition + LDA.w $0704 : BNE ++ ; check if coming from water transition + INY : BRA ++ + + + LDA.w $0704 : BEQ ++ ; check if coming from water transition + LDY.b #$02 + ++ + LDA.l OWSpecialDestSlot,X : TAX + JSR OWWorldTerrainUpdate .return RTS } -OWWorldUpdate: ; x = owid of destination screen +OWWorldTerrainUpdate: ; x = owid of destination screen, y = 1 for land to water, 2 for water to land, 3 for whirlpools and 0 else { - lda.l OWTileWorldAssoc,x : cmp.l CurrentWorld : beq .return + LDA.l OWMode+1 : AND.b #!FLAG_OW_CROSSED : BEQ .not_crossed + LDA.l OWTileWorldAssoc,x : CMP.l CurrentWorld : BNE .crossed + .not_crossed + JMP .normal + .crossed sta.l CurrentWorld ; change world ; moving mirror portal off screen when in DW @@ -781,19 +838,87 @@ OWWorldUpdate: ; x = owid of destination screen lda CurrentWorld : and.b #$40 : bra + .inverted lda CurrentWorld : and.b #$40 : eor #$40 + cmp #$40 : bne .nobunny - ; turn into bunny - lda $5d : cmp #$04 : beq + ; if swimming, continue - lda #$17 : sta $5d - + lda #$01 : sta $02e0 : sta $56 - bra .return + + LDA.w $0703 : BEQ + ; check if forced transition + CPY.b #$03 : BEQ .end_forced_whirlpool + LDA.b #$17 : STA.b $5D + LDA.b #$01 : STA.w $02E0 : STA.b $56 + LDA.w $0703 : BRA .end_forced_edge + + + CPY.b #$01 : BEQ .auto ; check if going from land to water + CPY.b #$02 : BEQ .to_bunny_reset_swim ; bunny state if swimming to land + LDA.b $5D : CMP.b #$04 : BNE .to_bunny ; check if swimming + .auto + PHX + LDA.b #$01 + LDX.b $5D : CPX.b #$04 : BNE + + INC + + + STA.w $0703 + CPY.b #$03 : BEQ .whirlpool + LDA.b #$01 : STA.w $0345 + LDX.w $0418 + LDA.l OWAutoWalk,X : STA.b $49 + STZ.b $5D + PLX + BRA .to_pseudo_bunny + .whirlpool + PLX : RTS + .to_bunny_reset_swim + JSL Link_ResetSwimmingState + STZ.w $0345 + .to_bunny + LDA.b #$17 : STA.b $5D + .to_pseudo_bunny + LDA.b #$01 : STA.w $02E0 : STA.b $56 + RTS .nobunny lda $5d : cmp #$17 : bne + ; retain current state unless bunny stz $5d + stz $02e0 : stz $56 + .normal + LDA.w $0703 : BEQ .not_forced ; check if forced transition + CPY.b #$03 : BEQ .end_forced_whirlpool + .end_forced_edge + STZ.b $49 : STZ.w $0345 + .end_forced_whirlpool + STZ.w $0703 + CMP.b #$02 : BNE + + DEC : STA.w $0345 + LDA.b #$04 : BRA .set_state + + + CMP.b #$03 : BNE ++ + LDA.b #$17 + .set_state + STA.b $5D + ++ + RTS + .not_forced + CPY.b #$02 : BNE + ; check if going from water to land + JSL Link_ResetSwimmingState + STZ.w $0345 + LDA.b $5D : CMP.b #$04 : BNE + ; check if swimming + STZ.b $5D + + + CPY.b #$01 : BNE .return ; check if going from land to water + LDA.b #$01 : STA.w $0345 + LDA.b $5D : CMP.b #$04 : BEQ .return ; check if swimming + LDA.l FlippersEquipment : BEQ .no_flippers ; check if flippers obtained + LDA.b $5D : CMP.b #$17 : BEQ .no_flippers ; check if bunny + LDA.b #$04 : STA.b $5D : RTS + .no_flippers + PHX + INC : STA.w $0703 + LDX.w $0418 + LDA.l OWAutoWalk,X : STA.b $49 + PLX + LDA.b $5D : CMP.b #$17 : BNE .return ; check if bunny + LDA.b #$03 : STA.w $0703 + STZ.b $5D .return - rts + RTS } OWAdjustExitPosition: { @@ -807,6 +932,9 @@ OWAdjustExitPosition: LDA.b #$3B : STA.w $061E INC.b $23 : INC.w $061D : INC.w $061F .normal + LDA.w $0703 : BEQ + + LDA.b #$3C : STA.w $012E ; play error sound before forced transition + + INC.b $11 : STZ.b $B0 ; what we wrote over RTL } @@ -978,7 +1106,7 @@ db $80, $80, $81 org $aaa800 ;PC 152800 OWNorthEdges: -; Min Max Width Mid OW Slot/OWID VRAM *FREE* Dest Index +; Min Max Width Mid OW Slot/OWID VRAM Terrain Dest Index dw $00a0, $00a0, $0000, $00a0, $0000, $0000, $0000, $B040 ;Lost Woods (exit only) dw $0458, $0540, $00e8, $04cc, $0a0a, $0000, $0000, $0000 dw $0f38, $0f60, $0028, $0f4c, $0f0f, $0000, $0000, $2041 ;Waterfall (exit only) @@ -993,7 +1121,7 @@ dw $02e8, $0348, $0060, $0318, $1819, $0000, $0000, $0008 dw $0478, $04d0, $0058, $04a4, $1a1a, $0000, $0000, $0009 dw $0510, $0538, $0028, $0524, $1a1a, $0000, $0000, $000a dw $0a48, $0af0, $00a8, $0a9c, $1d1d, $0000, $0000, $000b -dw $0b28, $0b38, $0010, $0b30, $1d1d, $0000, $0000, $000c +dw $0b28, $0b38, $0010, $0b30, $1d1d, $0000, $0001, $000c dw $0b70, $0ba0, $0030, $0b88, $1d1d, $0000, $0000, $000d dw $0a40, $0b10, $00d0, $0aa8, $2525, $0000, $0000, $000e dw $0350, $0390, $0040, $0370, $2929, $0000, $0000, $000f @@ -1007,11 +1135,11 @@ dw $04d8, $04f8, $0020, $04e8, $3232, $0000, $0000, $0016 dw $0688, $06b0, $0028, $069c, $3333, $0000, $0000, $0017 dw $08d0, $08f0, $0020, $08e0, $3434, $0000, $0000, $0018 dw $0a80, $0b40, $00c0, $0ae0, $3535, $0000, $0000, $0019 -dw $0d38, $0d58, $0020, $0d48, $3536, $0000, $0000, $001a +dw $0d38, $0d58, $0020, $0d48, $3536, $0000, $0001, $001a dw $0d90, $0da0, $0010, $0d98, $3536, $0000, $0000, $001b dw $06a0, $07b0, $0110, $0728, $3b3b, $0000, $0000, $001c dw $0830, $09b0, $0180, $08f0, $3c3c, $0000, $0000, $001d -dw $0e78, $0e88, $0010, $0e80, $3f3f, $0000, $0000, $001e +dw $0e78, $0e88, $0010, $0e80, $3f3f, $0000, $0001, $001e dw $0ee0, $0fc0, $00e0, $0f50, $3f3f, $0000, $0000, $001f dw $0458, $0540, $00e8, $04cc, $4a4a, $0000, $0000, $0020 dw $0058, $0058, $0000, $0058, $5050, $0000, $0000, $0021 @@ -1025,7 +1153,7 @@ dw $02e8, $0348, $0060, $0318, $5859, $0000, $0000, $0028 dw $0478, $04d0, $0058, $04a4, $5a5a, $0000, $0000, $0029 dw $0510, $0538, $0028, $0524, $5a5a, $0000, $0000, $002a dw $0a48, $0af0, $00a8, $0a9c, $5d5d, $0000, $0000, $002b -dw $0b28, $0b38, $0010, $0b30, $5d5d, $0000, $0000, $002c +dw $0b28, $0b38, $0010, $0b30, $5d5d, $0000, $0001, $002c dw $0b70, $0ba0, $0030, $0b88, $5d5d, $0000, $0000, $002d dw $0a40, $0b10, $00d0, $0aa8, $6565, $0000, $0000, $002e dw $0350, $0390, $0040, $0370, $6969, $0000, $0000, $002f @@ -1039,11 +1167,11 @@ dw $04d8, $04f8, $0020, $04e8, $7272, $0000, $0000, $0036 dw $0688, $06b0, $0028, $069c, $7373, $0000, $0000, $0037 dw $08d0, $08f0, $0020, $08e0, $7474, $0000, $0000, $0038 dw $0a80, $0b40, $00c0, $0ae0, $7575, $0000, $0000, $0039 -dw $0d38, $0d58, $0020, $0d48, $7576, $0000, $0000, $003a +dw $0d38, $0d58, $0020, $0d48, $7576, $0000, $0001, $003a dw $0d90, $0da0, $0010, $0d98, $7576, $0000, $0000, $003b dw $06a0, $07b0, $0110, $0728, $7b7b, $0000, $0000, $003c dw $0830, $09b0, $0180, $08f0, $7c7c, $0000, $0000, $003d -dw $0e78, $0e88, $0010, $0e80, $7f7f, $0000, $0000, $003e +dw $0e78, $0e88, $0010, $0e80, $7f7f, $0000, $0001, $003e dw $0ee0, $0fc0, $00e0, $0f50, $7f7f, $0000, $0000, $003f OWSouthEdges: dw $0458, $0540, $00e8, $04cc, $0202, $0000, $0000, $0001 @@ -1058,7 +1186,7 @@ dw $02e8, $0348, $0060, $0318, $1111, $0000, $0000, $000a dw $0478, $04d0, $0058, $04a4, $1212, $0000, $0000, $000b dw $0510, $0538, $0028, $0524, $1212, $0000, $0000, $000c dw $0a48, $0af0, $00a8, $0a9c, $1515, $0000, $0000, $000d -dw $0b28, $0b38, $0010, $0b30, $1515, $0000, $0000, $000e +dw $0b28, $0b38, $0010, $0b30, $1515, $0000, $0001, $000e dw $0b70, $0ba0, $0030, $0b88, $1515, $0000, $0000, $000f dw $0a40, $0b10, $00d0, $0aa8, $1d1d, $0000, $0000, $0010 dw $0350, $0390, $0040, $0370, $1821, $0000, $0000, $0011 @@ -1072,11 +1200,11 @@ dw $04d8, $04f8, $0020, $04e8, $2a2a, $0000, $0000, $0018 dw $0688, $06b0, $0028, $069c, $2b2b, $0000, $0000, $0019 dw $08d0, $08f0, $0020, $08e0, $2c2c, $0000, $0000, $001a dw $0a80, $0b40, $00c0, $0ae0, $2d2d, $0000, $0000, $001b -dw $0d38, $0d58, $0020, $0d48, $2e2e, $0000, $0000, $001c +dw $0d38, $0d58, $0020, $0d48, $2e2e, $0000, $0001, $001c dw $0d90, $0da0, $0010, $0d98, $2e2e, $0000, $0000, $001d dw $06a0, $07b0, $0110, $0728, $3333, $0000, $0000, $001e dw $0830, $09b0, $0180, $08f0, $3434, $0000, $0000, $001f -dw $0e78, $0e88, $0010, $0e80, $3737, $0000, $0000, $0020 +dw $0e78, $0e88, $0010, $0e80, $3737, $0000, $0001, $0020 dw $0ee0, $0fc0, $00e0, $0f50, $3737, $0000, $0000, $0021 dw $0458, $0540, $00e8, $04cc, $4242, $0000, $0000, $0022 dw $0058, $0058, $0000, $0058, $4048, $0000, $0000, $0023 @@ -1090,7 +1218,7 @@ dw $02e8, $0348, $0060, $0318, $5151, $0000, $0000, $002a dw $0478, $04d0, $0058, $04a4, $5252, $0000, $0000, $002b dw $0510, $0538, $0028, $0524, $5252, $0000, $0000, $002c dw $0a48, $0af0, $00a8, $0a9c, $5555, $0000, $0000, $002d -dw $0b28, $0b38, $0010, $0b30, $5555, $0000, $0000, $002e +dw $0b28, $0b38, $0010, $0b30, $5555, $0000, $0001, $002e dw $0b70, $0ba0, $0030, $0b88, $5555, $0000, $0000, $002f dw $0a40, $0b10, $00d0, $0aa8, $5d5d, $0000, $0000, $0030 dw $0350, $0390, $0040, $0370, $5861, $0000, $0000, $0031 @@ -1104,11 +1232,11 @@ dw $04d8, $04f8, $0020, $04e8, $6a6a, $0000, $0000, $0038 dw $0688, $06b0, $0028, $069c, $6b6b, $0000, $0000, $0039 dw $08d0, $08f0, $0020, $08e0, $6c6c, $0000, $0000, $003a dw $0a80, $0b40, $00c0, $0ae0, $6d6d, $0000, $0000, $003b -dw $0d38, $0d58, $0020, $0d48, $6e6e, $0000, $0000, $003c +dw $0d38, $0d58, $0020, $0d48, $6e6e, $0000, $0001, $003c dw $0d90, $0da0, $0010, $0d98, $6e6e, $0000, $0000, $003d dw $06a0, $07b0, $0110, $0728, $7373, $0000, $0000, $003e dw $0830, $09b0, $0180, $08f0, $7474, $0000, $0000, $003f -dw $0e78, $0e88, $0010, $0e80, $7777, $0000, $0000, $0040 +dw $0e78, $0e88, $0010, $0e80, $7777, $0000, $0001, $0040 dw $0ee0, $0fc0, $00e0, $0f50, $7777, $0000, $0000, $0041 dw $0080, $0080, $0000, $0080, $8080, $0000, $0000, $0000 ;Pedestal (unused) dw $0288, $02c0, $0038, $02a4, $8189, $0000, $0000, $0002 ;Zora (unused) @@ -1123,10 +1251,10 @@ dw $0488, $0500, $0078, $04c4, $1313, $0000, $0000, $0006 dw $0538, $05a8, $0070, $0570, $1313, $0000, $0000, $0007 dw $0470, $05a8, $0138, $050c, $1414, $0000, $0000, $0008 dw $0470, $0598, $0128, $0504, $1515, $0000, $0000, $0009 -dw $0480, $0488, $0008, $0484, $1616, $0000, $0000, $000a +dw $0480, $0488, $0008, $0484, $1616, $0000, $0001, $000a dw $04b0, $0510, $0060, $04e0, $1616, $0000, $0000, $000b dw $0560, $0588, $0028, $0574, $1616, $0000, $0000, $000c -dw $0450, $0458, $0008, $0454, $1717, $0000, $0000, $000d +dw $0450, $0458, $0008, $0454, $1717, $0000, $0001, $000d dw $0480, $04a8, $0028, $0494, $1717, $0000, $0000, $000e dw $0718, $0738, $0020, $0728, $1b1b, $0000, $0000, $000f dw $0908, $0948, $0040, $0928, $2222, $0000, $0000, $0010 @@ -1136,13 +1264,13 @@ dw $0b60, $0ba0, $0040, $0b80, $2a2a, $0000, $0000, $0013 dw $0ab0, $0ad0, $0020, $0ac0, $2c2c, $0000, $0000, $0014 dw $0af0, $0b40, $0050, $0b18, $2c2c, $0000, $0000, $0015 dw $0b78, $0ba0, $0028, $0b8c, $2c2c, $0000, $0000, $0016 -dw $0b10, $0b28, $0018, $0b1c, $2d2d, $0000, $0000, $604a ;Stone Bridge (exit only) +dw $0b10, $0b28, $0018, $0b1c, $2d2d, $0000, $0001, $604a ;Stone Bridge (exit only) dw $0b68, $0b98, $0030, $0b80, $2d2d, $0000, $0000, $0017 dw $0a68, $0ab8, $0050, $0a90, $2e2e, $0000, $0000, $0018 -dw $0b00, $0b78, $0078, $0b3c, $2e2e, $0000, $0000, $0019 +dw $0b00, $0b78, $0078, $0b3c, $2e2e, $0000, $0001, $0019 dw $0c50, $0db8, $0168, $0d04, $3333, $0000, $0000, $001a dw $0c78, $0ce3, $006b, $0cad, $3434, $0000, $0000, $001b -dw $0ce4, $0d33, $004f, $0d0b, $3434, $0000, $0000, $001c +dw $0ce4, $0d33, $004f, $0d0b, $3434, $0000, $0001, $001c dw $0d34, $0db8, $0084, $0d76, $3434, $0000, $0000, $001d dw $0ea8, $0f20, $0078, $0ee4, $3a3a, $0000, $0000, $001e dw $0f70, $0fa8, $0038, $0f8c, $3a3a, $0000, $0000, $001f @@ -1150,7 +1278,7 @@ dw $0f18, $0f18, $0000, $0f18, $3b3b, $0000, $0000, $0020 dw $0fc8, $0fc8, $0000, $0fc8, $3b3b, $0000, $0000, $0021 dw $0e28, $0fb8, $0190, $0ef0, $3c3c, $0000, $0000, $0022 dw $0f78, $0fb8, $0040, $0f98, $353d, $0000, $0000, $0023 -dw $0f20, $0f40, $0020, $0f30, $3f3f, $0000, $0000, $0024 +dw $0f20, $0f40, $0020, $0f30, $3f3f, $0000, $0001, $0024 dw $0f70, $0fb8, $0048, $0f94, $3f3f, $0000, $0000, $0025 dw $0070, $00a0, $0030, $0088, $4242, $0000, $0000, $0026 dw $0068, $0078, $0010, $0070, $4545, $0000, $0000, $0027 @@ -1162,10 +1290,10 @@ dw $0488, $0500, $0078, $04c4, $5353, $0000, $0000, $002c dw $0538, $05a8, $0070, $0570, $5353, $0000, $0000, $002d dw $0470, $05a8, $0138, $050c, $5454, $0000, $0000, $002e dw $0470, $0598, $0128, $0504, $5555, $0000, $0000, $002f -dw $0480, $0488, $0008, $0484, $5656, $0000, $0000, $0030 +dw $0480, $0488, $0008, $0484, $5656, $0000, $0001, $0030 dw $04b0, $0510, $0060, $04e0, $5656, $0000, $0000, $0031 dw $0560, $0588, $0028, $0574, $5656, $0000, $0000, $0032 -dw $0450, $0458, $0008, $0454, $5757, $0000, $0000, $0033 +dw $0450, $0458, $0008, $0454, $5757, $0000, $0001, $0033 dw $0480, $04a8, $0028, $0494, $5757, $0000, $0000, $0034 dw $0908, $0948, $0040, $0928, $6262, $0000, $0000, $0035 dw $0878, $08a8, $0030, $0890, $6565, $0000, $0000, $0036 @@ -1177,16 +1305,16 @@ dw $0af0, $0b40, $0050, $0b18, $6c6c, $0000, $0000, $003b dw $0b78, $0ba0, $0028, $0b8c, $6c6c, $0000, $0000, $003c dw $0b68, $0b98, $0030, $0b80, $6d6d, $0000, $0000, $003d dw $0a68, $0ab8, $0050, $0a90, $6e6e, $0000, $0000, $003e -dw $0b00, $0b78, $0078, $0b3c, $6e6e, $0000, $0000, $003f +dw $0b00, $0b78, $0078, $0b3c, $6e6e, $0000, $0001, $003f dw $0c50, $0db8, $0168, $0d04, $7373, $0000, $0000, $0040 dw $0c78, $0ce3, $006b, $0cad, $7474, $0000, $0000, $0041 -dw $0ce4, $0d33, $004f, $0d0b, $7474, $0000, $0000, $0042 +dw $0ce4, $0d33, $004f, $0d0b, $7474, $0000, $0001, $0042 dw $0d34, $0db8, $0084, $0d76, $7474, $0000, $0000, $0043 dw $0f18, $0f18, $0000, $0f18, $7b7b, $0000, $0000, $0044 dw $0fc8, $0fc8, $0000, $0fc8, $7b7b, $0000, $0000, $0045 dw $0e28, $0fb8, $0190, $0ef0, $7c7c, $0000, $0000, $0046 dw $0f78, $0fb8, $0040, $0f98, $757d, $0000, $0000, $0047 -dw $0f20, $0f40, $0020, $0f30, $7f7f, $0000, $0000, $0048 +dw $0f20, $0f40, $0020, $0f30, $7f7f, $0000, $0001, $0048 dw $0f70, $0fb8, $0048, $0f94, $7f7f, $0000, $0000, $0049 OWEastEdges: dw $0070, $00a0, $0030, $0088, $0001, $0000, $0000, $0000 @@ -1199,10 +1327,10 @@ dw $0488, $0500, $0078, $04c4, $1212, $0000, $0000, $0006 dw $0538, $05a8, $0070, $0570, $1212, $0000, $0000, $0007 dw $0470, $05a8, $0138, $050c, $1313, $0000, $0000, $0008 dw $0470, $0598, $0128, $0504, $1414, $0000, $0000, $0009 -dw $0480, $0488, $0008, $0484, $1515, $0000, $0000, $000a +dw $0480, $0488, $0008, $0484, $1515, $0000, $0001, $000a dw $04b0, $0510, $0060, $04e0, $1515, $0000, $0000, $000b dw $0560, $0588, $0028, $0574, $1515, $0000, $0000, $000c -dw $0450, $0458, $0008, $0454, $1616, $0000, $0000, $000d +dw $0450, $0458, $0008, $0454, $1616, $0000, $0001, $000d dw $0480, $04a8, $0028, $0494, $1616, $0000, $0000, $000e dw $0718, $0738, $0020, $0728, $1a1a, $0000, $0000, $000f dw $0908, $0948, $0040, $0928, $1821, $0000, $0000, $0010 @@ -1214,10 +1342,10 @@ dw $0af0, $0b40, $0050, $0b18, $2b2b, $0000, $0000, $0015 dw $0b78, $0ba0, $0028, $0b8c, $2b2b, $0000, $0000, $0016 dw $0b68, $0b98, $0030, $0b80, $2c2c, $0000, $0000, $0018 dw $0a68, $0ab8, $0050, $0a90, $2d2d, $0000, $0000, $0019 -dw $0b00, $0b78, $0078, $0b3c, $2d2d, $0000, $0000, $001a +dw $0b00, $0b78, $0078, $0b3c, $2d2d, $0000, $0001, $001a dw $0c50, $0db8, $0168, $0d04, $3232, $0000, $0000, $001b dw $0c78, $0ce3, $006b, $0cad, $3333, $0000, $0000, $001c -dw $0ce4, $0d33, $004f, $0d0b, $3333, $0000, $0000, $001d +dw $0ce4, $0d33, $004f, $0d0b, $3333, $0000, $0001, $001d dw $0d34, $0db8, $0084, $0d76, $3333, $0000, $0000, $001e dw $0ea8, $0f20, $0078, $0ee4, $3039, $0000, $0000, $001f dw $0f70, $0fa8, $0038, $0f8c, $3039, $0000, $0000, $0020 @@ -1225,7 +1353,7 @@ dw $0f18, $0f18, $0000, $0f18, $3a3a, $0000, $0000, $0021 dw $0fc8, $0fc8, $0000, $0fc8, $3a3a, $0000, $0000, $0022 dw $0e28, $0fb8, $0190, $0ef0, $3b3b, $0000, $0000, $0023 dw $0f78, $0fb8, $0040, $0f98, $3c3c, $0000, $0000, $0024 -dw $0f20, $0f40, $0020, $0f30, $353e, $0000, $0000, $0025 +dw $0f20, $0f40, $0020, $0f30, $353e, $0000, $0001, $0025 dw $0f70, $0fb8, $0048, $0f94, $353e, $0000, $0000, $0026 dw $0070, $00a0, $0030, $0088, $4041, $0000, $0000, $0027 ;Skull Woods dw $0068, $0078, $0010, $0070, $4344, $0000, $0000, $0028 @@ -1237,10 +1365,10 @@ dw $0488, $0500, $0078, $04c4, $5252, $0000, $0000, $002d dw $0538, $05a8, $0070, $0570, $5252, $0000, $0000, $002e dw $0470, $05a8, $0138, $050c, $5353, $0000, $0000, $002f dw $0470, $0598, $0128, $0504, $5454, $0000, $0000, $0030 -dw $0480, $0488, $0008, $0484, $5555, $0000, $0000, $0031 +dw $0480, $0488, $0008, $0484, $5555, $0000, $0001, $0031 dw $04b0, $0510, $0060, $04e0, $5555, $0000, $0000, $0032 dw $0560, $0588, $0028, $0574, $5555, $0000, $0000, $0033 -dw $0450, $0458, $0008, $0454, $5656, $0000, $0000, $0034 +dw $0450, $0458, $0008, $0454, $5656, $0000, $0001, $0034 dw $0480, $04a8, $0028, $0494, $5656, $0000, $0000, $0035 dw $0908, $0948, $0040, $0928, $5861, $0000, $0000, $0036 dw $0878, $08a8, $0030, $0890, $5b64, $0000, $0000, $0037 @@ -1252,18 +1380,18 @@ dw $0af0, $0b40, $0050, $0b18, $6b6b, $0000, $0000, $003c dw $0b78, $0ba0, $0028, $0b8c, $6b6b, $0000, $0000, $003d dw $0b68, $0b98, $0030, $0b80, $6c6c, $0000, $0000, $003e dw $0a68, $0ab8, $0050, $0a90, $6d6d, $0000, $0000, $003f -dw $0b00, $0b78, $0078, $0b3c, $6d6d, $0000, $0000, $0040 +dw $0b00, $0b78, $0078, $0b3c, $6d6d, $0000, $0001, $0040 dw $0c50, $0db8, $0168, $0d04, $7272, $0000, $0000, $0041 dw $0c78, $0ce3, $006b, $0cad, $7373, $0000, $0000, $0042 -dw $0ce4, $0d33, $004f, $0d0b, $7373, $0000, $0000, $0043 +dw $0ce4, $0d33, $004f, $0d0b, $7373, $0000, $0001, $0043 dw $0d34, $0db8, $0084, $0d76, $7373, $0000, $0000, $0044 dw $0f18, $0f18, $0000, $0f18, $7a7a, $0000, $0000, $0045 dw $0fc8, $0fc8, $0000, $0fc8, $7a7a, $0000, $0000, $0046 dw $0e28, $0fb8, $0190, $0ef0, $7b7b, $0000, $0000, $0047 dw $0f78, $0fb8, $0040, $0f98, $7c7c, $0000, $0000, $0048 -dw $0f20, $0f40, $0020, $0f30, $757e, $0000, $0000, $0049 +dw $0f20, $0f40, $0020, $0f30, $757e, $0000, $0001, $0049 dw $0f70, $0fb8, $0048, $0f94, $757e, $0000, $0000, $004a -dw $0058, $00c0, $0068, $008c, $8080, $0000, $0000, $0017 ;Hobo (unused) +dw $0058, $00c0, $0068, $008c, $8080, $0000, $0001, $0017 ;Hobo (unused) org $aab9a0 ;PC 1539a0 OWSpecialDestIndex: diff --git a/data/base2current.bps b/data/base2current.bps index aa3ecc07..50533c48 100644 Binary files a/data/base2current.bps and b/data/base2current.bps differ diff --git a/mystery_example.yml b/mystery_example.yml index feb4a3ed..1551f161 100644 --- a/mystery_example.yml +++ b/mystery_example.yml @@ -3,6 +3,9 @@ vanilla: 0 parallel: 2 full: 2 + overworld_terrain: + on: 1 + off: 1 overworld_crossed: none: 4 polar: 1 diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index d8166c48..09f9d69b 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -145,6 +145,10 @@ "full" ] }, + "ow_terrain": { + "action": "store_true", + "type": "bool" + }, "ow_crossed": { "choices": [ "none", diff --git a/resources/app/cli/lang/en.json b/resources/app/cli/lang/en.json index aabea6c0..f1046bee 100644 --- a/resources/app/cli/lang/en.json +++ b/resources/app/cli/lang/en.json @@ -214,6 +214,8 @@ "Full: Overworld transitions are shuffled, but both worlds", " will have an independent map shape." ], + "ow_terrain": [ + "With OW Layout Shuffle, this allows land and water edges to be connected." ], "ow_crossed": [ "This allows cross-world connections to occur on the overworld.", "None: No transitions are cross-world connections.", @@ -226,7 +228,7 @@ ], "ow_keepsimilar": [ "This keeps similar edge transitions together. ie. the two west edges on", - "Potion Shop will be paired with another similar pair." ], + "Sanctuary will be paired with another similar pair." ], "ow_mixed": [ "Overworld tiles are randomly chosen to become part of the opposite world." ], diff --git a/resources/app/gui/lang/en.json b/resources/app/gui/lang/en.json index e1b5f497..42607a14 100644 --- a/resources/app/gui/lang/en.json +++ b/resources/app/gui/lang/en.json @@ -131,6 +131,8 @@ "randomizer.overworld.overworldshuffle.parallel": "Parallel", "randomizer.overworld.overworldshuffle.full": "Full", + "randomizer.overworld.terrain": "Free Terrain", + "randomizer.overworld.crossed": "Crossed", "randomizer.overworld.crossed.none": "None", "randomizer.overworld.crossed.polar": "Polar", diff --git a/resources/app/gui/randomize/overworld/widgets.json b/resources/app/gui/randomize/overworld/widgets.json index dc0363c6..91540b27 100644 --- a/resources/app/gui/randomize/overworld/widgets.json +++ b/resources/app/gui/randomize/overworld/widgets.json @@ -28,7 +28,7 @@ }, "mixed": { "type": "checkbox", - "default": true + "default": false }, "whirlpool": { "type": "checkbox", @@ -45,9 +45,13 @@ } }, "rightOverworldFrame": { + "terrain": { + "type": "checkbox", + "default": false + }, "keepsimilar": { "type": "checkbox", - "default": true + "default": false } } } \ No newline at end of file diff --git a/source/classes/constants.py b/source/classes/constants.py index 1b6a6aa5..92dd1eff 100644 --- a/source/classes/constants.py +++ b/source/classes/constants.py @@ -77,6 +77,7 @@ SETTINGSTOPROCESS = { }, "overworld": { "overworldshuffle": "ow_shuffle", + "terrain": "ow_terrain", "crossed": "ow_crossed", "keepsimilar": "ow_keepsimilar", "mixed": "ow_mixed", diff --git a/source/gui/randomize/overworld.py b/source/gui/randomize/overworld.py index d3796af6..190a750a 100644 --- a/source/gui/randomize/overworld.py +++ b/source/gui/randomize/overworld.py @@ -33,8 +33,10 @@ def overworld_page(parent): for key in dictWidgets: self.widgets[key] = dictWidgets[key] packAttrs = {"anchor":E} - if key == "keepsimilar": - packAttrs = {"side":LEFT, "pady":(18,0)} + if key == "terrain": + packAttrs = {"anchor":W, "pady":(3,0)} + elif key == "keepsimilar": + packAttrs = {"anchor":W, "pady":(6,0)} elif key == "overworldflute": packAttrs["pady"] = (20,0) elif key in ["mixed", "whirlpool"]: