Merged in DR v1.2.0.15
This commit is contained in:
@@ -3812,6 +3812,8 @@ logical_connections = [
|
|||||||
('GT Blocked Stairs Block Path', 'GT Big Chest'),
|
('GT Blocked Stairs Block Path', 'GT Big Chest'),
|
||||||
('GT Speed Torch South Path', 'GT Speed Torch'),
|
('GT Speed Torch South Path', 'GT Speed Torch'),
|
||||||
('GT Speed Torch North Path', 'GT Speed Torch Upper'),
|
('GT Speed Torch North Path', 'GT Speed Torch Upper'),
|
||||||
|
('GT Conveyor Cross Hammer Path', 'GT Conveyor Cross Across Pits'),
|
||||||
|
('GT Conveyor Cross Hookshot Path', 'GT Conveyor Cross'),
|
||||||
('GT Hookshot East-Mid Path', 'GT Hookshot Mid Platform'),
|
('GT Hookshot East-Mid Path', 'GT Hookshot Mid Platform'),
|
||||||
('GT Hookshot Mid-East Path', 'GT Hookshot East Platform'),
|
('GT Hookshot Mid-East Path', 'GT Hookshot East Platform'),
|
||||||
('GT Hookshot North-Mid Path', 'GT Hookshot Mid Platform'),
|
('GT Hookshot North-Mid Path', 'GT Hookshot Mid Platform'),
|
||||||
|
|||||||
2
Doors.py
2
Doors.py
@@ -1115,6 +1115,8 @@ def create_doors(world, player):
|
|||||||
create_door(player, 'GT Invisible Catwalk NE', Nrml).dir(No, 0x9c, Right, High).pos(2),
|
create_door(player, 'GT Invisible Catwalk NE', Nrml).dir(No, 0x9c, Right, High).pos(2),
|
||||||
create_door(player, 'GT Conveyor Cross EN', Nrml).dir(Ea, 0x8b, Top, High).pos(2),
|
create_door(player, 'GT Conveyor Cross EN', Nrml).dir(Ea, 0x8b, Top, High).pos(2),
|
||||||
create_door(player, 'GT Conveyor Cross WN', Intr).dir(We, 0x8b, Top, High).pos(0),
|
create_door(player, 'GT Conveyor Cross WN', Intr).dir(We, 0x8b, Top, High).pos(0),
|
||||||
|
create_door(player, 'GT Conveyor Cross Hammer Path', Lgcl),
|
||||||
|
create_door(player, 'GT Conveyor Cross Hookshot Path', Lgcl),
|
||||||
create_door(player, 'GT Hookshot EN', Intr).dir(Ea, 0x8b, Top, High).pos(0),
|
create_door(player, 'GT Hookshot EN', Intr).dir(Ea, 0x8b, Top, High).pos(0),
|
||||||
create_door(player, 'GT Hookshot East-Mid Path', Lgcl),
|
create_door(player, 'GT Hookshot East-Mid Path', Lgcl),
|
||||||
create_door(player, 'GT Hookshot Mid-East Path', Lgcl),
|
create_door(player, 'GT Hookshot Mid-East Path', Lgcl),
|
||||||
|
|||||||
14
Dungeons.py
14
Dungeons.py
@@ -190,10 +190,11 @@ gt_regions = [
|
|||||||
'GT Tile Room', 'GT Speed Torch', 'GT Speed Torch Upper', 'GT Pots n Blocks', 'GT Crystal Conveyor',
|
'GT Tile Room', 'GT Speed Torch', 'GT Speed Torch Upper', 'GT Pots n Blocks', 'GT Crystal Conveyor',
|
||||||
'GT Crystal Conveyor Corner', 'GT Crystal Conveyor Left', 'GT Crystal Conveyor - Ranged Crystal',
|
'GT Crystal Conveyor Corner', 'GT Crystal Conveyor Left', 'GT Crystal Conveyor - Ranged Crystal',
|
||||||
'GT Crystal Conveyor Corner - Ranged Crystal', 'GT Compass Room', 'GT Invisible Bridges', 'GT Invisible Catwalk',
|
'GT Crystal Conveyor Corner - Ranged Crystal', 'GT Compass Room', 'GT Invisible Bridges', 'GT Invisible Catwalk',
|
||||||
'GT Conveyor Cross', 'GT Hookshot East Platform', 'GT Hookshot Mid Platform', 'GT Hookshot North Platform',
|
'GT Conveyor Cross', 'GT Conveyor Cross Across Pits', 'GT Hookshot East Platform', 'GT Hookshot Mid Platform',
|
||||||
'GT Hookshot South Platform', 'GT Hookshot South Entry', 'GT Hookshot South Entry - Ranged Crystal', 'GT Map Room',
|
'GT Hookshot North Platform', 'GT Hookshot South Platform', 'GT Hookshot South Entry',
|
||||||
'GT Double Switch Entry', 'GT Double Switch Pot Corners - Ranged Switches', 'GT Double Switch Pot Corners',
|
'GT Hookshot South Entry - Ranged Crystal', 'GT Map Room', 'GT Double Switch Entry',
|
||||||
'GT Double Switch Left', 'GT Double Switch Left - Crystal', 'GT Double Switch Entry - Ranged Switches',
|
'GT Double Switch Pot Corners - Ranged Switches', 'GT Double Switch Pot Corners', 'GT Double Switch Left',
|
||||||
|
'GT Double Switch Left - Crystal', 'GT Double Switch Entry - Ranged Switches',
|
||||||
'GT Double Switch Exit', 'GT Spike Crystal Left',
|
'GT Double Switch Exit', 'GT Spike Crystal Left',
|
||||||
'GT Spike Crystal Right', 'GT Warp Maze - Left Section', 'GT Warp Maze - Mid Section',
|
'GT Spike Crystal Right', 'GT Warp Maze - Left Section', 'GT Warp Maze - Mid Section',
|
||||||
'GT Warp Maze - Right Section', 'GT Warp Maze - Pit Section', 'GT Warp Maze - Pit Exit Warp Spot',
|
'GT Warp Maze - Right Section', 'GT Warp Maze - Pit Section', 'GT Warp Maze - Pit Exit Warp Spot',
|
||||||
@@ -204,8 +205,9 @@ gt_regions = [
|
|||||||
'GT Dash Hall', 'GT Hidden Spikes', 'GT Cannonball Bridge', 'GT Refill', 'GT Gauntlet 1', 'GT Gauntlet 2',
|
'GT Dash Hall', 'GT Hidden Spikes', 'GT Cannonball Bridge', 'GT Refill', 'GT Gauntlet 1', 'GT Gauntlet 2',
|
||||||
'GT Gauntlet 3', 'GT Gauntlet 4', 'GT Gauntlet 5', 'GT Beam Dash', 'GT Lanmolas 2', 'GT Quad Pot', 'GT Wizzrobes 1',
|
'GT Gauntlet 3', 'GT Gauntlet 4', 'GT Gauntlet 5', 'GT Beam Dash', 'GT Lanmolas 2', 'GT Quad Pot', 'GT Wizzrobes 1',
|
||||||
'GT Dashing Bridge', 'GT Wizzrobes 2', 'GT Conveyor Bridge', 'GT Torch Cross', 'GT Staredown', 'GT Falling Torches',
|
'GT Dashing Bridge', 'GT Wizzrobes 2', 'GT Conveyor Bridge', 'GT Torch Cross', 'GT Staredown', 'GT Falling Torches',
|
||||||
'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Crystal Inner Circle', 'GT Crystal Circles - Ranged Crystal',
|
'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Crystal Inner Circle',
|
||||||
'GT Left Moldorm Ledge', 'GT Right Moldorm Ledge', 'GT Moldorm', 'GT Moldorm Pit', 'GT Validation', 'GT Validation Door',
|
'GT Crystal Circles - Ranged Crystal', 'GT Left Moldorm Ledge', 'GT Right Moldorm Ledge', 'GT Moldorm',
|
||||||
|
'GT Moldorm Pit', 'GT Validation', 'GT Validation Door',
|
||||||
'GT Frozen Over', 'GT Brightly Lit Hall', 'GT Agahnim 2', 'Ganons Tower Portal'
|
'GT Frozen Over', 'GT Brightly Lit Hall', 'GT Agahnim 2', 'Ganons Tower Portal'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
2
Main.py
2
Main.py
@@ -36,7 +36,7 @@ from source.overworld.EntranceShuffle2 import link_entrances_new
|
|||||||
from source.tools.BPS import create_bps_from_data
|
from source.tools.BPS import create_bps_from_data
|
||||||
from source.classes.CustomSettings import CustomSettings
|
from source.classes.CustomSettings import CustomSettings
|
||||||
|
|
||||||
version_number = '1.2.0.14'
|
version_number = '1.2.0.15'
|
||||||
version_branch = '-u'
|
version_branch = '-u'
|
||||||
__version__ = f'{version_number}{version_branch}'
|
__version__ = f'{version_number}{version_branch}'
|
||||||
|
|
||||||
|
|||||||
@@ -109,10 +109,9 @@ These are now independent of retro mode and have three options: None, Random, an
|
|||||||
|
|
||||||
# Bug Fixes and Notes
|
# Bug Fixes and Notes
|
||||||
|
|
||||||
* 1.2.0.14u
|
* 1.2.0.15u
|
||||||
* Small fix for key logic validation (got rid of a false negative)
|
|
||||||
* Customized doors in ice cross work properly now
|
|
||||||
* GUI reorganization
|
* GUI reorganization
|
||||||
|
* Logic fix for pots in GT conveyor cross
|
||||||
* Auto option for pyramid open (trinity or ER + crystals goal)
|
* Auto option for pyramid open (trinity or ER + crystals goal)
|
||||||
* World model refactor (combining inverted and normal world models)
|
* World model refactor (combining inverted and normal world models)
|
||||||
* Partitioned fix for lamp logic and links house
|
* Partitioned fix for lamp logic and links house
|
||||||
@@ -120,6 +119,10 @@ These are now independent of retro mode and have three options: None, Random, an
|
|||||||
* Reduced universal keys in pool slightly for non-vanilla dungeons
|
* Reduced universal keys in pool slightly for non-vanilla dungeons
|
||||||
* Fake world fix finally
|
* Fake world fix finally
|
||||||
* Some extra restrictions on links house placement for lite/lean
|
* Some extra restrictions on links house placement for lite/lean
|
||||||
|
* Collection_rate works in customizer files
|
||||||
|
* 1.2.0.14u
|
||||||
|
* Small fix for key logic validation (got rid of a false negative)
|
||||||
|
* Customized doors in ice cross work properly now
|
||||||
* 1.2.0.13u
|
* 1.2.0.13u
|
||||||
* Allow green/blue potion refills to be customized
|
* Allow green/blue potion refills to be customized
|
||||||
* OW Map showing dungeon entrance at Snitch Lady (West) fixed (instead of @ HC Courtyard)
|
* OW Map showing dungeon entrance at Snitch Lady (West) fixed (instead of @ HC Courtyard)
|
||||||
|
|||||||
@@ -909,7 +909,8 @@ def create_dungeon_regions(world, player):
|
|||||||
['GT Compass Room EN', 'GT Compass Room Warp']),
|
['GT Compass Room EN', 'GT Compass Room Warp']),
|
||||||
create_dungeon_region(player, 'GT Invisible Bridges', 'Ganon\'s Tower', None, ['GT Invisible Bridges WS']),
|
create_dungeon_region(player, 'GT Invisible Bridges', 'Ganon\'s Tower', None, ['GT Invisible Bridges WS']),
|
||||||
create_dungeon_region(player, 'GT Invisible Catwalk', 'Ganon\'s Tower', None, ['GT Invisible Catwalk ES', 'GT Invisible Catwalk WS', 'GT Invisible Catwalk NW', 'GT Invisible Catwalk NE']),
|
create_dungeon_region(player, 'GT Invisible Catwalk', 'Ganon\'s Tower', None, ['GT Invisible Catwalk ES', 'GT Invisible Catwalk WS', 'GT Invisible Catwalk NW', 'GT Invisible Catwalk NE']),
|
||||||
create_dungeon_region(player, 'GT Conveyor Cross', 'Ganon\'s Tower', ['Ganons Tower - Conveyor Cross Pot Key'], ['GT Conveyor Cross EN', 'GT Conveyor Cross WN']),
|
create_dungeon_region(player, 'GT Conveyor Cross', 'Ganon\'s Tower', ['Ganons Tower - Conveyor Cross Pot Key'], ['GT Conveyor Cross EN', 'GT Conveyor Cross Hammer Path']),
|
||||||
|
create_dungeon_region(player, 'GT Conveyor Cross Across Pits', 'Ganon\'s Tower', None, ['GT Conveyor Cross Hookshot Path', 'GT Conveyor Cross WN']),
|
||||||
create_dungeon_region(player, 'GT Hookshot East Platform', 'Ganon\'s Tower', None, ['GT Hookshot EN', 'GT Hookshot East-Mid Path']),
|
create_dungeon_region(player, 'GT Hookshot East Platform', 'Ganon\'s Tower', None, ['GT Hookshot EN', 'GT Hookshot East-Mid Path']),
|
||||||
create_dungeon_region(player, 'GT Hookshot Mid Platform', 'Ganon\'s Tower', None, ['GT Hookshot Mid-East Path', 'GT Hookshot Mid-South Path', 'GT Hookshot Mid-North Path']),
|
create_dungeon_region(player, 'GT Hookshot Mid Platform', 'Ganon\'s Tower', None, ['GT Hookshot Mid-East Path', 'GT Hookshot Mid-South Path', 'GT Hookshot Mid-North Path']),
|
||||||
create_dungeon_region(player, 'GT Hookshot North Platform', 'Ganon\'s Tower', None, ['GT Hookshot NW', 'GT Hookshot North-Mid Path']),
|
create_dungeon_region(player, 'GT Hookshot North Platform', 'Ganon\'s Tower', None, ['GT Hookshot NW', 'GT Hookshot North-Mid Path']),
|
||||||
|
|||||||
25
Rules.py
25
Rules.py
@@ -209,22 +209,19 @@ def global_rules(world, player):
|
|||||||
set_rule(world.get_entrance('Flute Spot 8', player), lambda state: state.can_flute(player))
|
set_rule(world.get_entrance('Flute Spot 8', player), lambda state: state.can_flute(player))
|
||||||
|
|
||||||
# overworld location rules
|
# overworld location rules
|
||||||
set_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player))
|
set_rule(world.get_location('Ether Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
|
||||||
set_rule(world.get_location('Dark Blacksmith Ruins', player), lambda state: state.has('Return Smith', player))
|
|
||||||
set_rule(world.get_location('Old Man', player), lambda state: state.has('Return Old Man', player))
|
set_rule(world.get_location('Old Man', player), lambda state: state.has('Return Old Man', player))
|
||||||
set_rule(world.get_location('Old Man Drop Off', player), lambda state: state.has('Escort Old Man', player))
|
set_rule(world.get_location('Old Man Drop Off', player), lambda state: state.has('Escort Old Man', player))
|
||||||
|
set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
|
||||||
|
set_rule(world.get_location('Flute Spot', player), lambda state: state.has('Shovel', player))
|
||||||
set_rule(world.get_location('Middle Aged Man', player), lambda state: state.has('Pick Up Purple Chest', player)) # Can S&Q with chest
|
set_rule(world.get_location('Middle Aged Man', player), lambda state: state.has('Pick Up Purple Chest', player)) # Can S&Q with chest
|
||||||
set_rule(world.get_location('Purple Chest', player), lambda state: state.has('Deliver Purple Chest', player)) # Can S&Q with chest
|
set_rule(world.get_location('Purple Chest', player), lambda state: state.has('Deliver Purple Chest', player)) # Can S&Q with chest
|
||||||
|
set_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player))
|
||||||
|
set_rule(world.get_location('Turtle Medallion Pad', player), lambda state: state.has_sword(player) and state.has_turtle_rock_medallion(player)) # sword required to cast magic (!)
|
||||||
|
set_rule(world.get_location('Dark Blacksmith Ruins', player), lambda state: state.has('Return Smith', player))
|
||||||
set_rule(world.get_location('Big Bomb', player), lambda state: state.has('Crystal 5', player) and state.has('Crystal 6', player))
|
set_rule(world.get_location('Big Bomb', player), lambda state: state.has('Crystal 5', player) and state.has('Crystal 6', player))
|
||||||
set_rule(world.get_location('Pyramid Crack', player), lambda state: state.has('Pick Up Big Bomb', player))
|
|
||||||
set_rule(world.get_entrance('Pyramid Crack', player), lambda state: state.has('Detonate Big Bomb', player))
|
|
||||||
set_rule(world.get_location('Master Sword Pedestal', player), lambda state: state.has('Red Pendant', player) and state.has('Blue Pendant', player) and state.has('Green Pendant', player))
|
set_rule(world.get_location('Master Sword Pedestal', player), lambda state: state.has('Red Pendant', player) and state.has('Blue Pendant', player) and state.has('Green Pendant', player))
|
||||||
set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player))
|
set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player))
|
||||||
set_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player))
|
|
||||||
set_rule(world.get_location('Flute Spot', player), lambda state: state.has('Shovel', player))
|
|
||||||
set_rule(world.get_location('Ether Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
|
|
||||||
set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player))
|
|
||||||
set_rule(world.get_location('Turtle Medallion Pad', player), lambda state: state.has_sword(player) and state.has_turtle_rock_medallion(player)) # sword required to cast magic (!)
|
|
||||||
|
|
||||||
# bonk items
|
# bonk items
|
||||||
if world.shuffle_bonk_drops[player]:
|
if world.shuffle_bonk_drops[player]:
|
||||||
@@ -243,12 +240,12 @@ def global_rules(world, player):
|
|||||||
# underworld location rules
|
# underworld location rules
|
||||||
set_rule(world.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player))
|
set_rule(world.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player))
|
||||||
set_rule(world.get_location('Potion Shop', player), lambda state: state.has('Mushroom', player) and state.can_reach('Potion Shop Area', 'Region', player))
|
set_rule(world.get_location('Potion Shop', player), lambda state: state.has('Mushroom', player) and state.can_reach('Potion Shop Area', 'Region', player))
|
||||||
|
set_rule(world.get_location('Sick Kid', player), lambda state: state.has_bottle(player))
|
||||||
|
set_rule(world.get_location('Sahasrahla', player), lambda state: state.has('Green Pendant', player))
|
||||||
set_rule(world.get_location('Missing Smith', player), lambda state: state.has('Get Frog', player))
|
set_rule(world.get_location('Missing Smith', player), lambda state: state.has('Get Frog', player))
|
||||||
set_rule(world.get_location('Blacksmith', player), lambda state: state.has('Return Smith', player))
|
set_rule(world.get_location('Blacksmith', player), lambda state: state.has('Return Smith', player))
|
||||||
set_rule(world.get_location('Magic Bat', player), lambda state: state.has('Magic Powder', player))
|
set_rule(world.get_location('Magic Bat', player), lambda state: state.has('Magic Powder', player))
|
||||||
set_rule(world.get_location('Sick Kid', player), lambda state: state.has_bottle(player))
|
|
||||||
set_rule(world.get_location('Library', player), lambda state: state.has_Boots(player))
|
set_rule(world.get_location('Library', player), lambda state: state.has_Boots(player))
|
||||||
set_rule(world.get_location('Sahasrahla', player), lambda state: state.has('Green Pendant', player))
|
|
||||||
set_rule(world.get_location('Spike Cave', player), lambda state:
|
set_rule(world.get_location('Spike Cave', player), lambda state:
|
||||||
state.has('Hammer', player) and state.can_lift_rocks(player) and
|
state.has('Hammer', player) and state.can_lift_rocks(player) and
|
||||||
((state.has('Cape', player) and state.can_extend_magic(player, 16, True)) or
|
((state.has('Cape', player) and state.can_extend_magic(player, 16, True)) or
|
||||||
@@ -340,6 +337,8 @@ def global_rules(world, player):
|
|||||||
set_rule(world.get_entrance('20 Rupee Cave', player), lambda state: state.can_lift_rocks(player))
|
set_rule(world.get_entrance('20 Rupee Cave', player), lambda state: state.can_lift_rocks(player))
|
||||||
set_rule(world.get_entrance('50 Rupee Cave', player), lambda state: state.can_lift_rocks(player))
|
set_rule(world.get_entrance('50 Rupee Cave', player), lambda state: state.can_lift_rocks(player))
|
||||||
set_rule(world.get_entrance('Hookshot Cave', player), lambda state: state.can_lift_rocks(player))
|
set_rule(world.get_entrance('Hookshot Cave', player), lambda state: state.can_lift_rocks(player))
|
||||||
|
set_rule(world.get_location('Pyramid Crack', player), lambda state: state.has('Pick Up Big Bomb', player))
|
||||||
|
set_rule(world.get_entrance('Pyramid Crack', player), lambda state: state.has('Detonate Big Bomb', player))
|
||||||
set_rule(world.get_entrance('Hammer Peg Cave', player), lambda state: state.has('Hammer', player))
|
set_rule(world.get_entrance('Hammer Peg Cave', player), lambda state: state.has('Hammer', player))
|
||||||
set_rule(world.get_entrance('Bonk Fairy (Dark)', player), lambda state: state.has_Boots(player))
|
set_rule(world.get_entrance('Bonk Fairy (Dark)', player), lambda state: state.has_Boots(player))
|
||||||
set_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player))
|
set_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player))
|
||||||
@@ -546,8 +545,8 @@ def global_rules(world, player):
|
|||||||
|
|
||||||
set_rule(world.get_location('Ganons Tower - Bob\'s Torch', player), lambda state: state.has_Boots(player))
|
set_rule(world.get_location('Ganons Tower - Bob\'s Torch', player), lambda state: state.has_Boots(player))
|
||||||
set_rule(world.get_entrance('GT Hope Room EN', player), lambda state: state.has('Cane of Somaria', player))
|
set_rule(world.get_entrance('GT Hope Room EN', player), lambda state: state.has('Cane of Somaria', player))
|
||||||
set_rule(world.get_entrance('GT Conveyor Cross WN', player), lambda state: state.has('Hammer', player))
|
set_rule(world.get_entrance('GT Conveyor Cross Hammer Path', player), lambda state: state.has('Hammer', player))
|
||||||
set_rule(world.get_entrance('GT Conveyor Cross EN', player), lambda state: state.has('Hookshot', player))
|
set_rule(world.get_entrance('GT Conveyor Cross Hookshot Path', player), lambda state: state.has('Hookshot', player))
|
||||||
if not world.get_door('GT Speed Torch SE', player).entranceFlag:
|
if not world.get_door('GT Speed Torch SE', player).entranceFlag:
|
||||||
set_rule(world.get_entrance('GT Speed Torch SE', player), lambda state: state.has('Fire Rod', player))
|
set_rule(world.get_entrance('GT Speed Torch SE', player), lambda state: state.has('Fire Rod', player))
|
||||||
set_rule(world.get_entrance('GT Hookshot South-Mid Path', player), lambda state: state.has('Hookshot', player))
|
set_rule(world.get_entrance('GT Hookshot South-Mid Path', player), lambda state: state.has('Hookshot', player))
|
||||||
|
|||||||
@@ -253,6 +253,7 @@
|
|||||||
"randomizer.item.worldstate.open": "Open",
|
"randomizer.item.worldstate.open": "Open",
|
||||||
"randomizer.item.worldstate.inverted": "Inverted",
|
"randomizer.item.worldstate.inverted": "Inverted",
|
||||||
"randomizer.item.worldstate.retro": "Retro",
|
"randomizer.item.worldstate.retro": "Retro",
|
||||||
|
"randomizer.item.retro": "Enable Retro",
|
||||||
|
|
||||||
"randomizer.item.logiclevel": "Logic Level",
|
"randomizer.item.logiclevel": "Logic Level",
|
||||||
"randomizer.item.logiclevel.noglitches": "No Glitches",
|
"randomizer.item.logiclevel.noglitches": "No Glitches",
|
||||||
@@ -347,7 +348,7 @@
|
|||||||
"randomizer.item.potshuffle": "Pot Shuffle (Legacy)",
|
"randomizer.item.potshuffle": "Pot Shuffle (Legacy)",
|
||||||
|
|
||||||
"randomizer.item.dropshuffle": "Shuffle Enemy Key Drops",
|
"randomizer.item.dropshuffle": "Shuffle Enemy Key Drops",
|
||||||
"randomizer.item.keydropshuffle": "Key Drop Shuffle (Legacy)",
|
"randomizer.item.keydropshuffle": "Enable Key Drop Shuffle (Legacy)",
|
||||||
|
|
||||||
"randomizer.item.take_any": "Take Any Caves",
|
"randomizer.item.take_any": "Take Any Caves",
|
||||||
"randomizer.item.take_any.none": "None",
|
"randomizer.item.take_any.none": "None",
|
||||||
|
|||||||
@@ -11,12 +11,8 @@
|
|||||||
"options": [
|
"options": [
|
||||||
"standard",
|
"standard",
|
||||||
"open",
|
"open",
|
||||||
"inverted",
|
"inverted"
|
||||||
"retro"
|
]
|
||||||
],
|
|
||||||
"config": {
|
|
||||||
"command": "worldstate"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"logiclevel": {
|
"logiclevel": {
|
||||||
"type": "selectbox",
|
"type": "selectbox",
|
||||||
@@ -65,6 +61,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rightItemFrame": {
|
"rightItemFrame": {
|
||||||
|
"retro": {
|
||||||
|
"type": "button",
|
||||||
|
"config": {
|
||||||
|
"command": "retro"
|
||||||
|
}
|
||||||
|
},
|
||||||
"sortingalgo": {
|
"sortingalgo": {
|
||||||
"type": "selectbox",
|
"type": "selectbox",
|
||||||
"default": "balanced",
|
"default": "balanced",
|
||||||
@@ -155,9 +157,11 @@
|
|||||||
},
|
},
|
||||||
"dropshuffle": {
|
"dropshuffle": {
|
||||||
"type": "checkbox"
|
"type": "checkbox"
|
||||||
},
|
}
|
||||||
|
},
|
||||||
|
"leftPoolFrame2": {
|
||||||
"keydropshuffle": {
|
"keydropshuffle": {
|
||||||
"type": "checkbox",
|
"type": "button",
|
||||||
"config": {
|
"config": {
|
||||||
"command": "keydropshuffle"
|
"command": "keydropshuffle"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ class CustomSettings(object):
|
|||||||
args.crystals_gt[p] = get_setting(settings['crystals_gt'], args.crystals_gt[p])
|
args.crystals_gt[p] = get_setting(settings['crystals_gt'], args.crystals_gt[p])
|
||||||
args.crystals_ganon[p] = get_setting(settings['crystals_ganon'], args.crystals_ganon[p])
|
args.crystals_ganon[p] = get_setting(settings['crystals_ganon'], args.crystals_ganon[p])
|
||||||
args.experimental[p] = get_setting(settings['experimental'], args.experimental[p])
|
args.experimental[p] = get_setting(settings['experimental'], args.experimental[p])
|
||||||
|
args.collection_rate[p] = get_setting(settings['collection_rate'], args.collection_rate[p])
|
||||||
args.openpyramid[p] = get_setting(settings['openpyramid'], args.openpyramid[p])
|
args.openpyramid[p] = get_setting(settings['openpyramid'], args.openpyramid[p])
|
||||||
args.bigkeyshuffle[p] = get_setting(settings['bigkeyshuffle'], args.bigkeyshuffle[p])
|
args.bigkeyshuffle[p] = get_setting(settings['bigkeyshuffle'], args.bigkeyshuffle[p])
|
||||||
args.keyshuffle[p] = get_setting(settings['keyshuffle'], args.keyshuffle[p])
|
args.keyshuffle[p] = get_setting(settings['keyshuffle'], args.keyshuffle[p])
|
||||||
@@ -257,6 +258,7 @@ class CustomSettings(object):
|
|||||||
settings_dict[p]['crystals_gt'] = world.crystals_gt_orig[p]
|
settings_dict[p]['crystals_gt'] = world.crystals_gt_orig[p]
|
||||||
settings_dict[p]['crystals_ganon'] = world.crystals_ganon_orig[p]
|
settings_dict[p]['crystals_ganon'] = world.crystals_ganon_orig[p]
|
||||||
settings_dict[p]['experimental'] = world.experimental[p]
|
settings_dict[p]['experimental'] = world.experimental[p]
|
||||||
|
settings_dict[p]['collection_rate'] = world.collection_rate[p]
|
||||||
settings_dict[p]['openpyramid'] = world.open_pyramid[p]
|
settings_dict[p]['openpyramid'] = world.open_pyramid[p]
|
||||||
settings_dict[p]['bigkeyshuffle'] = world.bigkeyshuffle[p]
|
settings_dict[p]['bigkeyshuffle'] = world.bigkeyshuffle[p]
|
||||||
settings_dict[p]['keyshuffle'] = world.keyshuffle[p]
|
settings_dict[p]['keyshuffle'] = world.keyshuffle[p]
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ SETTINGSTOPROCESS = {
|
|||||||
"crystals_ganon": "crystals_ganon",
|
"crystals_ganon": "crystals_ganon",
|
||||||
"weapons": "swords",
|
"weapons": "swords",
|
||||||
|
|
||||||
|
"retro": "retro",
|
||||||
"sortingalgo": "algorithm",
|
"sortingalgo": "algorithm",
|
||||||
"accessibility": "accessibility",
|
"accessibility": "accessibility",
|
||||||
"restrict_boss_items": "restrict_boss_items",
|
"restrict_boss_items": "restrict_boss_items",
|
||||||
|
|||||||
@@ -57,7 +57,10 @@ def loadcliargs(gui, args, settings=None):
|
|||||||
pagewidgets[widget].selectbox.options = theseOptions
|
pagewidgets[widget].selectbox.options = theseOptions
|
||||||
elif thisType == "spinbox":
|
elif thisType == "spinbox":
|
||||||
pagewidgets[widget].label.configure(text=label)
|
pagewidgets[widget].label.configure(text=label)
|
||||||
pagewidgets[widget].storageVar.set(args[arg])
|
elif thisType == 'button':
|
||||||
|
pagewidgets[widget].button.configure(text=label)
|
||||||
|
if hasattr(pagewidgets[widget], 'storageVar'):
|
||||||
|
pagewidgets[widget].storageVar.set(args[arg])
|
||||||
# If we're on the Game Options page and it's not about Hints
|
# If we're on the Game Options page and it's not about Hints
|
||||||
if subpage == "gameoptions" and widget not in ["hints", "collection_rate"]:
|
if subpage == "gameoptions" and widget not in ["hints", "collection_rate"]:
|
||||||
# Check if we've got settings
|
# Check if we've got settings
|
||||||
|
|||||||
@@ -43,7 +43,10 @@ def item_page(parent):
|
|||||||
self.frames["leftPoolHeader"].pack(side=TOP, anchor=W)
|
self.frames["leftPoolHeader"].pack(side=TOP, anchor=W)
|
||||||
|
|
||||||
self.frames["leftPoolFrame"] = Frame(self.frames["leftPoolContainer"])
|
self.frames["leftPoolFrame"] = Frame(self.frames["leftPoolContainer"])
|
||||||
self.frames["leftPoolFrame"].pack(side=LEFT, fill=Y)
|
self.frames["leftPoolFrame"].pack(side=TOP, fill=Y)
|
||||||
|
|
||||||
|
self.frames["leftPoolFrame2"] = Frame(self.frames["leftPoolContainer"])
|
||||||
|
self.frames["leftPoolFrame2"].pack(side=LEFT, fill=Y)
|
||||||
|
|
||||||
self.frames["rightPoolFrame"] = Frame(self.frames["poolFrame"])
|
self.frames["rightPoolFrame"] = Frame(self.frames["poolFrame"])
|
||||||
self.frames["rightPoolFrame"].pack(side=RIGHT)
|
self.frames["rightPoolFrame"].pack(side=RIGHT)
|
||||||
@@ -62,14 +65,16 @@ def item_page(parent):
|
|||||||
for key in dictWidgets:
|
for key in dictWidgets:
|
||||||
self.widgets[key] = dictWidgets[key]
|
self.widgets[key] = dictWidgets[key]
|
||||||
packAttrs = {"anchor":E}
|
packAttrs = {"anchor":E}
|
||||||
if self.widgets[key].type == "checkbox" or framename == "leftPoolFrame":
|
if key == "retro":
|
||||||
|
packAttrs["side"] = RIGHT
|
||||||
|
if self.widgets[key].type == "checkbox" or framename.startswith("leftPoolFrame"):
|
||||||
packAttrs["anchor"] = W
|
packAttrs["anchor"] = W
|
||||||
if framename == "checkboxes":
|
if framename == "checkboxes":
|
||||||
packAttrs["side"] = LEFT
|
packAttrs["side"] = LEFT
|
||||||
packAttrs["padx"] = (10,0)
|
packAttrs["padx"] = (10, 0)
|
||||||
elif framename == "leftPoolHeader":
|
elif framename == "leftPoolHeader":
|
||||||
packAttrs["side"] = LEFT
|
packAttrs["side"] = LEFT
|
||||||
packAttrs["padx"] = (0,20)
|
packAttrs["padx"] = (0, 20)
|
||||||
packAttrs = widgets.add_padding_from_config(packAttrs, theseWidgets[key])
|
packAttrs = widgets.add_padding_from_config(packAttrs, theseWidgets[key])
|
||||||
self.widgets[key].pack(packAttrs)
|
self.widgets[key].pack(packAttrs)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
from tkinter import messagebox, Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, LEFT, RIGHT, X
|
from tkinter import messagebox, Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, LEFT, RIGHT, X
|
||||||
|
from tkinter import Button
|
||||||
from source.classes.Empty import Empty
|
from source.classes.Empty import Empty
|
||||||
|
|
||||||
# Override Spinbox to include mousewheel support for changing value
|
# Override Spinbox to include mousewheel support for changing value
|
||||||
@@ -172,6 +173,22 @@ def make_textbox(self, parent, label, storageVar, manager, managerAttrs):
|
|||||||
widget.textbox.pack(managerAttrs["textbox"] if managerAttrs is not None and "textbox" in managerAttrs else None)
|
widget.textbox.pack(managerAttrs["textbox"] if managerAttrs is not None and "textbox" in managerAttrs else None)
|
||||||
return widget
|
return widget
|
||||||
|
|
||||||
|
|
||||||
|
def make_button(self, parent, label, manager, managerAttrs, config):
|
||||||
|
self = Frame(parent)
|
||||||
|
if config and "command" in config:
|
||||||
|
self.command = config["command"]
|
||||||
|
else:
|
||||||
|
self.command = lambda: None
|
||||||
|
|
||||||
|
self.button = Button(parent, text=label, command=lambda: widget_command(self, self.command))
|
||||||
|
if managerAttrs is not None:
|
||||||
|
self.button.pack(managerAttrs)
|
||||||
|
else:
|
||||||
|
self.button.pack(anchor='w')
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
# Make a generic widget
|
# Make a generic widget
|
||||||
def make_widget(self, type, parent, label, storageVar=None, manager=None, managerAttrs=dict(),
|
def make_widget(self, type, parent, label, storageVar=None, manager=None, managerAttrs=dict(),
|
||||||
options=None, config=None):
|
options=None, config=None):
|
||||||
@@ -201,6 +218,8 @@ def make_widget(self, type, parent, label, storageVar=None, manager=None, manage
|
|||||||
if thisStorageVar is None:
|
if thisStorageVar is None:
|
||||||
thisStorageVar = StringVar()
|
thisStorageVar = StringVar()
|
||||||
widget = make_textbox(self, parent, label, thisStorageVar, manager, managerAttrs)
|
widget = make_textbox(self, parent, label, thisStorageVar, manager, managerAttrs)
|
||||||
|
elif type == 'button':
|
||||||
|
widget = make_button(self, parent, label, manager, managerAttrs, config)
|
||||||
widget.type = type
|
widget.type = type
|
||||||
return widget
|
return widget
|
||||||
|
|
||||||
@@ -243,36 +262,35 @@ def add_padding_from_config(packAttrs, defn):
|
|||||||
def widget_command(widget, command=""):
|
def widget_command(widget, command=""):
|
||||||
root = widget.winfo_toplevel()
|
root = widget.winfo_toplevel()
|
||||||
text_output = ""
|
text_output = ""
|
||||||
if command == "worldstate":
|
if command == "retro":
|
||||||
if widget.storageVar.get() == 'retro':
|
temp_widget = root.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"]
|
||||||
temp_widget = root.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"]
|
text_output += f'\n {temp_widget.label.cget("text")}'
|
||||||
text_output += f'\n {temp_widget.label.cget("text")}'
|
temp_widget.storageVar.set('universal')
|
||||||
temp_widget.storageVar.set('universal')
|
|
||||||
|
|
||||||
temp_widget = root.pages["randomizer"].pages["item"].widgets["bow_mode"]
|
temp_widget = root.pages["randomizer"].pages["item"].widgets["bow_mode"]
|
||||||
text_output += f'\n {temp_widget.label.cget("text")}'
|
text_output += f'\n {temp_widget.label.cget("text")}'
|
||||||
if temp_widget.storageVar.get() == 'progressive':
|
if temp_widget.storageVar.get() == 'progressive':
|
||||||
temp_widget.storageVar.set('retro')
|
temp_widget.storageVar.set('retro')
|
||||||
elif temp_widget.storageVar.get() == 'silvers':
|
elif temp_widget.storageVar.get() == 'silvers':
|
||||||
temp_widget.storageVar.set('retro_silvers')
|
temp_widget.storageVar.set('retro_silvers')
|
||||||
|
|
||||||
temp_widget = root.pages["randomizer"].pages["item"].widgets["take_any"]
|
temp_widget = root.pages["randomizer"].pages["item"].widgets["take_any"]
|
||||||
text_output += f'\n {temp_widget.label.cget("text")}'
|
text_output += f'\n {temp_widget.label.cget("text")}'
|
||||||
if temp_widget.storageVar.get() == 'none':
|
if temp_widget.storageVar.get() == 'none':
|
||||||
temp_widget.storageVar.set('random')
|
temp_widget.storageVar.set('random')
|
||||||
|
|
||||||
widget.storageVar.set('open')
|
messagebox.showinfo('', f'The following settings were changed:{text_output}')
|
||||||
messagebox.showinfo('', f'The following settings were changed:{text_output}')
|
|
||||||
elif command == "keydropshuffle":
|
elif command == "keydropshuffle":
|
||||||
if widget.storageVar.get() > 0:
|
temp_widget = root.pages["randomizer"].pages["item"].widgets["pottery"]
|
||||||
temp_widget = root.pages["randomizer"].pages["item"].widgets["pottery"]
|
text_output += f'\n {temp_widget.label.cget("text")}'
|
||||||
text_output += f'\n {temp_widget.label.cget("text")}'
|
if temp_widget.storageVar.get() == 'none':
|
||||||
if temp_widget.storageVar.get() == 'none':
|
temp_widget.storageVar.set('keys')
|
||||||
temp_widget.storageVar.set('keys')
|
|
||||||
|
|
||||||
temp_widget = root.pages["randomizer"].pages["item"].widgets["dropshuffle"]
|
temp_widget = root.pages["randomizer"].pages["item"].widgets["dropshuffle"]
|
||||||
|
text_output += f'\n {temp_widget.checkbox.cget("text")}'
|
||||||
|
if temp_widget.storageVar.get() == 0:
|
||||||
temp_widget.storageVar.set(1)
|
temp_widget.storageVar.set(1)
|
||||||
text_output += f'\n {temp_widget.checkbox.cget("text")}'
|
|
||||||
|
|
||||||
widget.storageVar.set(0)
|
if text_output:
|
||||||
messagebox.showinfo('', f'The following settings were changed:{text_output}')
|
messagebox.showinfo('', f'The following settings were changed:{text_output}')
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user