comparison mamba/widgets/level.py @ 555:c014f5023cd2

Test run replays
author Neil Muller <drnlmuller@gmail.com>
date Thu, 22 Sep 2011 17:32:38 +0200
parents b308ebaa96f3
children 03c0f1f5488c
comparison
equal deleted inserted replaced
554:b308ebaa96f3 555:c014f5023cd2
3 from pygame.key import set_repeat 3 from pygame.key import set_repeat
4 4
5 from mamba.widgets.base import Widget 5 from mamba.widgets.base import Widget
6 from mamba.constants import TILE_SIZE 6 from mamba.constants import TILE_SIZE
7 from mamba.snake import Snake 7 from mamba.snake import Snake
8 from mamba.engine import FlipArrowsEvent 8 from mamba.engine import FlipArrowsEvent, ReplayEvent
9 9
10 10
11 class EditLevelWidget(Widget): 11 class EditLevelWidget(Widget):
12 def __init__(self, level, offset=(0, 0)): 12 def __init__(self, level, offset=(0, 0)):
13 self.level = level 13 self.level = level
20 super(EditLevelWidget, self).__init__(level_rect) 20 super(EditLevelWidget, self).__init__(level_rect)
21 self.add_callback(MOUSEBUTTONDOWN, self.place_tile) 21 self.add_callback(MOUSEBUTTONDOWN, self.place_tile)
22 self.add_callback(MOUSEBUTTONUP, self.end_draw) 22 self.add_callback(MOUSEBUTTONUP, self.end_draw)
23 self.add_callback(MOUSEMOTION, self.draw_tiles) 23 self.add_callback(MOUSEMOTION, self.draw_tiles)
24 self.add_callback(FlipArrowsEvent, self.flip_arrows) 24 self.add_callback(FlipArrowsEvent, self.flip_arrows)
25 self.add_callback(ReplayEvent, self.handle_replay)
25 self.snake = None 26 self.snake = None
26 self.snake_alive = False 27 self.snake_alive = False
28 self.replay_data = []
29 self.last_run = []
30 self.replay_pos = 0
31
32 def get_replay(self):
33 return self.replay_data[:]
34
35 def replay(self, run=None):
36 if run is None:
37 # We exclude the last couple of steps, so we don't redo
38 # the final crash in this run
39 run = self.last_run[:-4]
40 if len(run) > 0:
41 self.start_test()
42 ReplayEvent.post(run, 0)
43
44 def handle_replay(self, ev, widget):
45 self.apply_action(ev.run[ev.replay_pos])
46 if ev.replay_pos < len(ev.run) - 1:
47 ReplayEvent.post(ev.run, ev.replay_pos + 1)
27 48
28 def start_test(self): 49 def start_test(self):
29 self.level.update_tiles_ascii() 50 self.level.update_tiles_ascii()
51 self.last_run = self.replay_data
52 self.replay_data = []
30 self.level.restart() 53 self.level.restart()
31 tile_pos, orientation = self.level.get_entry() 54 tile_pos, orientation = self.level.get_entry()
32 self.snake = Snake(tile_pos, orientation) 55 self.snake = Snake(tile_pos, orientation)
33 set_repeat(40, 100) 56 set_repeat(40, 100)
34 self.snake_alive = True 57 self.snake_alive = True
60 83
61 def get_sprite(self, sprite_id): 84 def get_sprite(self, sprite_id):
62 return self.level.extra_sprites[sprite_id] 85 return self.level.extra_sprites[sprite_id]
63 86
64 def apply_action(self, orientation): 87 def apply_action(self, orientation):
88 self.replay_data.append(orientation)
65 if not self.snake or not self.snake_alive: 89 if not self.snake or not self.snake_alive:
66 return 90 return
67 # We choose numbers that are close to, but not exactly, move 0.5 tiles 91 # We choose numbers that are close to, but not exactly, move 0.5 tiles
68 # to avoid a couple of rounding corner cases in the snake code 92 # to avoid a couple of rounding corner cases in the snake code
69 if orientation is None or orientation == self.snake.orientation: 93 if orientation is None or orientation == self.snake.orientation: