Skip to content

Commit

Permalink
poke-engine to 0.0.30. Support base_ability being passed in. Also pro…
Browse files Browse the repository at this point in the history
…perly tracks trace in the client
  • Loading branch information
pmariglia committed Feb 1, 2025
1 parent 06f9a84 commit 68ddbf0
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 2 deletions.
1 change: 1 addition & 0 deletions fp/battle_bots/poke_engine_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ def pokemon_to_poke_engine_pkmn(pkmn: Pokemon):
hp=int(pkmn.hp),
maxhp=int(pkmn.max_hp),
ability=str(pkmn.ability),
base_ability=pkmn.original_ability,
item=str(pkmn.item),
nature=pkmn.nature,
evs=tuple(pkmn.evs),
Expand Down
22 changes: 21 additions & 1 deletion fp/battle_modifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,10 @@ def switch_or_drag(battle, split_msg, switch_or_drag="switch"):
)
side.active.types = original_types

if side.active.original_ability is not None:
if (
side.active.original_ability is not None
and side.active.ability != side.active.original_ability
):
logger.info(
"{}'s ability was modified to {} - setting it back to {} on switch-out".format(
side.active.name, side.active.ability, side.active.original_ability
Expand Down Expand Up @@ -1597,11 +1600,28 @@ def _switch_active_with_zoroark_from_reserves(
def set_opponent_ability_from_ability_tag(battle, split_msg):
if is_opponent(battle, split_msg):
side = battle.opponent
other_side = battle.user
else:
side = battle.user
other_side = battle.opponent

ability = normalize_name(split_msg[3])
logger.info("Setting {}'s ability to {}".format(side.active.name, ability))
if len(split_msg) >= 6 and "ability:" in split_msg[4]:
original_ability = normalize_name(split_msg[4].split(":")[-1])
logger.info(
"Setting {}'s original ability to {}".format(
side.active.name, original_ability
)
)
side.active.original_ability = original_ability

if split_msg[5].startswith("[of]") and other_side.name in split_msg[5]:
logger.info(
"Setting {}'s ability to {}".format(other_side.active.name, ability)
)
other_side.active.ability = ability

side.active.ability = ability


Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ requests==2.32.0
environs==11.0.0
websockets==14.1
python-dateutil==2.8.0
poke-engine==0.0.29 --config-settings="build-args=--features poke-engine/terastallization --no-default-features"
poke-engine==0.0.30 --config-settings="build-args=--features poke-engine/terastallization --no-default-features"
89 changes: 89 additions & 0 deletions tests/test_battle_modifiers.py
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,15 @@ def test_switch_properly_resets_types_when_pkmn_was_typechanged(self):

self.assertEqual(["bug"], active.types)

def test_switch_properly_resets_ability_when_pkmn_had_ability_changed(self):
self.battle.opponent.active.ability = "lingeringarmoa"
self.battle.opponent.active.original_ability = "intimidate"
active = self.battle.opponent.active
split_msg = ["", "switch", "p2a: weedle", "Weedle, L100, M", "100/100"]
switch_or_drag(self.battle, split_msg)

self.assertEqual("intimidate", active.ability)

def test_increments_rest_turns_by_consequtive_sleeptalks(self):
self.battle.generation = "gen3"
active = self.battle.opponent.active
Expand Down Expand Up @@ -1025,6 +1034,28 @@ def setUp(self):
self.battle.opponent.active = self.opponent_active
self.battle.user.active = self.user_active

def test_lingeringarmoa_activating_to_change_abilities(self):
self.battle.user.active.ability = "intimidate"
self.battle.opponent.active.ability = (
None # lets say ability is unknown beforehand
)
split_msg = [
"",
"-activate",
"p2a: Caterpie",
"ability: Lingering Aroma",
"Intimidate",
"[of] p1a: Caterpie",
]
activate(self.battle, split_msg)

# sets ability but retains original ability
self.assertEqual("lingeringaroma", self.battle.user.active.ability)
self.assertEqual("intimidate", self.battle.user.active.original_ability)

# sets ability on the other pkmn
self.assertEqual("lingeringaroma", self.battle.opponent.active.ability)

def test_activating_partially_trapped_whirlpool(self):
split_msg = [
"",
Expand Down Expand Up @@ -2610,6 +2641,64 @@ def setUp(self):
self.user_active = Pokemon("weedle", 100)
self.battle.user.active = self.user_active

def test_sets_original_ability_from_trace(self):
self.battle.user.active.ability = "intimidate"
self.battle.opponent.active.ability = None

split_msg = [
"",
"-ability",
"p2a: Caterpie",
"Intimidate",
"[from] ability: Trace",
"[of] p1a: Caterpie",
]
set_opponent_ability_from_ability_tag(self.battle, split_msg)

self.assertEqual("intimidate", self.battle.opponent.active.ability)
self.assertEqual("trace", self.battle.opponent.active.original_ability)

def test_sets_original_ability_from_trace_with_intimidate(self):
self.battle.user.active.ability = "intimidate"
self.battle.opponent.active.ability = None

# PS protocol sends 2 `-ability` messages here so just make sure everything is set properly
split_msg_1 = ["", "-ability", "p2a: Caterpie", "Intimidate", "boost"]
split_msg_2 = [
"",
"-ability",
"p2a: Caterpie",
"Intimidate",
"[from] ability: Trace",
"[of] p1a: Caterpie",
]
set_opponent_ability_from_ability_tag(self.battle, split_msg_1)
set_opponent_ability_from_ability_tag(self.battle, split_msg_2)

self.assertEqual("intimidate", self.battle.opponent.active.ability)
self.assertEqual("trace", self.battle.opponent.active.original_ability)

def test_sets_original_ability_from_trace_with_intimidate_for_bot(self):
self.battle.user.active.ability = "trace"
self.battle.opponent.active.ability = None

# PS protocol sends 2 `-ability` messages here so just make sure everything is set properly
split_msg_1 = ["", "-ability", "p1a: Caterpie", "Intimidate", "boost"]
split_msg_2 = [
"",
"-ability",
"p1a: Caterpie",
"Intimidate",
"[from] ability: Trace",
"[of] p2a: Caterpie",
]
set_opponent_ability_from_ability_tag(self.battle, split_msg_1)
set_opponent_ability_from_ability_tag(self.battle, split_msg_2)

self.assertEqual("intimidate", self.battle.opponent.active.ability)
self.assertEqual("trace", self.battle.user.active.original_ability)
self.assertEqual("intimidate", self.battle.user.active.ability)

def test_update_ability_from_ability_string_properly_updates_ability(self):
split_msg = ["", "-ability", "p2a: Caterpie", "Lightning Rod", "boost"]
set_opponent_ability_from_ability_tag(self.battle, split_msg)
Expand Down

0 comments on commit 68ddbf0

Please sign in to comment.