annotate mamba/snake.py @ 203:8009742103e7

Add a segment when driving over the big rat.
author Simon Cross <hodgestar@gmail.com>
date Wed, 14 Sep 2011 20:26:39 +0200
parents 498c1d659a94
children 2b5956bedf64
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """The player snake object."""
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
188
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
3 from pygame.sprite import Group, spritecollide
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
4
199
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 198
diff changeset
5 from mamba.constants import TILE_SIZE, UP, DOWN, LEFT, RIGHT
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
6 from mamba.sprites import BaseSprite
186
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
7 from mamba.engine import SnakeDiedEvent
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
8 from mamba import mutators
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
9
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
11 class Snake(object):
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
12
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
13 def __init__(self, tile_pos, orientation):
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
14 self.segments = self.create_segments(tile_pos, orientation)
201
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
15 self.pending_segments = [] # segments waiting to be added
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
16 self.segment_group = Group()
178
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
17 self.segment_group.add(*reversed(self.segments))
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
18 self.set_orientation(orientation)
178
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
19 self.speed = 120.0 # pixel / s
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
20 self.frac_ds = 0.0
181
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
21 self.mutation = None
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
22
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
23 head = property(fget=lambda self: self.segments[0])
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
24 tail = property(fget=lambda self: self.segments[-1])
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
25
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
26 def create_segments(self, tile_pos, orientation):
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
27 tx, ty = tile_pos
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
28 dx, dy = orientation
178
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
29 segments = []
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
30 for cls in [Head] + [Body] * 10 + [Tail]:
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
31 segments.append(cls((tx, ty)))
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
32 return segments
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
33
201
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
34 def add_segment(self, segment=None):
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
35 if segment is None:
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
36 segment = Body((0, 0))
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
37 self.pending_segments.append(segment)
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
38
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
39 def remove_segment(self, segment=None):
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
40 if segment is None:
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
41 if len(self.segments) < 3:
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
42 return
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
43 segment = self.segments[-2]
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
44 try:
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
45 idx = self.segments.index(segment)
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
46 except IndexError:
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
47 return
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
48 self.shiftup_segments(idx, segment.get_tile_state())
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
49 del self.segments[idx]
202
498c1d659a94 Remove a segment when driving over the small rat.
Simon Cross <hodgestar@gmail.com>
parents: 201
diff changeset
50 segment.kill()
201
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
51
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
52 def shiftup_segments(self, idx, state):
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
53 for segment in self.segments[idx:]:
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
54 next_state = segment.get_tile_state()
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
55 segment.shift_tile(state)
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
56 state = next_state
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
57
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
58 def draw(self, surface):
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
59 self.segment_group.draw(surface)
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
60
181
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
61 def update(self, dt, world):
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
62 ds = dt * self.speed + self.frac_ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
63 ds, self.frac_ds = divmod(ds, 1)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
64 ds = int(ds)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
65 while True:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
66 tile_state = self.head.get_tile_state()
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
67 shifted, ds = self.head.shift_head(ds)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
68 if not shifted:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
69 break
203
8009742103e7 Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents: 202
diff changeset
70 if self.pending_segments:
8009742103e7 Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents: 202
diff changeset
71 new_segment = self.pending_segments.pop(0)
8009742103e7 Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents: 202
diff changeset
72 self.segments.insert(1, new_segment)
8009742103e7 Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents: 202
diff changeset
73 self.segment_group.add(new_segment)
8009742103e7 Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents: 202
diff changeset
74 new_segment.shift_tile(tile_state)
8009742103e7 Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents: 202
diff changeset
75 print len(self.segments)
8009742103e7 Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents: 202
diff changeset
76 else:
8009742103e7 Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents: 202
diff changeset
77 self.shiftup_segments(1, tile_state)
201
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
78 if not self.check_uturn():
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
79 self.head.set_orientation(self.orientation)
119
119c0fb758c2 Move key handling into GameWidget and GameWidget into widgets.game.
Simon Cross <hodgestar@gmail.com>
parents: 118
diff changeset
80
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
81 for segment in self.segments:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
82 segment.shift_pixels(ds)
188
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
83 world.interact(segment)
145
20b2cedf0f1d Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents: 141
diff changeset
84
201
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
85 def check_uturn(self):
198
2876658d0b98 Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents: 195
diff changeset
86 if len(self.segments) > 1:
2876658d0b98 Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents: 195
diff changeset
87 neck_x, neck_y = self.segments[1].tile_pos
2876658d0b98 Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents: 195
diff changeset
88 head_x, head_y = self.head.tile_pos
201
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
89 if (head_x + self.orientation[0] == neck_x and
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
90 head_y + self.orientation[1] == neck_y):
198
2876658d0b98 Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents: 195
diff changeset
91 # Don't allow the snake to go back on itself
2876658d0b98 Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents: 195
diff changeset
92 # immediately. More creative self-inflicted
2876658d0b98 Don't allow the snake to reverse onto itself immediately.
Simon Cross <hodgestar@gmail.com>
parents: 195
diff changeset
93 # deaths are allowed though.
201
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
94 return True
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
95 return False
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
96
78f9cafb0819 Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents: 199
diff changeset
97 def set_orientation(self, orientation):
119
119c0fb758c2 Move key handling into GameWidget and GameWidget into widgets.game.
Simon Cross <hodgestar@gmail.com>
parents: 118
diff changeset
98 self.orientation = orientation
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
99
181
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
100 def crash(self):
186
275f0be6946c Reincarnating Snakes
Neil Muller <drnlmuller@gmail.com>
parents: 182
diff changeset
101 SnakeDiedEvent.post()
181
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
102
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
103 def mutate(self, mutation):
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
104 self.mutation = mutation
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
105
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
106 def can_swim(self):
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
107 return self.mutation == 'amphibious'
061d711ba570 Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents: 178
diff changeset
108
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
109
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
110 class Segment(BaseSprite):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
111
195
d488731886dc Wean colour overlays off image colour patches.
Simon Cross <hodgestar@gmail.com>
parents: 188
diff changeset
112 GREEN = mutators.SNAKE_GREEN
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
113 BLUE = mutators.BLUE
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
114 RED = mutators.RED
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
115 YELLOW = mutators.YELLOW
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
116
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
117 _detail_mutators = ()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
118
182
0a955d2536f0 Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents: 181
diff changeset
119 is_head = False
0a955d2536f0 Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents: 181
diff changeset
120
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
121 def __init__(self, image_name, tile_pos):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
122 super(Segment, self).__init__()
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
123 self.set_base_image(image_name)
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
124 self._colour_overlay = self.GREEN
199
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 198
diff changeset
125 self.orientation = UP
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
126
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
127 self.make_images()
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
128 self.update_image()
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
129 self.set_tile_pos(tile_pos)
188
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
130 self.on_tiles = []
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
131
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
132 def filter_collisions(self, group):
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
133 collide = []
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
134 tiles = spritecollide(self, group, False)
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
135 for tile in tiles:
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
136 if tile not in self.on_tiles:
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
137 collide.append(tile)
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
138 self.on_tiles = tiles
d76c069164c0 Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
139 return collide
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
140
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
141 def set_base_image(self, image_name):
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
142 self._base_image = "/".join(["snake", image_name])
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
143
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
144 def make_images(self):
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
145 self._images = {}
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
146 for orientation, muts in [
199
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 198
diff changeset
147 (RIGHT, (mutators.RIGHT,)),
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 198
diff changeset
148 (LEFT, (mutators.LEFT,)),
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 198
diff changeset
149 (UP, (mutators.UP,)),
986e72d2cb4d Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents: 198
diff changeset
150 (DOWN, (mutators.DOWN,)),
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
151 ]:
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
152 all_muts = (self._colour_overlay,) + self._detail_mutators + muts
141
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 131
diff changeset
153 self._images[orientation] = self.load_image(self._base_image,
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 131
diff changeset
154 all_muts)
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
155
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
156 def update_image(self):
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
157 self.image = self._images[self.orientation]
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
158
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
159 def set_orientation(self, orientation):
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
160 self.orientation = orientation
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
161 self.update_image()
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
162
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
163 def set_colour(self, colour_overlay):
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
164 self._colour_overlay = colour_overlay
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
165 self.make_images()
125
625b22f92efa the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 122
diff changeset
166 self.update_image()
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
167
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
168 def get_tile_state(self):
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
169 return self.tile_pos, self.orientation
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
170
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
171 def shift_tile(self, tile_state):
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
172 """Shift this segment to the tile the other one was on.
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
173
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
174 Also reset the position to be the center of the tile.
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
175 """
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
176 tile_pos, orientation = tile_state
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
177 self.set_tile_pos(tile_pos)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
178 self.orientation = orientation
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
179
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
180 def shift_pixels(self, distance):
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
181 """Shift this segment a number of pixels."""
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
182 dx, dy = self.orientation
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
183 dx, dy = distance * dx, distance * dy
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
184 self.rect = self.rect.move(dx, dy)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
185
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
186
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
187 class Head(Segment):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
188 CLOSED = "snake-head"
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
189 OPEN = "snake-head-mouth-open-r"
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
190 EYE = mutators.Overlay("tiles/common/snake/snake-head-eye-r.png")
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
191 TONGUE = mutators.Overlay("tiles/common/snake/snake-head-tongue-r.png")
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
192
182
0a955d2536f0 Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents: 181
diff changeset
193 is_head = True
0a955d2536f0 Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents: 181
diff changeset
194
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
195 def __init__(self, tile_pos):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
196 self._detail_mutators = (self.EYE,)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
197 super(Head, self).__init__(self.CLOSED, tile_pos)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
198
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
199 def mouth_open(self):
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
200 self.set_base_image(self.OPEN)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
201 self.make_images()
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
202 self.update_image()
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
203
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
204 def mouth_closed(self):
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
205 self.set_base_image(self.CLOSED)
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
206 self.make_images()
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
207 self.update_image()
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
208
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
209 def tongue_out(self):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
210 self._detail_mutators = (self.EYE, self.TONGUE)
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
211 self.make_images()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
212 self.update_image()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
213
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
214 def tongue_in(self):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
215 self._detail_mutators = (self.EYE,)
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
216 self.make_images()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
217 self.update_image()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
218
177
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
219 def shift_head(self, ds):
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
220 """Shift the head a number of pixels in the direction of it
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
221 orientation.
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
222 """
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
223 dx, dy = self.orientation
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
224 TX, TY = TILE_SIZE
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
225 rx, ry = self.rect.left, self.rect.top
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
226 tx, ty = self.tile_pos
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
227 # WARNING: Tri-state logic ahead
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
228 # (Tri-state logic is the mamba's natural habitat)
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
229 if dx != 0:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
230 newdx = rx + ds * dx
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
231 newtx = newdx / TX
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
232 if newtx > tx:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
233 self.set_tile_pos((tx + 1, ty))
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
234 ds = newdx - self.rect.left
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
235 return True, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
236 elif newtx < tx - 1:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
237 self.set_tile_pos((tx - 1, ty))
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
238 ds = self.rect.left - newdx
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
239 return True, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
240 else:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
241 newdy = ry + ds * dy
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
242 newty = newdy / TY
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
243 if newty > ty:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
244 self.set_tile_pos((tx, ty + 1))
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
245 ds = newdy - self.rect.top
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
246 return True, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
247 elif newty < ty - 1:
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
248 self.set_tile_pos((tx, ty - 1))
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
249 ds = self.rect.top - newdy
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
250 return True, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
251 return False, ds
e0573297b17c Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents: 153
diff changeset
252
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
253
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
254 class Body(Segment):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
255 def __init__(self, tile_pos):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
256 super(Body, self).__init__("snake-body", tile_pos)
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
257
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
258
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
259 class Tail(Segment):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
260 def __init__(self, tile_pos):
153
9c47bf162ea1 snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 145
diff changeset
261 super(Tail, self).__init__("snake-tail", tile_pos)