From 68f4e152d3681ff4eae48cc29b6f4f13b811335c Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Mon, 20 May 2019 15:37:25 +0200 Subject: [PATCH] Fixes returning daggers and resets erupt attack --- src/effect_util.c | 3 +-- src/projectile.c | 11 ++++++++++- src/roommatrix.h | 12 ++++-------- src/skill.c | 40 +++++++++++++++++++++++++++++++++------- 4 files changed, 48 insertions(+), 18 deletions(-) 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; }