annotate pytouhou/game/laser.py @ 316:f0be7ea62330

Fix a bug with ECL instruction 96, and fix overall ECL handling. The issue with instruction 96 was about death callbacks, being executed on the caller of instruction 96 instead of the dying enemies. This was introduced by changeset 5930b33a0370. Additionnaly, ECL processes are now an attribute of the Enemy, and death/timeout conditions are checked right after the ECL frame, even if the ECL script has already ended, just like in the original game.
author Thibaut Girka <thib@sitedethib.com>
date Thu, 29 Mar 2012 21:18:35 +0200
parents 14c9aca8e274
children 690b5faaa0e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
1 # -*- encoding: utf-8 -*-
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
2 ##
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
3 ## Copyright (C) 2012 Thibaut Girka <thib@sitedethib.com>
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
4 ##
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
5 ## This program is free software; you can redistribute it and/or modify
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
6 ## it under the terms of the GNU General Public License as published
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
7 ## by the Free Software Foundation; version 3 only.
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
8 ##
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
9 ## This program is distributed in the hope that it will be useful,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
10 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
11 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
12 ## GNU General Public License for more details.
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
13 ##
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
14
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
15 from math import cos, sin, pi
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
16
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
17 from pytouhou.vm.anmrunner import ANMRunner
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
18 from pytouhou.game.sprite import Sprite
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
19
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
20
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
21 STARTING, STARTED, STOPPING = range(3)
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
22
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
23
290
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
24 class LaserLaunchAnim(object):
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
25 def __init__(self, laser, anm_wrapper, index):
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
26 self._laser = laser
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
27 self.sprite = Sprite()
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
28 self.sprite.anm, self.sprite.texcoords = anm_wrapper.get_sprite(index)
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
29 self.sprite.blendfunc = 1
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
30 self.removed = False
290
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
31 self.x, self.y = 0, 0
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
32
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
33
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
34 def update(self):
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
35 laser = self._laser
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
36 length = min(laser.end_offset - laser.start_offset, laser.max_length)
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
37 offset = laser.end_offset - length
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
38 dx, dy = cos(laser.angle), sin(laser.angle)
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
39
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
40 self.x = laser.base_pos[0] + offset * dx
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
41 self.y = laser.base_pos[1] + offset * dy
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
42
309
14c9aca8e274 Implement Remilia's laser webs.
Thibaut Girka <thib@sitedethib.com>
parents: 304
diff changeset
43 scale = laser.width / 10. - (offset - laser.start_offset) #TODO: check
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
44 self.sprite.rescale = (scale, scale)
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
45 self.sprite.changed = True
290
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
46
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
47 if laser.removed or scale <= 0.:
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
48 self.removed = True
290
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
49
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
50
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
51
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
52 class Laser(object):
279
3539520fff93 Fix sprite rotation/translation.
Thibaut Girka <thib@sitedethib.com>
parents: 278
diff changeset
53 def __init__(self, base_pos, laser_type, sprite_idx_offset,
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
54 angle, speed, start_offset, end_offset, max_length, width,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
55 start_duration, duration, stop_duration,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
56 grazing_delay, grazing_extra_duration,
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
57 game):
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
58 self._game = game
290
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
59 launch_anim = LaserLaunchAnim(self, laser_type.anm_wrapper,
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
60 laser_type.launch_anim_offsets[sprite_idx_offset]
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
61 + laser_type.launch_sprite_idx)
18e4ed141dd8 Display lasers' “launch anim”.
Thibaut Girka <thib@sitedethib.com>
parents: 281
diff changeset
62 self._game.effects.append(launch_anim)
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
63 self._laser_type = laser_type
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
64 self.state = STARTING
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
65 self.sprite = None
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
66 self.anmrunner = None
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
67 self.removed = False
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
68
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
69 #TODO: hitbox
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
70
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
71 self.frame = 0
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
72 self.start_duration = start_duration
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
73 self.duration = duration
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
74 self.stop_duration = stop_duration
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
75 self.grazing_delay = grazing_delay
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
76 self.grazing_extra_duration = grazing_extra_duration
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
77
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
78 self.sprite_idx_offset = sprite_idx_offset
279
3539520fff93 Fix sprite rotation/translation.
Thibaut Girka <thib@sitedethib.com>
parents: 278
diff changeset
79 self.base_pos = base_pos
3539520fff93 Fix sprite rotation/translation.
Thibaut Girka <thib@sitedethib.com>
parents: 278
diff changeset
80 self.x, self.y = 0, 0
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
81 self.angle = angle
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
82 self.speed = speed
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
83 self.start_offset = start_offset
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
84 self.end_offset = end_offset
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
85 self.max_length = max_length
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
86 self.width = width
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
87
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
88 self.set_anim()
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
89
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
90
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
91 def set_anim(self, sprite_idx_offset=None):
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
92 if sprite_idx_offset is not None:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
93 self.sprite_idx_offset = sprite_idx_offset
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
94
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
95 lt = self._laser_type
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
96 self.sprite = Sprite()
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
97 self.sprite.angle = self.angle
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
98 self.anmrunner = ANMRunner(lt.anm_wrapper, lt.anim_index,
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
99 self.sprite, self.sprite_idx_offset)
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
100 self.anmrunner.run_frame()
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
101
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
102
293
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
103 def _check_collision(self, point, border_size):
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
104 x, y = point[0] - self.base_pos[0], point[1] - self.base_pos[1]
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
105 dx, dy = cos(self.angle), sin(self.angle)
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
106 dx2, dy2 = -dy, dx
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
107
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
108 length = min(self.end_offset - self.start_offset, self.max_length)
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
109 offset = self.end_offset - length - border_size / 2.
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
110 end_offset = self.end_offset + border_size / 2.
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
111 half_width = self.width / 4. + border_size / 2.
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
112
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
113 c1 = dx * offset - dx2 * half_width, dy * offset - dy2 * half_width
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
114 c2 = dx * offset + dx2 * half_width, dy * offset + dy2 * half_width
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
115 c3 = dx * end_offset + dx2 * half_width, dy * end_offset + dy2 * half_width
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
116 vx, vy = x - c2[0], y - c2[1]
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
117 v1x, v1y = c1[0] - c2[0], c1[1] - c2[1]
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
118 v2x, v2y = c3[0] - c2[0], c3[1] - c2[1]
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
119
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
120 return (0 <= vx * v1x + vy * v1y <= v1x * v1x + v1y * v1y
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
121 and 0 <= vx * v2x + vy * v2y <= v2x * v2x + v2y * v2y)
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
122
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
123
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
124 def check_collision(self, point):
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
125 if self.state != STARTED:
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
126 return False
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
127
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
128 return self._check_collision(point, 2.5)
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
129
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
130
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
131 def check_grazing(self, point):
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
132 #TODO: quadruple check!
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
133 if self.state == STOPPING and self.frame >= self.grazing_extra_duration:
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
134 return False
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
135 if self.state == STARTING and self.frame <= self.grazing_delay:
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
136 return False
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
137 if self.frame % 12 != 0:
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
138 return False
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
139
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
140 return self._check_collision(point, 96 + 2.5)
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
141
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
142
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
143 def get_bullets_pos(self):
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
144 #TODO: check
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
145 length = min(self.end_offset - self.start_offset, self.max_length)
278
615c0bb6064b Fix generation of bullets/items position from lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
146 offset = self.end_offset - length
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
147 dx, dy = cos(self.angle), sin(self.angle)
278
615c0bb6064b Fix generation of bullets/items position from lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 274
diff changeset
148 while self.start_offset <= offset < self.end_offset:
281
13dcde917083 Fix bullet spawning along lasers.
Thibaut Girka <thib@sitedethib.com>
parents: 279
diff changeset
149 yield (self.base_pos[0] + offset * dx, self.base_pos[1] + offset * dy)
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
150 offset += 48.
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
151
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
152
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
153 def cancel(self):
293
ab618c2bbce8 Implement laser collision.
Thibaut Girka <thib@sitedethib.com>
parents: 290
diff changeset
154 self.grazing_extra_duration = 0
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
155 if self.state != STOPPING:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
156 self.frame = 0
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
157 self.state = STOPPING
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
158
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
159
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
160 def update(self):
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
161 if self.anmrunner is not None and not self.anmrunner.run_frame():
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
162 self.anmrunner = None
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
163
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
164 self.end_offset += self.speed
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
165
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
166 length = min(self.end_offset - self.start_offset, self.max_length) # TODO
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
167 if self.state == STARTING:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
168 if self.frame == self.start_duration:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
169 self.frame = 0
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
170 self.state = STARTED
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
171 else:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
172 width = self.width * float(self.frame) / self.start_duration #TODO
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
173 if self.state == STARTED:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
174 width = self.width #TODO
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
175 if self.frame == self.duration:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
176 self.frame = 0
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
177 self.state = STOPPING
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
178 if self.state == STOPPING:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
179 if self.frame == self.stop_duration:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
180 width = 0.
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
181 self.removed = True
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
182 else:
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
183 width = self.width * (1. - float(self.frame) / self.stop_duration) #TODO
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
184
279
3539520fff93 Fix sprite rotation/translation.
Thibaut Girka <thib@sitedethib.com>
parents: 278
diff changeset
185 offset = self.end_offset - length / 2.
3539520fff93 Fix sprite rotation/translation.
Thibaut Girka <thib@sitedethib.com>
parents: 278
diff changeset
186 self.x, self.y = self.base_pos[0] + offset * cos(self.angle), self.base_pos[1] + offset * sin(self.angle)
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
187 self.sprite.width_override = width or 0.01 #TODO
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
188 self.sprite.height_override = length or 0.01 #TODO
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
189
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
190 self.sprite.update_orientation(pi/2. - self.angle, True)
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
191 self.sprite.changed = True #TODO
274
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
192
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
193 self.frame += 1
f037bca24f2d Partially implement lasers.
Thibaut Girka <thib@sitedethib.com>
parents:
diff changeset
194
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
195
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
196 class PlayerLaser(object):
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
197 def __init__(self, laser_type, sprite_idx_offset, hitbox, damage,
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
198 angle, offset, duration, origin):
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
199 self.sprite = None
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
200 self.anmrunner = None
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
201 self.removed = False
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
202 self._laser_type = laser_type
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
203 self.origin = origin
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
204
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
205 self.hitbox_half_size = hitbox[0] / 2., hitbox[1] / 2.
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
206
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
207 self.frame = 0
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
208 self.duration = duration
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
209
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
210 self.sprite_idx_offset = sprite_idx_offset
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
211 self.angle = angle
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
212 self.offset = offset
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
213 self.damage = damage
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
214
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
215 self.set_anim()
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
216
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
217
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
218 @property
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
219 def x(self):
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
220 return self.origin.x + self.offset * cos(self.angle)
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
221
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
222
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
223 @property
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
224 def y(self):
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
225 return self.origin.y / 2. + self.offset * sin(self.angle)
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
226
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
227
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
228 def set_anim(self, sprite_idx_offset=None):
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
229 if sprite_idx_offset is not None:
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
230 self.sprite_idx_offset = sprite_idx_offset
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
231
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
232 lt = self._laser_type
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
233 self.sprite = Sprite()
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
234 self.anmrunner = ANMRunner(lt.anm_wrapper, lt.anim_index,
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
235 self.sprite, self.sprite_idx_offset)
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
236 #self.sprite.blendfunc = 1 #XXX
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
237 self.anmrunner.run_frame()
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
238
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
239
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
240 def cancel(self):
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
241 self.anmrunner.interrupt(1)
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
242
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
243
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
244 def update(self):
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
245 if self.anmrunner is not None and not self.anmrunner.run_frame():
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
246 self.anmrunner = None
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
247 self.removed = True
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
248
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
249 length = self.origin.y
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
250 if self.frame == self.duration:
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
251 self.cancel()
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
252
304
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
253 self.sprite.height_override = length or 0.01 #TODO
f3099ebf4f61 Update attribute names to reflect the actual interface.
Thibaut Girka <thib@sitedethib.com>
parents: 294
diff changeset
254 self.sprite.changed = True #TODO
294
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
255
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
256 self.frame += 1
94c636f8f863 Add player lasers for MarisaB.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 293
diff changeset
257