Skip to content

Commit b1158be

Browse files
authored
Player bleed based on health (#95)
This change makes the player bleed consistently based on how much damage has been taken.
1 parent 32ba4ca commit b1158be

File tree

7 files changed

+56
-14
lines changed

7 files changed

+56
-14
lines changed

src/particle_emitter.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ particle_emitter_create(void)
1313
emitter->timer = _timer_create();
1414
emitter->timestep = 1;
1515
emitter->enabled = false;
16+
emitter->userdata = NULL;
1617
return emitter;
1718
}
1819

@@ -34,7 +35,7 @@ particle_emitter_render(ParticleEmitter *emitter)
3435
timer_start(emitter->timer);
3536

3637
if (emitter->particle_func)
37-
emitter->particle_func(emitter->pos, emitter->dim);
38+
emitter->particle_func(emitter->pos, emitter->dim, emitter->userdata);
3839
else
3940
error("Particle emitter missing particle_func");
4041
}

src/particle_emitter.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ typedef struct ParticleEmitter {
2727
Timer *timer;
2828
Position pos;
2929
Dimension dim;
30-
void (*particle_func)(Position, Dimension);
30+
void (*particle_func)(Position, Dimension, void *userdata);
31+
void *userdata;
3132
bool enabled;
3233
} ParticleEmitter;
3334

src/particle_engine.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,9 @@ particle_engine_init(void)
100100
}
101101

102102
void
103-
particle_engine_bleed(Position pos, Dimension dim)
103+
particle_engine_bleed(Position pos, Dimension dim, void *userdata)
104104
{
105+
(void) userdata;
105106
particle_engine_bloodspray(pos, dim, 10);
106107
}
107108

@@ -267,8 +268,9 @@ particle_engine_speed_lines(Position pos, Dimension dim, bool horizontal)
267268
}
268269

269270
void
270-
particle_engine_bloodlust(Position pos, Dimension dim)
271+
particle_engine_bloodlust(Position pos, Dimension dim, void *userdata)
271272
{
273+
(void) userdata;
272274
particle_engine_sparkle(pos, dim, C_RED, false);
273275
}
274276

src/particle_engine.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ void
2929
particle_engine_init(void);
3030

3131
void
32-
particle_engine_bleed(Position pos, Dimension dim);
32+
particle_engine_bleed(Position pos, Dimension dim, void *userdata);
3333

3434
void
3535
particle_engine_bloodspray(Position, Dimension, unsigned int count);
@@ -50,7 +50,7 @@ void
5050
particle_engine_speed_lines(Position, Dimension, bool horizontal);
5151

5252
void
53-
particle_engine_bloodlust(Position, Dimension);
53+
particle_engine_bloodlust(Position, Dimension, void *userdata);
5454

5555
void
5656
particle_engine_sparkle(Position, Dimension, SDL_Color, bool global);

src/player.c

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,15 @@ levelup(Player *player)
6464
player->stats.hp = player->stats.maxhp;
6565
}
6666

67+
static void
68+
player_particle_bleed(Position pos, Dimension dim, void *userdata)
69+
{
70+
Player *p = userdata;
71+
float perc = (float) p->stats.hp / p->stats.maxhp;
72+
Uint32 particle_count = (Uint32) (20.0f * perc);
73+
particle_engine_bloodspray(pos, dim, particle_count);
74+
}
75+
6776
void
6877
player_levelup(Player *player)
6978
{
@@ -320,15 +329,26 @@ player_turn(Player *player, Vector2d *direction)
320329
}
321330
}
322331

332+
void
333+
player_update_pos(Player *player, Uint32 dx, Uint32 dy)
334+
{
335+
player->sprite->pos.x += dx;
336+
player->sprite->pos.y += dy;
337+
338+
Position pos = player->sprite->pos;
339+
pos.x += 5;
340+
pos.y += 5;
341+
particle_emitter_update(player->bleed_emitter, pos, DIM(10, 10));
342+
}
343+
323344
static void
324345
move(Player *player, RoomMatrix *matrix, Vector2d direction)
325346
{
326347
player_turn(player, &direction);
327348

328349
Position lastPos = position_to_matrix_coords(&player->sprite->pos);
329350

330-
player->sprite->pos.x += TILE_DIMENSION * (int) direction.x;
331-
player->sprite->pos.y += TILE_DIMENSION * (int) direction.y;
351+
player_update_pos(player, TILE_DIMENSION * (int) direction.x, TILE_DIMENSION * (int) direction.y);
332352

333353
if (!has_collided(player, matrix, direction)) {
334354
action_spent(player);
@@ -547,6 +567,13 @@ player_create(class_t class, Camera *cam)
547567
player->equipment.keys = 0;
548568
player->stateData.shopOwnerKiller = false;
549569

570+
ParticleEmitter *emitter = particle_emitter_create();
571+
emitter->timestep = 2000;
572+
emitter->enabled = false;
573+
emitter->particle_func = particle_engine_bleed;
574+
emitter->userdata = player;
575+
player->bleed_emitter = emitter;
576+
550577
build_sword_animation(player, cam->renderer);
551578

552579
memset(&player->skills,
@@ -701,6 +728,8 @@ player_render(Player *player, Camera *cam)
701728
projectile_render(projectile->data, cam);
702729
projectile = projectile->next;
703730
}
731+
732+
particle_emitter_render(player->bleed_emitter);
704733
}
705734

706735
void
@@ -759,6 +788,9 @@ player_update(UpdateData *data)
759788
player->projectiles = remaining;
760789

761790
animation_update(player->swordAnimation);
791+
792+
uint32_t damage_taken = player->stats.maxhp - player->stats.hp;
793+
player->bleed_emitter->enabled = damage_taken >= player->stats.maxhp / 2;
762794
}
763795

764796
static void
@@ -789,6 +821,8 @@ player_destroy(Player *player)
789821
player->skills[i] = NULL;
790822
}
791823

824+
particle_emitter_destroy(player->bleed_emitter);
825+
792826
free(player);
793827
}
794828

src/player.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include "linkedlist.h"
2727
#include "input.h"
2828
#include "artifact.h"
29+
#include "particle_engine.h"
30+
#include "particle_emitter.h"
2931

3032
#define PLAYER_SKILL_COUNT 5
3133

@@ -97,6 +99,7 @@ typedef struct Player {
9799
PlayerEquipment equipment;
98100
PlayerStateData stateData;
99101
PlayerEffects effects;
102+
ParticleEmitter *bleed_emitter;
100103
} Player;
101104

102105
Player*
@@ -132,6 +135,9 @@ player_render_toplayer(Player*, Camera*);
132135
void
133136
player_turn(Player*, Vector2d *dir);
134137

138+
void
139+
player_update_pos(Player*, Uint32 dx, Uint32 dy);
140+
135141
void
136142
player_destroy(Player*);
137143

src/skill.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -640,8 +640,8 @@ skill_backstab(Skill *skill, SkillData *data)
640640

641641
mixer_play_effect(SWING0 + get_random(2));
642642

643-
data->player->sprite->pos.x += (int) data->direction.x * TILE_DIMENSION;
644-
data->player->sprite->pos.y += (int) data->direction.y * TILE_DIMENSION;
643+
player_update_pos(data->player, data->direction.x * TILE_DIMENSION,
644+
data->direction.y * TILE_DIMENSION);
645645
player_turn(data->player, &reverseDirection);
646646
animation_run(data->player->swordAnimation);
647647

@@ -828,8 +828,7 @@ skill_charge(Skill *skill, SkillData *data)
828828
Position playerOriginPos = player->sprite->pos;
829829
Sint32 xdiff = destination.x - playerStartPos.x;
830830
Sint32 ydiff = destination.y - playerStartPos.y;
831-
player->sprite->pos.x += xdiff * TILE_DIMENSION;
832-
player->sprite->pos.y += ydiff * TILE_DIMENSION;
831+
player_update_pos(player, xdiff * TILE_DIMENSION, ydiff * TILE_DIMENSION);
833832
Position playerDestinationPos = player->sprite->pos;
834833
player_turn(data->player, &data->direction);
835834

@@ -912,8 +911,7 @@ skill_blink(Skill *skill, SkillData *data)
912911
Position playerOriginPos = player->sprite->pos;
913912
Sint32 xdiff = destination.x - playerStartPos.x;
914913
Sint32 ydiff = destination.y - playerStartPos.y;
915-
player->sprite->pos.x += xdiff * TILE_DIMENSION;
916-
player->sprite->pos.y += ydiff * TILE_DIMENSION;
914+
player_update_pos(player, xdiff * TILE_DIMENSION, ydiff * TILE_DIMENSION);
917915
Position playerDestinationPos = player->sprite->pos;
918916
player_turn(data->player, &data->direction);
919917

0 commit comments

Comments
 (0)