MM2: fix plando and weakness special cases (#4561)
This commit is contained in:
		
							parent
							
								
									a53bcb4697
								
							
						
					
					
						commit
						9466d5274e
					
				| 
						 | 
					@ -175,7 +175,7 @@ class WeaknessPlando(OptionDict):
 | 
				
			||||||
    display_name = "Plando Weaknesses"
 | 
					    display_name = "Plando Weaknesses"
 | 
				
			||||||
    schema = Schema({
 | 
					    schema = Schema({
 | 
				
			||||||
        Optional(And(str, Use(str.title), lambda s: s in bosses)): {
 | 
					        Optional(And(str, Use(str.title), lambda s: s in bosses)): {
 | 
				
			||||||
            And(str, Use(str.title), lambda s: s in weapons_to_id): And(int, lambda i: i in range(-1, 14))
 | 
					            And(str, Use(str.title), lambda s: s in weapons_to_id): And(int, lambda i: i in range(-1, 15))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
    default = {}
 | 
					    default = {}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -135,41 +135,47 @@ def set_rules(world: "MM2World") -> None:
 | 
				
			||||||
                        world.weapon_damage[weapon][i] = 0
 | 
					                        world.weapon_damage[weapon][i] = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for p_boss in world.options.plando_weakness:
 | 
					        for p_boss in world.options.plando_weakness:
 | 
				
			||||||
 | 
					            boss = bosses[p_boss]
 | 
				
			||||||
            for p_weapon in world.options.plando_weakness[p_boss]:
 | 
					            for p_weapon in world.options.plando_weakness[p_boss]:
 | 
				
			||||||
                if world.options.plando_weakness[p_boss][p_weapon] < minimum_weakness_requirement[p_weapon] \
 | 
					                weapon = weapons_to_id[p_weapon]
 | 
				
			||||||
                    and not any(w != p_weapon
 | 
					                if world.options.plando_weakness[p_boss][p_weapon] < minimum_weakness_requirement[weapon] \
 | 
				
			||||||
                                and world.weapon_damage[w][bosses[p_boss]] > minimum_weakness_requirement[w]
 | 
					                        and not any(w != weapon
 | 
				
			||||||
                                for w in world.weapon_damage):
 | 
					                                    and world.weapon_damage[w][boss] >= minimum_weakness_requirement[w]
 | 
				
			||||||
 | 
					                                    for w in world.weapon_damage):
 | 
				
			||||||
                    # we need to replace this weakness
 | 
					                    # we need to replace this weakness
 | 
				
			||||||
                    weakness = world.random.choice([key for key in world.weapon_damage if key != p_weapon])
 | 
					                    weakness = world.random.choice([key for key in world.weapon_damage if key != weapon])
 | 
				
			||||||
                    world.weapon_damage[weakness][bosses[p_boss]] = minimum_weakness_requirement[weakness]
 | 
					                    world.weapon_damage[weakness][boss] = minimum_weakness_requirement[weakness]
 | 
				
			||||||
                world.weapon_damage[weapons_to_id[p_weapon]][bosses[p_boss]] \
 | 
					                world.weapon_damage[weapon][boss] = world.options.plando_weakness[p_boss][p_weapon]
 | 
				
			||||||
                    = world.options.plando_weakness[p_boss][p_weapon]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # handle special cases
 | 
					        # handle special cases
 | 
				
			||||||
        for boss in range(14):
 | 
					        for boss in range(14):
 | 
				
			||||||
            for weapon in (1, 2, 3, 6, 8):
 | 
					            for weapon in (1, 2, 3, 6, 8):
 | 
				
			||||||
                if (0 < world.weapon_damage[weapon][boss] < minimum_weakness_requirement[weapon] and
 | 
					                if (0 < world.weapon_damage[weapon][boss] < minimum_weakness_requirement[weapon] and
 | 
				
			||||||
                        not any(world.weapon_damage[i][boss] >= minimum_weakness_requirement[weapon]
 | 
					                        not any(world.weapon_damage[i][boss] >= minimum_weakness_requirement[i]
 | 
				
			||||||
                                for i in range(9) if i != weapon)):
 | 
					                                for i in range(9) if i != weapon)):
 | 
				
			||||||
                    # Weapon does not have enough possible ammo to kill the boss, raise the damage
 | 
					                    # Weapon does not have enough possible ammo to kill the boss, raise the damage
 | 
				
			||||||
                    if boss == 9:
 | 
					                    world.weapon_damage[weapon][boss] = minimum_weakness_requirement[weapon]
 | 
				
			||||||
                        if weapon in (1, 6):
 | 
					
 | 
				
			||||||
                            # Atomic Fire and Crash Bomber cannot be Picopico-kun's only weakness
 | 
					        for weapon in (1, 6):
 | 
				
			||||||
                            world.weapon_damage[weapon][boss] = 0
 | 
					            if (world.weapon_damage[weapon][9] >= minimum_weakness_requirement[weapon] and
 | 
				
			||||||
                            weakness = world.random.choice((2, 3, 4, 5, 7, 8))
 | 
					                    not any(world.weapon_damage[i][9] >= minimum_weakness_requirement[i]
 | 
				
			||||||
                            world.weapon_damage[weakness][boss] = minimum_weakness_requirement[weakness]
 | 
					                            for i in range(9) if i not in (1, 6))):
 | 
				
			||||||
                    elif boss == 11:
 | 
					                # Atomic Fire and Crash Bomber cannot be Picopico-kun's only weakness
 | 
				
			||||||
                        if weapon == 1:
 | 
					                world.weapon_damage[weapon][9] = 0
 | 
				
			||||||
                            # Atomic Fire cannot be Boobeam Trap's only weakness
 | 
					                weakness = world.random.choice((2, 3, 4, 5, 7, 8))
 | 
				
			||||||
                            world.weapon_damage[weapon][boss] = 0
 | 
					                world.weapon_damage[weakness][9] = minimum_weakness_requirement[weakness]
 | 
				
			||||||
                            weakness = world.random.choice((2, 3, 4, 5, 6, 7, 8))
 | 
					
 | 
				
			||||||
                            world.weapon_damage[weakness][boss] = minimum_weakness_requirement[weakness]
 | 
					        if (world.weapon_damage[1][11] >= minimum_weakness_requirement[1] and
 | 
				
			||||||
                    else:
 | 
					                not any(world.weapon_damage[i][11] >= minimum_weakness_requirement[i]
 | 
				
			||||||
                        world.weapon_damage[weapon][boss] = minimum_weakness_requirement[weapon]
 | 
					                        for i in range(9) if i != 1)):
 | 
				
			||||||
 | 
					            # Atomic Fire cannot be Boobeam Trap's only weakness
 | 
				
			||||||
 | 
					            world.weapon_damage[1][11] = 0
 | 
				
			||||||
 | 
					            weakness = world.random.choice((2, 3, 4, 5, 6, 7, 8))
 | 
				
			||||||
 | 
					            world.weapon_damage[weakness][11] = minimum_weakness_requirement[weakness]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if world.weapon_damage[0][world.options.starting_robot_master.value] < 1:
 | 
					        if world.weapon_damage[0][world.options.starting_robot_master.value] < 1:
 | 
				
			||||||
            world.weapon_damage[0][world.options.starting_robot_master.value] = weapon_damage[0][world.options.starting_robot_master.value]
 | 
					            world.weapon_damage[0][world.options.starting_robot_master.value] = \
 | 
				
			||||||
 | 
					                weapon_damage[0][world.options.starting_robot_master.value]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # final special case
 | 
					        # final special case
 | 
				
			||||||
        # There's a vanilla crash if Time Stopper kills Wily phase 1
 | 
					        # There's a vanilla crash if Time Stopper kills Wily phase 1
 | 
				
			||||||
| 
						 | 
					@ -218,9 +224,10 @@ def set_rules(world: "MM2World") -> None:
 | 
				
			||||||
                    # we are out of weapons that can actually damage the boss
 | 
					                    # we are out of weapons that can actually damage the boss
 | 
				
			||||||
                    # so find the weapon that has the most uses, and apply that as an additional weakness
 | 
					                    # so find the weapon that has the most uses, and apply that as an additional weakness
 | 
				
			||||||
                    # it should be impossible to be out of energy, simply because even if every boss took 1 from
 | 
					                    # it should be impossible to be out of energy, simply because even if every boss took 1 from
 | 
				
			||||||
                    # Quick Boomerang and no other, it would only be 28 off from defeating all 9, which Metal Blade should
 | 
					                    # Quick Boomerang and no other, it would only be 28 off from defeating all 9,
 | 
				
			||||||
                    # be able to cover
 | 
					                    # which Metal Blade should be able to cover
 | 
				
			||||||
                    wp, max_uses = max((weapon, weapon_energy[weapon] // weapon_costs[weapon]) for weapon in weapon_weight
 | 
					                    wp, max_uses = max((weapon, weapon_energy[weapon] // weapon_costs[weapon])
 | 
				
			||||||
 | 
					                                       for weapon in weapon_weight
 | 
				
			||||||
                                       if weapon != 0 and (weapon != 8 or boss != 12))
 | 
					                                       if weapon != 0 and (weapon != 8 or boss != 12))
 | 
				
			||||||
                    # Wily Machine cannot under any circumstances take damage from Time Stopper, prevent this
 | 
					                    # Wily Machine cannot under any circumstances take damage from Time Stopper, prevent this
 | 
				
			||||||
                    world.weapon_damage[wp][boss] = minimum_weakness_requirement[wp]
 | 
					                    world.weapon_damage[wp][boss] = minimum_weakness_requirement[wp]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue