From 1d988d7f2f7cc9d708cfce9769bf3f39cb9372b2 Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Sat, 25 May 2019 13:11:24 +0200 Subject: [PATCH] Fixes working explosions and artifacts Artifacts: - Explosive daggers - Explosive kills --- assets/Sounds/FX/explosion.wav | Bin 0 -> 49764 bytes src/artifact.c | 23 +++++++--- src/artifact.h | 1 + src/effect_util.c | 3 +- src/effect_util.h | 1 + src/mixer.c | 1 + src/mixer.h | 1 + src/player.c | 78 +++++++++++++++++++-------------- src/projectile.c | 19 ++++++++ 9 files changed, 88 insertions(+), 39 deletions(-) create mode 100644 assets/Sounds/FX/explosion.wav diff --git a/assets/Sounds/FX/explosion.wav b/assets/Sounds/FX/explosion.wav new file mode 100644 index 0000000000000000000000000000000000000000..3c043bb50c6a11526bb5e4fae2ba2a49734c0151 GIT binary patch literal 49764 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 &0t=p^VWs(jC?Qsr#formNCY zx>h=yuBYy+u7U2ju3EbQnXA!oR2CqY_qA57{ac$7)k1qJijL|Io=TgjD^aqjM_9*r zaHUM(O65h3iTV{aCrYi|8`VvFFKVMUHR=O0bW62kwf%JWw0m`V+IKoqCybt|YY1-C zqUc23YUD($iMHytMQ7+%L>qKNq95zJMW5Dbqqplak&paA7pYsTb81KHo@hJi&TFG| zyR;hJMr}Ravj19F-BoQ*vTLw$X{v8t{4~(YvEFbwi_X;IqqglISVAQr$qEMb}aHRwvaR z))i~l={W65omsm}m#IAof0o-icil&wN@vnF)!B6&(Aw(qbbWLo(Mzy>)3E-lbq%l$ zO_1r;AbP#dEqW66t4eoWC(!NIWoftS(&4=kqg|-e!{f!IU8S>YN9t~AyXvlJC+VJ{ zebKJRcOKN`Yd7eu+8Mg<+UdFv+KFfbb(gixaaXDT%tqnw)l$VB#x`b%Thbc1huQB&4bI!y>J)J1UZ@+YPpf_KYxs(5?J-iJ-i>S4 z-((`$g?vP6aD^@+mXX=;D`3IB;D~m(Cp5&hsT=u>=tVxoy<#)rK`z7fW<61hYnX!= zL%aeb=?;8rwjtYl4%vPLIbWogEv{dX=L@S2CAE%3gmq&ol z(-66GgE8Jf@j)K0_##)rUq^vy(a16F3V)m?$YE}X`D*3o;dgUNUM@c&&zA3#8{~h> z-^r)S&&qp&1ym6xmwyZ^$5Y5#@F9+cb;mPFQ?RL|Q23i=QDKxU56>*mWwT^wkcP8C z)=V~ECYAjO{!u4zsJxIISSNiVbxMy*&C+es57HIVv&gYLD;+7FEe(@4lV-wmz!fT# zz77>g--1JRDD*?Sy2JH#D0dDT0po!oIPYJpXX75f6FAQo8 zW^g?ug4BS2TZreo7^cSQwBV@GjtWz`20S0b2vMz>T7NfDT=)zZ>%Q zzW878U+O=_zrDZ4-_1YU&*t~d@44SuztixinBzABPOPo{qW$XmmHJwIpTQyGly#0|x{$hA%u zm5NMww|OOs6YWM8)+Et9Q8Upfa4P;yu80shg%w~G)nsIzk+7!w0jHpQAn_9 z3yo9{_Y5dtEKtJep^7>0_SJ10-or;jO;5NDff}ogoBg-ME%tZy?;F1ppoBW`+Y9;{ zzE1M{SzS)ule*-(vq%DbQ0J(-T*o3s%v$%NE)!~Y@WRaWxZb zPS&(X=3sSo=bGH=s2XRrqK2=Qp@jkKuU`{hGp;6}rdLfc@+m!Qy4QrDLeaBkIg&S5 z)M%ldl4HEGx?N2@WLYLwOKQGD*LJr$wR(4TZ1vXakJZzvFIEr0SV;B%s;$3d)#rX$ zph153t0xr6)m3ev^H=^lTxF=5R&}eY2lW2hs##TjRimrip`2qXRt8nhs4V^2s`C3!S>@56PUx`T!wX>f&&-PUKaW*7E5=tmuIN&+ zqoS&OV1=!`QN`PGpNbXb`trf$$IAoCXOtI~buSl|k1prRnw7I5>wvq-Dv$ zk_Jfmbt{=tQUndUxwv&nLUDrp*QJH=g!j}_+> zjViuSR9CdBD5*$Qw7Dp?a8S{=LT%BO!u-O%g?9@}poe}3o%8jAz`~^kDFs^!^1)!R z6|BSX$pVkU?F9t|yOCnM4m!w{1+Idj1nXfCFJ?w%9n1{NTANvuxg@h9vuEZv=&WyLmS(KVjLG<4=7kJh=JAY3 za5hRa`l24%8cOWS^bHxg>1#8R(r0D7OCOeTEVm z-f4VVVA?%+mY+*YOI@FqnYt|Ped^e>6RC~TW~aKR4NJ{S)up~m&4Zr%K}x^WKU03E zG*0;jP4Kl8muqdxO?b6#aH&%Mgnwo`m(>;Kdh5z?9&mkd&T!pw4s*SCPIo%yG({pPi}6C!LRzr#h!4%bm@kYZfKHN=|faPQHe` z%#)7c$uk_P_(O+n~PQ-yuov;}9f|cgT_l!9%kjG}ayA;n~2E z>ga^N3O==kNl&5CzU{CjU36San&w!N)WXpssWhp|{vqjyeP7Z|`?93n_900V>`_Ve z?Ird++jIL%+aBNz{{X94WItt_YCmk7Yu|4hXWs*#&m+Jt4%(*Mx7hw?pKfbq?`2ci zd%zR8zOBXpR;^;2zJdJ8XNbQ*G0%Eo}p>q^+k_Zu7V1SWT8k)=idi z)*cp(RbeT&Wb)s^54di*%x|>p<`-K2;s;t(yqBdv-_Szx5=%Mf}Bu<{sInJ zXYghd3^Y8nPZ`@9x*7|ZLc=>I-f)aL1OCkh!#HM^VJ@=@9DuWiE6hW~8z#X}#QZWe zH*_!_Gn_S22G&^57|OOWc3_tnm$Ung2ieV7=VRaot;2e4GH$|p4`Tg{{;bj9G~P4Z z2e)Rev5BFvF`cOf=K9vKm$_tE!K?=dXr7@RG8 z=m*qSIv(@XQh`i8I+}^1+b~VwZ>^@={Wt7K6If;tlTH1mKT{U^Bz2$O3QT+vwS^u^ zEu>pgedt!e$?KyZPBo>QqTiJ2N4G}nNlm0XQbXuL)I7Q`HJ0v2O-6qL#%I#)sR6Wt zYDEjE5L!Y-(nWd+&FTxO*ZM^2rv4-Kw|*bhTR)lVt_Sl%KZP2spGr;8ucZ#_uTYot zuPLKGjjGiL(>@e|W&TNzqn6TR@I4Et&Gba-Z+bSh68$A~e`*}oZvY)dwWs~4`gEcG zH}yfEOnujzsE7EjC;9~Re^6WX7pdL)^Jq7yYv6WV(SM>I>EBZy^$sdWUrG5;YFbV; zqi_n+RbLLiLjh&cmr$HOkMg8QT1vH`d*hf*!gueZPSB5V4zXB%4kcv# z;T0c+^I{^n3_Iw<%pv4$901Q@Eq#PpO>bv5f;%&Up3L;1M=-&(j>)HLv7YRI>%EBD z2o4R{5;!NiQ8VcII9~I>t=UK&rN2{lT11C3ZRi2ac5vGg>10L+PTeYIkKqu36DECb&S7E5UEtia^W`k3m0E76YaVCscy(57>%C7SC@<>v0@*4$>~0=zdr<|@tUoQ(756`YVC zguH-$TpPXxr{jBZt@)O~{WahO$T%PH0u-1hfNujHKr|PQel)J#UHFCIa~y|=ldVrJC#|uTC)O0pJ8Ovbw^asS<}h$I*ICEd?px2; zT-KMs`wMN2Z60>QR%dH(3$;huYHc#`K3m&@?M-a{_NF!;duv+=`ayPut=v{&I27jP;W3i}i+0Z@p_Puu?WLeC~BNv3<0yt$hYK0H=`WW3|1s zd)qVYee6WiBKrX3x%5lgZ=as@)P5xCyZvO6!G0$x%lE!wF&)@3QC!cawC%<=wz;C;iv%=Zm>F1i_ zY~VWR{GaO;o?R-OFI=R{)OF|w7Ln_K@O zeTMe$K76D)&&DFA1i$Xx6+v=Ic9TxCmn-`iya#JEJ8r z=-info.name = "Stick of dynamite"; a->info.desc = "You are an explosive slayer"; break; + case VOLATILE_DAGGERS: + a->info.name = "Glowing dagger"; + a->info.desc = "Your daggers are volatile"; default: break; } @@ -92,7 +95,8 @@ static int WarriorArtifacts[] = { INCREASED_STUN, // 6 DAGGER_BOUNCE, // 7 EXPLOSIVE_KILLS, // 8 - CHARGE_THROUGH // 9 + VOLATILE_DAGGERS, // 9 + CHARGE_THROUGH // 10 }; static int RogueArtifacts[] = { @@ -105,7 +109,8 @@ static int RogueArtifacts[] = { INCREASED_STUN, // 6 DAGGER_BOUNCE, // 7 EXPLOSIVE_KILLS, // 8 - PHASE_IMPROVEMENT // 9 + VOLATILE_DAGGERS, // 9 + PHASE_IMPROVEMENT // 10 }; static int MageArtifacts[] = { @@ -118,7 +123,8 @@ static int MageArtifacts[] = { INCREASED_STUN, // 6 DAGGER_BOUNCE, // 7 EXPLOSIVE_KILLS, // 8 - SKILL_RADIUS // 9 + VOLATILE_DAGGERS, // 9 + SKILL_RADIUS // 10 }; /* Not in play yet */ @@ -132,7 +138,8 @@ static int PaladinArtifacts[] = { INCREASED_STUN, // 6 DAGGER_BOUNCE, // 7 EXPLOSIVE_KILLS, // 8 - SKILL_RADIUS // 9 + VOLATILE_DAGGERS, // 9 + SKILL_RADIUS // 10 }; /* Not in play yet */ @@ -146,7 +153,8 @@ static int EngineerArtifacts[] = { INCREASED_STUN, // 6 DAGGER_BOUNCE, // 7 EXPLOSIVE_KILLS, // 8 - PHASE_IMPROVEMENT // 9 + VOLATILE_DAGGERS, // 9 + PHASE_IMPROVEMENT // 10 }; static void @@ -268,6 +276,11 @@ artifact_sprite_for(MagicalEffect effect) sprite_set_texture(sprite, t, 0); sprite->clip = CLIP16(32, 0); break; + case VOLATILE_DAGGERS: + t = texturecache_add("Extras/Artifacts.png"); + sprite_set_texture(sprite, t, 0); + sprite->clip = CLIP16(16, 0); + break; default: break; } diff --git a/src/artifact.h b/src/artifact.h index ca7271f..8c58603 100644 --- a/src/artifact.h +++ b/src/artifact.h @@ -33,6 +33,7 @@ typedef enum MagicalEffect { SKILL_RADIUS, DAGGER_BOUNCE, EXPLOSIVE_KILLS, + VOLATILE_DAGGERS, LAST_ARTIFACT_EFFECT // Sentinel } MagicalEffect; diff --git a/src/effect_util.c b/src/effect_util.c index 00b4f0a..e68be31 100644 --- a/src/effect_util.c +++ b/src/effect_util.c @@ -24,6 +24,7 @@ void effect_damage_surroundings(Position *pos, RoomMatrix *rm, + Player *player, Stats *attackerStats, unsigned int radius, unsigned int pushRadius, @@ -48,7 +49,7 @@ effect_damage_surroundings(Position *pos, Vector2d dir = vector2d_to_direction(&VEC2D((float) i, (float) j)); for (unsigned int k = 0; k < pushRadius; ++k) { monster_push(r->monster, - roommatrix_get_player(rm), + player, rm, dir); } diff --git a/src/effect_util.h b/src/effect_util.h index 1dcc1d5..1151fc2 100644 --- a/src/effect_util.h +++ b/src/effect_util.h @@ -24,6 +24,7 @@ void effect_damage_surroundings(Position *pos, RoomMatrix *rm, + Player *player, Stats *attackerStats, unsigned int radius, unsigned int pushRadius, diff --git a/src/mixer.c b/src/mixer.c index 4732706..bfe1ab1 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -92,6 +92,7 @@ load_effects(void) effects[KEY_PICKUP] = load_effect("Sounds/FX/key_pickup.wav"); effects[BLINK_EFFECT] = load_effect("Sounds/FX/blink.wav"); effects[BLAST_EFFECT] = load_effect("Sounds/FX/blast.wav"); + effects[EXPLOSION_EFFECT] = load_effect("Sounds/FX/explosion.wav"); } void diff --git a/src/mixer.h b/src/mixer.h index ecf060d..3d31c8e 100644 --- a/src/mixer.h +++ b/src/mixer.h @@ -68,6 +68,7 @@ typedef enum Fx_t { KEY_PICKUP, BLINK_EFFECT, BLAST_EFFECT, + EXPLOSION_EFFECT, LAST_EFFECT } Fx; diff --git a/src/player.c b/src/player.c index 2aa5d09..235e9c1 100644 --- a/src/player.c +++ b/src/player.c @@ -37,6 +37,7 @@ #include "trap.h" #include "gamecontroller.h" #include "event.h" +#include "effect_util.h" #ifdef STEAM_BUILD #include "steam/steamworks_api_wrapper.h" @@ -150,6 +151,17 @@ on_monster_collision(Player *player, player->stat_data.misses += 1; } player_monster_kill_check(player, monster); + if (monster->stats.hp <= 0 && (player_has_artifact(player, EXPLOSIVE_KILLS))) { + mixer_play_effect(EXPLOSION_EFFECT); + particle_engine_fire_explosion(monster->sprite->pos, DIM(32, 32)); + effect_damage_surroundings(&monster->sprite->pos, + matrix, + player, + &player->stats, + player_has_artifact(player, EXPLOSIVE_KILLS), + 0, + false); + } if (monster->stats.hp > 0) { if (get_random(10) < player_has_artifact(player, PUSH_BACK)) { @@ -169,7 +181,7 @@ on_monster_collision(Player *player, action_spent(player); } -static void + static void player_pickup_artifacts(Player *player, RoomSpace *space) { LinkedList *artifacts = space->artifacts; @@ -179,7 +191,7 @@ player_pickup_artifacts(Player *player, RoomSpace *space) } } -static void + static void player_interact_objects(Player *player, RoomSpace *space) { LinkedList *objects = space->objects; @@ -189,7 +201,7 @@ player_interact_objects(Player *player, RoomSpace *space) } } -static void + static void player_collect_items(Player *player, RoomSpace *space) { LinkedList *items = space->items; @@ -200,7 +212,7 @@ player_collect_items(Player *player, RoomSpace *space) } } -static void + static void player_interact_traps_and_pits(Player *player, RoomSpace *space) { if (space->lethal) { @@ -212,7 +224,7 @@ player_interact_traps_and_pits(Player *player, RoomSpace *space) } } -static bool + static bool player_has_collided(Player *p, RoomSpace *space) { if (space->occupied) @@ -221,7 +233,7 @@ player_has_collided(Player *p, RoomSpace *space) return !p->phase_count && space->monster && space->monster->sprite->state != SPRITE_STATE_FALLING; } -static bool + static bool has_collided(Player *player, RoomMatrix *matrix, Vector2d direction) { Position roomCoord = position_to_room_coords(&player->sprite->pos); @@ -254,7 +266,7 @@ has_collided(Player *player, RoomMatrix *matrix, Vector2d direction) else { player_collect_items(player, space); player_pickup_artifacts(player, space); - + // If not phased or phase will end this turn, react to traps and pits if (!player->phase_count || (player->phase_count == 1 && player->stats.speed == (player->stat_data.steps + 1))) { player_interact_objects(player, space); @@ -264,7 +276,7 @@ has_collided(Player *player, RoomMatrix *matrix, Vector2d direction) } } -static void + static void set_clip_for_direction(Player *player, Vector2d *direction) { if (vector2d_equals(*direction, VECTOR2D_LEFT)) @@ -277,7 +289,7 @@ set_clip_for_direction(Player *player, Vector2d *direction) player->sprite->clip.y = 0; } -void + void player_turn(Player *player, Vector2d *direction) { set_clip_for_direction(player, direction); @@ -304,7 +316,7 @@ player_turn(Player *player, Vector2d *direction) } } -static void + static void move(Player *player, RoomMatrix *matrix, Vector2d direction) { player_turn(player, &direction); @@ -326,12 +338,12 @@ move(Player *player, RoomMatrix *matrix, Vector2d direction) lastSpace->trap == NULL && lastSpace->objects == NULL && lastSpace->items == NULL - ) + ) map_trigger_tile_fall(lastSpace->tile); } } -void + void player_sip_health(Player *player) { bool hasSips = player->class == MAGE ? @@ -350,7 +362,7 @@ player_sip_health(Player *player) } } -static Vector2d + static Vector2d read_direction_from(Input *input) { if (input_key_is_pressed(input, KEY_LEFT)) @@ -365,7 +377,7 @@ read_direction_from(Input *input) return VECTOR2D_NODIR; } -static void + static void handle_next_move(UpdateData *data) { static unsigned int step = 1; @@ -405,7 +417,7 @@ handle_next_move(UpdateData *data) } } -static void + static void use_skill(Skill *skill, SkillData *skillData) { skill->active = false; @@ -415,7 +427,7 @@ use_skill(Skill *skill, SkillData *skillData) skill->resetCountdown = skill->resetTime; } -static void + static void check_skill_activation(UpdateData *data) { // TODO(Linus): This could be "smarter" @@ -456,7 +468,7 @@ check_skill_activation(UpdateData *data) } } -static bool + static bool check_skill_trigger(UpdateData *data) { Player *player = data->player; @@ -484,7 +496,7 @@ check_skill_trigger(UpdateData *data) return true; } -static void + static void build_sword_animation(Player *p, SDL_Renderer *renderer) { animation_load_texture(p->swordAnimation, "Extras/SwordSwing.png", renderer); @@ -502,7 +514,7 @@ build_sword_animation(Player *p, SDL_Renderer *renderer) p->swordAnimation->sprite->rotationPoint = (SDL_Point) { 16, 16 }; } -Player* + Player* player_create(class_t class, Camera *cam) { Player *player = malloc(sizeof(Player)); @@ -584,7 +596,7 @@ player_create(class_t class, Camera *cam) return player; } -void + void player_reset_on_levelchange(Player *player) { player->sprite->pos = (Position) { @@ -602,7 +614,7 @@ ExperienceData player_get_xp_data(Player *p) return data; } -void + void player_monster_kill_check(Player *player, Monster *monster) { if (!monster) @@ -642,7 +654,7 @@ player_monster_kill_check(Player *player, Monster *monster) } } -void + void player_hit(Player *p, unsigned int dmg) { if (dmg > 0) { @@ -666,7 +678,7 @@ player_hit(Player *p, unsigned int dmg) } -void + void player_render(Player *player, Camera *cam) { sprite_set_alpha(player->sprite, player->phase_count ? 150 : 255); @@ -679,25 +691,25 @@ player_render(Player *player, Camera *cam) } } -void + void player_render_toplayer(Player *player, Camera *camera) { animation_render(player->swordAnimation, camera); } -void + void player_reset_steps(Player *p) { p->stat_data.steps = 0; } -static void + static void reset_dagger_skill(Player *p) { p->skills[3]->resetCountdown = 0; } -void + void player_update(UpdateData *data) { Player *player = data->player; @@ -737,7 +749,7 @@ player_update(UpdateData *data) animation_update(player->swordAnimation); } -static void + static void player_reset(Player *player) { for (size_t i = 0; i < LAST_ARTIFACT_EFFECT; ++i) @@ -748,7 +760,7 @@ player_reset(Player *player) projectile_destroy(linkedlist_pop(&player->projectiles)); } -void + void player_destroy(Player *player) { player_reset(player); @@ -768,19 +780,19 @@ player_destroy(Player *player) free(player); } -bool + bool player_turn_over(Player *player) { return player->stat_data.steps >= player->stats.speed; } -Uint32 + Uint32 player_has_artifact(Player *p, MagicalEffect effect) { return p->equipment.artifacts[effect].level; } -void + void player_add_artifact(Player *p, Artifact *a) { if (a->price > p->gold) { @@ -810,7 +822,7 @@ player_add_artifact(Player *p, Artifact *a) p->equipment.hasArtifacts = true; } -void + void player_set_falling(Player *player) { mixer_play_effect(FALL0 + get_random(1)); diff --git a/src/projectile.c b/src/projectile.c index 6ca9db6..869095a 100644 --- a/src/projectile.c +++ b/src/projectile.c @@ -28,6 +28,8 @@ #include "item_builder.h" #include "random.h" #include "update_data.h" +#include "effect_util.h" +#include "particle_engine.h" static void onDaggerRender(Sprite *s) @@ -95,6 +97,22 @@ clear_processed_spaces(Projectile *p) sizeof(p->processedSpaces[0][0]) * MAP_ROOM_WIDTH * MAP_ROOM_HEIGHT); } +static void +perform_dagger_explosion(Player *player, RoomMatrix *rm, Position *collisionPos) +{ + if (player_has_artifact(player, VOLATILE_DAGGERS)) { + mixer_play_effect(EXPLOSION_EFFECT); + particle_engine_fire_explosion(*collisionPos, DIM(32, 32)); + effect_damage_surroundings(collisionPos, + rm, + player, + &player->stats, + player_has_artifact(player, VOLATILE_DAGGERS), + 0, + false); + } +} + void projectile_update(Projectile *p, UpdateData *data) { @@ -132,6 +150,7 @@ projectile_update(Projectile *p, UpdateData *data) if (result.dmg > 0) { gui_log("Your dagger pierced %s for %u damage", space->monster->lclabel, result.dmg); data->player->stat_data.hits += 1; + perform_dagger_explosion(data->player, data->matrix, &collisionPos); } else { gui_log("%s dodged your dagger", space->monster->label); }