Skip to content

Commit 9a079bd

Browse files
authored
Add files via upload
1 parent ff68c0a commit 9a079bd

File tree

1 file changed

+325
-0
lines changed

1 file changed

+325
-0
lines changed

core/game/player/character.py

Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,325 @@
1+
import pygame as pg
2+
from core.game.projectile import *
3+
from core.game.player.yinyangs import *
4+
from core.game.colliders import CircleCollider
5+
6+
7+
class Player:
8+
def __init__(self, game, pos=(194, 300), start_power=0):
9+
self.game = game
10+
self.unfocus_speed = 0.73
11+
self.focus_speed = 0.4
12+
self.speed = self.unfocus_speed
13+
14+
self.lives = 2
15+
self.life_pieces = 0
16+
self.piecesforlife = 3
17+
self.max_lives = 8
18+
self.bombs = 3
19+
self.max_bombs = 8
20+
21+
self.yinyang = YingYang
22+
self.yinyangs = []
23+
24+
self.yin_offset_p_1 = [-1 , -50]
25+
self.yin_offset_p_2 = [20, -30, -20, -30]
26+
self.yin_offset_p_3 = [28, -30, -35, -30, -2, 30]
27+
self.yin_offset_p_4 = [28, -30, -35, -30, 28, 30, -35, 30]
28+
29+
self.focus_yin_offset_p_1 = [-1 , -30]
30+
self.focus_yin_offset_p_2 = [20, -30, -20, -30]
31+
self.focus_yin_offset_p_3 = [28, -30, -35, -30, -2, 30]
32+
self.focus_yin_offset_p_4 = [28, -30, -35, -30, 28, 30, -35, 30]
33+
34+
self.grazes = 0
35+
self.deathbomb = 8
36+
self.deathbombc = 0
37+
self.bomb_used = False
38+
39+
self.shooting = False
40+
self.legacy_shots = False
41+
42+
self.power = start_power
43+
self.max_power = 128
44+
45+
self.item_slow_rate = 0.11
46+
47+
self.shot_type = Projectile
48+
self.secondary = Projectile
49+
50+
self.focus = False
51+
52+
self.shot_cooldown = 0.04
53+
self.cooldown = 0.0
54+
55+
self.homing_shot_cooldown = 0.9
56+
self.homing_cooldown = 0.0
57+
58+
self.bomb_cooldown = 0.0
59+
60+
self.animstate = "I"
61+
62+
self.right = pg.image.load("assets/img/sprites/characters/Reimu/ReimuRight.png")
63+
self.left = pg.transform.flip(self.right, 1, 0)
64+
self.other = pg.image.load("assets/img/sprites/characters/Reimu/Reimu.png")
65+
self.hitbox_img = pg.image.load("assets/img/sprites/other/hitbox.png")
66+
self.graze_hitbox_img = pg.image.load("assets/img/sprites/other/graze_hitbox.png")
67+
self.graze_angle = 0
68+
self.img = self.other
69+
70+
self.pos = list(pos)
71+
self.start_pos = pos
72+
self.size = (39, 43)
73+
self.center = (self.pos[0] + (self.size[0] // 2), self.pos[1] + (self.size[1] // 2))
74+
75+
self.hitboxradius = 3
76+
self.grazeradius = 40
77+
self.hitbox = CircleCollider(self.hitboxradius, self.center)
78+
self.graze_hitbox = CircleCollider(self.grazeradius, self.center)
79+
self.iframes = 0
80+
self.ifmax = 200
81+
82+
def bomb(self):
83+
self.bombs -= 1
84+
self.iframes = 180
85+
self.game.player_proj.append(Bomb(self.game, (self.hitbox.x - self.hitbox.x / 2, self.hitbox.y)))
86+
87+
def movement(self):
88+
keys = pg.key.get_pressed()
89+
if self.deathbombc <= -1:
90+
if keys[pg.K_UP] and self.pos[1] >= -10:
91+
self.pos[1] -= self.speed
92+
self.animstate = "I"
93+
if keys[pg.K_DOWN] and self.pos[1] <= 416:
94+
self.pos[1] += self.speed
95+
self.animstate = "I"
96+
if keys[pg.K_LEFT] and self.pos[0] >= -10:
97+
self.pos[0] -= self.speed
98+
self.animstate = "L"
99+
if keys[pg.K_RIGHT] and self.pos[0] <= 358:
100+
self.pos[0] += self.speed
101+
self.animstate = "R"
102+
if keys[pg.K_LSHIFT] or keys[pg.K_RSHIFT]:
103+
self.focus = True
104+
if keys[pg.K_z]:
105+
self.shooting = True
106+
if self.shooting:
107+
if self.cooldown <= 0:
108+
#if self.legacy_shots:
109+
# if self.power < 8:
110+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 2, self.pos[1] - 25), direction=(0, -1)))
111+
# elif self.power >= 8 and self.power <= 24:
112+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 2, self.pos[1] - 25), direction=(0, -1)))
113+
# if self.homing_cooldown <= 0:
114+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] + 40, self.pos[1] + 10)))
115+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] - 40, self.pos[1] + 10)))
116+
# self.homing_cooldown = self.homing_shot_cooldown
117+
# elif self.power >= 24 and self.power <= 32:
118+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 15, self.pos[1] - 25), direction=(0, -1)))
119+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] - 12, self.pos[1] - 25), direction=(0, -1)))
120+
# if self.homing_cooldown <= 0:
121+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] + 40, self.pos[1] + 10)))
122+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] - 40, self.pos[1] + 10)))
123+
# self.homing_cooldown = self.homing_shot_cooldown
124+
# elif self.power >= 32 and self.power <= 48:
125+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 15, self.pos[1] - 25), direction=(0, -1)))
126+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] - 12, self.pos[1] - 25), direction=(0, -1)))
127+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 30, self.pos[1] - 25), direction=(0, -1)))
128+
# if self.homing_cooldown <= 0:
129+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] + 40, self.pos[1] + 10)))
130+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] - 40, self.pos[1] + 10)))
131+
# self.homing_cooldown = self.homing_shot_cooldown
132+
# elif self.power >= 48 and self.power <= 80:
133+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 15, self.pos[1] - 25), direction=(0, -1)))
134+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] - 12, self.pos[1] - 25), direction=(0, -1)))
135+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 30, self.pos[1] - 25), direction=(0, -1)))
136+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] - 27, self.pos[1] - 25), direction=(0, -1)))
137+
# if self.homing_cooldown <= 0:
138+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] + 40, self.pos[1] + 10)))
139+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] - 40, self.pos[1] + 10)))
140+
# self.homing_cooldown = self.homing_shot_cooldown
141+
# elif self.power >= 80 and self.power <= 127:
142+
# self.homing_shot_cooldown = 0.7
143+
# self.shot_cooldown = 0.19
144+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 15, self.pos[1] - 25), direction=(0, -1)))
145+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] - 12, self.pos[1] - 25), direction=(0, -1)))
146+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 30, self.pos[1] - 25), direction=(0, -1)))
147+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] - 27, self.pos[1] - 25), direction=(0, -1)))
148+
# if self.homing_cooldown <= 0:
149+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] + 40, self.pos[1] + 10)))
150+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] - 40, self.pos[1] + 10)))
151+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] + 15, self.pos[1] - 25)))
152+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] - 12, self.pos[1] - 25)))
153+
# self.homing_cooldown = self.homing_shot_cooldown
154+
# else:
155+
# self.homing_shot_cooldown = 0.45
156+
# self.shot_cooldown = 0.16
157+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 15, self.pos[1] - 25), direction=(0, -1)))
158+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] - 12, self.pos[1] - 25), direction=(0, -1)))
159+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] + 30, self.pos[1] - 25), direction=(0, -1)))
160+
# self.game.proj_list.append(self.shot_type(self.game, (self.pos[0] - 27, self.pos[1] - 25), direction=(0, -1)))
161+
# if self.homing_cooldown <= 0:
162+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] + 40, self.pos[1] + 10)))
163+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] - 40, self.pos[1] + 10)))
164+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] + 15, self.pos[1] - 25)))
165+
# self.game.proj_list.append(self.secondary(self.game, (self.pos[0] - 12, self.pos[1] - 25)))
166+
# self.homing_cooldown = self.homing_shot_cooldown
167+
#else:
168+
self.game.player_proj.append(self.shot_type(self.game, (self.hitbox.x + 10, self.hitbox.y - 25), direction=(0, -1)))
169+
self.game.player_proj.append(self.shot_type(self.game, (self.hitbox.x - 12, self.hitbox.y - 25), direction=(0, -1)))
170+
if len(self.yinyangs) > 0:
171+
if self.homing_cooldown <= 0:
172+
173+
for yin in self.yinyangs:
174+
yin.shoot()
175+
self.homing_cooldown = self.homing_shot_cooldown
176+
self.cooldown = self.shot_cooldown
177+
if keys[pg.K_x]:
178+
if self.bomb_cooldown <= 0 and self.bombs >= 1:
179+
self.bomb()
180+
self.bomb_used = True
181+
self.bomb_cooldown = 2.0
182+
183+
def draw(self):
184+
#pg.draw.rect(self.game.fight_area, (25, 25, 100), self.graze_hitbox)
185+
#pg.draw.rect(self.game.fight_area, (255, 255, 255), self.hitbox)
186+
#self.game.fight_area.blit(self.hitbox_img, (self.hitbox.x, self.hitbox.y))
187+
# if self.focus == True:
188+
# self.game.fight_area.blit(self.graze_hitbox_img, (self.pos[0] - 16, self.pos[1] - 10))
189+
#self.game.fight_area.blit(self.hitbox_img, (self.hitbox.x, self.hitbox.y))
190+
self.game.fight_area.blit(pg.transform.scale(self.img, self.size), self.pos)
191+
if self.focus:
192+
pg.draw.circle(self.game.fight_area, (0, 0, 0), self.center, 4)
193+
pg.draw.circle(self.game.fight_area, (255, 255, 255), self.center, 3)
194+
195+
def if_hit(self):
196+
if self.lives > 0:
197+
self.lives -= 1
198+
else:
199+
self.game.to_menu()
200+
if self.power >= 16:
201+
self.power -= 16
202+
else:
203+
self.po = 0
204+
self.bombs = 3
205+
self.pos = list(self.start_pos)
206+
self.game.proj_list = []
207+
self.iframes = self.ifmax
208+
209+
def check_hit(self):
210+
if self.deathbombc <= -10:
211+
for enemy in self.game.enemy_list:
212+
if self.hitbox.collidecircle(enemy.hitbox) and enemy.col_dmg and self.game.frametime >= enemy.time:
213+
if self.iframes <= 0:
214+
self.deathbombc = self.deathbomb
215+
return True
216+
for bul in self.game.proj_list:
217+
if self.hitbox.collidecircle(bul.hitbox):
218+
if self.iframes <= 0:
219+
if bul.team == "en":
220+
self.deathbombc = self.deathbomb
221+
return True
222+
223+
def check_colliders(self):
224+
is_hit = self.check_hit()
225+
if is_hit or self.deathbombc >= 0:
226+
if self.iframes <= 0:
227+
self.game.soundregistry.get("pl_death").play()
228+
self.bomb_used = False
229+
if self.deathbombc == 0 and not self.bomb_used:
230+
self.if_hit()
231+
self.game.soundregistry.get("pl_death").reload()
232+
elif self.bomb_used and self.deathbombc == 0:
233+
self.iframes = 100
234+
self.game.soundregistry.get("pl_death").reload()
235+
for pickup in self.game.pickup_list:
236+
if self.graze_hitbox.collidecircle(pickup.hitbox):
237+
if pickup.type == "pwr":
238+
if self.power < self.max_power:
239+
self.power += pickup.power
240+
else:
241+
self.power = self.max_power
242+
self.game.score += pickup.points
243+
pickup.kill = True
244+
if pickup.type == "col":
245+
self.game.score += pickup.points
246+
pickup.kill = True
247+
if pickup.type == "life":
248+
self.game.score += pickup.points
249+
self.lives += 1
250+
pickup.kill = True
251+
if pickup.type == "lifepiece":
252+
self.game.score += pickup.points
253+
if self.life_pieces > self.piecesforlife - 1 and self.lives < self.max_lives: # - 1 required to register the extend when life piece count gets to the count for giving a life
254+
self.lives += 1
255+
self.life_pieces = 0
256+
self.game.soundregistry.get("extend").play()
257+
self.game.soundregistry.get("extend").reload()
258+
else:
259+
self.life_pieces += 1
260+
pickup.kill = True
261+
if pickup.type == "bom":
262+
self.bombs += 1
263+
self.game.score += pickup.points
264+
pickup.kill = True
265+
for bul in self.game.proj_list:
266+
if bul.team == "en":
267+
if self.graze_hitbox.collidecircle(bul.hitbox) and not bul.grazed:
268+
self.game.soundregistry.get("graze").play(self.game.soundvolume)
269+
self.grazes += 1
270+
bul.grazed = True
271+
self.game.soundregistry.get("graze").reload()
272+
273+
def update(self):
274+
#self.graze_angle += 1
275+
#if self.legacy_shots == False:
276+
self.draw()
277+
if len(self.yinyangs) > 0:
278+
for yin in self.yinyangs:
279+
yin.update()
280+
self.shooting = False
281+
if self.bomb_cooldown <= 0:
282+
self.bomb_used = False
283+
self.deathbombc -= 1
284+
self.iframes -= 1
285+
if not self.legacy_shots:
286+
if self.power <= 0.99:
287+
self.yinyangs = []
288+
if self.focus == True:
289+
self.speed = self.focus_speed
290+
if self.power >= 1.0 and self.power <= 1.99:
291+
self.yinyangs = [self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_1[0], self.hitbox.y + self.focus_yin_offset_p_1[1]))]
292+
if self.power >= 2.0 and self.power <= 2.99:
293+
self.yinyangs = [self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_2[0], self.hitbox.y + self.focus_yin_offset_p_2[1])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_2[2], self.hitbox.y + self.focus_yin_offset_p_2[3]))]
294+
if self.power >= 3.0 and self.power <= 3.99:
295+
self.yinyangs = [self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_3[0], self.hitbox.y + self.focus_yin_offset_p_3[1])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_3[2], self.hitbox.y + self.focus_yin_offset_p_3[3])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_3[4], self.hitbox.y + self.focus_yin_offset_p_3[5]))]
296+
if self.power >= 4.0:
297+
self.power = 4.0
298+
self.yinyangs = [self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_4[0], self.hitbox.y + self.focus_yin_offset_p_4[1])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_4[2], self.hitbox.y + self.focus_yin_offset_p_4[3])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_4[4], self.hitbox.y + self.focus_yin_offset_p_4[5])),self.yinyang(self.game, self, pos=(self.hitbox.x + self.focus_yin_offset_p_4[6], self.hitbox.y + self.focus_yin_offset_p_4[7]))]
299+
else:
300+
self.speed = self.unfocus_speed
301+
if self.power >= 1.0 and self.power <= 1.99:
302+
self.yinyangs = [self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_1[0], self.hitbox.y + self.yin_offset_p_1[1]))]
303+
if self.power >= 2.0 and self.power <= 2.99:
304+
self.yinyangs = [self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_2[0], self.hitbox.y + self.yin_offset_p_2[1])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_2[2], self.hitbox.y + self.yin_offset_p_2[3]))]
305+
if self.power >= 3.0 and self.power <= 3.99:
306+
self.yinyangs = [self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_3[0], self.hitbox.y + self.yin_offset_p_3[1])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_3[2], self.hitbox.y + self.yin_offset_p_3[3])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_3[4], self.hitbox.y + self.yin_offset_p_3[5]))]
307+
if self.power >= 4.0:
308+
self.yinyangs = [self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_4[0], self.hitbox.y + self.yin_offset_p_4[1])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_4[2], self.hitbox.y + self.yin_offset_p_4[3])), self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_4[4], self.hitbox.y + self.yin_offset_p_4[5])),self.yinyang(self.game, self, pos=(self.hitbox.x + self.yin_offset_p_4[6], self.hitbox.y + self.yin_offset_p_4[7]))]
309+
310+
if self.animstate == "I":
311+
self.img = self.other
312+
elif self.animstate == "R":
313+
self.img = self.right
314+
elif self.animstate == "L":
315+
self.img = self.left
316+
self.animstate = "I"
317+
self.focus = False
318+
self.homing_cooldown -= 0.01
319+
self.cooldown -= 0.01
320+
self.bomb_cooldown -= 0.01
321+
self.center = (self.pos[0] + (self.size[0] // 2), self.pos[1] + (self.size[1] // 2))
322+
self.graze_hitbox.update(self.center)
323+
self.hitbox.update(self.center)
324+
self.check_colliders()
325+
self.movement()

0 commit comments

Comments
 (0)