implemented death animations, added ordinal rank, added swords to ending
This commit is contained in:
parent
fdba749b43
commit
e7c39d3e8b
70
NS.py
70
NS.py
@ -34,6 +34,7 @@ from lib.pgfw.pgfw.Game import Game
|
||||
from lib.pgfw.pgfw.GameChild import GameChild
|
||||
from lib.pgfw.pgfw.Sprite import Sprite, RainbowSprite
|
||||
from lib.pgfw.pgfw.Animation import Animation
|
||||
from lib.pgfw.pgfw.Vector import Vector
|
||||
from lib.pgfw.pgfw.extension import (
|
||||
get_step, get_step_relative, get_delta, reflect_angle, get_distance, render_box, get_hsla_color, get_hue_shifted_surface,
|
||||
get_color_swapped_surface, load_frames, fill_colorkey, get_segments, get_boxed_surface
|
||||
@ -237,12 +238,12 @@ class NS(Game, Animation):
|
||||
self.tony = Tony(self)
|
||||
self.logo = Logo(self)
|
||||
self.title = Title(self)
|
||||
self.ending = Ending(self)
|
||||
self.wipe = Wipe(self)
|
||||
self.dialogue = Dialogue(self)
|
||||
self.chemtrails = Chemtrails(self)
|
||||
self.boss = Boss(self)
|
||||
self.level_select = LevelSelect(self)
|
||||
self.ending = Ending(self)
|
||||
self.last_press = get_ticks()
|
||||
self.register(self.blink_score, interval=500)
|
||||
self.register(self.close_pop_up)
|
||||
@ -326,11 +327,11 @@ class NS(Game, Animation):
|
||||
self.title.reset()
|
||||
if not leave_wipe_running:
|
||||
self.wipe.reset()
|
||||
self.ending.reset()
|
||||
self.boss.reset()
|
||||
self.chemtrails.reset()
|
||||
self.platform.reset()
|
||||
self.dialogue.reset()
|
||||
self.ending.reset()
|
||||
self.no_reset_elapsed = 0
|
||||
self.title.activate()
|
||||
|
||||
@ -1773,9 +1774,10 @@ class Chemtrails(Sprite):
|
||||
self.set_frameset(NS.N)
|
||||
self.orient()
|
||||
|
||||
def update(self):
|
||||
def update(self, offset: Vector=(0, 0)):
|
||||
if self.active:
|
||||
self.orient()
|
||||
self.location.move(offset)
|
||||
Sprite.update(self)
|
||||
if not self.get_game().title.active and not self.get_game().level_select.active:
|
||||
boss = self.get_game().boss
|
||||
@ -1961,6 +1963,9 @@ class Boss(Animation):
|
||||
self.boss_sprites[-1].load_from_path(path.joinpath(f"{prefix}Boil"), True)
|
||||
self.boss_sprites[-1].add_frameset(name="hurt", switch=True)
|
||||
self.boss_sprites[-1].load_from_path(path.joinpath(f"{prefix}Hit"), True)
|
||||
if path.joinpath(f"{prefix}Death").exists():
|
||||
self.boss_sprites[-1].add_frameset(name="death", switch=True)
|
||||
self.boss_sprites[-1].load_from_path(path.joinpath(f"{prefix}Death"), True)
|
||||
self.boss_sprites[-1].add_frameset(name="entrance", switch=True)
|
||||
self.boss_sprites[-1].load_from_path(path.joinpath(f"{prefix}Intro"), True)
|
||||
self.boss_sprites[-1].location.topleft = 207, 10
|
||||
@ -2333,6 +2338,9 @@ class Boss(Animation):
|
||||
self.queue = []
|
||||
self.brandish_complete = True
|
||||
if win:
|
||||
if "death" in [str(frameset) for frameset in self.level_sprite().framesets]:
|
||||
self.level_sprite().set_frameset("death")
|
||||
else:
|
||||
self.level_sprite().set_frameset("hurt")
|
||||
if self.get_configuration("system", "enable-level-select"):
|
||||
self.get_game().add_time_to_scores(self.time_elapsed, self.level_index)
|
||||
@ -2889,23 +2897,24 @@ class Ending(Animation):
|
||||
|
||||
def __init__(self, parent):
|
||||
Animation.__init__(self, parent)
|
||||
self.slime_bag = Sprite(self)
|
||||
self.slime_bag.load_from_path(self.get_resource("Introduction_slime_bag.png"), True)
|
||||
self.slime_bag.location.center = self.get_display_surface().get_rect().centerx, 300
|
||||
self.slime_bag = Chemtrails(self)
|
||||
self.tony_avatar = load(self.get_resource("Introduction_tony_avatar.png")).convert()
|
||||
self.time_font = Font(self.get_resource("rounded-mplus-1m-bold.ttf"), 64)
|
||||
self.rank_font = Font(self.get_resource("rounded-mplus-1m-bold.ttf"), 18)
|
||||
self.rank_font = Font(self.get_resource("rounded-mplus-1m-bold.ttf"), 26)
|
||||
self.register(self.start, self.start_wipe)
|
||||
self.register(self.append_sword, interval=1500)
|
||||
self.swords = []
|
||||
|
||||
def reset(self):
|
||||
self.deactivate()
|
||||
self.slime_bag.unhide()
|
||||
self.halt()
|
||||
self.text_index = 0
|
||||
self.angle = choice((pi / 4, 3 * pi / 4, 5 * pi / 4, 7 * pi / 4))
|
||||
self.slime_bag.reset()
|
||||
|
||||
def deactivate(self):
|
||||
self.active = False
|
||||
self.slime_bag.deactivate()
|
||||
|
||||
def activate(self, level_index):
|
||||
self.defeated_level_index = level_index
|
||||
@ -2913,11 +2922,22 @@ class Ending(Animation):
|
||||
self.play(self.start, delay=3000, play_once=True)
|
||||
foreground = get_boxed_surface(
|
||||
self.time_font.render(str(self.get_game().most_recent_score), False, (180, 150, 20), (255, 255, 255)).convert_alpha(),
|
||||
background=(255, 255, 255), padding=(30, 0))
|
||||
rank = self.rank_font.render(f"rank {self.rank()}", False, (180, 150, 20), (255, 255, 255))
|
||||
rank = pygame.transform.rotate(rank, 270)
|
||||
background=(255, 255, 255), padding=(38, 0))
|
||||
if self.rank() % 100 // 10 != 1:
|
||||
if self.rank() % 10 == 1:
|
||||
ordinal = "ST"
|
||||
elif self.rank() % 10 == 2:
|
||||
ordinal = "ND"
|
||||
elif self.rank() % 10 == 3:
|
||||
ordinal = "RD"
|
||||
else:
|
||||
ordinal = "TH"
|
||||
else:
|
||||
ordinal = "TH"
|
||||
rank = self.rank_font.render(f"{self.rank()}{ordinal}", False, (180, 150, 20), (255, 255, 255))
|
||||
rank = pygame.transform.rotate(rank, 90)
|
||||
rank_rect = rank.get_rect()
|
||||
rank_rect.midright = foreground.get_rect().midright
|
||||
rank_rect.midleft = foreground.get_rect().midleft
|
||||
foreground.blit(rank, rank_rect)
|
||||
dsr = self.get_display_surface().get_rect()
|
||||
self.text = RainbowSprite(self, foreground, 180, 200)
|
||||
@ -2930,6 +2950,8 @@ class Ending(Animation):
|
||||
dialogue.show_text("")
|
||||
self.play(self.start_wipe, delay=20000, play_once=True)
|
||||
self.get_audio().play_bgm("end")
|
||||
self.slime_bag.activate()
|
||||
self.play(self.append_sword)
|
||||
|
||||
def rank(self):
|
||||
"""
|
||||
@ -2966,6 +2988,24 @@ class Ending(Animation):
|
||||
def start_wipe(self):
|
||||
self.get_game().wipe.start(self.end_game)
|
||||
|
||||
def append_sword(self):
|
||||
"""
|
||||
Add a sword to the list based on what button is pressed. Remove swords that are out of view.
|
||||
"""
|
||||
if self.get_game().platform.get_edge_pressed() is not None:
|
||||
sprite = Sprite(self)
|
||||
# Add frames from Boss->Sword storage
|
||||
for frame in self.get_game().boss.sword.swords[0][self.get_game().platform.get_edge_pressed()]:
|
||||
sprite.add_frame(frame)
|
||||
sprite.location.center = self.slime_bag.location.center
|
||||
self.swords.append(sprite)
|
||||
outgoing = []
|
||||
for sword in self.swords:
|
||||
if sword.location.bottom < 0:
|
||||
outgoing.append(sword)
|
||||
for sword in outgoing:
|
||||
self.swords.remove(sword)
|
||||
|
||||
def update(self):
|
||||
if self.active:
|
||||
Animation.update(self)
|
||||
@ -2973,7 +3013,11 @@ class Ending(Animation):
|
||||
wipe = self.get_game().wipe
|
||||
self.get_game().logo.update()
|
||||
self.get_game().tony.update()
|
||||
self.slime_bag.update()
|
||||
# Draw swords shot at Tony
|
||||
for sword in self.swords:
|
||||
sword.move(0, -5)
|
||||
sword.update()
|
||||
self.slime_bag.update(offset=(0, -30))
|
||||
dsr = self.get_display_surface().get_rect()
|
||||
# Bounce the time sprite around the screen
|
||||
if self.text.location.right > dsr.right or self.text.location.left < dsr.left:
|
||||
|
2
lib/pgfw
2
lib/pgfw
@ -1 +1 @@
|
||||
Subproject commit 7329aa76937b5fd225bb561459a2f5c70a57819d
|
||||
Subproject commit 72866bd11c07ae50ef4fbaae683200e6bb9007b5
|
Binary file not shown.
Before ![]() (image error) Size: 2.3 KiB |
Binary file not shown.
Before ![]() (image error) Size: 3.2 KiB |
Binary file not shown.
Before ![]() (image error) Size: 2.7 KiB |
Binary file not shown.
Before ![]() (image error) Size: 3.3 KiB |
Binary file not shown.
Before ![]() (image error) Size: 3.1 KiB |
Binary file not shown.
Before ![]() (image error) Size: 2.7 KiB |
@ -1,10 +1,25 @@
|
||||
10202 0
|
||||
10317 0
|
||||
10403 0
|
||||
10411 0
|
||||
10417 0
|
||||
10434 0
|
||||
16483 0
|
||||
21640 0
|
||||
24404 0
|
||||
33896 0
|
||||
59424 0
|
||||
10329 1
|
||||
10718 1
|
||||
18586 1
|
||||
21561 1
|
||||
33442 1
|
||||
71763 1
|
||||
9474 2
|
||||
10286 2
|
||||
10433 2
|
||||
10589 2
|
||||
73798 2
|
||||
75161 2
|
||||
86762 2
|
||||
96171 2
|
||||
|
Loading…
Reference in New Issue
Block a user