Skip to content

Commit 66e2d5f

Browse files
committed
change UT code to maybe match TUNIC's implementation
1 parent 1bf1a44 commit 66e2d5f

File tree

2 files changed

+168
-227
lines changed

2 files changed

+168
-227
lines changed

worlds/mmx3/Rules.py

Lines changed: 62 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
def set_rules(world: MMX3World):
9999
player = world.player
100100
multiworld = world.multiworld
101+
jammed_buster = world.options.jammed_buster.value
101102

102103
multiworld.completion_condition[player] = lambda state: state.has(ItemName.victory, player)
103104

@@ -120,28 +121,28 @@ def set_rules(world: MMX3World):
120121
lambda state: state.has(ItemName.stage_blast_hornet, player))
121122

122123
# Doppler Lab entrance rules
123-
doppler_open = world.doppler_open
124+
doppler_open = world.options.doppler_open.value
124125
entrance = multiworld.get_entrance(f"{RegionName.intro_stage} -> {RegionName.dr_doppler_lab}", player)
125126

126127
if len(doppler_open) == 0:
127128
set_rule(entrance, lambda state: state.has(ItemName.stage_doppler_lab, player))
128129
else:
129-
if "Medals" in doppler_open and world.doppler_medal_count > 0:
130-
add_rule(entrance, lambda state: state.has(ItemName.maverick_medal, player, world.doppler_medal_count))
131-
if "Weapons" in doppler_open and world.doppler_weapon_count > 0:
132-
add_rule(entrance, lambda state: state.has_group("Weapons", player, world.doppler_weapon_count))
133-
if "Armor Upgrades" in doppler_open and world.doppler_upgrade_count > 0:
134-
add_rule(entrance, lambda state: state.has_group("Armor Upgrades", player, world.doppler_upgrade_count))
135-
if "Heart Tanks" in doppler_open and world.doppler_heart_tank_count > 0:
136-
add_rule(entrance, lambda state: state.has(ItemName.heart_tank, player, world.doppler_heart_tank_count))
137-
if "Sub Tanks" in doppler_open and world.doppler_sub_tank_count > 0:
138-
add_rule(entrance, lambda state: state.has(ItemName.sub_tank, player, world.doppler_sub_tank_count))
130+
if "Medals" in doppler_open and world.options.doppler_medal_count.value > 0:
131+
add_rule(entrance, lambda state: state.has(ItemName.maverick_medal, player, world.options.doppler_medal_count.value))
132+
if "Weapons" in doppler_open and world.options.doppler_weapon_count.value > 0:
133+
add_rule(entrance, lambda state: state.has_group("Weapons", player, world.options.doppler_weapon_count.value))
134+
if "Armor Upgrades" in doppler_open and world.options.doppler_upgrade_count.value > 0:
135+
add_rule(entrance, lambda state: state.has_group("Armor Upgrades", player, world.options.doppler_upgrade_count.value))
136+
if "Heart Tanks" in doppler_open and world.options.doppler_heart_tank_count.value > 0:
137+
add_rule(entrance, lambda state: state.has(ItemName.heart_tank, player, world.options.doppler_heart_tank_count.value))
138+
if "Sub Tanks" in doppler_open and world.options.doppler_sub_tank_count.value > 0:
139+
add_rule(entrance, lambda state: state.has(ItemName.sub_tank, player, world.options.doppler_sub_tank_count.value))
139140

140-
if world.logic_vile_required:
141+
if world.options.logic_vile_required.value:
141142
add_rule(entrance, lambda state: state.has(EventName.vile_defeated, player))
142143

143144
# Doppler Lab level rules
144-
if world.doppler_all_labs:
145+
if world.options.doppler_all_labs:
145146
set_rule(multiworld.get_entrance(f"{RegionName.dr_doppler_lab} -> {RegionName.dr_doppler_lab_4}", player),
146147
lambda state: (
147148
state.has(EventName.dr_doppler_lab_1_clear, player) and
@@ -157,12 +158,12 @@ def set_rules(world: MMX3World):
157158
lambda state: state.has(EventName.dr_doppler_lab_3_clear, player))
158159

159160
# Set Boss rematch rules
160-
if world.doppler_lab_3_boss_rematch_count > 0:
161+
if world.options.doppler_lab_3_boss_rematch_count.value > 0:
161162
set_rule(multiworld.get_entrance(f"{RegionName.dr_doppler_lab_3_rematches} -> {RegionName.dr_doppler_lab_3_after_rematches}", player),
162-
lambda state: state.has(EventName.boss_rematch_clear, player, world.doppler_lab_3_boss_rematch_count))
163+
lambda state: state.has(EventName.boss_rematch_clear, player, world.options.doppler_lab_3_boss_rematch_count.value))
163164

164165
# Vile entrance rules
165-
vile_open = world.vile_open
166+
vile_open = world.options.vile_open.value
166167
entrance_blizzard = multiworld.get_entrance(f"{RegionName.blizzard_buffalo_start} -> {RegionName.vile}", player)
167168
entrance_volt = multiworld.get_entrance(f"{RegionName.volt_catfish_start} -> {RegionName.vile}", player)
168169
entrance_crush = multiworld.get_entrance(f"{RegionName.crush_crawfish_start} -> {RegionName.vile}", player)
@@ -171,57 +172,57 @@ def set_rules(world: MMX3World):
171172
set_rule(entrance_volt, lambda state: state.has(ItemName.stage_vile, player))
172173
set_rule(entrance_crush, lambda state: state.has(ItemName.stage_vile, player))
173174
else:
174-
if "Medals" in vile_open and world.vile_medal_count > 0:
175-
add_rule(entrance_blizzard, lambda state: state.has(ItemName.maverick_medal, player, world.vile_medal_count))
176-
add_rule(entrance_volt, lambda state: state.has(ItemName.maverick_medal, player, world.vile_medal_count))
177-
add_rule(entrance_crush, lambda state: state.has(ItemName.maverick_medal, player, world.vile_medal_count))
178-
if "Weapons" in vile_open and world.vile_weapon_count > 0:
179-
add_rule(entrance_blizzard, lambda state: state.has_group("Weapons", player, world.vile_weapon_count))
180-
add_rule(entrance_volt, lambda state: state.has_group("Weapons", player, world.vile_weapon_count))
181-
add_rule(entrance_crush, lambda state: state.has_group("Weapons", player, world.vile_weapon_count))
182-
if "Armor Upgrades" in vile_open and world.vile_upgrade_count > 0:
183-
add_rule(entrance_blizzard, lambda state: state.has_group("Armor Upgrades", player, world.vile_upgrade_count))
184-
add_rule(entrance_volt, lambda state: state.has_group("Armor Upgrades", player, world.vile_upgrade_count))
185-
add_rule(entrance_crush, lambda state: state.has_group("Armor Upgrades", player, world.vile_upgrade_count))
186-
if "Heart Tanks" in vile_open and world.vile_heart_tank_count > 0:
187-
add_rule(entrance_blizzard, lambda state: state.has(ItemName.heart_tank, player, world.vile_heart_tank_count))
188-
add_rule(entrance_volt, lambda state: state.has(ItemName.heart_tank, player, world.vile_heart_tank_count))
189-
add_rule(entrance_crush, lambda state: state.has(ItemName.heart_tank, player, world.vile_heart_tank_count))
190-
if "Sub Tanks" in vile_open and world.vile_sub_tank_count > 0:
191-
add_rule(entrance_blizzard, lambda state: state.has(ItemName.sub_tank, player, world.vile_sub_tank_count))
192-
add_rule(entrance_volt, lambda state: state.has(ItemName.sub_tank, player, world.vile_sub_tank_count))
193-
add_rule(entrance_crush, lambda state: state.has(ItemName.sub_tank, player, world.vile_sub_tank_count))
175+
if "Medals" in vile_open and world.options.vile_medal_count.value > 0:
176+
add_rule(entrance_blizzard, lambda state: state.has(ItemName.maverick_medal, player, world.options.vile_medal_count.value))
177+
add_rule(entrance_volt, lambda state: state.has(ItemName.maverick_medal, player, world.options.vile_medal_count.value))
178+
add_rule(entrance_crush, lambda state: state.has(ItemName.maverick_medal, player, world.options.vile_medal_count.value))
179+
if "Weapons" in vile_open and world.options.vile_weapon_count.value > 0:
180+
add_rule(entrance_blizzard, lambda state: state.has_group("Weapons", player, world.options.vile_weapon_count.value))
181+
add_rule(entrance_volt, lambda state: state.has_group("Weapons", player, world.options.vile_weapon_count.value))
182+
add_rule(entrance_crush, lambda state: state.has_group("Weapons", player, world.options.vile_weapon_count.value))
183+
if "Armor Upgrades" in vile_open and world.options.vile_upgrade_count.value > 0:
184+
add_rule(entrance_blizzard, lambda state: state.has_group("Armor Upgrades", player, world.options.vile_upgrade_count.value))
185+
add_rule(entrance_volt, lambda state: state.has_group("Armor Upgrades", player, world.options.vile_upgrade_count.value))
186+
add_rule(entrance_crush, lambda state: state.has_group("Armor Upgrades", player, world.options.vile_upgrade_count.value))
187+
if "Heart Tanks" in vile_open and world.options.vile_heart_tank_count.value > 0:
188+
add_rule(entrance_blizzard, lambda state: state.has(ItemName.heart_tank, player, world.options.vile_heart_tank_count.value))
189+
add_rule(entrance_volt, lambda state: state.has(ItemName.heart_tank, player, world.options.vile_heart_tank_count.value))
190+
add_rule(entrance_crush, lambda state: state.has(ItemName.heart_tank, player, world.options.vile_heart_tank_count.value))
191+
if "Sub Tanks" in vile_open and world.options.vile_sub_tank_count.value > 0:
192+
add_rule(entrance_blizzard, lambda state: state.has(ItemName.sub_tank, player, world.options.vile_sub_tank_count.value))
193+
add_rule(entrance_volt, lambda state: state.has(ItemName.sub_tank, player, world.options.vile_sub_tank_count.value))
194+
add_rule(entrance_crush, lambda state: state.has(ItemName.sub_tank, player, world.options.vile_sub_tank_count.value))
194195

195196
# Bit & Byte arena entrance rules
196197
set_rule(multiworld.get_entrance(f"{RegionName.blast_hornet_bit_byte} -> {RegionName.bit_byte}", player),
197-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
198+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
198199
set_rule(multiworld.get_entrance(f"{RegionName.blizzard_buffalo_bit_byte} -> {RegionName.bit_byte}", player),
199-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
200+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
200201
set_rule(multiworld.get_entrance(f"{RegionName.toxic_seahorse_bit_byte} -> {RegionName.bit_byte}", player),
201-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
202+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
202203
set_rule(multiworld.get_entrance(f"{RegionName.tunnel_rhino_bit_byte} -> {RegionName.bit_byte}", player),
203-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
204+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
204205
set_rule(multiworld.get_entrance(f"{RegionName.volt_catfish_bit_byte} -> {RegionName.bit_byte}", player),
205-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
206+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
206207
set_rule(multiworld.get_entrance(f"{RegionName.crush_crawfish_bit_byte} -> {RegionName.bit_byte}", player),
207-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
208+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
208209
set_rule(multiworld.get_entrance(f"{RegionName.neon_tiger_bit_byte} -> {RegionName.bit_byte}", player),
209-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
210+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
210211
set_rule(multiworld.get_entrance(f"{RegionName.gravity_beetle_bit_byte} -> {RegionName.bit_byte}", player),
211-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
212+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
212213

213214
# Set Bit rules
214215
set_rule(multiworld.get_location(LocationName.bit_defeat, player),
215-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
216+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
216217
set_rule(multiworld.get_location(EventName.bit_defeated, player),
217-
lambda state: state.has(ItemName.maverick_medal, player, world.bit_medal_count))
218+
lambda state: state.has(ItemName.maverick_medal, player, world.options.bit_medal_count.value))
218219

219220
# Set Byte rules
220221
set_rule(multiworld.get_location(LocationName.byte_defeat, player),
221-
lambda state: state.has(ItemName.maverick_medal, player, world.byte_medal_count) and
222+
lambda state: state.has(ItemName.maverick_medal, player, world.options.byte_medal_count.value) and
222223
state.can_reach_location(LocationName.bit_defeat, player))
223224
set_rule(multiworld.get_location(EventName.byte_defeated, player),
224-
lambda state: state.has(ItemName.maverick_medal, player, world.byte_medal_count) and
225+
lambda state: state.has(ItemName.maverick_medal, player, world.options.byte_medal_count.value) and
225226
state.can_reach_location(LocationName.bit_defeat, player))
226227

227228
# Set Blizzard Buffalo collectible rules
@@ -242,7 +243,7 @@ def set_rules(world: MMX3World):
242243
state.has(ItemName.ride_frog, player) or
243244
(
244245
state.has(ItemName.frost_shield, player) and
245-
state.has(ItemName.third_armor_arms, player, world.jammed_buster + 1)
246+
state.has(ItemName.third_armor_arms, player, jammed_buster + 1)
246247
)
247248
)
248249
))
@@ -252,19 +253,19 @@ def set_rules(world: MMX3World):
252253
state.has(ItemName.ride_frog, player) or
253254
(
254255
state.has(ItemName.frost_shield, player) and
255-
state.has(ItemName.third_armor_arms, player, world.jammed_buster + 1)
256+
state.has(ItemName.third_armor_arms, player, jammed_buster + 1)
256257
)
257258
))
258259

259260
# Set Tunnel Rhino collectible rules
260261
set_rule(multiworld.get_location(LocationName.tunnel_rhino_heart_tank, player),
261262
lambda state: (
262-
state.has(ItemName.third_armor_arms, player, world.jammed_buster + 1) and
263+
state.has(ItemName.third_armor_arms, player, jammed_buster + 1) and
263264
state.has(ItemName.triad_thunder, player)
264265
))
265266
set_rule(multiworld.get_location(LocationName.tunnel_rhino_helmet, player),
266267
lambda state: (
267-
state.has(ItemName.third_armor_arms, player, world.jammed_buster + 1) and
268+
state.has(ItemName.third_armor_arms, player, jammed_buster + 1) and
268269
state.has(ItemName.triad_thunder, player)
269270
))
270271

@@ -273,7 +274,7 @@ def set_rules(world: MMX3World):
273274
lambda state: state.has_group("Ride Armors", player, 1))
274275
set_rule(multiworld.get_location(LocationName.volt_catfish_body, player),
275276
lambda state: (
276-
state.has(ItemName.third_armor_arms, player, world.jammed_buster + 1) and
277+
state.has(ItemName.third_armor_arms, player, jammed_buster + 1) and
277278
state.has(ItemName.gravity_well, player)
278279
))
279280

@@ -284,7 +285,7 @@ def set_rules(world: MMX3World):
284285
lambda state: state.has_group("Ride Armors", player, 1))
285286
set_rule(multiworld.get_location(LocationName.crush_crawfish_hawk_ride, player),
286287
lambda state: (
287-
state.has(ItemName.third_armor_arms, player, world.jammed_buster + 1) and
288+
state.has(ItemName.third_armor_arms, player, jammed_buster + 1) and
288289
state.has(ItemName.triad_thunder, player)
289290
))
290291

@@ -322,15 +323,15 @@ def set_rules(world: MMX3World):
322323
))
323324

324325
# Handle bosses weakness
325-
if world.logic_boss_weakness or world.boss_weakness_strictness >= 2:
326+
if world.options.logic_boss_weakness.value or world.options.boss_weakness_strictness.value >= 2:
326327
add_boss_weakness_logic(world)
327328

328329
# Handle pickupsanity logic
329-
if world.pickupsanity:
330+
if world.options.pickupsanity.value:
330331
add_pickupsanity_logic(world)
331332

332333
# Handle helmet logic
333-
if world.logic_helmet_checkpoints:
334+
if world.options.logic_helmet_checkpoints.value:
334335
add_helmet_logic(world)
335336

336337

@@ -345,12 +346,13 @@ def check_weaknesses(state: CollectionState, player: int, rulesets: list) -> boo
345346
def add_boss_weakness_logic(world: MMX3World):
346347
player = world.player
347348
multiworld = world.multiworld
349+
jammed_buster = world.options.jammed_buster.value
348350

349351
boss_dict = {}
350352
for boss, regions in bosses.items():
351353
boss_dict[boss] = regions.copy()
352354

353-
if boss in mavericks and world.doppler_lab_3_boss_rematch_count == 0:
355+
if boss in mavericks and world.options.doppler_lab_3_boss_rematch_count.value == 0:
354356
boss_dict[boss].pop()
355357
boss_dict[boss].pop()
356358

@@ -362,7 +364,7 @@ def add_boss_weakness_logic(world: MMX3World):
362364
world.boss_weaknesses["Dr. Doppler's Lab 1 Boss"].append(weakness)
363365

364366
if boss == "Dr. Doppler's Lab 2 Boss":
365-
if world.doppler_lab_2_boss == "vile":
367+
if world.options.doppler_lab_2_boss == "vile":
366368
boss_dict["Vile Goliath"] = list()
367369
boss_dict["Vile Goliath"].append(LocationName.doppler_lab_2_boss)
368370
boss_dict["Vile Goliath"].append(EventName.dr_doppler_lab_2_clear)
@@ -384,7 +386,7 @@ def add_boss_weakness_logic(world: MMX3World):
384386
weakness = weakness[0]
385387
ruleset = dict()
386388
if "Check Charge" in weakness[0]:
387-
ruleset[ItemName.third_armor_arms] = world.jammed_buster + int(weakness[0][-1:]) - 1
389+
ruleset[ItemName.third_armor_arms] = jammed_buster + int(weakness[0][-1:]) - 1
388390
else:
389391
ruleset[weakness[0]] = 1
390392
if len(weakness) != 1:

0 commit comments

Comments
 (0)