-
Notifications
You must be signed in to change notification settings - Fork 0
/
Archer.py
249 lines (219 loc) · 6.44 KB
/
Archer.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
from Enemy import *
from Img import *
arrow_image_names = [arrow1,arrow2,arrow3,arrow4
,arrow5,arrow6,arrow7,arrow8
,arrow9,arrow10,arrow11,arrow12]
def ChangeNextIndexArcher(current, key):
if current<0 or current>15:
print "incorrect current image index"
return
if key == 1:
if current>7 and current<12:
if current == 11:
return 8
else:
return current+1
else:
return 9
elif key == 2:
if current<4:
if current == 3:
return 1
else:
return current+1
else:
return 1
elif key==3:
if current>11 and current<16:
if current == 15:
return 12
else:
return current+1
else:
return 13
elif key == 4:
if current<8 and current>3:
if current ==7:
return 5
else:
return current+1
else:
return 5
class Archer(Enemy):
#same init as Enemy
def __init__(self, x,y,speed,rushingSpeed, imagenames, radarx, radary):
Enemy.__init__(self, x,y,speed,rushingSpeed, imagenames, radarx, radary)
self.invincible_turn = 0
self.show = 1;
#hp and hp image
self.hp_image = pygame.image.load('img/hp.png').convert_alpha()
self.hp_image = pygame.transform.scale(self.hp_image, (self.image_x-4,10))
self.hp = 50
self.arrowImages = []
for name in arrow_image_names:
temp = pygame.image.load(name).convert_alpha()
self.arrowImages.append(temp)
self.damage = 25
self.lock = False
self.arrowDirection = 0
self.arrowSpeed = 450
self.arrowX = 0
self.arrowY = 0
self.arrowTurn = 0
self.backTurn = 0
self.waitturn = 0
#bias to determine if player is in the same row as Mage
self.bias = 20
def GetDamage(self, value):
if(self.invincible_turn<=0):
self.invincible_turn = 15;
self.hp -= value
if self.hp <= 0:
self.hp = 0
self.isAlive = False
new_width = (self.hp / 50.0) * (self.image_x-4)
self.hp_image = pygame.transform.scale(self.hp_image, (int(new_width),10))
def LiveAction(self, screen, player, seconds):
if self.isAlive:
self.Action(screen, player, seconds)
def Action(self, screen, player, seconds):
if self.invincible_turn>0:
#flashing affect
if(self.show==1):
self.show = 0
else:
self.show = 1
self.invincible_turn-=1
#distance in x direction between player and enemy
xDistance = player.GetX()-self.rect.x
#distance in y direction between player and enemy
yDistance = player.GetY()-self.rect.y
#time to change the image of the archer
if self.timetochange>0:
self.timetochange-=1
else:
self.timetochange = 4
#damage calcution
if self.arrowTurn>0 and abs(self.arrowX-player.GetX())<self.arrowImages[1].get_width()/2 and abs(self.arrowY -player.GetY())<self.arrowImages[1].get_height()/2 and player.GetInvincible()<=0:
player.GetDamge(self.damage)
player.KnockBack(self.arrowDirection)
#0 = left, 1 = right, 2 = up, 3 = down, order of the archer's iamge
#check if archer can lock the player
if self.lock == False and self.arrowTurn<=0:
if (abs(xDistance)<self.radarx and abs(yDistance)<self.bias):
self.lock = True
if xDistance>0:
self.arrowDirection = 3
self.image_index = 12
else:
self.arrowDirection = 1
self.image_index = 8
if abs(yDistance)<self.radary and abs(xDistance)<self.bias:
self.lock = True
if yDistance>0:
self.arrowDirection = 4
self.image_index = 4
else:
self.arrowDirection = 2
self.image_index = 0
if self.lock == True:
self.arrowX = self.rect.x
self.arrowY = self.rect.y
self.waitturn = 5
#when lock the player, wait for 2 turns then shot the arrow
if self.lock == True:
if self.waitturn>0:
self.waitturn-=1
else:
self.lock = False
self.backTurn = 7
self.arrowTurn = 12
#warning is false
elif self.backTurn<=0:
distance = seconds * self.speed
#move down
if self.down==True :
if (self.rect.y+distance)<(self.map_y-self.images[0].get_height()):
self.rect.y+=distance
self.lastcommand = 4
if self.timetochange==0:
self.image_index = ChangeNextIndexArcher(self.image_index,self.lastcommand)
else:
self.down = False
self.up = True
self.image_index = 0
#move up
else:
if (self.rect.y-distance)>0:
self.rect.y-=distance
self.lastcommand=2
if self.timetochange==0:
self.image_index = ChangeNextIndexArcher(self.image_index,self.lastcommand)
else:
self.up = False
self.down = True
self.image_index = 4
backupDistance = 70 * seconds
if self.backTurn > 0:
self.backTurn-=1
if self.arrowDirection == 1:
if (self.rect.x + backupDistance) <650:
self.rect.x+=backupDistance
else:
self.rect.x = 650
elif self.arrowDirection == 3:
if (self.rect.x - backupDistance) > 0:
self.rect.x -= backupDistance
else:
self.rect.x = 0
elif self.arrowDirection == 2:
if (self.rect.y +backupDistance) < 650:
self.rect.y += backupDistance
else:
self.rect.y = 650
else :
if (self.rect.y - backupDistance) > 0:
self.rect.y -= backupDistance
else:
self.rect.y = 0
#need to update the arrow's position and display the arrow's iamge
if self.arrowTurn>0:
arrowDistance = self.arrowSpeed * seconds;
self.arrowTurn-=1;
currentArrowImage = self.arrowImages[11-self.arrowTurn]
arrow_sound = pygame.mixer.Sound("music/arrow.wav")
arrow_sound.play()
arrow_sound.set_volume(0.1)
if self.arrowDirection == 3:
if (self.arrowX + arrowDistance) <650:
self.arrowX+=arrowDistance
else:
self.arrowX = 650
#arrow disappear when hit the bounderary
self.arrowTurn = 0
elif self.arrowDirection == 1:
currentArrowImage = pygame.transform.rotate(currentArrowImage, -180)
if (self.arrowX - arrowDistance) > 0:
self.arrowX -= arrowDistance
else:
self.arrowX = 0
self.arrowTurn =0
elif self.arrowDirection == 4:
currentArrowImage = pygame.transform.rotate(currentArrowImage, -90)
if (self.arrowY +arrowDistance) < 650:
self.arrowY += arrowDistance
else:
self.arrowY = 650
self.arrowTurn =0
else :
currentArrowImage = pygame.transform.rotate(currentArrowImage, 90)
if (self.arrowY - arrowDistance) > 0:
self.arrowY -= arrowDistance
else:
self.arrowY = 0
self.arrowTurn =0
screen.blit(currentArrowImage,(self.arrowX,self.arrowY));
#displaye image on screen
if self.invincible_turn<=0 or self.show == 1:
screen.blit(self.hp_image,(self.rect.x,self.rect.y-13))
screen.blit(self.images[self.image_index], (self.rect.x, self.rect.y))