summaryrefslogtreecommitdiff
path: root/vba.py
diff options
context:
space:
mode:
authorBryan Bishop <kanzure@gmail.com>2013-03-05 01:56:25 -0600
committerBryan Bishop <kanzure@gmail.com>2013-03-05 01:56:25 -0600
commit3f7de71048d3b0275dac4ad5a0c41634a40f53a0 (patch)
tree83a22a33e69118ff1eb31f997efb10ee5b517c69 /vba.py
parentee4a7b53dd80651d526b7786c7fe9888741642f3 (diff)
vba - record/replay button sequences
original-commit-id: 6a3cf4e39391560ec978432ec797ce77d13cd76b
Diffstat (limited to 'vba.py')
-rw-r--r--vba.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/vba.py b/vba.py
index b8c3dc9..b57e8e6 100644
--- a/vba.py
+++ b/vba.py
@@ -443,6 +443,69 @@ def press(buttons, steplimit=1):
for step_counter in range(0, steplimit):
Gb.step(number)
+def get_buttons():
+ """
+ Returns the currentButtons[0] value (an integer with bits set for which
+ buttons are currently pressed).
+ """
+ return Gb.getCurrentButtons()
+
+class State(RomList):
+ name = None
+
+class Recording:
+ def __init__(self):
+ self.frames = []
+ self.states = {}
+
+ def _get_frame_count(self):
+ return len(self.frames)
+
+ frame_count = property(fget=_get_frame_count)
+
+ def save(self, name=None):
+ """
+ Saves the current state.
+ """
+ state = State(get_state())
+ state.name = name
+ self.states[self.frame_count] = state
+
+ def load(self, name):
+ """
+ Loads a state by name in the state list.
+ """
+ for state in self.states.items():
+ if state.name == name:
+ set_state(state)
+ return state
+ return False
+
+ def step(self, stepcount=1, first_frame=0, replay=False):
+ """
+ Records button presses for each frame.
+ """
+ if replay:
+ stepcount = len(self.frames[first_name:])
+
+ for counter in range(first_frame, stepcount):
+ if replay:
+ press(self.frames[counter], steplimit=0)
+ else:
+ self.frames.append(get_buttons())
+ nstep(1)
+
+ def replay_from(self, thing):
+ """
+ Replays based on a State or the name of a saved state.
+ """
+ if isinstance(thing, State):
+ set_state(thing)
+ else:
+ thing = self.load(thing)
+ frame_id = self.states.index(thing)
+ self.step(first_frame=frame_id, replay=True)
+
class Registers:
order = [
"pc",