all enemy entrance animations, per boss time variables, display score rank

This commit is contained in:
frank 2022-03-15 20:43:30 -04:00
parent 63c2e834b9
commit d400682ee5
3 changed files with 77 additions and 71 deletions

108
NS.py
View File

@ -36,7 +36,7 @@ from lib.pgfw.pgfw.Sprite import Sprite, RainbowSprite
from lib.pgfw.pgfw.Animation import Animation
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_color_swapped_surface, load_frames, fill_colorkey, get_segments, get_boxed_surface
)
from lib.pgfw.pgfw.gfx_extension import aa_filled_polygon
@ -158,15 +158,15 @@ class NS(Game, Animation):
{
"time":
{
"int": ["timer-max-time", "timer-start-time", "timer-addition", "sword-delay", "attract-gif-length",
"attract-board-length", "attract-reset-countdown", "level-select-reset-countdown",
"level-select-press-length"],
"int": ["timer-max-time", "timer-start-level-1", "timer-start-level-2", "timer-start-level-3", "timer-addition-level-1",
"timer-addition-level-2", "timer-addition-level-3", "sword-delay", "attract-gif-length", "attract-board-length",
"attract-reset-countdown", "level-select-reset-countdown", "level-select-press-length"],
"float": "timer-warning-start"
},
"boss":
{
"float": ["damage-per-hit-level-1", "damage-per-hit-level-2", "damage-per-hit-level-3"],
"int": ["cooldown-level-1", "cooldown-level-2", "cooldown-level-3"]
"int": ["cooldown-level-1", "cooldown-level-2", "cooldown-level-3", "first-combo-delay"]
},
"input":
{
@ -1579,6 +1579,7 @@ class Platform(GameChild):
if self.get_edge_pressed() is not None:
if self.get_edge_pressed() != self.previously_pressed_edge:
self.previously_pressed_edge = self.get_edge_pressed()
self.press_elapsed = 0
else:
self.press_elapsed += self.get_game().time_filter.get_last_frame_duration()
else:
@ -1723,7 +1724,7 @@ class Chemtrails(Sprite):
@param parent PGFW game object that initialized this object
"""
Sprite.__init__(self, parent, 42)
Sprite.__init__(self, parent, 125)
for directory in sorted(iglob(join(self.get_resource("littleSlimeGoop"), "[0-9]_*/"))):
self.add_frameset(switch=True)
self.load_from_path(directory, True)
@ -1800,13 +1801,8 @@ class Chemtrails(Sprite):
boss = self.get_game().boss
queue = boss.queue
if self.orientation == queue[self.queue_index]:
self.timer.add_time(self.get_configuration("time", "timer-addition"))
if boss.level_index == 0:
boss.health.decrease(self.get_configuration("boss", "damage-per-hit-level-1"))
elif boss.level_index == 1:
boss.health.decrease(self.get_configuration("boss", "damage-per-hit-level-2"))
elif boss.level_index == 2:
boss.health.decrease(self.get_configuration("boss", "damage-per-hit-level-3"))
self.timer.add_time(self.get_configuration("time", f"timer-addition-level-{boss.level_index + 1}"))
boss.health.decrease(self.get_configuration("boss", f"damage-per-hit-level-{boss.level_index + 1}"))
self.queue_index += 1
boss.last_attack = self.orientation
boss.sword.block()
@ -1863,7 +1859,17 @@ class Timer(Meter):
rect = background.get_rect()
rect.bottomright = dsr.right - 6, dsr.bottom - 4
self.setup(background, rect, 53, (0, 0, 255),
self.get_configuration("time", "timer-start-time"), "scrapeIcons/scrapeIcons_07.png")
self.get_configuration("time", "timer-start-level-1"), "scrapeIcons/scrapeIcons_07.png")
def reset(self):
"""
Account for the differences in time per level by setting a custom amount based on the boss's level
"""
super().reset()
# The difference between level 1 and the current level is how much to remove from the timer
difference = self.get_configuration("time", "timer-start-level-1") - \
self.get_configuration("time", f"timer-start-level-{self.get_game().boss.level_index + 1}")
self.change(-difference)
def add_time(self, amount):
self.change(amount)
@ -1944,16 +1950,7 @@ class Boss(Animation):
animations that control attacks, effects, and dialog.
"""
Animation.__init__(self, parent)
hue_shift = 30
if self.get_configuration("display", "effects"):
self.kool_man = RainbowSprite(self, load(self.get_resource("Kool_man_waah.png")).convert_alpha(), hue_shift)
self.spoopy = RainbowSprite(self, load(self.get_resource("Spoopy.png")).convert_alpha(), hue_shift)
else:
self.kool_man = Sprite(self)
self.kool_man.load_from_path("Kool_man_waah.png", True)
self.spoopy = Sprite(self)
self.spoopy.load_from_path("Spoopy.png", True)
# Set up sprites with boil and hurt animations
# Set up sprites with boil, hit, and intro animations
self.boss_sprites = []
self.boss_sprite_arms = []
for path in (pathlib.Path(self.get_resource("koolAnimations")), pathlib.Path(self.get_resource("alienAnimations")),
@ -1964,12 +1961,11 @@ 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 prefix == "alien":
self.boss_sprites[-1].add_frameset(name="entrance", switch=True)
self.boss_sprites[-1].load_from_path(path.joinpath("alienIntro"), 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
# Set the arm to its own sprite
self.boss_sprite_arms.append(Sprite(self, 42))
self.boss_sprite_arms.append(Sprite(self, 60))
# Map the strings used to indicate direction in the animations directory to the IDs defined in the script
name_map = {
"U": NS.N,
@ -2142,7 +2138,9 @@ class Boss(Animation):
def activate(self):
self.active = True
def combo(self, delay=2500):
def combo(self, delay=None):
if delay is None:
delay = self.get_configuration("boss", f"cooldown-level-{self.level_index + 1}")
self.queue = None
if self.get_game().serial_enabled():
self.get_game().reset_arduino()
@ -2294,13 +2292,13 @@ class Boss(Animation):
platform.get_opposite_of_edge(third)]
elif self.level_index == 2:
if self.health.amount > 90:
length = 3
elif self.health.amount > 70:
length = 4
elif self.health.amount > 40:
elif self.health.amount > 70:
length = 5
else:
elif self.health.amount > 40:
length = 6
else:
length = 8
while len(self.queue) < length:
while True:
orientation = randint(0, 5)
@ -2384,12 +2382,7 @@ class Boss(Animation):
def end_dialogue(self):
self.get_game().dialogue.deactivate()
if not self.battle_finished:
if self.level_index == 0:
self.combo(self.get_configuration("boss", "cooldown-level-1"))
elif self.level_index == 1:
self.combo(self.get_configuration("boss", "cooldown-level-2"))
elif self.level_index == 2:
self.combo(self.get_configuration("boss", "cooldown-level-3"))
self.combo(self.get_configuration("boss", "first-combo-delay"))
else:
self.get_game().wipe.start(self.transition_after_battle)
@ -2476,10 +2469,7 @@ class Boss(Animation):
def enter_boss(self):
self.level_sprite().unhide()
self.level_sprite().get_current_frameset().reset()
if self.level_index == 1:
self.level_sprite().set_frameset("entrance")
else:
self.level_sprite().set_frameset("normal")
self.level_sprite().set_frameset("entrance")
def level_sprite(self, level_index=None):
"""
@ -2769,7 +2759,7 @@ class Sword(Animation):
self.parent.level_sprite_arm().unhide()
self.parent.level_sprite_arm().set_frameset(str(position))
if len(self.parent.unbrandished) > 0:
self.play(self.swab, delay=self.get_configuration("time", "sword-delay") - 42 * 4, play_once=True, position=position)
self.play(self.swab, delay=self.get_configuration("time", "sword-delay") - 60 * 4, play_once=True, position=position)
def swab(self, position):
"""
@ -2903,7 +2893,8 @@ class Ending(Animation):
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.tony_avatar = load(self.get_resource("Introduction_tony_avatar.png")).convert()
self.font = Font(self.get_resource("rounded-mplus-1m-bold.ttf"), 64)
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.register(self.start, self.start_wipe)
def reset(self):
@ -2920,7 +2911,14 @@ class Ending(Animation):
self.defeated_level_index = level_index
self.active = True
self.play(self.start, delay=3000, play_once=True)
foreground = self.font.render(str(self.get_game().most_recent_score), False, (180, 150, 20), (255, 255, 255)).convert_alpha()
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)
rank_rect = rank.get_rect()
rank_rect.midright = foreground.get_rect().midright
foreground.blit(rank, rank_rect)
dsr = self.get_display_surface().get_rect()
self.text = RainbowSprite(self, foreground, 180, 200)
self.text.location.midtop = dsr.centerx, 80
@ -2933,15 +2931,21 @@ class Ending(Animation):
self.play(self.start_wipe, delay=20000, play_once=True)
self.get_audio().play_bgm("end")
def rank(self):
"""
Get the rank of the currently displaying score
"""
rank = 0
for score in sorted([score for score in self.get_game().scores if score.level_index == self.defeated_level_index]):
rank += 1
if score == self.get_game().most_recent_score:
break
return rank
def start(self):
dialogue = self.get_game().dialogue
if self.get_configuration("system", "enable-level-select"):
rank = 0
for score in sorted([score for score in self.get_game().scores if score.level_index == self.defeated_level_index]):
rank += 1
if score == self.get_game().most_recent_score:
break
text = f"You vanquished my goon and got the #{rank} rank! Well done, slime bag.\n"
text = f"You vanquished my goon and got the #{self.rank()} rank! Well done, slime bag.\n"
if self.defeated_level_index == 2:
dialogue.set_name("Tony")
text += "You made your father proud today. I love you child."

17
config
View File

@ -38,10 +38,11 @@ lives-level-select-mode = 1
[boss]
damage-per-hit-level-1 = 4.0
damage-per-hit-level-2 = 2.5
damage-per-hit-level-3 = 1.5
cooldown-level-1 = 1300
cooldown-level-2 = 1150
cooldown-level-3 = 700
damage-per-hit-level-3 = 1.75
cooldown-level-1 = 2500
cooldown-level-2 = 2100
cooldown-level-3 = 1300
first-combo-delay = 1300
[mouse]
visible = no
@ -62,8 +63,12 @@ serial = True
[time]
timer-max-time = 10000
timer-start-time = 7000
timer-addition = 1000
timer-start-level-1 = 8000
timer-start-level-2 = 7000
timer-start-level-3 = 6000
timer-addition-level-1 = 1000
timer-addition-level-2 = 700
timer-addition-level-3 = 700
timer-warning-start = 0.4
sword-delay = 300
attract-gif-length = 10000

View File

@ -1,13 +1,10 @@
52418 0
57797 0
70979 0
78301 0
79581 0
66858 1
98128 1
100960 1
95569 2
96481 2
113904 2
120571 2
122294 2
10202 0
10317 0
10403 0
16483 0
24404 0
59424 0
71763 1
75161 2
86762 2
96171 2