Mercurial > touhou
diff pytouhou/game/eclrunner.py @ 48:8353c33d53d4
Support a few more instructions
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Mon, 22 Aug 2011 15:45:42 +0200 |
parents | 1f1793e7ec8e |
children | cbe1cb50f2fd |
line wrap: on
line diff
--- a/pytouhou/game/eclrunner.py +++ b/pytouhou/game/eclrunner.py @@ -12,8 +12,11 @@ class ECLRunner(object): self.stack = [] self.implementation = {4: self.set_variable, + 5: self.set_variable, 2: self.relative_jump, 3: self.relative_jump_ex, + 20: self.add, + 21: self.substract, 35: self.call, 36: self.ret, 109: self.memory_write} @@ -21,6 +24,27 @@ class ECLRunner(object): self.implementation.update(implementation) + def _get_value(self, value): #TODO: -10013 and beyond! + assert not -10025 <= value <= -10013 + if -10012 <= value <= -10001: + return self.variables[int(-10001-value)] + else: + return value + + + def add(self, variable_id, a, b): + #TODO: proper variable handling + #TODO: int vs float thing + self.variables[-10001-variable_id] = self._get_value(a) + self._get_value(b) + + + def substract(self, variable_id, a, b): + #TODO: proper variable handling + #TODO: int vs float thing + self.variables[-10001-variable_id] = self._get_value(a) - self._get_value(b) + + + def memory_write(self, value, index): #TODO #XXX: this is a hack to display bosses although we don't handle MSG :) @@ -45,10 +69,9 @@ class ECLRunner(object): self.sub, self.frame, self.instruction_pointer, self.variables = self.stack.pop() - def set_variable(self, variable_id, value): #TODO: -10013 and beyond! - self.variables[-10000-variable_id] = value + self.variables[-10001-variable_id] = self._get_value(value) def relative_jump(self, frame, instruction_pointer): @@ -56,8 +79,8 @@ class ECLRunner(object): def relative_jump_ex(self, frame, instruction_pointer, variable_id): - if self.variables[-10000-variable_id]: - self.variables[-10000-variable_id] -= 1 + if self.variables[-10001-variable_id]: + self.variables[-10001-variable_id] -= 1 self.frame, self.instruction_pointer = frame, instruction_pointer