forked from ksiondag/gamejam_flowers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rabbit.py
110 lines (84 loc) · 3.16 KB
/
rabbit.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import pygame
import ai
import colors
import flower
import unit
import terrain as t
import event as e
class Rabbit( unit.Unit ):
def __init__( self, terrain ):
unit.Unit.__init__( self, terrain )
self.growth = 5
self.active_listeners = {
e.AI_SKIP: self.action_skip,
e.AI_LEFT: self.action_left,
e.AI_RIGHT: self.action_right,
e.AI_UP: self.action_up,
e.AI_DOWN: self.action_down
}
self.wait_time = 1
self.target = None
def _action_direction( self, action_terrain ):
ai.Action( action_terrain, self )
return False
def action_up( self, event ):
action_terrain = self.terrain.up_terrain()
return self._action_direction( action_terrain )
def action_down( self, event ):
action_terrain = self.terrain.down_terrain()
return self._action_direction( action_terrain )
def action_left( self, event ):
action_terrain = self.terrain.left_terrain()
return self._action_direction( action_terrain )
def action_right( self, event ):
action_terrain = self.terrain.right_terrain()
return self._action_direction( action_terrain )
def action_skip( self, event):
return True
def distance( self, terrain ):
row_diff = abs(self.terrain.row - terrain.row)
col_diff = abs(self.terrain.col - terrain.col)
return row_diff + col_diff
def closer( self, terrain1, terrain2 ):
if self.distance( terrain1 ) <= self.distance( terrain2 ):
return terrain1
return terrain2
def find_target( self ):
for terrain in t.all():
if terrain is not self.terrain and terrain.contains_unit():
if self.target is None:
self.target = terrain
self.target = self.closer( terrain, self.target )
def update( self, dt ):
unit.Unit.update( self, dt )
if self.terrain.contains_unit( flower.Obstacle ):
e.Event( e.DEATH, target=self )
return
if self is not unit.Unit.active(): return
self.wait_time -= dt
if self.wait_time < 0:
self.wait_time = 1
if self.target:
row_diff = self.target.row - self.terrain.row
col_diff = self.target.col - self.terrain.col
if abs( row_diff ) > abs( col_diff ):
if row_diff < 0:
e.Event( e.AI_UP )
else:
e.Event( e.AI_DOWN )
else:
if col_diff < 0:
e.Event( e.AI_LEFT )
else:
e.Event( e.AI_RIGHT )
else:
e.Event( e.AI_SKIP )
elif self.target is None:
self.find_target()
def end_turn( self ):
unit.Unit.end_turn( self )
def draw( self, screen ):
#pygame.draw.rect( screen, colors.GREY, self.terrain )
#self.draw_number( screen )
screen.blit(colors.RABBIT, self.terrain)
unit.Unit.draw( self, screen )#Old, restore?