diff options
author | Bryan Bishop <kanzure@gmail.com> | 2013-11-02 20:56:40 -0500 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2013-11-02 20:56:40 -0500 |
commit | 0d4f9340b08766ae3a445b1428cbfe4b4a33031a (patch) | |
tree | 1eb21fdd4e01892381efad267e0172ae43f78194 | |
parent | 211da4dcb3ac2d8ca370d6b840e2368f59b5114d (diff) |
a naive implementation of start_trainer_battle
This is a really dumb way to start a battle, but the other methods
aren't working yet.
-rw-r--r-- | pokemontools/vba/vba.py | 91 |
1 files changed, 76 insertions, 15 deletions
diff --git a/pokemontools/vba/vba.py b/pokemontools/vba/vba.py index 1af2364..bb468b8 100644 --- a/pokemontools/vba/vba.py +++ b/pokemontools/vba/vba.py @@ -127,14 +127,7 @@ class crystal(object): 0x3bb7, ] - for value in push: - self.registers.sp -= 2 - self.vba.write_memory_at(self.registers.sp + 1, value >> 8) - self.vba.write_memory_at(self.registers.sp, value & 0xFF) - if list(self.vba.memory[self.registers.sp : self.registers.sp + 2]) != [value & 0xFF, value >> 8]: - print "desired memory values: " + str([value & 0xFF, value >> 8] ) - print "actual memory values: " + str(list(self.vba.memory[self.registers.sp : self.registers.sp + 2])) - print "wrong value at " + hex(self.registers.sp) + " expected " + hex(value) + " but got " + hex(self.vba.read_memory_at(self.registers.sp)) + self.push_stack(push) if bank != 0: self.registers["af"] = (bank << 8) | (self.registers["af"] & 0xFF) @@ -143,6 +136,16 @@ class crystal(object): else: self.registers["pc"] = address + def push_stack(self, push): + for value in push: + self.registers["sp"] -= 2 + self.vba.write_memory_at(self.registers.sp + 1, value >> 8) + self.vba.write_memory_at(self.registers.sp, value & 0xFF) + if list(self.vba.memory[self.registers.sp : self.registers.sp + 2]) != [value & 0xFF, value >> 8]: + print "desired memory values: " + str([value & 0xFF, value >> 8] ) + print "actual memory values: " + str(list(self.vba.memory[self.registers.sp : self.registers.sp + 2])) + print "wrong value at " + hex(self.registers.sp) + " expected " + hex(value) + " but got " + hex(self.vba.read_memory_at(self.registers.sp)) + def get_stack(self): """ Return a list of functions on the stack. @@ -578,16 +581,74 @@ class crystal(object): hp = ((self.vba.memory[0xd218] << 8) | self.vba.memory[0xd217]) return hp - def start_trainer_battle(self, trainer_group, trainer_id): + def start_trainer_battle(self, map_group=0x1, map_id=0xc, x=6, y=8, direction="l", loop_limit=10): + """ + Starts a trainer battle by warping into a map at the designated + coordinates, pressing the direction button for a full walk step (which + ideally should be blocked, this is mainly to establish direction), and + then pressing "a" to initiate the trainer battle. + """ + self.warp(map_group, map_id, x, y) + + # finish loading the map, might not be necessary? + self.nstep(100) + + # face towards the trainer (or whatever direction was specified). If + # this direction is blocked, then this will only change which direction + # the character is facing. However, if this direction is not blocked by + # the map or by an npc, then this will cause an entire step to be + # taken. + self.vba.press([direction]) + + # talk to the trainer, don't assume line of sight will be triggered + self.vba.press(["a"]) + self.vba.press([]) + + # trainer might talk, skip any text until the player can choose moves + while not self.is_in_battle() and loop_limit > 0: + self.text_wait() + loop_limit -= 1 + + def broken_start_battle(self): + # go to a map with wildmons + self.warp(0x1, 0xc, 6, 8) + self.nstep(200) + memory = self.vba.memory + Script_startbattle_address = 0x97436 + CallScript_address = 0x261f + RockSmashBattleScript_address = 0x97cf9 + RockSmashEncounter_address = 0x97cc0 + StartBattle_address = 0x3f4c1 + ScriptRunning = 0xd438 + ScriptBank = 0xd439 + ScriptPos = 0xd43a + start_wild_battle = 0x3f4dd + script = 0x1a1dc6 + # setup the battle - memory[0xd459] = 0x81 - memory[0xd22f] = trainer_group - memory[0xd231] = trainer_id + #memory[0xd459] = 0x81 + #memory[0xd22f] = trainer_group + #memory[0xd231] = trainer_id - self.vba.memory = memory + #self.vba.memory = memory - Script_startbattle_address = 0x97436 + #self.call(0x25, Script_startbattle_address % 0x4000) + + #self.vba.registers["af"] = ((RockSmashBattleScript_address / 0x4000) << 8) | (self.vba.registers.af & 0xff) + #self.vba.registers["hl"] = RockSmashBattleScript_address % 0x4000 + #self.call(0x0, CallScript_address) + + #self.call(StartBattle_address / 0x4000, StartBattle_address % 0x4000) + #self.call(RockSmashEncounter_address / 0x4000, RockSmashEncounter_address % 0x4000) + + #self.push_stack([self.registers.pc]) + #memory[ScriptBank] = script / 0x4000 + #memory[ScriptPos] = ((script % 0x4000) & 0xff00) >> 8 + #memory[ScriptPos+1] = ((script % 0x4000) & 0xff) + #memory[ScriptRunning] = 0xff + + #self.call(start_wild_battle / 0x4000, start_wild_battle % 0x4000) - self.call(0x25, Script_startbattle_address) + #self.vba.memory = memory |