LADX: Open Mabe Option (#3964)
* open mabe option swaps east mabe rocks for bushes * add open mabe to slot data * use upstream overworld option Instead of a standalone option, use upstream's "overworld" option, which we don't use yet but it leaves better space for the future * use ladxr_setting for consistency * newline
This commit is contained in:
parent
7c8d102c17
commit
e1a1cd1067
|
@ -58,7 +58,6 @@ from . import hints
|
||||||
|
|
||||||
from .patches import bank34
|
from .patches import bank34
|
||||||
from .utils import formatText
|
from .utils import formatText
|
||||||
from ..Options import TrendyGame, Palette, Warps
|
|
||||||
from .roomEditor import RoomEditor, Object
|
from .roomEditor import RoomEditor, Object
|
||||||
from .patches.aesthetics import rgb_to_bin, bin_to_rgb
|
from .patches.aesthetics import rgb_to_bin, bin_to_rgb
|
||||||
|
|
||||||
|
@ -66,7 +65,7 @@ from .locations.keyLocation import KeyLocation
|
||||||
|
|
||||||
from BaseClasses import ItemClassification
|
from BaseClasses import ItemClassification
|
||||||
from ..Locations import LinksAwakeningLocation
|
from ..Locations import LinksAwakeningLocation
|
||||||
from ..Options import TrendyGame, Palette, MusicChangeCondition, BootsControls
|
from ..Options import TrendyGame, Palette, MusicChangeCondition, Warps
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .. import LinksAwakeningWorld
|
from .. import LinksAwakeningWorld
|
||||||
|
@ -156,6 +155,8 @@ def generateRom(args, world: "LinksAwakeningWorld"):
|
||||||
if not world.ladxr_settings.rooster:
|
if not world.ladxr_settings.rooster:
|
||||||
patches.maptweaks.tweakMap(rom)
|
patches.maptweaks.tweakMap(rom)
|
||||||
patches.maptweaks.tweakBirdKeyRoom(rom)
|
patches.maptweaks.tweakBirdKeyRoom(rom)
|
||||||
|
if world.ladxr_settings.overworld == "openmabe":
|
||||||
|
patches.maptweaks.openMabe(rom)
|
||||||
patches.chest.fixChests(rom)
|
patches.chest.fixChests(rom)
|
||||||
patches.shop.fixShop(rom)
|
patches.shop.fixShop(rom)
|
||||||
patches.rooster.patchRooster(rom)
|
patches.rooster.patchRooster(rom)
|
||||||
|
@ -247,7 +248,7 @@ def generateRom(args, world: "LinksAwakeningWorld"):
|
||||||
patches.core.quickswap(rom, 1)
|
patches.core.quickswap(rom, 1)
|
||||||
elif world.ladxr_settings.quickswap == 'b':
|
elif world.ladxr_settings.quickswap == 'b':
|
||||||
patches.core.quickswap(rom, 0)
|
patches.core.quickswap(rom, 0)
|
||||||
|
|
||||||
patches.core.addBootsControls(rom, world.options.boots_controls)
|
patches.core.addBootsControls(rom, world.options.boots_controls)
|
||||||
|
|
||||||
|
|
||||||
|
@ -397,7 +398,7 @@ def generateRom(args, world: "LinksAwakeningWorld"):
|
||||||
# Then put new text in
|
# Then put new text in
|
||||||
for bucket_idx, (orig_idx, data) in enumerate(bucket):
|
for bucket_idx, (orig_idx, data) in enumerate(bucket):
|
||||||
rom.texts[shuffled[bucket_idx][0]] = data
|
rom.texts[shuffled[bucket_idx][0]] = data
|
||||||
|
|
||||||
|
|
||||||
if world.options.trendy_game != TrendyGame.option_normal:
|
if world.options.trendy_game != TrendyGame.option_normal:
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,12 @@ class World:
|
||||||
self._addEntrance("moblin_cave", graveyard, moblin_cave, None)
|
self._addEntrance("moblin_cave", graveyard, moblin_cave, None)
|
||||||
|
|
||||||
# "Ukuku Prairie"
|
# "Ukuku Prairie"
|
||||||
ukuku_prairie = Location().connect(mabe_village, POWER_BRACELET).connect(graveyard, POWER_BRACELET)
|
ukuku_prairie = Location()
|
||||||
|
if options.overworld == "openmabe":
|
||||||
|
ukuku_prairie.connect(mabe_village, r.bush)
|
||||||
|
else:
|
||||||
|
ukuku_prairie.connect(mabe_village, POWER_BRACELET)
|
||||||
|
ukuku_prairie.connect(graveyard, POWER_BRACELET)
|
||||||
ukuku_prairie.connect(Location().add(TradeSequenceItem(0x07B, TRADING_ITEM_STICK)), TRADING_ITEM_BANANAS)
|
ukuku_prairie.connect(Location().add(TradeSequenceItem(0x07B, TRADING_ITEM_STICK)), TRADING_ITEM_BANANAS)
|
||||||
ukuku_prairie.connect(Location().add(TradeSequenceItem(0x087, TRADING_ITEM_HONEYCOMB)), TRADING_ITEM_STICK)
|
ukuku_prairie.connect(Location().add(TradeSequenceItem(0x087, TRADING_ITEM_HONEYCOMB)), TRADING_ITEM_STICK)
|
||||||
self._addEntrance("prairie_left_phone", ukuku_prairie, None, None)
|
self._addEntrance("prairie_left_phone", ukuku_prairie, None, None)
|
||||||
|
|
|
@ -38,3 +38,12 @@ def tweakBirdKeyRoom(rom):
|
||||||
re.moveObject(2, 5, 3, 6)
|
re.moveObject(2, 5, 3, 6)
|
||||||
re.addEntity(3, 5, 0x9D)
|
re.addEntity(3, 5, 0x9D)
|
||||||
re.store(rom)
|
re.store(rom)
|
||||||
|
|
||||||
|
|
||||||
|
def openMabe(rom):
|
||||||
|
# replaces rocks on east side of Mabe Village with bushes
|
||||||
|
re = RoomEditor(rom, 0x094)
|
||||||
|
re.changeObject(5, 1, 0x5C)
|
||||||
|
re.overlay[5 + 1 * 10] = 0x5C
|
||||||
|
re.overlay[5 + 2 * 10] = 0x5C
|
||||||
|
re.store(rom)
|
||||||
|
|
|
@ -169,7 +169,7 @@ Note, some entrances can lead into water, use the warp-to-home from the save&qui
|
||||||
[Never] you can never steal from the shop."""),
|
[Never] you can never steal from the shop."""),
|
||||||
Setting('bowwow', 'Special', 'g', 'Good boy mode', options=[('normal', '', 'Disabled'), ('always', 'a', 'Enabled'), ('swordless', 's', 'Enabled (swordless)')], default='normal',
|
Setting('bowwow', 'Special', 'g', 'Good boy mode', options=[('normal', '', 'Disabled'), ('always', 'a', 'Enabled'), ('swordless', 's', 'Enabled (swordless)')], default='normal',
|
||||||
description='Allows BowWow to be taken into any area, damage bosses and more enemies. If enabled you always start with bowwow. Swordless option removes the swords from the game and requires you to beat the game without a sword and just bowwow.'),
|
description='Allows BowWow to be taken into any area, damage bosses and more enemies. If enabled you always start with bowwow. Swordless option removes the swords from the game and requires you to beat the game without a sword and just bowwow.'),
|
||||||
Setting('overworld', 'Special', 'O', 'Overworld', options=[('normal', '', 'Normal'), ('dungeondive', 'D', 'Dungeon dive'), ('nodungeons', 'N', 'No dungeons'), ('random', 'R', 'Randomized')], default='normal',
|
Setting('overworld', 'Special', 'O', 'Overworld', options=[('normal', '', 'Normal'), ('dungeondive', 'D', 'Dungeon dive'), ('nodungeons', 'N', 'No dungeons'), ('random', 'R', 'Randomized'), ('openmabe', 'M', 'Open Mabe')], default='normal',
|
||||||
description="""
|
description="""
|
||||||
[Dungeon Dive] Create a different overworld where all the dungeons are directly accessible and almost no chests are located in the overworld.
|
[Dungeon Dive] Create a different overworld where all the dungeons are directly accessible and almost no chests are located in the overworld.
|
||||||
[No dungeons] All dungeons only consist of a boss fight and a instrument reward. Rest of the dungeon is removed.
|
[No dungeons] All dungeons only consist of a boss fight and a instrument reward. Rest of the dungeon is removed.
|
||||||
|
|
|
@ -57,7 +57,7 @@ class TextShuffle(DefaultOffToggle):
|
||||||
|
|
||||||
class Rooster(DefaultOnToggle, LADXROption):
|
class Rooster(DefaultOnToggle, LADXROption):
|
||||||
"""
|
"""
|
||||||
[On] Adds the rooster to the item pool.
|
[On] Adds the rooster to the item pool.
|
||||||
[Off] The rooster spot is still a check giving an item. But you will never find the rooster. In that case, any rooster spot is accessible without rooster by other means.
|
[Off] The rooster spot is still a check giving an item. But you will never find the rooster. In that case, any rooster spot is accessible without rooster by other means.
|
||||||
"""
|
"""
|
||||||
display_name = "Rooster"
|
display_name = "Rooster"
|
||||||
|
@ -70,7 +70,7 @@ class Boomerang(Choice):
|
||||||
[Gift] The boomerang salesman will give you a random item, and the boomerang is shuffled.
|
[Gift] The boomerang salesman will give you a random item, and the boomerang is shuffled.
|
||||||
"""
|
"""
|
||||||
display_name = "Boomerang"
|
display_name = "Boomerang"
|
||||||
|
|
||||||
normal = 0
|
normal = 0
|
||||||
gift = 1
|
gift = 1
|
||||||
default = gift
|
default = gift
|
||||||
|
@ -156,7 +156,7 @@ class ShuffleSmallKeys(DungeonItemShuffle):
|
||||||
[Own Dungeons] The item will be within a dungeon in your world
|
[Own Dungeons] The item will be within a dungeon in your world
|
||||||
[Own World] The item will be somewhere in your world
|
[Own World] The item will be somewhere in your world
|
||||||
[Any World] The item could be anywhere
|
[Any World] The item could be anywhere
|
||||||
[Different World] The item will be somewhere in another world
|
[Different World] The item will be somewhere in another world
|
||||||
"""
|
"""
|
||||||
display_name = "Shuffle Small Keys"
|
display_name = "Shuffle Small Keys"
|
||||||
ladxr_item = "KEY"
|
ladxr_item = "KEY"
|
||||||
|
@ -223,7 +223,7 @@ class Goal(Choice, LADXROption):
|
||||||
The Goal of the game
|
The Goal of the game
|
||||||
[Instruments] The Wind Fish's Egg will only open if you have the required number of Instruments of the Sirens, and play the Ballad of the Wind Fish.
|
[Instruments] The Wind Fish's Egg will only open if you have the required number of Instruments of the Sirens, and play the Ballad of the Wind Fish.
|
||||||
[Seashells] The Egg will open when you bring 20 seashells. The Ballad and Ocarina are not needed.
|
[Seashells] The Egg will open when you bring 20 seashells. The Ballad and Ocarina are not needed.
|
||||||
[Open] The Egg will start pre-opened.
|
[Open] The Egg will start pre-opened.
|
||||||
"""
|
"""
|
||||||
display_name = "Goal"
|
display_name = "Goal"
|
||||||
ladxr_name = "goal"
|
ladxr_name = "goal"
|
||||||
|
@ -313,15 +313,12 @@ class Bowwow(Choice):
|
||||||
|
|
||||||
class Overworld(Choice, LADXROption):
|
class Overworld(Choice, LADXROption):
|
||||||
"""
|
"""
|
||||||
[Dungeon Dive] Create a different overworld where all the dungeons are directly accessible and almost no chests are located in the overworld.
|
[Open Mabe] Replaces rock on the east side of Mabe Village with bushes, allowing access to Ukuku Prairie without Power Bracelet.
|
||||||
[Tiny dungeons] All dungeons only consist of a boss fight and a instrument reward. Rest of the dungeon is removed.
|
|
||||||
"""
|
"""
|
||||||
display_name = "Overworld"
|
display_name = "Overworld"
|
||||||
ladxr_name = "overworld"
|
ladxr_name = "overworld"
|
||||||
option_normal = 0
|
option_normal = 0
|
||||||
option_dungeon_dive = 1
|
option_open_mabe = 1
|
||||||
option_tiny_dungeons = 2
|
|
||||||
# option_shuffled = 3
|
|
||||||
default = option_normal
|
default = option_normal
|
||||||
|
|
||||||
|
|
||||||
|
@ -472,7 +469,7 @@ class GfxMod(FreeText, LADXROption):
|
||||||
|
|
||||||
class Palette(Choice):
|
class Palette(Choice):
|
||||||
"""
|
"""
|
||||||
Sets the palette for the game.
|
Sets the palette for the game.
|
||||||
Note: A few places aren't patched, such as the menu and a few color dungeon tiles.
|
Note: A few places aren't patched, such as the menu and a few color dungeon tiles.
|
||||||
[Normal] The vanilla palette
|
[Normal] The vanilla palette
|
||||||
[1-Bit] One bit of color per channel
|
[1-Bit] One bit of color per channel
|
||||||
|
@ -530,7 +527,6 @@ class InGameHints(DefaultOnToggle):
|
||||||
display_name = "In-game Hints"
|
display_name = "In-game Hints"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ForeignItemIcons(Choice):
|
class ForeignItemIcons(Choice):
|
||||||
"""
|
"""
|
||||||
Choose how to display foreign items.
|
Choose how to display foreign items.
|
||||||
|
@ -562,6 +558,7 @@ ladx_option_groups = [
|
||||||
OptionGroup("Miscellaneous", [
|
OptionGroup("Miscellaneous", [
|
||||||
TradeQuest,
|
TradeQuest,
|
||||||
Rooster,
|
Rooster,
|
||||||
|
Overworld,
|
||||||
TrendyGame,
|
TrendyGame,
|
||||||
InGameHints,
|
InGameHints,
|
||||||
NagMessages,
|
NagMessages,
|
||||||
|
@ -591,12 +588,12 @@ ladx_option_groups = [
|
||||||
@dataclass
|
@dataclass
|
||||||
class LinksAwakeningOptions(PerGameCommonOptions):
|
class LinksAwakeningOptions(PerGameCommonOptions):
|
||||||
logic: Logic
|
logic: Logic
|
||||||
# 'heartpiece': DefaultOnToggle, # description='Includes heart pieces in the item pool'),
|
# 'heartpiece': DefaultOnToggle, # description='Includes heart pieces in the item pool'),
|
||||||
# 'seashells': DefaultOnToggle, # description='Randomizes the secret sea shells hiding in the ground/trees. (chest are always randomized)'),
|
# 'seashells': DefaultOnToggle, # description='Randomizes the secret sea shells hiding in the ground/trees. (chest are always randomized)'),
|
||||||
# 'heartcontainers': DefaultOnToggle, # description='Includes boss heart container drops in the item pool'),
|
# 'heartcontainers': DefaultOnToggle, # description='Includes boss heart container drops in the item pool'),
|
||||||
# 'instruments': DefaultOffToggle, # description='Instruments are placed on random locations, dungeon goal will just contain a random item.'),
|
# 'instruments': DefaultOffToggle, # description='Instruments are placed on random locations, dungeon goal will just contain a random item.'),
|
||||||
tradequest: TradeQuest # description='Trade quest items are randomized, each NPC takes its normal trade quest item, but gives a random item'),
|
tradequest: TradeQuest # description='Trade quest items are randomized, each NPC takes its normal trade quest item, but gives a random item'),
|
||||||
# 'witch': DefaultOnToggle, # description='Adds both the toadstool and the reward for giving the toadstool to the witch to the item pool'),
|
# 'witch': DefaultOnToggle, # description='Adds both the toadstool and the reward for giving the toadstool to the witch to the item pool'),
|
||||||
rooster: Rooster # description='Adds the rooster to the item pool. Without this option, the rooster spot is still a check giving an item. But you will never find the rooster. Any rooster spot is accessible without rooster by other means.'),
|
rooster: Rooster # description='Adds the rooster to the item pool. Without this option, the rooster spot is still a check giving an item. But you will never find the rooster. Any rooster spot is accessible without rooster by other means.'),
|
||||||
# 'boomerang': Boomerang,
|
# 'boomerang': Boomerang,
|
||||||
# 'randomstartlocation': DefaultOffToggle, # 'Randomize where your starting house is located'),
|
# 'randomstartlocation': DefaultOffToggle, # 'Randomize where your starting house is located'),
|
||||||
|
@ -633,6 +630,7 @@ class LinksAwakeningOptions(PerGameCommonOptions):
|
||||||
text_mode: TextMode
|
text_mode: TextMode
|
||||||
no_flash: NoFlash
|
no_flash: NoFlash
|
||||||
in_game_hints: InGameHints
|
in_game_hints: InGameHints
|
||||||
|
overworld: Overworld
|
||||||
|
|
||||||
warp_improvements: Removed
|
warp_improvements: Removed
|
||||||
additional_warp_points: Removed
|
additional_warp_points: Removed
|
||||||
|
|
|
@ -530,6 +530,7 @@ class LinksAwakeningWorld(World):
|
||||||
"shuffle_instruments",
|
"shuffle_instruments",
|
||||||
"nag_messages",
|
"nag_messages",
|
||||||
"hard_mode",
|
"hard_mode",
|
||||||
|
"overworld",
|
||||||
]
|
]
|
||||||
|
|
||||||
# use the default behaviour to grab options
|
# use the default behaviour to grab options
|
||||||
|
|
Loading…
Reference in New Issue