Skip to content

Commit b76f216

Browse files
authored
MM2: Fix invalid weakness failsafe and refactor weakness tests (ArchipelagoMW#4899)
1 parent 04aa471 commit b76f216

File tree

2 files changed

+35
-19
lines changed

2 files changed

+35
-19
lines changed

worlds/mm2/rules.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ def set_rules(world: "MM2World") -> None:
215215
continue
216216
highest, wp = max(zip(weapon_weight.values(), weapon_weight.keys()))
217217
uses = weapon_energy[wp] // weapon_costs[wp]
218-
if int(uses * boss_damage[wp]) > boss_health[boss]:
218+
if int(uses * boss_damage[wp]) >= boss_health[boss]:
219219
used = ceil(boss_health[boss] / boss_damage[wp])
220220
weapon_energy[wp] -= weapon_costs[wp] * used
221221
boss_health[boss] = 0
@@ -226,7 +226,7 @@ def set_rules(world: "MM2World") -> None:
226226
# it should be impossible to be out of energy, simply because even if every boss took 1 from
227227
# Quick Boomerang and no other, it would only be 28 off from defeating all 9,
228228
# which Metal Blade should be able to cover
229-
wp, max_uses = max((weapon, weapon_energy[weapon] // weapon_costs[weapon])
229+
max_uses, wp = max((weapon_energy[weapon] // weapon_costs[weapon], weapon)
230230
for weapon in weapon_weight
231231
if weapon != 0 and (weapon != 8 or boss != 12))
232232
# Wily Machine cannot under any circumstances take damage from Time Stopper, prevent this

worlds/mm2/test/test_weakness.py

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from . import MM2TestBase
44
from ..options import bosses
5+
from ..rules import minimum_weakness_requirement
56

67

7-
# Need to figure out how this test should work
88
def validate_wily_5(base: MM2TestBase) -> None:
99
world = base.multiworld.worlds[base.player]
1010
weapon_damage = world.weapon_damage
@@ -67,38 +67,54 @@ def validate_wily_5(base: MM2TestBase) -> None:
6767
weapon_weight.pop(wp)
6868

6969

70-
class StrictWeaknessTests(MM2TestBase):
70+
class WeaknessTests(MM2TestBase):
7171
options = {
72-
"strict_weakness": True,
7372
"yoku_jumps": True,
74-
"enable_lasers": True
73+
"enable_lasers": True,
7574
}
76-
7775
def test_that_every_boss_has_a_weakness(self) -> None:
7876
world = self.multiworld.worlds[self.player]
7977
weapon_damage = world.weapon_damage
8078
for boss in range(14):
81-
if not any(weapon_damage[weapon][boss] for weapon in range(9)):
79+
if not any(weapon_damage[weapon][boss] >= minimum_weakness_requirement[weapon] for weapon in range(9)):
8280
self.fail(f"Boss {boss} generated without weakness! Seed: {self.multiworld.seed}")
8381

8482
def test_wily_5(self) -> None:
8583
validate_wily_5(self)
8684

8785

88-
class RandomStrictWeaknessTests(MM2TestBase):
86+
class StrictWeaknessTests(WeaknessTests):
8987
options = {
9088
"strict_weakness": True,
89+
**WeaknessTests.options
90+
}
91+
92+
93+
class RandomWeaknessTests(WeaknessTests):
94+
options = {
9195
"random_weakness": "randomized",
92-
"yoku_jumps": True,
93-
"enable_lasers": True
96+
**WeaknessTests.options
9497
}
9598

96-
def test_that_every_boss_has_a_weakness(self) -> None:
97-
world = self.multiworld.worlds[self.player]
98-
weapon_damage = world.weapon_damage
99-
for boss in range(14):
100-
if not any(weapon_damage[weapon][boss] for weapon in range(9)):
101-
self.fail(f"Boss {boss} generated without weakness! Seed: {self.multiworld.seed}")
10299

103-
def test_wily_5(self) -> None:
104-
validate_wily_5(self)
100+
class ShuffledWeaknessTests(WeaknessTests):
101+
options = {
102+
"random_weakness": "shuffled",
103+
**WeaknessTests.options
104+
}
105+
106+
107+
class RandomStrictWeaknessTests(WeaknessTests):
108+
options = {
109+
"strict_weakness": True,
110+
"random_weakness": "randomized",
111+
**WeaknessTests.options
112+
}
113+
114+
115+
class ShuffledStrictWeaknessTests(WeaknessTests):
116+
options = {
117+
"strict_weakness": True,
118+
"random_weakness": "shuffled",
119+
**WeaknessTests.options
120+
}

0 commit comments

Comments
 (0)