Mercurial > mamba
annotate mamba/snake.py @ 501:ed752233f1aa
Clamp distance moved per update to shorter side of tile.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Sat, 17 Sep 2011 23:41:01 +0200 |
parents | 1e299187884b |
children | 3fdbde59dc8a |
rev | line source |
---|---|
78 | 1 """The player snake object.""" |
2 | |
221 | 3 import random |
4 | |
392
a48c7b4cf65a
Die if you leave the arena
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
5 import pygame |
188
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
6 from pygame.sprite import Group, spritecollide |
110 | 7 |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
8 from mamba.constants import TILE_SIZE, UP, DOWN, LEFT, RIGHT |
252
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
9 from mamba.sprites import BaseSprite, tile_sizify |
213 | 10 from mamba.engine import SnakeDiedEvent, LevelCompletedEvent |
282 | 11 from mamba.sound import load_sound, play_sound |
98 | 12 from mamba import mutators |
78 | 13 |
14 | |
217
874eb26aad10
No more mile-long snake to start with.
Jeremy Thurgood <firxen@gmail.com>
parents:
213
diff
changeset
|
15 INITIAL_SEGMENT_COUNT = 4 |
874eb26aad10
No more mile-long snake to start with.
Jeremy Thurgood <firxen@gmail.com>
parents:
213
diff
changeset
|
16 |
874eb26aad10
No more mile-long snake to start with.
Jeremy Thurgood <firxen@gmail.com>
parents:
213
diff
changeset
|
17 |
110 | 18 class Snake(object): |
78 | 19 |
501
ed752233f1aa
Clamp distance moved per update to shorter side of tile.
Simon Cross <hodgestar@gmail.com>
parents:
472
diff
changeset
|
20 # don't move more than one tile at once |
ed752233f1aa
Clamp distance moved per update to shorter side of tile.
Simon Cross <hodgestar@gmail.com>
parents:
472
diff
changeset
|
21 MAX_DISTANCE = min(TILE_SIZE) |
ed752233f1aa
Clamp distance moved per update to shorter side of tile.
Simon Cross <hodgestar@gmail.com>
parents:
472
diff
changeset
|
22 |
78 | 23 def __init__(self, tile_pos, orientation): |
316
cd544a311f11
Move directory names into sound.py for simplicity
Neil Muller <drnlmuller@gmail.com>
parents:
312
diff
changeset
|
24 load_sound('crash', 'crash.ogg') |
110 | 25 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
|
26 self.pending_segments = [] # segments waiting to be added |
110 | 27 self.segment_group = Group() |
178 | 28 self.segment_group.add(*reversed(self.segments)) |
425
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
29 self.set_orientation(orientation) |
178 | 30 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
|
31 self.frac_ds = 0.0 |
181
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
32 self.mutation = None |
225
af95fbc8ef5c
Snakes should be impermeable. So now they are.
Jeremy Thurgood <firxen@gmail.com>
parents:
223
diff
changeset
|
33 self.coiled = True |
307
09ec51b9d385
Queue movement commands and handle them sanely. (FSVO)
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
34 self._orientation_changes = [] |
78 | 35 |
110 | 36 head = property(fget=lambda self: self.segments[0]) |
37 tail = property(fget=lambda self: self.segments[-1]) | |
38 | |
39 def create_segments(self, tile_pos, orientation): | |
178 | 40 segments = [] |
217
874eb26aad10
No more mile-long snake to start with.
Jeremy Thurgood <firxen@gmail.com>
parents:
213
diff
changeset
|
41 for cls in [Head] + [Body] * INITIAL_SEGMENT_COUNT + [Tail]: |
425
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
42 segments.append(cls(tile_pos, orientation)) |
178 | 43 return segments |
110 | 44 |
201
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
45 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
|
46 if segment is None: |
427
81eba9892ade
Allow big rats to be eaten, again
Stefano Rivera <stefano@rivera.za.net>
parents:
425
diff
changeset
|
47 segment = Body((0, 0), UP) |
205
2b5956bedf64
Set colour of default new segment to colour of snake head.
Simon Cross <hodgestar@gmail.com>
parents:
203
diff
changeset
|
48 segment.set_colour(self.head.colour) |
201
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
49 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
|
50 |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
51 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
|
52 if segment is None: |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
53 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
|
54 return |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
55 segment = self.segments[-2] |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
56 try: |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
57 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
|
58 except IndexError: |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
59 return |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
60 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
|
61 del self.segments[idx] |
202
498c1d659a94
Remove a segment when driving over the small rat.
Simon Cross <hodgestar@gmail.com>
parents:
201
diff
changeset
|
62 segment.kill() |
201
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
63 |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
64 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
|
65 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
|
66 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
|
67 segment.shift_tile(state) |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
68 state = next_state |
78f9cafb0819
Fix uturns. Start of work on adding and removing segments.
Simon Cross <hodgestar@gmail.com>
parents:
199
diff
changeset
|
69 |
110 | 70 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
|
71 self.segment_group.draw(surface) |
98 | 72 |
181
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
73 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
|
74 ds = dt * self.speed + self.frac_ds |
501
ed752233f1aa
Clamp distance moved per update to shorter side of tile.
Simon Cross <hodgestar@gmail.com>
parents:
472
diff
changeset
|
75 ds = min(ds, self.MAX_DISTANCE) |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
76 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
|
77 ds = int(ds) |
465
738712143645
Cap Snake movement to one tile per loop
Stefano Rivera <stefano@rivera.za.net>
parents:
427
diff
changeset
|
78 tile_state = self.head.get_tile_state() |
738712143645
Cap Snake movement to one tile per loop
Stefano Rivera <stefano@rivera.za.net>
parents:
427
diff
changeset
|
79 shifted, ds = self.head.shift_head(ds) |
738712143645
Cap Snake movement to one tile per loop
Stefano Rivera <stefano@rivera.za.net>
parents:
427
diff
changeset
|
80 if shifted: |
738712143645
Cap Snake movement to one tile per loop
Stefano Rivera <stefano@rivera.za.net>
parents:
427
diff
changeset
|
81 self.coiled = False |
738712143645
Cap Snake movement to one tile per loop
Stefano Rivera <stefano@rivera.za.net>
parents:
427
diff
changeset
|
82 self.head.shifted_tile() |
738712143645
Cap Snake movement to one tile per loop
Stefano Rivera <stefano@rivera.za.net>
parents:
427
diff
changeset
|
83 self._pop_orientation_queue() |
203
8009742103e7
Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents:
202
diff
changeset
|
84 if self.pending_segments: |
8009742103e7
Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents:
202
diff
changeset
|
85 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
|
86 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
|
87 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
|
88 new_segment.shift_tile(tile_state) |
206 | 89 for segment in self.segments[2:]: |
90 segment.shift_tile(segment.get_tile_state()) | |
472
1e299187884b
Fix two-colours-plus rat eating bug.
Simon Cross <hodgestar@gmail.com>
parents:
465
diff
changeset
|
91 # Fix for segment being mis-coloured when the |
1e299187884b
Fix two-colours-plus rat eating bug.
Simon Cross <hodgestar@gmail.com>
parents:
465
diff
changeset
|
92 # snake passes over two consequetive paint |
1e299187884b
Fix two-colours-plus rat eating bug.
Simon Cross <hodgestar@gmail.com>
parents:
465
diff
changeset
|
93 # splashes and then eats a lot of large rats |
1e299187884b
Fix two-colours-plus rat eating bug.
Simon Cross <hodgestar@gmail.com>
parents:
465
diff
changeset
|
94 # Warning: Don't completely understand why this |
1e299187884b
Fix two-colours-plus rat eating bug.
Simon Cross <hodgestar@gmail.com>
parents:
465
diff
changeset
|
95 # works. |
1e299187884b
Fix two-colours-plus rat eating bug.
Simon Cross <hodgestar@gmail.com>
parents:
465
diff
changeset
|
96 ds = 0 |
203
8009742103e7
Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents:
202
diff
changeset
|
97 else: |
8009742103e7
Add a segment when driving over the big rat.
Simon Cross <hodgestar@gmail.com>
parents:
202
diff
changeset
|
98 self.shiftup_segments(1, tile_state) |
119
119c0fb758c2
Move key handling into GameWidget and GameWidget into widgets.game.
Simon Cross <hodgestar@gmail.com>
parents:
118
diff
changeset
|
99 |
225
af95fbc8ef5c
Snakes should be impermeable. So now they are.
Jeremy Thurgood <firxen@gmail.com>
parents:
223
diff
changeset
|
100 self.check_self_crash() |
392
a48c7b4cf65a
Die if you leave the arena
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
101 self.check_on_screen(world) |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
102 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
|
103 segment.shift_pixels(ds) |
188
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
104 world.interact(segment) |
145
20b2cedf0f1d
Snake movement now turn
Gideon Visser <gideon@gideonvisser.com>
parents:
141
diff
changeset
|
105 |
307
09ec51b9d385
Queue movement commands and handle them sanely. (FSVO)
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
106 def send_new_direction(self, orientation): |
410
09ff0abf3e0f
Filter keys at queueing time too
Stefano Rivera <stefano@rivera.za.net>
parents:
392
diff
changeset
|
107 # Filter illegal & noop orientation changes |
09ff0abf3e0f
Filter keys at queueing time too
Stefano Rivera <stefano@rivera.za.net>
parents:
392
diff
changeset
|
108 if self._orientation_changes: |
09ff0abf3e0f
Filter keys at queueing time too
Stefano Rivera <stefano@rivera.za.net>
parents:
392
diff
changeset
|
109 tip = self._orientation_changes[-1] |
09ff0abf3e0f
Filter keys at queueing time too
Stefano Rivera <stefano@rivera.za.net>
parents:
392
diff
changeset
|
110 else: |
09ff0abf3e0f
Filter keys at queueing time too
Stefano Rivera <stefano@rivera.za.net>
parents:
392
diff
changeset
|
111 tip = self.head.orientation |
09ff0abf3e0f
Filter keys at queueing time too
Stefano Rivera <stefano@rivera.za.net>
parents:
392
diff
changeset
|
112 if ((0 == orientation[0] == tip[0]) |
09ff0abf3e0f
Filter keys at queueing time too
Stefano Rivera <stefano@rivera.za.net>
parents:
392
diff
changeset
|
113 or (0 == orientation[1] == tip[1])): |
09ff0abf3e0f
Filter keys at queueing time too
Stefano Rivera <stefano@rivera.za.net>
parents:
392
diff
changeset
|
114 return |
09ff0abf3e0f
Filter keys at queueing time too
Stefano Rivera <stefano@rivera.za.net>
parents:
392
diff
changeset
|
115 |
307
09ec51b9d385
Queue movement commands and handle them sanely. (FSVO)
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
116 self._orientation_changes.append(orientation) |
308
31bbd0ed9b63
Merge the two orientation queues into one
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
117 # Cap queue length: |
312
8a6ef789bd45
Cap at three moves, not two.
Jeremy Thurgood <firxen@gmail.com>
parents:
311
diff
changeset
|
118 self._orientation_changes = self._orientation_changes[:3] |
307
09ec51b9d385
Queue movement commands and handle them sanely. (FSVO)
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
119 |
385 | 120 def force_new_direction(self, orientation): |
121 self._orientation_changes.insert(0, orientation) | |
122 | |
308
31bbd0ed9b63
Merge the two orientation queues into one
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
123 def _pop_orientation_queue(self): |
307
09ec51b9d385
Queue movement commands and handle them sanely. (FSVO)
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
124 while self._orientation_changes: |
09ec51b9d385
Queue movement commands and handle them sanely. (FSVO)
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
125 orientation = self._orientation_changes.pop(0) |
09ec51b9d385
Queue movement commands and handle them sanely. (FSVO)
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
126 if ((0 == orientation[0] == self.head.orientation[0]) |
09ec51b9d385
Queue movement commands and handle them sanely. (FSVO)
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
127 or (0 == orientation[1] == self.head.orientation[1])): |
09ec51b9d385
Queue movement commands and handle them sanely. (FSVO)
Jeremy Thurgood <firxen@gmail.com>
parents:
305
diff
changeset
|
128 continue |
308
31bbd0ed9b63
Merge the two orientation queues into one
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
129 self.set_orientation(orientation) |
31bbd0ed9b63
Merge the two orientation queues into one
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
130 break |
31bbd0ed9b63
Merge the two orientation queues into one
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
131 |
31bbd0ed9b63
Merge the two orientation queues into one
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
132 def set_orientation(self, orientation): |
31bbd0ed9b63
Merge the two orientation queues into one
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
133 self.orientation = orientation |
31bbd0ed9b63
Merge the two orientation queues into one
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
134 self.head.set_orientation(orientation) |
98 | 135 |
225
af95fbc8ef5c
Snakes should be impermeable. So now they are.
Jeremy Thurgood <firxen@gmail.com>
parents:
223
diff
changeset
|
136 def check_self_crash(self): |
af95fbc8ef5c
Snakes should be impermeable. So now they are.
Jeremy Thurgood <firxen@gmail.com>
parents:
223
diff
changeset
|
137 if self.coiled: |
af95fbc8ef5c
Snakes should be impermeable. So now they are.
Jeremy Thurgood <firxen@gmail.com>
parents:
223
diff
changeset
|
138 return |
af95fbc8ef5c
Snakes should be impermeable. So now they are.
Jeremy Thurgood <firxen@gmail.com>
parents:
223
diff
changeset
|
139 collides = spritecollide(self.head, self.segment_group, False) |
af95fbc8ef5c
Snakes should be impermeable. So now they are.
Jeremy Thurgood <firxen@gmail.com>
parents:
223
diff
changeset
|
140 if [s for s in collides if s not in self.segments[:2]]: |
304
49fe66680ff8
And even death shall lose it's mysteries
Neil Muller <drnlmuller@gmail.com>
parents:
295
diff
changeset
|
141 self.crash('You hit yourself!') |
225
af95fbc8ef5c
Snakes should be impermeable. So now they are.
Jeremy Thurgood <firxen@gmail.com>
parents:
223
diff
changeset
|
142 |
392
a48c7b4cf65a
Die if you leave the arena
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
143 def check_on_screen(self, world): |
a48c7b4cf65a
Die if you leave the arena
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
144 if self.coiled: |
a48c7b4cf65a
Die if you leave the arena
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
145 return |
a48c7b4cf65a
Die if you leave the arena
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
146 world_rect = pygame.Rect((0, 0), world.level.get_size()) |
a48c7b4cf65a
Die if you leave the arena
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
147 if not world_rect.contains(self.head.rect): |
a48c7b4cf65a
Die if you leave the arena
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
148 self.crash('You left the arena!') |
a48c7b4cf65a
Die if you leave the arena
Stefano Rivera <stefano@rivera.za.net>
parents:
385
diff
changeset
|
149 |
304
49fe66680ff8
And even death shall lose it's mysteries
Neil Muller <drnlmuller@gmail.com>
parents:
295
diff
changeset
|
150 def crash(self, reason='You hit something'): |
282 | 151 play_sound('crash') |
304
49fe66680ff8
And even death shall lose it's mysteries
Neil Muller <drnlmuller@gmail.com>
parents:
295
diff
changeset
|
152 SnakeDiedEvent.post(reason) |
181
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
153 |
213 | 154 def exit_level(self): |
155 LevelCompletedEvent.post() | |
156 | |
181
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
157 def mutate(self, mutation): |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
158 self.mutation = mutation |
261
d0ed88799c44
mutation indicators
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
255
diff
changeset
|
159 self.tail.show_mutation(mutation) |
181
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
160 |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
161 def can_swim(self): |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
162 return self.mutation == 'amphibious' |
061d711ba570
Interact with the world.
Jeremy Thurgood <firxen@gmail.com>
parents:
178
diff
changeset
|
163 |
255 | 164 def flame_retardant(self): |
165 return self.mutation == 'flame-retardant' | |
166 | |
263
c7c9d71ac6ea
Lizards and snails are extra delicious.
Jeremy Thurgood <firxen@gmail.com>
parents:
262
diff
changeset
|
167 def adjust_speed(self, delta): |
c7c9d71ac6ea
Lizards and snails are extra delicious.
Jeremy Thurgood <firxen@gmail.com>
parents:
262
diff
changeset
|
168 self.speed += delta |
c7c9d71ac6ea
Lizards and snails are extra delicious.
Jeremy Thurgood <firxen@gmail.com>
parents:
262
diff
changeset
|
169 self.speed = max(self.speed, 60) |
c7c9d71ac6ea
Lizards and snails are extra delicious.
Jeremy Thurgood <firxen@gmail.com>
parents:
262
diff
changeset
|
170 self.speed = min(self.speed, 180) |
c7c9d71ac6ea
Lizards and snails are extra delicious.
Jeremy Thurgood <firxen@gmail.com>
parents:
262
diff
changeset
|
171 |
98 | 172 |
110 | 173 class Segment(BaseSprite): |
174 | |
195
d488731886dc
Wean colour overlays off image colour patches.
Simon Cross <hodgestar@gmail.com>
parents:
188
diff
changeset
|
175 GREEN = mutators.SNAKE_GREEN |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
176 BLUE = mutators.BLUE |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
177 RED = mutators.RED |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
178 YELLOW = mutators.YELLOW |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
179 |
131 | 180 _detail_mutators = () |
181 | |
182
0a955d2536f0
Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents:
181
diff
changeset
|
182 is_head = False |
0a955d2536f0
Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents:
181
diff
changeset
|
183 |
425
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
184 def __init__(self, image_name, tile_pos, orientation): |
110 | 185 super(Segment, self).__init__() |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
186 self.set_base_image(image_name) |
205
2b5956bedf64
Set colour of default new segment to colour of snake head.
Simon Cross <hodgestar@gmail.com>
parents:
203
diff
changeset
|
187 self.colour = self.GREEN |
425
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
188 self.orientation = orientation |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
189 |
131 | 190 self.make_images() |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
191 self.update_image() |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
192 self.set_tile_pos(tile_pos) |
188
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
193 self.on_tiles = [] |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
194 |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
195 def filter_collisions(self, group): |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
196 collide = [] |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
197 tiles = spritecollide(self, group, False) |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
198 for tile in tiles: |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
199 if tile not in self.on_tiles: |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
200 collide.append(tile) |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
201 self.on_tiles = tiles |
d76c069164c0
Much better interaction detection.
Jeremy Thurgood <firxen@gmail.com>
parents:
187
diff
changeset
|
202 return collide |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
203 |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
204 def set_base_image(self, image_name): |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
205 self._base_image = "/".join(["snake", image_name]) |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
206 |
131 | 207 def make_images(self): |
110 | 208 self._images = {} |
209 for orientation, muts in [ | |
199
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
210 (RIGHT, (mutators.RIGHT,)), |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
211 (LEFT, (mutators.LEFT,)), |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
212 (UP, (mutators.UP,)), |
986e72d2cb4d
Rejiggered entrances and shifted directions around.
Jeremy Thurgood <firxen@gmail.com>
parents:
198
diff
changeset
|
213 (DOWN, (mutators.DOWN,)), |
110 | 214 ]: |
205
2b5956bedf64
Set colour of default new segment to colour of snake head.
Simon Cross <hodgestar@gmail.com>
parents:
203
diff
changeset
|
215 all_muts = (self.colour,) + self._detail_mutators + muts |
141 | 216 self._images[orientation] = self.load_image(self._base_image, |
217 all_muts) | |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
218 |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
219 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
|
220 self.image = self._images[self.orientation] |
110 | 221 |
222 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
|
223 self.orientation = orientation |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
224 self.update_image() |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
225 |
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
226 def set_colour(self, colour_overlay): |
205
2b5956bedf64
Set colour of default new segment to colour of snake head.
Simon Cross <hodgestar@gmail.com>
parents:
203
diff
changeset
|
227 self.colour = colour_overlay |
131 | 228 self.make_images() |
125
625b22f92efa
the snake is green
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
122
diff
changeset
|
229 self.update_image() |
110 | 230 |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
231 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
|
232 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
|
233 |
252
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
234 def get_distance(self): |
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
235 rx, ry = self.rect.topleft |
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
236 x, y = tile_sizify(self.tile_pos) |
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
237 return max(abs(rx - x), abs(ry - y)) |
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
238 |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
239 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
|
240 """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
|
241 |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
242 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
|
243 """ |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
244 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
|
245 self.set_tile_pos(tile_pos) |
295
43ac21d498a1
Fix segment orientation.
Jeremy Thurgood <firxen@gmail.com>
parents:
282
diff
changeset
|
246 self.set_orientation(orientation) |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
247 |
252
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
248 def shift_tile_and_pixels(self, tile_state): |
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
249 ds = self.get_distance() |
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
250 self.shift_tile(tile_state) |
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
251 self.shift_pixels(ds) |
8198492745b1
Try not to let head wander during teleporting (it's bad for your health).
Simon Cross <hodgestar@gmail.com>
parents:
232
diff
changeset
|
252 |
221 | 253 def shifted_tile(self): |
254 pass | |
255 | |
177
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
256 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
|
257 """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
|
258 dx, dy = self.orientation |
e0573297b17c
Snake that moves (my god that was an epic struggle).
Simon Cross <hodgestar@gmail.com>
parents:
153
diff
changeset
|
259 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
|
260 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
|
261 |
223
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
262 def shift_head(self, ds): |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
263 """Shift the head a number of pixels in the direction of it |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
264 orientation. |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
265 """ |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
266 dx, dy = self.orientation |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
267 TX, TY = TILE_SIZE |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
268 rx, ry = self.rect.left, self.rect.top |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
269 tx, ty = self.tile_pos |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
270 # WARNING: Tri-state logic ahead |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
271 # (Tri-state logic is the mamba's natural habitat) |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
272 if dx != 0: |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
273 newdx = rx + ds * dx |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
274 newtx = newdx / TX |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
275 if newtx > tx: |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
276 self.set_tile_pos((tx + 1, ty)) |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
277 ds = newdx - self.rect.left |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
278 return True, ds |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
279 elif newtx < tx - 1: |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
280 self.set_tile_pos((tx - 1, ty)) |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
281 ds = self.rect.left - newdx |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
282 return True, ds |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
283 else: |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
284 newdy = ry + ds * dy |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
285 newty = newdy / TY |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
286 if newty > ty: |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
287 self.set_tile_pos((tx, ty + 1)) |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
288 ds = newdy - self.rect.top |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
289 return True, ds |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
290 elif newty < ty - 1: |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
291 self.set_tile_pos((tx, ty - 1)) |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
292 ds = self.rect.top - newdy |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
293 return True, ds |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
294 return False, ds |
c3018764942a
Move shift_head onto base segment so that head is less special (in preparation for snake disappearing down the exit).
Simon Cross <hodgestar@gmail.com>
parents:
221
diff
changeset
|
295 |
110 | 296 |
297 class Head(Segment): | |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
298 CLOSED = "snake-head" |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
299 OPEN = "snake-head-mouth-open-r" |
212
e768056b0588
Refactor tile image loading stuff. More magic is good, right?
Jeremy Thurgood <firxen@gmail.com>
parents:
206
diff
changeset
|
300 EYE = mutators.Overlay("snake/snake-head-eye-r") |
e768056b0588
Refactor tile image loading stuff. More magic is good, right?
Jeremy Thurgood <firxen@gmail.com>
parents:
206
diff
changeset
|
301 TONGUE = mutators.Overlay("snake/snake-head-tongue-r") |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
302 |
182
0a955d2536f0
Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents:
181
diff
changeset
|
303 is_head = True |
0a955d2536f0
Painted Jezebel! (Assuming you name your snake Jezebel.)
Jeremy Thurgood <firxen@gmail.com>
parents:
181
diff
changeset
|
304 |
425
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
305 def __init__(self, tile_pos, orientation): |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
306 self._detail_mutators = (self.EYE,) |
425
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
307 super(Head, self).__init__(self.CLOSED, tile_pos, orientation) |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
308 |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
309 def mouth_open(self): |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
310 self.set_base_image(self.OPEN) |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
311 self.make_images() |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
312 self.update_image() |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
313 |
218
10804ae58066
Open mouth when eating things
Stefano Rivera <stefano@rivera.za.net>
parents:
217
diff
changeset
|
314 def mouth_close(self): |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
315 self.set_base_image(self.CLOSED) |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
316 self.make_images() |
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
317 self.update_image() |
110 | 318 |
131 | 319 def tongue_out(self): |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
320 self._detail_mutators = (self.EYE, self.TONGUE) |
131 | 321 self.make_images() |
322 self.update_image() | |
323 | |
324 def tongue_in(self): | |
153
9c47bf162ea1
snake has plastic surgery
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
145
diff
changeset
|
325 self._detail_mutators = (self.EYE,) |
131 | 326 self.make_images() |
327 self.update_image() | |
328 | |
221 | 329 def shifted_tile(self): |
330 if random.random() < 0.02: | |
311
3b7288064935
Revert accidentally commited tweak to the snake's tongue
Stefano Rivera <stefano@rivera.za.net>
parents:
308
diff
changeset
|
331 self.mouth_open() |
221 | 332 self.tongue_out() |
333 else: | |
334 self.mouth_close() | |
335 self.tongue_in() | |
336 | |
110 | 337 |
338 class Body(Segment): | |
425
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
339 def __init__(self, tile_pos, orientation): |
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
340 super(Body, self).__init__("snake-body", tile_pos, orientation) |
110 | 341 |
342 | |
343 class Tail(Segment): | |
261
d0ed88799c44
mutation indicators
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
255
diff
changeset
|
344 INDICATORS = { |
262
9f3b4e16372e
renamed tail images for consistency
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
261
diff
changeset
|
345 "flame-retardant": mutators.Overlay("snake/snake-tail-fire-r"), |
9f3b4e16372e
renamed tail images for consistency
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
261
diff
changeset
|
346 "amphibious": mutators.Overlay("snake/snake-tail-puddle-r"), |
261
d0ed88799c44
mutation indicators
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
255
diff
changeset
|
347 } |
d0ed88799c44
mutation indicators
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
255
diff
changeset
|
348 |
425
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
349 def __init__(self, tile_pos, orientation): |
37b7b045166a
Fix snake initial orientation. (Hint: it is not always UP.)
Jeremy Thurgood <firxen@gmail.com>
parents:
410
diff
changeset
|
350 super(Tail, self).__init__("snake-tail-r", tile_pos, orientation) |
261
d0ed88799c44
mutation indicators
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
255
diff
changeset
|
351 |
d0ed88799c44
mutation indicators
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
255
diff
changeset
|
352 def show_mutation(self, mutation): |
d0ed88799c44
mutation indicators
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
255
diff
changeset
|
353 self._detail_mutators = (self.INDICATORS[mutation],) |
d0ed88799c44
mutation indicators
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
255
diff
changeset
|
354 self.make_images() |
d0ed88799c44
mutation indicators
Adrianna Pińska <adrianna.pinska@gmail.com>
parents:
255
diff
changeset
|
355 self.update_image() |