summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Bishop <kanzure@gmail.com>2013-11-09 14:44:36 -0600
committerBryan Bishop <kanzure@gmail.com>2013-11-09 14:44:36 -0600
commit1ac0e437d19963d46bd5360e0790b2294ade72b8 (patch)
tree8c507fe2e98d14bec77db1c76bf547db0fdda33f
parent2b7e903f847e1c6de7e63549f915a89b0a5795e3 (diff)
add a bunch of docstrings in the battler
-rw-r--r--pokemontools/vba/battle.py49
1 files changed, 41 insertions, 8 deletions
diff --git a/pokemontools/vba/battle.py b/pokemontools/vba/battle.py
index 08d0b93..1949fbb 100644
--- a/pokemontools/vba/battle.py
+++ b/pokemontools/vba/battle.py
@@ -34,6 +34,12 @@ class Battle(EmulatorController):
"""
return self.emulator.is_in_battle()
+ def is_input_required(self):
+ """
+ Detects if the battle is waiting for player input.
+ """
+ return self.is_player_turn() or self.is_mandatory_switch()
+
def is_fight_pack_run_menu(self):
"""
Attempts to detect if the current menu is fight-pack-run. This is only
@@ -44,14 +50,28 @@ class Battle(EmulatorController):
return all([sign in screentext for sign in signs])
def is_player_turn(self):
- return is_fight_pack_run_menu()
+ """
+ Detects if the battle is waiting for the player to choose an attack.
+ """
+ return self.is_fight_pack_run_menu()
def is_mandatory_switch(self):
- return False # TODO
+ """
+ Detects if the battle is waiting for the player to choose a next
+ pokemon.
+ """
+ # TODO: detect the mandatry switch menu
+ # The following conditions are probably sufficient:
+ # 1) current pokemon hp is 0
+ # 2) game is polling for input
+ return False
def skip_start_text(self, max_loops=20):
"""
- Skip any initial conversation until the battle has begun.
+ Skip any initial conversation until the player can select an action.
+ This includes skipping any text that appears on a map from an NPC as
+ well as text that appears prior to the first time the action selection
+ menu appears.
"""
if not self.is_in_battle():
while not self.is_in_battle() and max_loops > 0:
@@ -64,6 +84,9 @@ class Battle(EmulatorController):
self.emulator.text_wait()
def skip_end_text(self, loops=20):
+ """
+ Skip through any text that appears after the final attack.
+ """
if not self.is_in_battle():
# TODO: keep talking until the character can move?
self.emulator.text_wait()
@@ -75,23 +98,31 @@ class Battle(EmulatorController):
if loops <= 0:
raise Exception("Couldn't get out of the battle.")
- def skip_crap(self):
- while not self.is_flight_pack_run_menu():
+ def skip_until_input_required(self):
+ """
+ Waits until the battle needs player input.
+ """
+ while not self.is_input_required():
self.emulator.text_wait()
def run(self):
"""
Step through the entire battle.
"""
- # xyz wants to battle
+ # Advance to the battle from either of these states:
+ # 1) the player is talking with an npc
+ # 2) the battle has already started but there's initial text
+ # xyz wants to battle, a wild foobar appeared
self.skip_start_text()
while self.is_in_battle():
- self.skip_crap()
+ self.skip_until_input_required()
if self.is_player_turn():
+ # battle hook provides input to handle this situation
self.handle_turn()
elif self.is_mandatory_switch():
+ # battle hook provides input to handle this situation too
self.handle_mandatory_switch()
else:
raise BattleException("unknown state, aborting")
@@ -99,6 +130,8 @@ class Battle(EmulatorController):
# "how did i lose? wah"
self.skip_end_text()
+ # TODO: return should indicate win/loss (blackout)
+
def handle_mandatory_switch(self):
"""
Something fainted, pick the next mon.
@@ -133,7 +166,7 @@ class BattleStrategy(Battle):
"""
Take actions inside of a battle based on the game state.
"""
- self.battle.throw_pokeball()
+ self.throw_pokeball()
class SimpleBattleStrategy(BattleStrategy):
"""