diff --git a/src/effect_util.c b/src/effect_util.c
index 916bfc6..00b4f0a 100644
--- a/src/effect_util.c
+++ b/src/effect_util.c
@@ -50,8 +50,7 @@ effect_damage_surroundings(Position *pos,
monster_push(r->monster,
roommatrix_get_player(rm),
rm,
- dir
- );
+ dir);
}
} else if (r->player && damagePlayer) {
CombatResult result = stats_fight(attackerStats, &r->player->stats);
diff --git a/src/projectile.c b/src/projectile.c
index 9ce02ba..6ca9db6 100644
--- a/src/projectile.c
+++ b/src/projectile.c
@@ -87,6 +87,14 @@ get_projectile_pos_for(Projectile *p)
return projectilePos;
}
+static void
+clear_processed_spaces(Projectile *p)
+{
+ memset(&p->processedSpaces,
+ false,
+ sizeof(p->processedSpaces[0][0]) * MAP_ROOM_WIDTH * MAP_ROOM_HEIGHT);
+}
+
void
projectile_update(Projectile *p, UpdateData *data)
{
@@ -134,7 +142,8 @@ projectile_update(Projectile *p, UpdateData *data)
} else {
p->bounceCount += 1;
vector2d_reverse(&p->velocity);
- alive = p->bounceCount < player_has_artifact(data->player, DAGGER_BOUNCE);
+ clear_processed_spaces(p);
+ alive = p->bounceCount <= player_has_artifact(data->player, DAGGER_BOUNCE);
}
mixer_play_effect(SWORD_HIT);
diff --git a/src/roommatrix.h b/src/roommatrix.h
index 94c433f..c15c9e0 100644
--- a/src/roommatrix.h
+++ b/src/roommatrix.h
@@ -15,9 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-
-#ifndef ROOMMATRIX_H_
-#define ROOMMATRIX_H_
+#pragma once
#include
#include "defines.h"
@@ -87,6 +85,9 @@ roommatrix_render_lightmap(RoomMatrix*, Camera*);
RoomSpace*
roommatrix_get_space_for(RoomMatrix*, const Position *p);
+Player *
+roommatrix_get_player(RoomMatrix*);
+
#ifdef DEBUG
void
roommatrix_render_debug(RoomMatrix*, Camera*);
@@ -94,8 +95,3 @@ roommatrix_render_debug(RoomMatrix*, Camera*);
void
roommatrix_destroy(RoomMatrix*);
-
-Player *
-roommatrix_get_player(RoomMatrix*);
-
-#endif // ROOMMATRIX_H_
diff --git a/src/skill.c b/src/skill.c
index e49c311..ce66828 100644
--- a/src/skill.c
+++ b/src/skill.c
@@ -954,13 +954,39 @@ skill_erupt(Skill *skill, SkillData *data)
particle_engine_eldritch_explosion(player->sprite->pos, DIM(32, 32));
mixer_play_effect(BLAST_EFFECT);
- int range = 1 + player_has_artifact(player, SKILL_RADIUS);
- effect_damage_surroundings(&player->sprite->pos,
- rm,
- &player->stats,
- range,
- 1 + player_has_artifact(player, PUSH_BACK),
- false);
+ Position playerMPos = position_to_matrix_coords(&player->sprite->pos);
+ int range = player_has_artifact(player, SKILL_RADIUS);
+ for (Sint32 i = -1 - range; i <= 1 + range; ++i) {
+ for (Sint32 j = -1 - range; j <= 1 + range; ++j) {
+
+ if (i == 0 && j == 0)
+ continue;
+
+ Position matrixPos = POS(playerMPos.x + i, playerMPos.y + j);
+ if (!position_in_roommatrix(&matrixPos))
+ continue;
+
+ RoomSpace *r = &rm->spaces[matrixPos.x][matrixPos.y];
+ if (r->monster) {
+ player->stats.advantage = true;
+ CombatResult result = stats_fight(&player->stats, &r->monster->stats);
+ player->stats.advantage = false;
+ monster_hit(r->monster, result.dmg, result.critical);
+ gui_log("%s takes %d damage from the explosion", r->monster->label, result.dmg);
+ monster_set_state(r->monster, SCARED, 3);
+
+ int lvl = 1 + player_has_artifact(player, PUSH_BACK);
+ Vector2d dir = vector2d_to_direction(&VEC2D((float) i, (float) j));
+ for (int k = 0; k < lvl; ++k) {
+ if (r->monster->stats.hp > 0)
+ monster_push(r->monster,
+ player,
+ rm,
+ dir);
+ }
+ }
+ }
+ }
return true;
}