diff --git a/NS.py b/NS.py index fa0cfd6..656af27 100644 --- a/NS.py +++ b/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,7 +2338,10 @@ class Boss(Animation): self.queue = [] self.brandish_complete = True if win: - self.level_sprite().set_frameset("hurt") + 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) elif self.level_index == 2: @@ -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): """ @@ -2965,7 +2987,25 @@ 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: diff --git a/lib/pgfw b/lib/pgfw index 7329aa7..72866bd 160000 --- a/lib/pgfw +++ b/lib/pgfw @@ -1 +1 @@ -Subproject commit 7329aa76937b5fd225bb561459a2f5c70a57819d +Subproject commit 72866bd11c07ae50ef4fbaae683200e6bb9007b5 diff --git a/resource/littleSlimeGoop/0_back.png b/resource/littleSlimeGoop/0_back.png deleted file mode 100644 index 10f7d8a..0000000 Binary files a/resource/littleSlimeGoop/0_back.png and /dev/null differ diff --git a/resource/littleSlimeGoop/1_downRight.png b/resource/littleSlimeGoop/1_downRight.png deleted file mode 100644 index a58d226..0000000 Binary files a/resource/littleSlimeGoop/1_downRight.png and /dev/null differ diff --git a/resource/littleSlimeGoop/2_right.png b/resource/littleSlimeGoop/2_right.png deleted file mode 100644 index 186e83f..0000000 Binary files a/resource/littleSlimeGoop/2_right.png and /dev/null differ diff --git a/resource/littleSlimeGoop/3_downLeft.png b/resource/littleSlimeGoop/3_downLeft.png deleted file mode 100644 index 25d8be0..0000000 Binary files a/resource/littleSlimeGoop/3_downLeft.png and /dev/null differ diff --git a/resource/littleSlimeGoop/4_front.png b/resource/littleSlimeGoop/4_front.png deleted file mode 100644 index 4618cc5..0000000 Binary files a/resource/littleSlimeGoop/4_front.png and /dev/null differ diff --git a/resource/littleSlimeGoop/5_left.png b/resource/littleSlimeGoop/5_left.png deleted file mode 100644 index 787533b..0000000 Binary files a/resource/littleSlimeGoop/5_left.png and /dev/null differ diff --git a/resource/scores b/resource/scores index 771bf50..c476db1 100644 --- a/resource/scores +++ b/resource/scores @@ -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