Skip to content

Commit c3591a3

Browse files
committed
Merge branch 'Dev' into dev-fenhl
# Conflicts: # EntranceShuffle.py # Hints.py # Main.py # Messages.py # SettingsList.py # SettingsListTricks.py # State.py # Unittest.py # World.py # data/Glitched World/Deku Tree MQ.json # data/Glitched World/Deku Tree.json # data/Glitched World/Ganons Castle MQ.json # data/Glitched World/Ganons Castle.json # data/Glitched World/Overworld.json # data/LogicHelpers.json # data/World/Overworld.json # tests/glitched-standard.sav
2 parents 0a2da24 + 9532e81 commit c3591a3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+10531
-1939
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
* The `Free Scarecrow's Song` setting has been renamed to `Scarecrow Behavior`, with a new `Fast` option.
77
* New options `Deku Theater Skull Mask` and `Deku Theater Mask of Truth` for the `Misc. Hints` setting.
88
* New setting `Shuffle 100 Skulltula Reward` along with a new `House of Skulltula: 100` option for the `Misc. Hints` setting.
9+
* Glitched logic has been renamed to `Advanced` and been revamped to work with any settings, including Entrance Randomization.
10+
* A slew of advanced tricks and glitches have been added for the new `Advanced` logic setting.
911

1012
## Bug fixes
1113
* The Deku Shield pot in the Spirit Temple is no longer shuffled when both `Fix Broken Drops` and `Include Empty Pots` are off.
@@ -14,6 +16,7 @@
1416
## Other changes
1517
* Big poe souls can now be collected while riding Epona.
1618
* Ice traps have a new item model that's displayed instead of nothing after being picked up.
19+
* The professor in the lakeside lab now only takes 1 second instead of 6 to prepare the eyeball frog.
1720

1821
# 8.3
1922

CI.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ def check_presets_formatting(fix_errors: bool = False) -> None:
9595

9696
def check_hell_mode_tricks(fix_errors: bool = False) -> None:
9797
# Check for tricks missing from Hell Mode preset.
98+
# Not checking for advanced logic tricks since hellmode is still glitchless logic
9899
with open(data_path('presets_default.json'), encoding='utf-8') as f:
99100
presets = json.load(f)
100101

Cutscenes.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,10 @@ def patch_cutscenes(rom: Rom, songs_as_items: bool, settings: Settings) -> None:
229229
patch_cutscene_length(rom, 0x1FC8550, 84) # West
230230
patch_cutscene_length(rom, 0x1FC8B30, 42) # Front gates
231231

232+
# Lakeside Professor preparing the frog before giving the eyedrops.
233+
# Cut the 120 frames timer to 20 to let him cook.
234+
rom.write_byte(0xE2C7F7, 0x14)
235+
232236
# Speed learning Minuet of Forest
233237
if songs_as_items:
234238
delete_cutscene(rom, 0x020AFF80)

EntranceShuffle.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -438,9 +438,8 @@ def set_entrances(worlds: list[World], savewarps_to_connect: list[tuple[Entrance
438438
savewarp.connect(savewarp.replaces.connected_region)
439439

440440
for world in worlds:
441-
if world.settings.logic_rules != 'glitched':
442-
# Set entrance data for all entrances, even those we aren't shuffling
443-
set_all_entrances_data(world)
441+
# Set entrance data for all entrances, even those we aren't shuffling
442+
set_all_entrances_data(world)
444443

445444
if any(world.entrance_shuffle for world in worlds):
446445
shuffle_random_entrances(worlds)
@@ -1154,7 +1153,9 @@ def validate_world(world: World, worlds: list[World], entrance_placed: Optional[
11541153
CHILD_FORBIDDEN = ()
11551154
ADULT_FORBIDDEN = ()
11561155
if not world.settings.decouple_entrances:
1157-
CHILD_FORBIDDEN += ('OGC Great Fairy Fountain -> Castle Grounds', 'GV Carpenter Tent -> GV Fortress Side')
1156+
CHILD_FORBIDDEN += ('OGC Great Fairy Fountain -> Castle Grounds',)
1157+
if world.settings.logic_rules == 'glitchless':
1158+
CHILD_FORBIDDEN += ('GV Carpenter Tent -> GV Fortress Side',)
11581159
ADULT_FORBIDDEN += ('HC Great Fairy Fountain -> Castle Grounds', 'HC Storms Grotto -> Castle Grounds')
11591160
if not world.dungeon_back_access:
11601161
# Logic for back access to Shadow and Spirit temples is experimental

ItemPool.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ def get_pool_core(world: World) -> tuple[list[str], dict[str, Item]]:
764764
# Gerudo Fortress Freestanding Heart Piece
765765
elif location.vanilla_item == 'Piece of Heart (Out of Logic)':
766766
shuffle_item = world.settings.shuffle_gerudo_fortress_heart_piece == 'shuffle'
767-
if world.settings.shuffle_hideout_entrances or world.settings.logic_rules == 'glitched':
767+
if world.settings.shuffle_hideout_entrances or world.settings.logic_rules == 'advanced':
768768
if world.settings.shuffle_hideout_entrances and world.settings.shuffle_gerudo_fortress_heart_piece == 'remove':
769769
item = IGNORE_LOCATION
770770
else:

Main.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from Rom import Rom
2626
from Rules import set_rules, set_shop_rules
2727
from Settings import Settings
28-
from SettingsList import logic_tricks
28+
from SettingsList import logic_tricks, advanced_logic_tricks
2929
from Spoiler import Spoiler
3030
from Utils import default_output_path, is_bundled, run_process, data_path
3131
from World import World
@@ -97,6 +97,8 @@ def resolve_settings(settings: Settings) -> Tuple[Optional[Rom], list[Settings]]
9797
for settings in world_settings:
9898
for trick in logic_tricks.values():
9999
settings.settings_dict[trick['name']] = trick['name'] in settings.allowed_tricks
100+
for trick in advanced_logic_tricks.values():
101+
settings.settings_dict[trick['name']] = trick['name'] in settings.advanced_allowed_tricks
100102

101103
# Set to a custom hint distribution if plando is overriding the distro
102104
if len(settings.hint_dist_user) != 0:
@@ -130,7 +132,7 @@ def build_world_graphs(world_settings: list[Settings]) -> list[World]:
130132
logger.info('Creating Overworld')
131133

132134
# Load common json rule files (those used regardless of MQ status)
133-
if world.settings.logic_rules == 'glitched':
135+
if world.settings.logic_rules == 'advanced':
134136
path = 'Glitched World'
135137
else:
136138
path = 'World'

Messages.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1408,20 +1408,19 @@ def update_warp_song_text(messages: list[Message], world: World) -> None:
14081408
0x4004: 'LH Owl Flight -> Hyrule Field',
14091409
}
14101410

1411-
if world.settings.logic_rules != "glitched": # Entrances not set on glitched logic so following code will error
1412-
for id, entr in msg_list.items():
1413-
if 'warp_songs_and_owls' in world.settings.misc_hints or world.settings.warp_songs == 'off':
1414-
destination = world.get_entrance(entr).connected_region
1415-
destination_name = HintArea.at(destination)
1416-
color = COLOR_MAP[destination_name.color]
1417-
if destination_name.preposition(True) is not None:
1418-
destination_name = f'to {destination_name}'
1419-
else:
1420-
destination_name = 'to a mysterious place'
1421-
color = COLOR_MAP['White']
1411+
for id, entr in msg_list.items():
1412+
if 'warp_songs_and_owls' in world.settings.misc_hints or world.settings.warp_songs == 'off':
1413+
destination = world.get_entrance(entr).connected_region
1414+
destination_name = HintArea.at(destination)
1415+
color = COLOR_MAP[destination_name.color]
1416+
if destination_name.preposition(True) is not None:
1417+
destination_name = f'to {destination_name}'
1418+
else:
1419+
destination_name = 'to a mysterious place'
1420+
color = COLOR_MAP['White']
14221421

1423-
new_msg = f"\x08\x05{color}Warp {destination_name}?\x05\40\x09\x01\x01\x1b\x05\x42OK\x01No\x05\40"
1424-
update_message_by_id(messages, id, new_msg)
1422+
new_msg = f"\x08\x05{color}Warp {destination_name}?\x05\40\x09\x01\x01\x1b\x05\x42OK\x01No\x05\40"
1423+
update_message_by_id(messages, id, new_msg)
14251424

14261425
if world.settings.owl_drops != 'off':
14271426
for id, entr in owl_messages.items():

Patches.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,7 @@ def set_entrance_updates(entrances: Iterable[Entrance]) -> None:
874874
if world.settings.adult_trade_shuffle or world.settings.item_pool_value in ('plentiful', 'ludicrous'):
875875
rom.write_byte(rom.sym('CFG_ADULT_TRADE_SHUFFLE'), 0x01)
876876
move_fado_in_lost_woods(rom)
877-
if world.settings.shuffle_child_trade or world.settings.logic_rules == 'glitched':
877+
if world.settings.shuffle_child_trade or world.settings.logic_rules == 'advanced':
878878
rom.write_byte(rom.sym('CFG_CHILD_TRADE_SHUFFLE'), 0x01)
879879

880880
if world.settings.shuffle_overworld_entrances:
@@ -2012,10 +2012,7 @@ def update_scrub_text(message: bytearray, text_replacement: list[str], default_p
20122012
area = GossipText(area.text(world.settings.clearer_hints, preposition=True, use_2nd_person=True), [area.color], prefix='', capitalize=False)
20132013
compass_message = f"\x13\x75\x08You found the \x05\x41Compass\x05\x40\x01for {dungeon_name}\x05\x40!\x01The {vanilla_reward} can be found\x01{area}!\x09"
20142014
else:
2015-
if world.settings.logic_rules == 'glitched':
2016-
boss_location = world.get_location(dungeon.vanilla_boss_name)
2017-
else:
2018-
boss_location = next(filter(lambda loc: loc.type == 'Boss', world.get_entrance(f'{dungeon} Before Boss -> {dungeon.vanilla_boss_name} Boss Room').connected_region.locations))
2015+
boss_location = next(filter(lambda loc: loc.type == 'Boss', world.get_entrance(f'{dungeon} Before Boss -> {dungeon.vanilla_boss_name} Boss Room').connected_region.locations))
20192016
dungeon_reward = boss_location.item.name
20202017
compass_message = f"\x13\x75\x08You found the \x05\x41Compass\x05\x40\x01for {dungeon_name}\x05\x40!\x01It holds the \x05{COLOR_MAP[REWARD_COLORS[dungeon_reward]]}{dungeon_reward}\x05\x40!\x09"
20212018
if world.settings.shuffle_dungeon_rewards != 'dungeon':

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ Differences between `dev-fenhl` and [`Dev-R`](https://github.com/Roman971/OoT-Ra
6262
* “Standard Anti-Weekly Settings (Beginner)” disables every location that's enabled in “S7 Tournament” and enables every location that's disabled there, as well as changing some miscellaneous settings. See [the official document](https://docs.google.com/document/d/1sbL6Zju943F5qyx4QbTLUsqZqOTMmvqKVbDwJl08SGc/edit) for details.
6363
* “Standard Anti-Weekly Settings (Advanced)” adds “Shuffle Rupees & Hearts”, “Shuffle Pots”, “Shuffle Crates”, “Shuffle Beehives”, and “Shuffle Silver Rupees”, has a minimal item pool, and adds extra ice traps.
6464
* “Triforce Blitz S2” is a fast-paced game mode with very powerful hints used for [a tournament](https://midos.house/event/tfb/2), taken from [Elagatua's `Dev` branch](https://github.com/Elagatua/OoT-Randomizer/tree/Dev). Note that the tournament itself was played on that branch, not this one. See [the official website](https://www.triforceblitz.com/) for details.
65-
* “SGL 2023 Tournament” is a game mode that was used for [a tournament at SpeedGaming Live 2023](https://midos.house/event/sgl/2023live) as well as [an online tournament](https://midos.house/event/sgl/2023onl), taken from [Elagatua's `feature/sgl-2023` branch](https://github.com/Elagatua/OoT-Randomizer/tree/feature/sgl-2023). Note that the tournament itself was played on that branch, not this one. See [the official document](https://docs.google.com/document/d/1EACqBl8ZOreD6xT5jQ2HrdLOnpBpKyjS3FUYK8XFeqg/edit) for details.
6665
* “SDG Bingo Tournament 3” is a variant of “Bingo” used for an ongoing tournament. Note that the tournament itself is being played on version 8.0 of the randomizer, not this branch. See [the official document](https://docs.google.com/document/d/1fpDPSBGH9YQeC9W3P1SMDE7FhoikVgbFTJapqKnMmL4/edit) for details.
6766
* Other changes:
6867
* New hint distribution option `boss_goal_names` (defaults to `true`) that can be disabled to force dungeon reward names to be used in Goal hints instead of boss names even if dungeon rewards aren't shuffled. ([#2416](https://github.com/OoTRandomizer/OoT-Randomizer/pull/2416))

SettingsList.py

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from Location import LocationIterator
1212
from LocationList import location_table
1313
from Models import get_model_choices
14-
from SettingsListTricks import logic_tricks
14+
from SettingsListTricks import logic_tricks, advanced_logic_tricks
1515
from SettingTypes import SettingInfo, SettingInfoStr, SettingInfoList, SettingInfoDict, Textbox, Button, Checkbutton, \
1616
Combobox, Radiobutton, Fileinput, Directoryinput, Textinput, ComboboxInt, Scale, Numberinput, MultipleSelect, \
1717
SearchBox
@@ -724,7 +724,7 @@ class SettingInfos:
724724
default = 'glitchless',
725725
choices = {
726726
'glitchless': 'Glitchless',
727-
'glitched': 'Glitched',
727+
'advanced': 'Advanced',
728728
'none': 'No Logic',
729729
},
730730
gui_tooltip = '''\
@@ -736,21 +736,19 @@ class SettingInfos:
736736
some minor tricks. Add minor tricks to consider for logic
737737
in the 'Detailed Logic' tab.
738738
739-
'Glitched': Movement-oriented glitches are likely required.
740-
No locations excluded.
739+
'Advanced': More Glitchless tricks and toggleable
740+
glitches for accessability to curate the overall difficulty
741+
level for every skill level.
741742
742743
'No Logic': Maximize randomization, All locations are
743744
considered available. MAY BE IMPOSSIBLE TO BEAT.
744745
''',
745746
disable = {
746-
'glitchless': {'settings': ['tricks_list_msg']},
747-
'glitched': {'settings': ['allowed_tricks', 'shuffle_interior_entrances', 'shuffle_hideout_entrances', 'shuffle_gerudo_fortress_heart_piece', 'shuffle_grotto_entrances',
748-
'shuffle_dungeon_entrances', 'shuffle_overworld_entrances', 'shuffle_gerudo_valley_river_exit', 'owl_drops',
749-
'warp_songs', 'blue_warps', 'shuffle_child_spawn', 'shuffle_adult_spawn', 'mq_dungeons_mode', 'mq_dungeons_specific',
750-
'mq_dungeons_count', 'shuffle_bosses', 'shuffle_ganon_tower', 'dungeon_shortcuts', 'deadly_bonks',
751-
'shuffle_freestanding_items', 'shuffle_pots', 'shuffle_empty_pots', 'shuffle_crates', 'shuffle_empty_crates', 'shuffle_beehives', 'shuffle_silver_rupees', 'shuffle_wonderitems',
752-
'mix_entrance_pools', 'decouple_entrances', 'logic_water_gold_scale_no_entry']},
753-
'none': {'settings': ['dungeon_back_access', 'allowed_tricks', 'logic_no_night_tokens_without_suns_song', 'logic_water_gold_scale_no_entry', 'reachable_locations']},
747+
'glitchless': {'settings': ['tricks_list_msg', 'advanced_allowed_tricks']},
748+
# Forcing blue fire arrows to be on, and the tcg lens setting to be off as we can do it without the lens logically
749+
# and don't care if people do 1/32
750+
'advanced': {'settings': ['tricks_list_msg', 'blue_fire_arrows', 'tcg_requires_lens']},
751+
'none': {'settings': ['dungeon_back_access', 'allowed_tricks', 'advanced_allowed_tricks', 'logic_no_night_tokens_without_suns_song', 'logic_water_gold_scale_no_entry', 'reachable_locations']},
754752
},
755753
shared = True,
756754
)
@@ -3768,8 +3766,26 @@ class SettingInfos:
37683766
and MAY be required to complete the game.
37693767
37703768
Tricks in the left column are NEVER required.
3769+
'''
3770+
)
37713771

3772-
Tricks are only relevant for Glitchless logic.
3772+
advanced_allowed_tricks = SearchBox(
3773+
gui_text = "Enable Advanced Tricks",
3774+
shared = True,
3775+
choices = {
3776+
val['name']: gui_text for gui_text, val in advanced_logic_tricks.items()
3777+
},
3778+
default = [],
3779+
gui_params = {
3780+
'choice_tooltip': {choice['name']: choice['tooltip'] for choice in advanced_logic_tricks.values()},
3781+
'filterdata': {val['name']: val['tags'] for _, val in advanced_logic_tricks.items()},
3782+
"hide_when_disabled": True,
3783+
},
3784+
gui_tooltip='''
3785+
Tricks moved to the right column are in-logic
3786+
and MAY be required to complete the game.
3787+
3788+
Tricks in the left column are NEVER required.
37733789
'''
37743790
)
37753791

@@ -4614,14 +4630,18 @@ class SettingInfos:
46144630
)
46154631

46164632
blue_fire_arrows = Checkbutton(
4617-
gui_text = 'Blue Fire Arrows',
4618-
gui_tooltip = '''\
4633+
gui_text = 'Blue Fire Arrows',
4634+
gui_tooltip = '''\
46194635
Ice arrows gain the power of blue fire.
46204636
They can be used to melt red ice
46214637
and break the mud walls in Dodongo's Cavern.
46224638
''',
4623-
default = False,
4624-
shared = True,
4639+
default = False,
4640+
disabled_default = True,
4641+
gui_params = {
4642+
"hide_when_disabled": True,
4643+
},
4644+
shared = True,
46254645
)
46264646

46274647
fix_broken_drops = Checkbutton(

0 commit comments

Comments
 (0)