Bugfix for rupee20

Bugfix for Triforce hunt
Bugfix for python issue
Mystery experimental option
Mystery open pyramid refined
Mirror Scroll turned off if door shuffle is vanilla (even if experimental)
This commit is contained in:
aerinon
2020-03-03 09:37:09 -07:00
parent 34774eb2d5
commit 549607c72a
7 changed files with 24 additions and 25 deletions

View File

@@ -197,8 +197,7 @@ def connect_simple_door(world, exit_name, region_name, player):
d.dest = region d.dest = region
def connect_door_only(world, exit_name, region_name, player): def connect_door_only(world, exit_name, region, player):
region = world.get_region(region_name, player)
d = world.check_for_door(exit_name, player) d = world.check_for_door(exit_name, player)
if d is not None: if d is not None:
d.dest = region d.dest = region
@@ -1352,8 +1351,8 @@ def add_inaccessible_doors(world, player):
# todo: ignore standard mode hyrule castle ledge? # todo: ignore standard mode hyrule castle ledge?
for inaccessible_region in world.inaccessible_regions[player]: for inaccessible_region in world.inaccessible_regions[player]:
region = world.get_region(inaccessible_region, player) region = world.get_region(inaccessible_region, player)
for exit in region.exits: for ext in region.exits:
create_door(world, player, exit.name, region.name) create_door(world, player, ext.name, region.name)
def create_door(world, player, entName, region_name): def create_door(world, player, entName, region_name):
@@ -1459,6 +1458,7 @@ def check_for_pinball_fix(state, bad_region, world, player):
@unique @unique
class DROptions(Flag): class DROptions(Flag):
NoOptions = 0x00
Eternal_Mini_Bosses = 0x01 # If on, GT minibosses marked as defeated when they try to spawn a heart Eternal_Mini_Bosses = 0x01 # If on, GT minibosses marked as defeated when they try to spawn a heart
Town_Portal = 0x02 # If on, Players will start with mirror scroll Town_Portal = 0x02 # If on, Players will start with mirror scroll
Open_Desert_Wall = 0x80 # If on, pre opens the desert wall, no fire required Open_Desert_Wall = 0x80 # If on, pre opens the desert wall, no fire required

View File

@@ -177,6 +177,7 @@ def get_custom_array_key(item):
key = label_switcher.get(key) key = label_switcher.get(key)
return key return key
def generate_itempool(world, player): def generate_itempool(world, player):
if (world.difficulty[player] not in ['normal', 'hard', 'expert'] or world.goal[player] not in ['ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals'] if (world.difficulty[player] not in ['normal', 'hard', 'expert'] or world.goal[player] not in ['ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals']
or world.mode[player] not in ['open', 'standard', 'inverted'] or world.timer not in ['none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown'] or world.progressive not in ['on', 'off', 'random']): or world.mode[player] not in ['open', 'standard', 'inverted'] or world.timer not in ['none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown'] or world.progressive not in ['on', 'off', 'random']):
@@ -194,7 +195,7 @@ def generate_itempool(world, player):
region = world.get_region('Light World',player) region = world.get_region('Light World',player)
loc = Location(player, "Murahdahla", parent=region) loc = Location(player, "Murahdahla", parent=region)
loc.access_rule = lambda state: state.item_count(get_custom_array_key('Triforce Piece'), player) + state.item_count(get_custom_array_key('Power Star'), player) > state.world.treasure_hunt_count[player] loc.access_rule = lambda state: state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) > state.world.treasure_hunt_count[player]
region.locations.append(loc) region.locations.append(loc)
world.dynamic_locations.append(loc) world.dynamic_locations.append(loc)
@@ -253,7 +254,6 @@ def generate_itempool(world, player):
world.get_location('Zelda Drop Off', player).event = True world.get_location('Zelda Drop Off', player).event = True
world.get_location('Zelda Drop Off', player).locked = True world.get_location('Zelda Drop Off', player).locked = True
# set up item pool # set up item pool
if world.custom: if world.custom:
(pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.customitemarray) (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.customitemarray)
@@ -265,10 +265,10 @@ def generate_itempool(world, player):
amt = world.pool_adjustment[player] amt = world.pool_adjustment[player]
if amt < 0: if amt < 0:
for i in range(0, amt): for i in range(0, amt):
pool.remove(get_custom_array_key('Rupees (20)')) pool.remove('Rupees (20)')
elif amt > 0: elif amt > 0:
for i in range(0, amt): for i in range(0, amt):
pool.append(get_custom_array_key('Rupees (20)')) pool.append('Rupees (20)')
for item in precollected_items: for item in precollected_items:
world.push_precollected(ItemFactory(item, player)) world.push_precollected(ItemFactory(item, player))
@@ -407,6 +407,7 @@ def set_up_take_anys(world, player):
world.initialize_regions() world.initialize_regions()
def create_dynamic_shop_locations(world, player): def create_dynamic_shop_locations(world, player):
for shop in world.shops: for shop in world.shops:
if shop.region.player == player: if shop.region.player == player:

View File

@@ -24,7 +24,7 @@ from Fill import distribute_items_cutoff, distribute_items_staleness, distribute
from ItemList import generate_itempool, difficulties, fill_prizes from ItemList import generate_itempool, difficulties, fill_prizes
from Utils import output_path, parse_player_names from Utils import output_path, parse_player_names
__version__ = '0.0.18dev' __version__ = '0.0.18.1d'
def main(args, seed=None): def main(args, seed=None):

View File

@@ -148,6 +148,7 @@ def roll_settings(weights):
ret.shuffle = entrance_shuffle if entrance_shuffle != 'none' else 'vanilla' ret.shuffle = entrance_shuffle if entrance_shuffle != 'none' else 'vanilla'
door_shuffle = get_choice('door_shuffle') door_shuffle = get_choice('door_shuffle')
ret.door_shuffle = door_shuffle if door_shuffle != 'none' else 'vanilla' ret.door_shuffle = door_shuffle if door_shuffle != 'none' else 'vanilla'
ret.experimental = get_choice('experimental') == 'on'
goal = get_choice('goals') goal = get_choice('goals')
ret.goal = {'ganon': 'ganon', ret.goal = {'ganon': 'ganon',
@@ -156,7 +157,7 @@ def roll_settings(weights):
'pedestal': 'pedestal', 'pedestal': 'pedestal',
'triforce-hunt': 'triforcehunt' 'triforce-hunt': 'triforcehunt'
}[goal] }[goal]
ret.openpyramid = goal == 'fast_ganon' ret.openpyramid = goal == 'fast_ganon' if ret.shuffle in ['vanilla', 'dungeonsfull', 'dungeonssimple'] else False
ret.crystals_gt = get_choice('tower_open') ret.crystals_gt = get_choice('tower_open')

View File

@@ -36,10 +36,6 @@ Doors are shuffled between dungeons as well.
Doors are not shuffled. Doors are not shuffled.
### Experimental
Used for development testing. This will be removed in a future version. Use at your own risk. Might play like a plando.
## Map/Compass/Small Key/Big Key shuffle (aka Keysanity) ## Map/Compass/Small Key/Big Key shuffle (aka Keysanity)
These settings allow dungeon specific items to be distributed anywhere in the world and not just in their native dungeon. These settings allow dungeon specific items to be distributed anywhere in the world and not just in their native dungeon.

2
Rom.py
View File

@@ -591,7 +591,7 @@ def patch_rom(world, rom, player, team, enemized):
patch_shuffled_dark_sanc(world, rom, player) patch_shuffled_dark_sanc(world, rom, player)
# patch doors # patch doors
dr_flags = DROptions.Eternal_Mini_Bosses if not world.experimental[player] else DROptions.Town_Portal dr_flags = DROptions.Eternal_Mini_Bosses if world.doorShuffle[player] == 'vanilla' or not world.experimental[player] else DROptions.Town_Portal
if world.doorShuffle[player] == 'crossed': if world.doorShuffle[player] == 'crossed':
rom.write_byte(0x139004, 2) rom.write_byte(0x139004, 2)
rom.write_byte(0x151f1, 2) rom.write_byte(0x151f1, 2)

View File

@@ -1,11 +1,12 @@
from tkinter import ttk, StringVar, Entry, Frame, Label, N, E, W, LEFT, RIGHT, X, VERTICAL, Y from tkinter import ttk, Frame, N, LEFT, VERTICAL, Y
import gui.widgets as widgets import gui.widgets as widgets
import json import json
import os import os
import classes.constants as CONST import classes.constants as CONST
def custom_page(top,parent):
def custom_page(top, parent):
# Custom Item Pool # Custom Item Pool
self = ttk.Frame(parent) self = ttk.Frame(parent)
@@ -31,24 +32,24 @@ def custom_page(top,parent):
# Custom Item Pool option sections # Custom Item Pool option sections
self.frames = {} self.frames = {}
create_list_frame(self,"itemList1") create_list_frame(self, "itemList1")
create_vertical_rule(2) create_vertical_rule(2)
create_list_frame(self,"itemList2") create_list_frame(self, "itemList2")
create_vertical_rule(2) create_vertical_rule(2)
create_list_frame(self,"itemList3") create_list_frame(self, "itemList3")
create_vertical_rule(2) create_vertical_rule(2)
create_list_frame(self,"itemList4") create_list_frame(self, "itemList4")
create_vertical_rule(2) create_vertical_rule(2)
create_list_frame(self,"itemList5") create_list_frame(self, "itemList5")
with open(os.path.join("resources","app","gui","custom","overview","widgets.json")) as widgetDefns: with open(os.path.join("resources", "app", "gui", "custom", "overview", "widgets.json")) as widgetDefns:
myDict = json.load(widgetDefns) myDict = json.load(widgetDefns)
for framename,theseWidgets in myDict.items(): for framename,theseWidgets in myDict.items():
dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename]) dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename])
for key in dictWidgets: for key in dictWidgets:
self.customWidgets[key] = dictWidgets[key] self.customWidgets[key] = dictWidgets[key]
for key in CONST.CUSTOMITEMS: for i, key in enumerate(CONST.CUSTOMITEMS):
self.customWidgets[key].storageVar.set(top.settings["customitemarray"][key]) self.customWidgets[key].storageVar.set(top.settings["customitemarray"][i])
return self return self