Remove stonewall pre-opening code in favor of dynamic softlock prevention (Promoted from experimental)
This commit is contained in:
@@ -1358,10 +1358,8 @@ def combine_layouts(recombinant_builders, dungeon_builders, entrances_map):
|
|||||||
if recombine.master_sector is None:
|
if recombine.master_sector is None:
|
||||||
recombine.master_sector = builder.master_sector
|
recombine.master_sector = builder.master_sector
|
||||||
recombine.master_sector.name = recombine.name
|
recombine.master_sector.name = recombine.name
|
||||||
recombine.pre_open_stonewalls = builder.pre_open_stonewalls
|
|
||||||
else:
|
else:
|
||||||
recombine.master_sector.regions.extend(builder.master_sector.regions)
|
recombine.master_sector.regions.extend(builder.master_sector.regions)
|
||||||
recombine.pre_open_stonewalls.update(builder.pre_open_stonewalls)
|
|
||||||
recombine.layout_starts = list(entrances_map[recombine.name])
|
recombine.layout_starts = list(entrances_map[recombine.name])
|
||||||
dungeon_builders[recombine.name] = recombine
|
dungeon_builders[recombine.name] = recombine
|
||||||
|
|
||||||
@@ -2043,8 +2041,8 @@ class DROptions(Flag):
|
|||||||
Debug = 0x08
|
Debug = 0x08
|
||||||
# Rails = 0x10 # Unused bit now
|
# Rails = 0x10 # Unused bit now
|
||||||
OriginalPalettes = 0x20
|
OriginalPalettes = 0x20
|
||||||
Open_PoD_Wall = 0x40 # If on, pre opens the PoD wall, no bow required
|
# Open_PoD_Wall = 0x40 # No longer pre-opening pod wall - unused
|
||||||
Open_Desert_Wall = 0x80 # If on, pre opens the desert wall, no fire required
|
# Open_Desert_Wall = 0x80 # No longer pre-opening desert wall - unused
|
||||||
Hide_Total = 0x100
|
Hide_Total = 0x100
|
||||||
DarkWorld_Spawns = 0x200
|
DarkWorld_Spawns = 0x200
|
||||||
|
|
||||||
|
|||||||
@@ -56,23 +56,10 @@ def pre_validate(builder, entrance_region_names, split_dungeon, world, player):
|
|||||||
|
|
||||||
|
|
||||||
def generate_dungeon(builder, entrance_region_names, split_dungeon, world, player):
|
def generate_dungeon(builder, entrance_region_names, split_dungeon, world, player):
|
||||||
stonewalls = check_for_stonewalls(builder)
|
|
||||||
sector = generate_dungeon_main(builder, entrance_region_names, split_dungeon, world, player)
|
sector = generate_dungeon_main(builder, entrance_region_names, split_dungeon, world, player)
|
||||||
for stonewall in stonewalls:
|
|
||||||
if not stonewall_valid(stonewall):
|
|
||||||
builder.pre_open_stonewalls.add(stonewall)
|
|
||||||
return sector
|
return sector
|
||||||
|
|
||||||
|
|
||||||
def check_for_stonewalls(builder):
|
|
||||||
stonewalls = set()
|
|
||||||
for sector in builder.sectors:
|
|
||||||
for door in sector.outstanding_doors:
|
|
||||||
if door.stonewall:
|
|
||||||
stonewalls.add(door)
|
|
||||||
return stonewalls
|
|
||||||
|
|
||||||
|
|
||||||
def generate_dungeon_main(builder, entrance_region_names, split_dungeon, world, player):
|
def generate_dungeon_main(builder, entrance_region_names, split_dungeon, world, player):
|
||||||
if builder.valid_proposal: # we made this earlier in gen, just use it
|
if builder.valid_proposal: # we made this earlier in gen, just use it
|
||||||
proposed_map = builder.valid_proposal
|
proposed_map = builder.valid_proposal
|
||||||
@@ -612,35 +599,6 @@ def winnow_hangers(hangers, hooks):
|
|||||||
hangers[hanger].remove(door)
|
hangers[hanger].remove(door)
|
||||||
|
|
||||||
|
|
||||||
def stonewall_valid(stonewall):
|
|
||||||
bad_door = stonewall.dest
|
|
||||||
if bad_door.blocked:
|
|
||||||
return True # great we're done with this one
|
|
||||||
loop_region = stonewall.entrance.parent_region
|
|
||||||
start_regions = [bad_door.entrance.parent_region]
|
|
||||||
if bad_door.dependents:
|
|
||||||
for dep in bad_door.dependents:
|
|
||||||
start_regions.append(dep.entrance.parent_region)
|
|
||||||
queue = deque(start_regions)
|
|
||||||
visited = set(start_regions)
|
|
||||||
while len(queue) > 0:
|
|
||||||
region = queue.popleft()
|
|
||||||
if region == loop_region:
|
|
||||||
return False # guaranteed loop
|
|
||||||
possible_entrances = list(region.entrances)
|
|
||||||
for entrance in possible_entrances:
|
|
||||||
parent = entrance.parent_region
|
|
||||||
if parent.type != RegionType.Dungeon:
|
|
||||||
return False # you can get stuck from an entrance
|
|
||||||
else:
|
|
||||||
door = entrance.door
|
|
||||||
if (door is None or (door != stonewall and not door.blocked)) and parent not in visited:
|
|
||||||
visited.add(parent)
|
|
||||||
queue.append(parent)
|
|
||||||
# we didn't find anything bad
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def create_graph_piece_from_state(door, o_state, b_state, proposed_map, exception):
|
def create_graph_piece_from_state(door, o_state, b_state, proposed_map, exception):
|
||||||
# todo: info about dungeon events - not sure about that
|
# todo: info about dungeon events - not sure about that
|
||||||
graph_piece = GraphPiece()
|
graph_piece = GraphPiece()
|
||||||
@@ -1198,8 +1156,6 @@ class DungeonBuilder(object):
|
|||||||
self.path_entrances = None # used for pathing/key doors, I think
|
self.path_entrances = None # used for pathing/key doors, I think
|
||||||
self.split_flag = False
|
self.split_flag = False
|
||||||
|
|
||||||
self.pre_open_stonewalls = set() # used by stonewall system
|
|
||||||
|
|
||||||
self.candidates = None
|
self.candidates = None
|
||||||
self.total_keys = None
|
self.total_keys = None
|
||||||
self.key_doors_num = None
|
self.key_doors_num = None
|
||||||
|
|||||||
2
Main.py
2
Main.py
@@ -29,7 +29,7 @@ from Fill import sell_potions, sell_keys, balance_multiworld_progression, balanc
|
|||||||
from ItemList import generate_itempool, difficulties, fill_prizes, customize_shops
|
from ItemList import generate_itempool, difficulties, fill_prizes, customize_shops
|
||||||
from Utils import output_path, parse_player_names
|
from Utils import output_path, parse_player_names
|
||||||
|
|
||||||
__version__ = '0.5.1.1-u'
|
__version__ = '0.5.1.2-u'
|
||||||
|
|
||||||
from source.classes.BabelFish import BabelFish
|
from source.classes.BabelFish import BabelFish
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,14 @@ CLI: ```--bombbag```
|
|||||||
|
|
||||||
# Bug Fixes and Notes.
|
# Bug Fixes and Notes.
|
||||||
|
|
||||||
|
* 0.5.1.2
|
||||||
|
* Allowed Blind's Cell to be shuffled anywhere if Blind is not the boss of Thieves Town
|
||||||
|
* Remove unique annotation from a FastEnum that was causing problems
|
||||||
|
* Updated prevent mixed_travel setting to prevent more mixed travel
|
||||||
|
* Prevent key door loops on the same supertile where you could have spent 2 keys on one logical door
|
||||||
|
* Promoted dynamic soft-lock prevention on "stonewalls" from experimental to be the primary prevention (Stonewalls are now never pre-opened)
|
||||||
|
* Fix to money balancing algorithm with small item_pool, thanks Catobat
|
||||||
|
* Many fixes and refinements to key logic and generation
|
||||||
* 0.5.1.1
|
* 0.5.1.1
|
||||||
* Shop hints in ER are now more generic instead of using "near X" because they aren't near that anymore
|
* Shop hints in ER are now more generic instead of using "near X" because they aren't near that anymore
|
||||||
* Added memory location for mutliworld scripts to read what item was just obtain (longer than one frame)
|
* Added memory location for mutliworld scripts to read what item was just obtain (longer than one frame)
|
||||||
|
|||||||
9
Rom.py
9
Rom.py
@@ -32,7 +32,7 @@ from source.classes.SFX import randomize_sfx
|
|||||||
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
||||||
RANDOMIZERBASEHASH = 'ef6e3e1aa59838c01dbd5b1b2387e70c'
|
RANDOMIZERBASEHASH = '11f4f494e999a919aafd7d2624e67679'
|
||||||
|
|
||||||
|
|
||||||
class JsonRom(object):
|
class JsonRom(object):
|
||||||
@@ -754,13 +754,6 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
|
|||||||
rom.write_bytes(paired_door.address_a(world, player), paired_door.rom_data_a(world, player))
|
rom.write_bytes(paired_door.address_a(world, player), paired_door.rom_data_a(world, player))
|
||||||
rom.write_bytes(paired_door.address_b(world, player), paired_door.rom_data_b(world, player))
|
rom.write_bytes(paired_door.address_b(world, player), paired_door.rom_data_b(world, player))
|
||||||
if world.doorShuffle[player] != 'vanilla':
|
if world.doorShuffle[player] != 'vanilla':
|
||||||
if not world.experimental[player]:
|
|
||||||
for builder in world.dungeon_layouts[player].values():
|
|
||||||
for stonewall in builder.pre_open_stonewalls:
|
|
||||||
if stonewall.name == 'Desert Wall Slide NW':
|
|
||||||
dr_flags |= DROptions.Open_Desert_Wall
|
|
||||||
elif stonewall.name == 'PoD Bow Statue Down Ladder':
|
|
||||||
dr_flags |= DROptions.Open_PoD_Wall
|
|
||||||
for name, pair in boss_indicator.items():
|
for name, pair in boss_indicator.items():
|
||||||
dungeon_id, boss_door = pair
|
dungeon_id, boss_door = pair
|
||||||
opposite_door = world.get_door(boss_door, player).dest
|
opposite_door = world.get_door(boss_door, player).dest
|
||||||
|
|||||||
@@ -35,11 +35,7 @@ rtl
|
|||||||
|
|
||||||
OnFileLoadOverride:
|
OnFileLoadOverride:
|
||||||
jsl OnFileLoad ; what I wrote over
|
jsl OnFileLoad ; what I wrote over
|
||||||
lda.l DRFlags : and #$80 : beq + ;flag is off
|
+ lda.l DRFlags : and #$02 : beq + ; Mirror Scroll
|
||||||
lda $7ef086 : ora #$80 : sta $7ef086
|
|
||||||
+ lda.l DRFlags : and #$40 : beq + ;flag is off
|
|
||||||
lda $7ef036 : ora #$80 : sta $7ef036
|
|
||||||
+ lda.l DRFlags : and #$02 : beq +
|
|
||||||
lda $7ef353 : bne +
|
lda $7ef353 : bne +
|
||||||
lda #$01 : sta $7ef353
|
lda #$01 : sta $7ef353
|
||||||
+ rtl
|
+ rtl
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user