Fixes returning daggers and resets erupt attack
This commit is contained in:
parent
7f232beb32
commit
68f4e152d3
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -15,9 +15,7 @@
|
|||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef ROOMMATRIX_H_
|
||||
#define ROOMMATRIX_H_
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
#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_
|
||||
|
|
40
src/skill.c
40
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue