From 09f821c78fa8f6e4307cbe8e3a8a269223d6eabd Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Fri, 10 Oct 2025 09:06:03 +0200 Subject: [PATCH 1/2] Adds 3 new animations and replaces sword swing. The Explosion and tripple swing animations still need to be implemented. --- assets/Extras/Explosion.png | Bin 0 -> 5455 bytes assets/Extras/SwordSwing.png | Bin 297 -> 685 bytes assets/Extras/TrippleSwing.png | Bin 0 -> 1170 bytes src/player.c | 12 ++++++------ src/skill.c | 3 +++ src/skill.h | 2 ++ 6 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 assets/Extras/Explosion.png create mode 100644 assets/Extras/TrippleSwing.png diff --git a/assets/Extras/Explosion.png b/assets/Extras/Explosion.png new file mode 100644 index 0000000000000000000000000000000000000000..3959099520868797959910aa37361900632042ed GIT binary patch literal 5455 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 FV1iW`$i@Hw literal 0 HcmV?d00001 diff --git a/assets/Extras/SwordSwing.png b/assets/Extras/SwordSwing.png index bd8a783633f4f87403e073f76bff23349b893cbc..7ecede2693649016b7ac9382e41cdd5fd61509cf 100644 GIT binary patch literal 685 zcmV;e0#f~nP)001Be1^@s6m49>f00001b5ch_0Itp) z=>Px%XGugsRCt{2oI#etAPk1fT*Wzpvv!WIYdwN<7G@*97!wMXBtY|RwC%G$uY87< zR>OjbF-E)&5<&>M?OU+S?kPWn5V-eR`Dr=jOJ#rI72!dyk%`ugvCQW3FSkGS{M6yp zdx>0}f4<(IBA&1Jr+m`+Z^S}o%f|WV>)j+jy-z~m^^(9$i~J`govQA0wU zp(Q@q5PZP*Bw@;;+M^|*l?-Om;YL_VSR$aL1UO?MhGva?Zd>a-&5XBc7!K(v)7g#nqe!Tb6DWu>U? z{MJ><=lEo3G6ZYg4WQ1mw5pQJ*8$w{%MHb?v#HkwJ+9=#ug7!RRK#Y ziY#;msV*ga^ T@Yy9&00000NkvXXu0mjfinc_} literal 297 zcmV+^0oMMBP)H)Z$V6_Ii(E(>E0MSU4 zmlg7&CfrlhI=T1?x6iNeN`54Wy9h)KqKTB;RhHmoQ3t59RUazf$EdPX9HN8md13;q z4WRN>R^jLvRs+9$0}%X(4u1j84x%O?Gth2cY5xQdyak^00000NkvXXu0mjfC!mAp diff --git a/assets/Extras/TrippleSwing.png b/assets/Extras/TrippleSwing.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed037331bd5f2dba780a169e726b93011f5968d GIT binary patch literal 1170 zcmV;D1a13?P)Px(Oi4sRRCt{2oy}p~AP|L7TFI6WpY8rqLfS|H>$6>gT?@G^$#^0yKlAetJMZG` zM&g4JJPiWbDH$r~oGr_*>H79j<^TNk+pLagev2NRA6iiPCM3UQ@YCa0;-^OQv*h;( z%?~Z4OoZZJ-#)qxK&!sJ=96w_p&74Uewx4p(EQK>n!$WV3?M0)kfaPP6Oxn>CJ^%0 zH?4xuowx8`-#>@W-?nW_f_9Yiwr$%+4DjXYvc0~4iVb9xpKf(WU&m0WTbT*P@11%b zmDAe>N#@1N8O?+=vnON*i{OS%tX0g1m)F`BE%Tw}^_q}o+&xWbkKx&ew657%`7=l~ z1>>EiOk=#nr(G{k7crlD`cCi zWj=dl-)oz8=0jE5RLg{{;!b0#&1mg2RwiWCXU@b&aE~;U0j-$%Q1SNg_F7~a zOh`NP+2fZ?NUPKKlw%QB^x(6+X00mx(@y_Z&U}tow5^tz57$v9%?)0qeU40fJMJ1LBe7@FWHZ?s1LRTKm=R(wnZm>j}P|q_Ve%$Euk5S{G{Lu}n66M=7pDf%Us#TBE zPXA`Piy`Old-ALUpN66M<#Ua%9k0>%>rnlMuOdDgzg5)?Nb4>(s=~Kg@oMGowcE=C za?ZK58=clbz&^V{w(H$8Z+KZGa=07Vg9#zbhw}I85atu+Gt57W`SA0k@f$r4 zxm)_seH>Q^k=ajXQ_%9gH-8Bs%_p&WG>R`d7cl^fP$q;nAoSEL0nLZk!JDa}zx#kn z15j`4=A5(D+vTl%N!z9Sgrpsazd^52W=%)szrKIE{Cd~x+ed!>@%;<-w;v5m^`ge9C7&MdswordAnimation, "Extras/SwordSwing.png", renderer); animation_set_frames(p->swordAnimation, (AnimationClip[]) { - { 0, 0, 16, 16, 20 }, - { 16, 0, 16, 16, 20 }, - { 32, 0, 16, 16, 20 }, - { 48, 0, 16, 16, 20 }, - { 64, 0, 16, 16, 20 } + { 0, 0, 32, 32, 20 }, + { 32, 0, 32, 32, 20 }, + { 64, 0, 32, 32, 20 }, + { 96, 0, 32, 32, 20 }, + { 128, 0, 32, 32, 20 } }); p->swordAnimation->loop = false; p->swordAnimation->sprite->dim = GAME_DIMENSION; - p->swordAnimation->sprite->clip = (SDL_Rect) { 0, 0, 16, 16 }; + p->swordAnimation->sprite->clip = (SDL_Rect) { 0, 0, 32, 32 }; p->swordAnimation->sprite->rotationPoint = (SDL_Point) { 16, 16 }; } diff --git a/src/skill.c b/src/skill.c index 9b77ae9d..566110d1 100644 --- a/src/skill.c +++ b/src/skill.c @@ -306,6 +306,7 @@ create_default(const char *s_label, Sprite *s) skill->use = NULL; skill->levelcap = 1; skill->tooltip = NULL; + skill->animation = NULL; return skill; } @@ -1076,5 +1077,7 @@ skill_destroy(Skill *skill) sprite_destroy(skill->icon); if (skill->tooltip) tooltip_destroy(skill->tooltip); + if (skill->animation) + animation_destroy(skill->animation); free(skill); } diff --git a/src/skill.h b/src/skill.h index 6cf0232a..2524c6d0 100644 --- a/src/skill.h +++ b/src/skill.h @@ -20,6 +20,7 @@ #define SKILL_H_ #include +#include "animation.h" #include "roommatrix.h" #include "sprite.h" #include "vector2d.h" @@ -60,6 +61,7 @@ typedef struct Skill_t { bool (*available)(Player*); bool (*use)(struct Skill_t*, SkillData*); Tooltip *tooltip; + Animation *animation; } Skill; Skill* From d7e67220a6e55a9394e95181401437c0967fb498 Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Fri, 10 Oct 2025 10:38:31 +0200 Subject: [PATCH 2/2] Adds support for custom skill animations Also implements the flurry animation --- assets/Extras/TrippleSwing.png | Bin 1170 -> 1133 bytes src/player.c | 73 +++++++++++++++++++++++++++++++-- src/player.h | 1 + src/skill.c | 26 ++++++++++-- 4 files changed, 93 insertions(+), 7 deletions(-) diff --git a/assets/Extras/TrippleSwing.png b/assets/Extras/TrippleSwing.png index 3ed037331bd5f2dba780a169e726b93011f5968d..8ca0409a4bc2d93537a442314f16f4f52e854518 100644 GIT binary patch literal 1133 zcmV-z1d{uSP)Px(CrLy>RCt{2UCUwHFbt)-N78_H9uZM45 zhS15A`EMV0)$z-+EXm+UK5ki-MN@z-=hJfgxSIv6C5Igs0a5AMX4Fp=l-S%I}IVLbSI0L`B~3hmKm{x#dr zeDj|9IkHcsP9Q4oJf_|pwK)@21fp_gPyGC~sslLU%+DeHk^V-^{2bioRwv*+^RMye zPQa@OwAhJ=>j<-MZ>>mVesuvl^31=*#eI#O`6aeGfnIUvK3X|7dE*)5o_Vvyp9Wd? ztMN+Wmz*3uPogXWz2ojt1T1;uePI_V{t-G5)4{JMe#wpUor@pEpMP)VN5^i8|LZs; zs;&WyI(QTidLu0`gLy5e8Uzvg!@5fTw)zfqk4zcY{uoxs}r*1Wl# zPt`Nn8h_8c;rw~#?VYzS{B!32=QppYz2d@cXZ{g7f%If;8{I9H_9qbANr}iE64x3K zdF#SI#s9zf<=-OXvnGE2dc-0SE&eV3j4A#pepmkVB#4oT{!IM*{n3g*5Ai?aA4U8q z&A1vvi9fMmqPI(y_@fiP#6MCI=v@FLzl=lg{8s7vwzFyJ>%A5 zV}v4r5I^T%8^aX;6u+8Zdz>|X+T)PB1vk~-@eT=c_9w9f%J28)cQb|(e-i5`6u;$I zga9&7MF3p@(5-(0ieHXFbKKv30NDWQX(b|}sHf{{`7OR%_X$`9BcCAjuvx;E{oBXA z%h!ut-#_W?$M-M1J;8;}pRz;but~Rb=J(}qodvyP&pQE6yBwuiKl*%9;i`WRe*P2D zb@10Fex&%*UN4vw&{6~<_@j$JP0Jt2UvtYZGOv)g{9J){;E3YSs3`)`Ng5%-8u9Zn zMDS<3r8R$4aZdwiXJQ9vT@H97q6pNApO3+lzgGPG^IqK2-fnmMP4vUjih#x+Z~oS+ z{gFjr&v5(4AQRhY`KI9r@Fxka{QUUVE6-m1mM23!;y;4;M;OC|0wZ(-T7HkQTlqci z^IOM{79W~_!U4!4pyl@*v&NRE_%wbTQT%@ZKO(q3N2W}u00000NkvXXu0mjf_xC!E literal 1170 zcmV;D1a13?P)Px(Oi4sRRCt{2oy}p~AP|L7TFI6WpY8rqLfS|H>$6>gT?@G^$#^0yKlAetJMZG` zM&g4JJPiWbDH$r~oGr_*>H79j<^TNk+pLagev2NRA6iiPCM3UQ@YCa0;-^OQv*h;( z%?~Z4OoZZJ-#)qxK&!sJ=96w_p&74Uewx4p(EQK>n!$WV3?M0)kfaPP6Oxn>CJ^%0 zH?4xuowx8`-#>@W-?nW_f_9Yiwr$%+4DjXYvc0~4iVb9xpKf(WU&m0WTbT*P@11%b zmDAe>N#@1N8O?+=vnON*i{OS%tX0g1m)F`BE%Tw}^_q}o+&xWbkKx&ew657%`7=l~ z1>>EiOk=#nr(G{k7crlD`cCi zWj=dl-)oz8=0jE5RLg{{;!b0#&1mg2RwiWCXU@b&aE~;U0j-$%Q1SNg_F7~a zOh`NP+2fZ?NUPKKlw%QB^x(6+X00mx(@y_Z&U}tow5^tz57$v9%?)0qeU40fJMJ1LBe7@FWHZ?s1LRTKm=R(wnZm>j}P|q_Ve%$Euk5S{G{Lu}n66M=7pDf%Us#TBE zPXA`Piy`Old-ALUpN66M<#Ua%9k0>%>rnlMuOdDgzg5)?Nb4>(s=~Kg@oMGowcE=C za?ZK58=clbz&^V{w(H$8Z+KZGa=07Vg9#zbhw}I85atu+Gt57W`SA0k@f$r4 zxm)_seH>Q^k=ajXQ_%9gH-8Bs%_p&WG>R`d7cl^fP$q;nAoSEL0nLZk!JDa}zx#kn z15j`4=A5(D+vTl%N!z9Sgrpsazd^52W=%)szrKIE{Cd~x+ed!>@%;<-w;v5m^`ge9C7&MdskillAnimations; + LinkedList *prev = NULL; + while (next != NULL) { + Animation *a = next->data; + if (!a->running) { + next->data = NULL; + if (prev) { + prev->next = next->next; + } else { + player->skillAnimations = next->next; + } + LinkedList *tmp = next; + next = next->next; + free(tmp); + continue; + } + animation_update(a); + prev = next; + next = next->next; + } +} + +static void +render_skill_animations(Player *player, Camera *cam) +{ + LinkedList *next = player->skillAnimations; + while (next != NULL) { + Animation *a = next->data; + animation_render(a, cam); + next = next->next; + } +} + +static void +destroy_skill_animations(LinkedList *skillAnimations) +{ + LinkedList *next = skillAnimations; + LinkedList *tmp; + while (next != NULL) { + tmp = next; + next = next->next; + free(tmp); + } +} + +static void +use_skill(Player *player, Skill *skill, SkillData *skillData) { skill->active = false; skill->use(skill, skillData); if (skill->actionRequired) action_spent(skillData->player); skill->resetCountdown = skill->resetTime; + + if (skill->animation) { + Animation *a = skill->animation; + + // Copy the orientation and position of the sword animation for the skill animation + // \see player_turn + a->sprite->pos = player->swordAnimation->sprite->pos; + a->sprite->flip = player->swordAnimation->sprite->flip; + a->sprite->angle = player->swordAnimation->sprite->angle; + + animation_run(a); + linkedlist_append(&player->skillAnimations, skill->animation); + } } static void @@ -487,7 +548,7 @@ check_skill_activation(UpdateData *data) skill->active = (selected - 1) == i && !skill->active && skill->resetCountdown == 0; if (skill->active && skill->instantUse) { SkillData skillData = { player, matrix, VECTOR2D_NODIR }; - use_skill(skill, &skillData); + use_skill(player, skill, &skillData); } } } @@ -515,7 +576,7 @@ check_skill_trigger(UpdateData *data) return false; SkillData skillData = { player, matrix, nextDir }; - use_skill(player->skills[activeSkill], &skillData); + use_skill(player, player->skills[activeSkill], &skillData); return true; } @@ -625,6 +686,8 @@ player_create(class_t class, Camera *cam) player->sprite->dim = GAME_DIMENSION; player->sprite->clip = (SDL_Rect) { 0, 0, 16, 16 }; + player->skillAnimations = NULL; + return player; } @@ -736,6 +799,7 @@ void player_render_toplayer(Player *player, Camera *camera) { animation_render(player->swordAnimation, camera); + render_skill_animations(player, camera); } void @@ -788,6 +852,7 @@ player_update(UpdateData *data) player->projectiles = remaining; animation_update(player->swordAnimation); + update_skill_animations(player); uint32_t damage_taken = player->stats.maxhp - player->stats.hp; player->bleed_emitter->enabled = (int) damage_taken >= player->stats.maxhp / 2; @@ -821,6 +886,8 @@ player_destroy(Player *player) player->skills[i] = NULL; } + destroy_skill_animations(player->skillAnimations); + particle_emitter_destroy(player->bleed_emitter); free(player); diff --git a/src/player.h b/src/player.h index 0fd16803..3dcd6593 100644 --- a/src/player.h +++ b/src/player.h @@ -101,6 +101,7 @@ typedef struct Player { PlayerStateData stateData; PlayerEffects effects; ParticleEmitter *bleed_emitter; + LinkedList *skillAnimations; } Player; Player* diff --git a/src/skill.c b/src/skill.c index 566110d1..7817cffb 100644 --- a/src/skill.c +++ b/src/skill.c @@ -18,6 +18,7 @@ #include #include +#include "defines.h" #include "texturecache.h" #include "skill.h" #include "util.h" @@ -403,7 +404,6 @@ skill_use_flurry(Skill *skill, SkillData *data) return false; } - animation_run(data->player->swordAnimation); Monster *monster = data->matrix->spaces[targetPos.x][targetPos.y].monster; mixer_play_effect(TRIPPLE_SWING); if (monster) { @@ -434,7 +434,7 @@ skill_use_flurry(Skill *skill, SkillData *data) } static Skill * -create_flurry(void) +create_flurry(Camera *cam) { Texture *t = texturecache_add("Extras/Skills.png"); Sprite *s = sprite_create(); @@ -445,6 +445,25 @@ create_flurry(void) Skill *skill = create_default("Flurry", s); skill->levelcap = 2; skill->use = skill_use_flurry; + skill->tooltip = tooltip_create(flurry_tooltip, cam); + skill->animation = animation_create(8); + + Animation *a = skill->animation; + animation_load_texture(a, "Extras/TrippleSwing.png", cam->renderer); + animation_set_frames(a, (AnimationClip[]) { + { 0, 0, 32, 32, 20 }, + { 32, 0, 32, 32, 20 }, + { 64, 0, 32, 32, 20 }, + { 96, 0, 32, 32, 20 }, + { 128, 0, 32, 32, 20 }, + { 160, 0, 32, 32, 20 }, + { 192, 0, 32, 32, 20 }, + { 224, 0, 32, 32, 20 } + }); + a->loop = false; + a->sprite->dim = GAME_DIMENSION; + a->sprite->clip = (SDL_Rect) { 0, 0, 32, 32 }; + a->sprite->rotationPoint = (SDL_Point) { 16, 16 }; return skill; } @@ -1017,8 +1036,7 @@ skill_create(enum SkillType t, Camera *cam) Skill *skill; switch (t) { case FLURRY: - skill = create_flurry(); - skill->tooltip = tooltip_create(flurry_tooltip, cam); + skill = create_flurry(cam); break; case VAMPIRIC_BLOW: skill = create_vampiric_blow();