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
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
221
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
3 import random
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 212
diff changeset
10 from mamba.engine import SnakeDiedEvent, LevelCompletedEvent
282
56cd71696dff Use some sound files
Neil Muller <drnlmuller@gmail.com>
parents: 263
diff changeset
11 from mamba.sound import load_sound, play_sound
98
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
12 from mamba import mutators
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
13
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
18 class Snake(object):
78
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
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
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
27 self.segment_group = Group()
178
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
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
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
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
b1019923cb12 Direction control for snake.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
35
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
36 head = property(fget=lambda self: self.segments[0])
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
37 tail = property(fget=lambda self: self.segments[-1])
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
38
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
39 def create_segments(self, tile_pos, orientation):
178
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
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
74f8d8cbc51d Longer, speedier mamba.
Simon Cross <hodgestar@gmail.com>
parents: 177
diff changeset
43 return segments
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
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
bf661acd34ee Fix segment adding.
Simon Cross <hodgestar@gmail.com>
parents: 205
diff changeset
89 for segment in self.segments[2:]:
bf661acd34ee Fix segment adding.
Simon Cross <hodgestar@gmail.com>
parents: 205
diff changeset
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
80ba03bec6ad Make arrows work
Stefano Rivera <stefano@rivera.za.net>
parents: 316
diff changeset
120 def force_new_direction(self, orientation):
80ba03bec6ad Make arrows work
Stefano Rivera <stefano@rivera.za.net>
parents: 316
diff changeset
121 self._orientation_changes.insert(0, orientation)
80ba03bec6ad Make arrows work
Stefano Rivera <stefano@rivera.za.net>
parents: 316
diff changeset
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
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
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
56cd71696dff Use some sound files
Neil Muller <drnlmuller@gmail.com>
parents: 263
diff changeset
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
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 212
diff changeset
154 def exit_level(self):
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 212
diff changeset
155 LevelCompletedEvent.post()
7a9be9add4c7 Hook up exit.
Simon Cross <hodgestar@gmail.com>
parents: 212
diff changeset
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
59166ae6e864 fire works
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 252
diff changeset
164 def flame_retardant(self):
59166ae6e864 fire works
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 252
diff changeset
165 return self.mutation == 'flame-retardant'
59166ae6e864 fire works
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 252
diff changeset
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
7ce2d2d8381a Refactor BaseSprite.
Simon Cross <hodgestar@gmail.com>
parents: 79
diff changeset
172
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
173 class Segment(BaseSprite):
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
180 _detail_mutators = ()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
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
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
207 def make_images(self):
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
208 self._images = {}
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 131
diff changeset
216 self._images[orientation] = self.load_image(self._base_image,
2c643ec8dc4e pep8 & pyflakes cleanup
Neil Muller <drnlmuller@gmail.com>
parents: 131
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
221
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
253 def shifted_tile(self):
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
254 pass
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
296
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
318
131
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
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
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
321 self.make_images()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
322 self.update_image()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
323
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
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
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
326 self.make_images()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
327 self.update_image()
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 129
diff changeset
328
221
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
329 def shifted_tile(self):
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
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
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
332 self.tongue_out()
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
333 else:
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
334 self.mouth_close()
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
335 self.tongue_in()
3a652f048f57 Tssss, I smell rats
Stefano Rivera <stefano@rivera.za.net>
parents: 218
diff changeset
336
110
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
337
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
341
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
342
e6299eb296ce Draw the world!
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
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()