Add Free Terrain mode and terrain rules

This commit is contained in:
Catobat
2022-10-09 01:23:47 +02:00
parent 1fd1f9ca5c
commit 0c53fc8519
18 changed files with 603 additions and 106 deletions

View File

@@ -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]))

5
CLI.py
View File

@@ -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,

View File

@@ -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()

View File

@@ -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'

View File

@@ -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,

View File

@@ -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]:

View File

@@ -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.

2
Rom.py
View File

@@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127
JAP10HASH = '03a63945398191337e896e5771f77173'
RANDOMIZERBASEHASH = '0aa072c020b0c1167c3e618b571efbbe'
RANDOMIZERBASEHASH = '4657087846e24d65cd69ff61241601fe'
class JsonRom(object):

View File

@@ -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))

View File

@@ -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,7 +547,16 @@ OWDetectSpecialTransition:
{
STZ.w $06FC
LDA.l OWMode : BEQ .normal
LDA.l OWSpecialDestIndex,X : BIT.w #$0080 : BNE .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
@@ -552,12 +583,6 @@ OWDetectSpecialTransition:
LDX.b $02
LDA.b $84
JML OverworldHandleTransitions_SpecialTrigger+6
.special
AND.w #$0003 : TAY : ASL : TAX
.normal
JSR OWLoadSpecialArea
.return
RTL
}
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:

Binary file not shown.

View File

@@ -3,6 +3,9 @@
vanilla: 0
parallel: 2
full: 2
overworld_terrain:
on: 1
off: 1
overworld_crossed:
none: 4
polar: 1

View File

@@ -145,6 +145,10 @@
"full"
]
},
"ow_terrain": {
"action": "store_true",
"type": "bool"
},
"ow_crossed": {
"choices": [
"none",

View File

@@ -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."
],

View File

@@ -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",

View File

@@ -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
}
}
}

View File

@@ -77,6 +77,7 @@ SETTINGSTOPROCESS = {
},
"overworld": {
"overworldshuffle": "ow_shuffle",
"terrain": "ow_terrain",
"crossed": "ow_crossed",
"keepsimilar": "ow_keepsimilar",
"mixed": "ow_mixed",

View File

@@ -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"]: