comparison pytouhou/game/item.pyx @ 502:3d3285918ba1

Disallow collection of items dropped by the other player in netplay, also fixes a longstanding bug where autocollection worked with those items.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Wed, 23 Oct 2013 18:24:08 +0200
parents 6be9c99a3a24
children db28538cd399
comparison
equal deleted inserted replaced
501:4778c482f24a 502:3d3285918ba1
31 self.x = self._item.x 31 self.x = self._item.x
32 32
33 33
34 34
35 cdef class Item(Element): 35 cdef class Item(Element):
36 def __init__(self, start_pos, long _type, ItemType item_type, Game game, double angle=pi/2, Player player=None, end_pos=None): 36 def __init__(self, start_pos, long _type, ItemType item_type, Game game,
37 double angle=pi/2, player=None, end_pos=None,
38 target=None):
37 Element.__init__(self, start_pos) 39 Element.__init__(self, start_pos)
38 40
39 self._game = game 41 self._game = game
40 self._type = _type 42 self._type = _type
41 self._item_type = item_type 43 self._item_type = item_type
43 45
44 self.frame = 0 46 self.frame = 0
45 self.angle = angle 47 self.angle = angle
46 self.indicator = None 48 self.indicator = None
47 49
48 if player is not None: 50 # The only player allowed to collect that item. If not None,
49 self.autocollect(player) 51 # autocollection is disabled too.
52 self.player = player
53
54 # The player who has autocollected that item.
55 # TODO: do we allow stealing in case another player is in the way?
56 self.target = target
57
58 #TODO: find the formulae in the binary.
59 self.speed_interpolator = None
60 if end_pos:
61 self.pos_interpolator = Interpolator(start_pos, 0,
62 end_pos, 60)
50 else: 63 else:
51 self.player = None 64 self.speed_interpolator = Interpolator((-2.,), 0,
52 65 (0.,), 60)
53 #TODO: find the formulae in the binary.
54 self.speed_interpolator = None
55 if end_pos:
56 self.pos_interpolator = Interpolator(start_pos, 0,
57 end_pos, 60)
58 else:
59 self.speed_interpolator = Interpolator((-2.,), 0,
60 (0.,), 60)
61 66
62 self.sprite.angle = angle 67 self.sprite.angle = angle
63 68
64 69
65 property objects: 70 property objects:
68 return [self.indicator] 73 return [self.indicator]
69 return [self] 74 return [self]
70 75
71 76
72 cdef void autocollect(self, Player player): 77 cdef void autocollect(self, Player player):
73 if self.player is None: 78 if self.target is None and self.player is None:
74 self.player = player 79 self.target = player
75 self.speed = player.sht.autocollection_speed 80 self.speed = player.sht.autocollection_speed
76 81
77 82
78 cdef void on_collect(self, Player player): 83 cdef void on_collect(self, Player player):
79 cdef long level, poc 84 cdef long level, poc
85
86 if not (self.player is None or self.player is player):
87 return
80 88
81 old_power = player.power 89 old_power = player.power
82 score = 0 90 score = 0
83 label = None 91 label = None
84 color = 'white' 92 color = 'white'
161 169
162 if self.frame == 60: 170 if self.frame == 60:
163 self.speed_interpolator = Interpolator((0.,), 60, 171 self.speed_interpolator = Interpolator((0.,), 60,
164 (3.,), 180) 172 (3.,), 180)
165 173
166 if self.player is not None: 174 if self.target is not None:
167 self.angle = atan2(self.player.y - self.y, self.player.x - self.x) 175 self.angle = atan2(self.target.y - self.y, self.target.x - self.x)
168 self.x += cos(self.angle) * self.speed 176 self.x += cos(self.angle) * self.speed
169 self.y += sin(self.angle) * self.speed 177 self.y += sin(self.angle) * self.speed
170 elif self.speed_interpolator is None: 178 elif self.speed_interpolator is None:
171 self.pos_interpolator.update(self.frame) 179 self.pos_interpolator.update(self.frame)
172 self.x, self.y = self.pos_interpolator.values 180 self.x, self.y = self.pos_interpolator.values