Merge branch 'OverworldShuffleDev' into OverworldShuffle
This commit is contained in:
@@ -1,5 +1,12 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
### 0.1.8.1
|
||||||
|
- Fixed issue with activating flute in DW (OW Mixed)
|
||||||
|
- Fixed issue with Parallel+Crossed not generating
|
||||||
|
- Fixed issue with Standard not generating
|
||||||
|
- Fixed issue with Swordless not generating
|
||||||
|
- Fixed logic for Graveyard Ledge and Kings Tomb
|
||||||
|
|
||||||
### 0.1.8.0
|
### 0.1.8.0
|
||||||
- Moved Crossed to its own checkbox option
|
- Moved Crossed to its own checkbox option
|
||||||
- Removed Legacy ER shuffles
|
- Removed Legacy ER shuffles
|
||||||
|
|||||||
@@ -1868,7 +1868,7 @@ def find_accessible_entrances(world, player, builder):
|
|||||||
connect = ext.connected_region
|
connect = ext.connected_region
|
||||||
if connect is None or ext.door and ext.door.blocked:
|
if connect is None or ext.door and ext.door.blocked:
|
||||||
continue
|
continue
|
||||||
if world.mode[player] == 'standard' and builder.name == 'Hyrule Castle' and ext.name in ['Hyrule Castle Main Gate (North)', 'Top of Pyramid (Inner)', 'Inverted Pyramid Entrance' ]:
|
if world.mode[player] == 'standard' and builder.name == 'Hyrule Castle' and (ext.name.startswith('Flute From') or ext.name in ['Hyrule Castle Main Gate (North)', 'Top of Pyramid (Inner)', 'Inverted Pyramid Entrance']):
|
||||||
continue
|
continue
|
||||||
if connect.name in entrances and connect not in visited_entrances:
|
if connect.name in entrances and connect not in visited_entrances:
|
||||||
visited_entrances.append(connect.name)
|
visited_entrances.append(connect.name)
|
||||||
|
|||||||
@@ -2369,13 +2369,24 @@ inverted_default_dungeon_connections = [('Ganons Tower', 'Agahnims Tower Portal'
|
|||||||
|
|
||||||
indirect_connections = {
|
indirect_connections = {
|
||||||
'Turtle Rock Ledge': 'Turtle Rock',
|
'Turtle Rock Ledge': 'Turtle Rock',
|
||||||
'Pyramid Area': 'Pyramid Fairy',
|
|
||||||
#'East Dark World': 'Pyramid Fairy',
|
|
||||||
'Big Bomb Shop': 'Pyramid Fairy',
|
'Big Bomb Shop': 'Pyramid Fairy',
|
||||||
|
#'East Dark World': 'Pyramid Fairy',
|
||||||
|
'Pyramid Area': 'Pyramid Fairy', # HC Ledge/Courtyard
|
||||||
#'Dark Desert': 'Pyramid Fairy',
|
#'Dark Desert': 'Pyramid Fairy',
|
||||||
|
'Misery Mire Area': 'Pyramid Fairy', # Desert/Checkerboard Ledge
|
||||||
#'West Dark World': 'Pyramid Fairy',
|
#'West Dark World': 'Pyramid Fairy',
|
||||||
|
'Dark Chapel Area': 'Pyramid Fairy', # Bonk Rocks
|
||||||
|
'Dark Graveyard North': 'Pyramid Fairy', # Graveyard Ledge/Kings Tomb
|
||||||
#'South Dark World': 'Pyramid Fairy',
|
#'South Dark World': 'Pyramid Fairy',
|
||||||
|
'Dig Game Ledge': 'Pyramid Fairy', # Brother House Left
|
||||||
|
'Stumpy Approach Area': 'Pyramid Fairy', # Cave 45
|
||||||
|
# Inverted Cases
|
||||||
#'Light World': 'Pyramid Fairy',
|
#'Light World': 'Pyramid Fairy',
|
||||||
|
'Lost Woods West Area': 'Pyramid Fairy', # Skull Woods Back
|
||||||
|
'East Death Mountain (Top East)': 'Pyramid Fairy', # Floating Island
|
||||||
|
'Blacksmith Area': 'Pyramid Fairy', # Hammerpegs
|
||||||
|
'Forgotten Forest Area': 'Pyramid Fairy', # Shield Shop
|
||||||
|
'Desert Area': 'Pyramid Fairy', # Mire Area
|
||||||
'Old Man Cave': 'Old Man S&Q'
|
'Old Man Cave': 'Old Man S&Q'
|
||||||
}
|
}
|
||||||
# format:
|
# format:
|
||||||
|
|||||||
@@ -870,6 +870,7 @@ OWTileRegions = bidict({
|
|||||||
'Dark Chapel Area': 0x53,
|
'Dark Chapel Area': 0x53,
|
||||||
|
|
||||||
'Dark Graveyard Area': 0x54,
|
'Dark Graveyard Area': 0x54,
|
||||||
|
'Dark Graveyard North': 0x54,
|
||||||
|
|
||||||
'Qirn Jump Area': 0x55,
|
'Qirn Jump Area': 0x55,
|
||||||
'Qirn Jump East Bank': 0x55,
|
'Qirn Jump East Bank': 0x55,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import RaceRandom as random, logging, copy
|
|||||||
from BaseClasses import OWEdge, WorldType, RegionType, Direction, Terrain, PolSlot, Entrance
|
from BaseClasses import OWEdge, WorldType, RegionType, Direction, Terrain, PolSlot, Entrance
|
||||||
from OWEdges import OWTileRegions, OWTileGroups, OWEdgeGroups, OpenStd, parallel_links, IsParallel
|
from OWEdges import OWTileRegions, OWTileGroups, OWEdgeGroups, OpenStd, parallel_links, IsParallel
|
||||||
|
|
||||||
__version__ = '0.1.8.0-u'
|
__version__ = '0.1.8.1-u'
|
||||||
|
|
||||||
def link_overworld(world, player):
|
def link_overworld(world, player):
|
||||||
# setup mandatory connections
|
# setup mandatory connections
|
||||||
@@ -230,15 +230,26 @@ def link_overworld(world, player):
|
|||||||
f += 1
|
f += 1
|
||||||
if f < len(forward_edge_sets):
|
if f < len(forward_edge_sets):
|
||||||
forward_set = forward_edge_sets[f]
|
forward_set = forward_edge_sets[f]
|
||||||
|
else:
|
||||||
|
forward_set = None
|
||||||
|
break
|
||||||
f += 1
|
f += 1
|
||||||
while back_set[0] in connected_edges:
|
while back_set[0] in connected_edges:
|
||||||
b += 1
|
b += 1
|
||||||
if b < len(back_edge_sets):
|
if b < len(back_edge_sets):
|
||||||
back_set = back_edge_sets[b]
|
back_set = back_edge_sets[b]
|
||||||
|
else:
|
||||||
|
back_set = None
|
||||||
|
break
|
||||||
b += 1
|
b += 1
|
||||||
|
if forward_set is not None and back_set is not None:
|
||||||
assert len(forward_set) == len(back_set)
|
assert len(forward_set) == len(back_set)
|
||||||
for (forward_edge, back_edge) in zip(forward_set, back_set):
|
for (forward_edge, back_edge) in zip(forward_set, back_set):
|
||||||
connect_two_way(world, forward_edge, back_edge, player, connected_edges)
|
connect_two_way(world, forward_edge, back_edge, player, connected_edges)
|
||||||
|
elif forward_set is not None:
|
||||||
|
logging.getLogger('').warning("Edge '%s' could not find a valid connection" % forward_set[0])
|
||||||
|
elif back_set is not None:
|
||||||
|
logging.getLogger('').warning("Edge '%s' could not find a valid connection" % back_set[0])
|
||||||
else:
|
else:
|
||||||
# vanilla/crossed shuffle
|
# vanilla/crossed shuffle
|
||||||
for (forward_edge_sets, back_edge_sets) in groups:
|
for (forward_edge_sets, back_edge_sets) in groups:
|
||||||
@@ -964,6 +975,8 @@ mandatory_connections = [# Whirlpool Connections
|
|||||||
('Skull Woods Pass Bush Row (East)', 'Skull Woods Pass West Area'), #pearl
|
('Skull Woods Pass Bush Row (East)', 'Skull Woods Pass West Area'), #pearl
|
||||||
('Skull Woods Pass Rock (Top)', 'Skull Woods Pass East Bottom Area'), #mitts
|
('Skull Woods Pass Rock (Top)', 'Skull Woods Pass East Bottom Area'), #mitts
|
||||||
('Skull Woods Pass Rock (Bottom)', 'Skull Woods Pass East Top Area'), #mitts
|
('Skull Woods Pass Rock (Bottom)', 'Skull Woods Pass East Top Area'), #mitts
|
||||||
|
('Dark Graveyard Bush (South)', 'Dark Graveyard North'), #pearl
|
||||||
|
('Dark Graveyard Bush (North)', 'Dark Graveyard Area'), #pearl
|
||||||
('Qirn Jump Water Drop', 'Qirn Jump Water'), #flippers
|
('Qirn Jump Water Drop', 'Qirn Jump Water'), #flippers
|
||||||
('Qirn Jump East Water Drop', 'Qirn Jump Water'), #flippers
|
('Qirn Jump East Water Drop', 'Qirn Jump Water'), #flippers
|
||||||
('Qirn Jump Pier', 'Qirn Jump East Bank'),
|
('Qirn Jump Pier', 'Qirn Jump East Bank'),
|
||||||
|
|||||||
@@ -148,7 +148,8 @@ def create_regions(world, player):
|
|||||||
create_dw_region(player, 'Dark Fortune Area', None, ['Fortune Teller (Dark)', 'Kakariko Fortune Mirror Spot', 'Dark Fortune NE', 'Dark Fortune EN', 'Dark Fortune ES', 'Dark Fortune SC']),
|
create_dw_region(player, 'Dark Fortune Area', None, ['Fortune Teller (Dark)', 'Kakariko Fortune Mirror Spot', 'Dark Fortune NE', 'Dark Fortune EN', 'Dark Fortune ES', 'Dark Fortune SC']),
|
||||||
create_dw_region(player, 'Outcast Pond Area', None, ['Kakariko Pond Mirror Spot', 'Outcast Pond NE', 'Outcast Pond WN', 'Outcast Pond WS', 'Outcast Pond SW', 'Outcast Pond SE', 'Outcast Pond EN', 'Outcast Pond ES']),
|
create_dw_region(player, 'Outcast Pond Area', None, ['Kakariko Pond Mirror Spot', 'Outcast Pond NE', 'Outcast Pond WN', 'Outcast Pond WS', 'Outcast Pond SW', 'Outcast Pond SE', 'Outcast Pond EN', 'Outcast Pond ES']),
|
||||||
create_dw_region(player, 'Dark Chapel Area', None, ['Dark Sanctuary Hint', 'Sanctuary Mirror Spot', 'Bonk Rock Ledge Mirror Spot', 'Dark Chapel WN', 'Dark Chapel WS', 'Dark Chapel EC']),
|
create_dw_region(player, 'Dark Chapel Area', None, ['Dark Sanctuary Hint', 'Sanctuary Mirror Spot', 'Bonk Rock Ledge Mirror Spot', 'Dark Chapel WN', 'Dark Chapel WS', 'Dark Chapel EC']),
|
||||||
create_dw_region(player, 'Dark Graveyard Area', None, ['Graveyard Ledge Mirror Spot', 'Kings Grave Mirror Spot', 'Dark Graveyard WC', 'Dark Graveyard EC']),
|
create_dw_region(player, 'Dark Graveyard Area', None, ['Dark Graveyard Bush (South)', 'Dark Graveyard WC', 'Dark Graveyard EC']),
|
||||||
|
create_dw_region(player, 'Dark Graveyard North', None, ['Graveyard Ledge Mirror Spot', 'Kings Grave Mirror Spot', 'Dark Graveyard Bush (North)']),
|
||||||
create_dw_region(player, 'Qirn Jump Area', None, ['Qirn Jump Water Drop', 'River Bend Mirror Spot', 'Qirn Jump WC', 'Qirn Jump SW']),
|
create_dw_region(player, 'Qirn Jump Area', None, ['Qirn Jump Water Drop', 'River Bend Mirror Spot', 'Qirn Jump WC', 'Qirn Jump SW']),
|
||||||
create_dw_region(player, 'Qirn Jump East Bank', None, ['Qirn Jump East Water Drop', 'River Bend East Mirror Spot', 'Qirn Jump SE', 'Qirn Jump EC', 'Qirn Jump ES']),
|
create_dw_region(player, 'Qirn Jump East Bank', None, ['Qirn Jump East Water Drop', 'River Bend East Mirror Spot', 'Qirn Jump SE', 'Qirn Jump EC', 'Qirn Jump ES']),
|
||||||
create_dw_region(player, 'Qirn Jump Water', None, ['Qirn Jump Pier', 'Qirn Jump Whirlpool', 'Qirn Jump EN', 'Qirn Jump SC'], Terrain.Water),
|
create_dw_region(player, 'Qirn Jump Water', None, ['Qirn Jump Pier', 'Qirn Jump Whirlpool', 'Qirn Jump EN', 'Qirn Jump SC'], Terrain.Water),
|
||||||
|
|||||||
2
Rom.py
2
Rom.py
@@ -33,7 +33,7 @@ from source.classes.SFX import randomize_sfx
|
|||||||
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = '99f3f57ab2c9449172cade4927a462d6'
|
RANDOMIZERBASEHASH = '3f7cd4772ea4a3f503691ef8807f5d84'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
|
|||||||
3
Rules.py
3
Rules.py
@@ -1263,6 +1263,8 @@ def ow_bunny_rules(world, player):
|
|||||||
add_bunny_rule(world.get_entrance('Skull Woods Pass Bush Row (East)', player), player)
|
add_bunny_rule(world.get_entrance('Skull Woods Pass Bush Row (East)', player), player)
|
||||||
add_bunny_rule(world.get_entrance('Skull Woods Pass Rock (Top)', player), player)
|
add_bunny_rule(world.get_entrance('Skull Woods Pass Rock (Top)', player), player)
|
||||||
add_bunny_rule(world.get_entrance('Skull Woods Pass Rock (Bottom)', player), player)
|
add_bunny_rule(world.get_entrance('Skull Woods Pass Rock (Bottom)', player), player)
|
||||||
|
add_bunny_rule(world.get_entrance('Dark Graveyard Bush (South)', player), player)
|
||||||
|
add_bunny_rule(world.get_entrance('Dark Graveyard Bush (North)', player), player)
|
||||||
add_bunny_rule(world.get_entrance('Dark Witch Rock (North)', player), player)
|
add_bunny_rule(world.get_entrance('Dark Witch Rock (North)', player), player)
|
||||||
add_bunny_rule(world.get_entrance('Dark Witch Rock (South)', player), player)
|
add_bunny_rule(world.get_entrance('Dark Witch Rock (South)', player), player)
|
||||||
add_bunny_rule(world.get_entrance('Catfish Approach Rocks (West)', player), player)
|
add_bunny_rule(world.get_entrance('Catfish Approach Rocks (West)', player), player)
|
||||||
@@ -1487,6 +1489,7 @@ def swordless_rules(world, player):
|
|||||||
if world.mode[player] != 'inverted':
|
if world.mode[player] != 'inverted':
|
||||||
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has('Hammer', player) or state.has('Beat Agahnim 1', player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle
|
set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has('Hammer', player) or state.has('Beat Agahnim 1', player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle
|
||||||
|
|
||||||
|
set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_misery_mire_medallion(player)) # sword not required to use medallion for opening in swordless (!)
|
||||||
set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock Ledge', 'Region', player)) # sword not required to use medallion for opening in swordless (!)
|
set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock Ledge', 'Region', player)) # sword not required to use medallion for opening in swordless (!)
|
||||||
add_bunny_rule(world.get_entrance('Turtle Rock', player), player)
|
add_bunny_rule(world.get_entrance('Turtle Rock', player), player)
|
||||||
add_bunny_rule(world.get_entrance('Misery Mire', player), player)
|
add_bunny_rule(world.get_entrance('Misery Mire', player), player)
|
||||||
|
|||||||
@@ -341,7 +341,7 @@ OWNewDestination:
|
|||||||
sep #$30 : lda OWOppSlotOffset,y : !add $04 : asl : and #$7f : sta $700
|
sep #$30 : lda OWOppSlotOffset,y : !add $04 : asl : and #$7f : sta $700
|
||||||
|
|
||||||
; crossed OW shuffle
|
; crossed OW shuffle
|
||||||
lda.l OWMode+1 : and.b #$02 : beq .return
|
LDA.l OWMode+1 : AND.b #!FLAG_OW_CROSSED : beq .return
|
||||||
ldx $05 : lda.l OWTileWorldAssoc,x : sta.l $7ef3ca ; change world
|
ldx $05 : lda.l OWTileWorldAssoc,x : sta.l $7ef3ca ; change world
|
||||||
|
|
||||||
; toggle bunny mode
|
; toggle bunny mode
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user