diff --git a/assets/Sounds/FX/blast.wav b/assets/Sounds/FX/blast.wav new file mode 100644 index 0000000..d937f5c Binary files /dev/null and b/assets/Sounds/FX/blast.wav differ diff --git a/src/mixer.c b/src/mixer.c index 4560ff7..4732706 100644 --- a/src/mixer.c +++ b/src/mixer.c @@ -91,6 +91,7 @@ load_effects(void) effects[DOOR_OPEN] = load_effect("Sounds/FX/door_open.wav"); 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"); } void diff --git a/src/mixer.h b/src/mixer.h index 9708fd2..ecf060d 100644 --- a/src/mixer.h +++ b/src/mixer.h @@ -67,6 +67,7 @@ typedef enum Fx_t { DOOR_OPEN, KEY_PICKUP, BLINK_EFFECT, + BLAST_EFFECT, LAST_EFFECT } Fx; diff --git a/src/monster.c b/src/monster.c index 2114c57..6cc416f 100644 --- a/src/monster.c +++ b/src/monster.c @@ -552,7 +552,7 @@ monster_perform_aoe_attack(Monster *m, RoomMatrix *rm) } static void -apply_bleed_damage(Monster *m) +apply_bleed_damage(Player *p, Monster *m) { if (!m->emitters.bleed->enabled) return; @@ -560,12 +560,13 @@ apply_bleed_damage(Monster *m) uint32_t dmg = m->stats.lvl * 2; monster_hit(m, dmg); m->stats.hp -= dmg; + player_monster_kill_check(p, m); } bool monster_move(Monster *m, RoomMatrix *rm, Map *map) { - apply_bleed_damage(m); + apply_bleed_damage(roommatrix_get_player(rm), m); Player *player = roommatrix_get_player(rm); if (player && player->phase_count) diff --git a/src/player.c b/src/player.c index d8c7fbe..40f22df 100644 --- a/src/player.c +++ b/src/player.c @@ -542,6 +542,7 @@ player_create(class_t class, Camera *cam) case MAGE: m_strcpy(asset, 100, "Commissions/Mage.png"); player->stats = (Stats) MAGE_STATS; + player->skills[1] = skill_create(ERUPT, cam); player->skills[2] = skill_create(BLINK, cam); break; case PALADIN: diff --git a/src/skill.c b/src/skill.c index 35a8f66..b7e1fb4 100644 --- a/src/skill.c +++ b/src/skill.c @@ -163,7 +163,7 @@ static char *blink_tooltip[] = { " object. Monsters will not obstruct your blink.", "", "", "COOLDOWN:", "", - " 5 turns", "", + " 4 turns", "", "", "USAGE:", " activate the skill (press ", "3", ")", "", @@ -174,6 +174,23 @@ static char *blink_tooltip[] = { NULL }; +static char *erupt_tooltip[] = { + "ERUPT", "", + "", + " You erupt in a magical explosion damaging monsters", "", + " around you and causing bleeding.", "", + "", + "COOLDOWN:", "", + " 3 turns", "", + "", + "USAGE:", + " Erupt (press ", "2", ")", "", + "", + "", + "Press ", "ESC", " to close", "", + NULL +}; + static char *dagger_tooltip[] = { "THROW DAGGER", "", "", @@ -835,8 +852,60 @@ create_blink(void) s->clip = CLIP32(32, 0); s->fixed = true; Skill *skill = create_default("Blink", s); - skill->levelcap = 4; + skill->levelcap = 3; skill->use = skill_blink; + skill->resetTime = 4; + return skill; +} + +static bool +skill_erupt(Skill *skill, SkillData *data) +{ + UNUSED(skill); + + Player *player = data->player; + RoomMatrix *rm = data->matrix; + + gui_log("You erupt in a magical explosion"); + particle_engine_eldritch_explosion(player->sprite->pos, DIM(32, 32)); + mixer_play_effect(BLAST_EFFECT); + + Position playerMPos = position_to_matrix_coords(&player->sprite->pos); + for (Sint32 i = -1; i <= 1; ++i) { + for (Sint32 j = -1; j <= 1; ++j) { + + if (i == 0 && j == 0) + continue; + + RoomSpace *r = &rm->spaces[playerMPos.x + i][playerMPos.y + j]; + if (r->monster) { + player->stats.advantage = true; + int dmg = stats_fight(&player->stats, &r->monster->stats); + player->stats.advantage = false; + monster_hit(r->monster, dmg); + gui_log("%s takes %d damage from the explosion", r->monster->label, dmg); + monster_set_bleeding(r->monster); + } + } + } + + return true; +} + +static Skill * +create_erupt(void) +{ + Texture *t = texturecache_add("Extras/Skills.png"); + Sprite *s = sprite_create(); + sprite_set_texture(s, t, 0); + s->dim = GAME_DIMENSION; + s->clip = CLIP32(32, 0); + s->fixed = true; + Skill *skill = create_default("Erupt", s); + skill->levelcap = 3; + skill->use = skill_erupt; + skill->instantUse = true; + skill->resetTime = 3; return skill; } @@ -861,6 +930,10 @@ skill_create(enum SkillType t, Camera *cam) skill = create_blink(); skill->tooltip = tooltip_create(blink_tooltip, cam); break; + case ERUPT: + skill = create_erupt(); + skill->tooltip = tooltip_create(erupt_tooltip, cam); + break; case DAGGER_THROW: skill = create_throw_dagger(); skill->tooltip = tooltip_create(dagger_tooltip, cam); diff --git a/src/skill.h b/src/skill.h index 89863f0..442c992 100644 --- a/src/skill.h +++ b/src/skill.h @@ -36,7 +36,8 @@ enum SkillType { BACKSTAB, TRIP, PHASE, - BLINK + BLINK, + ERUPT }; typedef struct SkillData_t {