Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions worlds/little_witch_nobeta/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,12 +173,14 @@ def create_items(self):
else:
self.multiworld.push_precollected(wind_spell)

# Generate 4 extra of all progressive and useful items
for item in magic_items.keys():
for _ in range(4):
lwn_item = self.create_item(item)
item_pool.append(lwn_item)

# Generate duplicate magic items up to max magic level
if self.options.condensed_magic == Toggle.option_false:
for item in magic_items.keys():
for _ in range(self.options.max_magic_level.value - 1):
lwn_item = self.create_item(item)
item_pool.append(lwn_item)

# Generate 4 extra of all useful items
for item in useful_items.keys():
for _ in range(4):
lwn_item = self.create_item(item)
Expand Down Expand Up @@ -297,7 +299,7 @@ def generate_basic(self):
(self.multiworld.get_location("Secret Passage - Enraged Armor", self.player)
.place_locked_item(self.create_item("Enraged Armor Token")))

(self.multiworld.get_location("Underground - Defeat tania", self.player)
(self.multiworld.get_location("Underground - Tania", self.player)
.place_locked_item(self.create_item("Tania Token")))

(self.multiworld.get_location("Lava Ruins - Monica", self.player)
Expand Down
26 changes: 23 additions & 3 deletions worlds/little_witch_nobeta/locations.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ def __init__(self, player: int, name="", code=None, parent=None):

secret_passage_start_locations: Dict[str, str] = {
"Secret Passage - 35. Dwarven Metalwork in pot after first drop": "Lore",
}

secret_passage_first_fire_barrier_switch_room_locations: Dict[str, str] = {
"Secret Passage - 36. High Elf's Mana Ring in pot beside destructible wall": "Lore",
"Secret Passage - 11. Broken Queen Doll from enemy behind destructible wall": "Lore",
"Secret Passage - Absorption spell chest behind destructible wall": "Chest",
Expand All @@ -58,12 +61,15 @@ def __init__(self, player: int, name="", code=None, parent=None):
secret_passage_after_first_fire_barrier_locations: Dict[str, str] = {
"Secret Passage - 37. Forest Elf's Vest from enemy before hole in floor": "Lore",
"Secret Passage - Wind spell chest in alcove during fall": "Chest",
"Secret Passage - 38. Dark Elf's Ear Sample from pot at magic barrier": "Lore",
}

secret_passage_after_secret_passage_gate_locations: Dict[str, str] = {
"Secret Passage - Ice spell chest behind breakable wall after fall": "Chest",
"Secret Passage - 4. Unknown House Banner from big enemy at spiral stairs": "Lore",
"Secret Passage - Secret area shortcut gate switch": "Metal Gate",
"Secret Passage - Fire spell chest at second fire barrier magic switch": "Chest",
"Secret Passage - Second fire barrier magic switch": "Barrier",
"Secret Passage - 38. Dark Elf's Ear Sample from pot at magic barrier": "Lore",
}

secret_passage_before_enraged_armor_locations: Dict[str, str] = {
Expand Down Expand Up @@ -127,7 +133,7 @@ def __init__(self, player: int, name="", code=None, parent=None):
}

underground_tania_locations: Dict[str, str] = {
"Underground - Defeat tania": "Bosses",
"Underground - Tania": "Bosses",
"Underground - Tania boss arena barrier": "Barrier",
"Underground - Tania shortcut switch on Tania side": "Metal Gate",
"Underground - 98. Lost Maiden's Soul Shard from Tania": "Lore",
Expand Down Expand Up @@ -422,7 +428,9 @@ def __init__(self, player: int, name="", code=None, parent=None):
**shrine_armor_hall_locations,
**shrine_underground_shortcut_locations,
**secret_passage_start_locations,
**secret_passage_first_fire_barrier_switch_room_locations,
**secret_passage_after_first_fire_barrier_locations,
**secret_passage_after_secret_passage_gate_locations,
**secret_passage_before_enraged_armor_locations,
**secret_passage_enraged_armor_locations,
**secret_passage_boss_shortcut_locations,
Expand Down Expand Up @@ -487,7 +495,7 @@ def __init__(self, player: int, name="", code=None, parent=None):
"Secret Passage - Enraged Armor",
"Shrine - Specter Armor",
"Spirit Realm - Vanessa V2",
"Underground - Defeat tania",
"Underground - Tania",
},
"Lore": {
"Abyss - 102. Lost Maiden's Crafted Soul Shard from Nonota",
Expand Down Expand Up @@ -776,12 +784,24 @@ def append_locations(world: "LWNWorld"):
region = world.multiworld.get_region("Secret passage - Start", world.player)
add_location_to_region(location_name, location_id, group_name, region, world)

for location_name in secret_passage_first_fire_barrier_switch_room_locations:
location_id = location_name_to_id[location_name]
group_name = secret_passage_first_fire_barrier_switch_room_locations[location_name]
region = world.multiworld.get_region("Secret passage - First fire barrier switch room", world.player)
add_location_to_region(location_name, location_id, group_name, region, world)

for location_name in secret_passage_after_first_fire_barrier_locations:
location_id = location_name_to_id[location_name]
group_name = secret_passage_after_first_fire_barrier_locations[location_name]
region = world.multiworld.get_region("Secret passage - After first fire barrier", world.player)
add_location_to_region(location_name, location_id, group_name, region, world)

for location_name in secret_passage_after_secret_passage_gate_locations:
location_id = location_name_to_id[location_name]
group_name = secret_passage_after_secret_passage_gate_locations[location_name]
region = world.multiworld.get_region("Secret passage - After secret passage gate", world.player)
add_location_to_region(location_name, location_id, group_name, region, world)

for location_name in secret_passage_before_enraged_armor_locations:
location_id = location_name_to_id[location_name]
group_name = secret_passage_before_enraged_armor_locations[location_name]
Expand Down
26 changes: 24 additions & 2 deletions worlds/little_witch_nobeta/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class Goal(Choice):
"""
The Goal of the game.
[Vanilla] Reaching and beating Nonota will end the game.
[Magic Master] All attack magics (arcane, ice, fire and thunder) must be level 5 before Nonota can be reached.
[Magic Master] All attack magics (arcane, ice, fire and thunder) must be at the max set level before Nonota can be reached.
[Boss Hunt] All boss tokens gained by defeating bosses need to be collected before Nonota can be reached.
[Lore Keeper] All lore items must be collected before Nonota can be reached.
"""
Expand All @@ -26,7 +26,7 @@ class AbyssTrialRequirement(Choice):
Requirement to open the final teleport in Abyss to reach Nonota.
[Vanilla] The three switches at the end of each trial must be destroyed.
[Randomized Item] Requires three trial clear items, which are placed in the item pool.
[Magic Master] All attack magics (arcane, ice, fire and thunder) must be level 5.
[Magic Master] All attack magics (arcane, ice, fire and thunder) must be at the max set level.
[Boss Hunt] All boss tokens gained by defeating bosses need to be collected.
[Lore Keeper] All lore items must be collected.
"""
Expand Down Expand Up @@ -228,6 +228,24 @@ class WindRequirements(Choice):

default = option_start_without

class CondensedMagic(DefaultOffToggle):
"""
Turns each magic type into a single item which grants up to the max magic level.
If start with arcane or absorption is enabled, those will also start at max level.
This is for players who prefer checks with higher stakes.
"""
display_name = "Condensed Magic"

class MaxMagicLevel(Range):
"""
The maximum level for each magic type. A lower number means less magic items in the pool and a less powerful Nobeta.
Magic Master goals will only require up to this max level, and condensed magic will grant up to this level as well.
"""
display_name = "Max Magic Level"
range_start = 1
range_end = 5
default = 5

class SkipsInLogic(OptionSet):
"""
List of in-bound and glitchless skips to be considered in logic.
Expand Down Expand Up @@ -374,6 +392,7 @@ class DeathLink(DefaultOffToggle):
]),
OptionGroup("Logic Options", [
WindRequirements,
CondensedMagic,
RandomizeBossSouls,
RandomizeBossTokens,
SkippableBosses,
Expand All @@ -395,6 +414,7 @@ class DeathLink(DefaultOffToggle):
]),
OptionGroup("Difficulty Options", [
BossRequirementsDifficulty,
MaxMagicLevel,
NoArcane,
NoManaRegeneration,
StartWithAbsorption,
Expand Down Expand Up @@ -433,6 +453,8 @@ class LWNOptions(PerGameCommonOptions):
randomize_crystal_balls: RandomizeCrystalBalls
randomize_crystals: RandomizeCrystals
wind_requirements: WindRequirements
condensed_magic: CondensedMagic
max_magic_level: MaxMagicLevel
skips_in_logic: SkipsInLogic
entrance_randomization: EntranceRandomization
starting_area: StartingArea
Expand Down
6 changes: 4 additions & 2 deletions worlds/little_witch_nobeta/regions.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ class LWNRegion(Region):
"Shrine - Cat Room": {"Shrine - After first magic switch", "Shrine - Armor Hall"},
"Shrine - Armor Hall": {"Secret passage - Start", "Secret passage - After first fire barrier", "Secret Passage - Boss Shortcut", "Shrine - Underground shortcut", "Shrine - Cat Room", "Underground - Start"},
"Shrine - Underground shortcut": {"Shrine - Armor Hall", "Underground - Shrine shortcut"},
"Secret passage - Start": {"Shrine - Armor Hall", "Secret passage - After first fire barrier"},
"Secret passage - After first fire barrier": {"Secret passage - Start", "Secret Passage - Dark Tunnel shortcut", "Shrine - Armor Hall", "Secret Passage - Before Enraged Armor"},
"Secret passage - Start": {"Secret passage - First fire barrier switch room"},
"Secret passage - First fire barrier switch room": {"Secret passage - After first fire barrier"},
"Secret passage - After first fire barrier": {"Secret passage - First fire barrier switch room", "Secret passage - After secret passage gate", "Secret Passage - Before Enraged Armor"},
"Secret passage - After secret passage gate": {"Secret passage - After first fire barrier", "Secret Passage - Dark Tunnel shortcut", "Shrine - Armor Hall"},
"Secret Passage - Before Enraged Armor": {"Secret passage - After first fire barrier", "Secret Passage - Enraged Armor"},
"Secret Passage - Enraged Armor": {"Secret Passage - Boss Shortcut", "Secret Passage - Before Enraged Armor"},
"Secret Passage - Boss Shortcut": {"Shrine - Armor Hall", "Secret Passage - Enraged Armor"},
Expand Down
Loading
Loading