aboutsummaryrefslogtreecommitdiff
path: root/player.c
diff options
context:
space:
mode:
Diffstat (limited to 'player.c')
-rw-r--r--player.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/player.c b/player.c
index 1ebe589..7326fca 100644
--- a/player.c
+++ b/player.c
@@ -8,6 +8,8 @@
#include "render.h"
#include "world.h"
+const Rect player_rect = { 5, 4, 5, 12 };
+
void init_player(Player* p) {
p->anim = asset_id_guy_run_right_anm;
p->x = 0;
@@ -22,6 +24,8 @@ void init_player(Player* p) {
p->cooldown = 0;
p->slashing = 0;
p->face = face_right;
+ p->inv = 0;
+ p->hp = player_health;
}
void update_player_anim(Player* p) {
@@ -30,12 +34,11 @@ void update_player_anim(Player* p) {
}
void update_player_phys(Player* p, const Map* map) {
- const Rect r = {
- 5 << fbits,
- 4 << fbits,
- 5 << fbits,
- 12 << fbits
- };
+ Rect r = player_rect;
+ r.x <<= fbits;
+ r.y <<= fbits;
+ r.w <<= fbits;
+ r.h <<= fbits;
update_body(
map,
&p->x,
@@ -151,6 +154,26 @@ void update_player_move(Player* p, const App* a, World* w) {
}
}
+void update_player_hurt(Player* p, World* w) {
+ int i;
+ Rect r = player_rect;
+ r.x += p->x >> fbits;
+ r.y += p->y >> fbits;
+ if (p->inv) {
+ p->inv--;
+ return;
+ }
+ for (i = 0; i < w->deathzone_count; i++) {
+ const Deathzone* dz = &w->deathzones[i];
+ if (!dz->friendly && rects_overlap(&r, &dz->r)) {
+ p->hp -= dz->hp;
+ p->vx -= dz->vx;
+ p->vy -= dz->vy;
+ p->inv = enemy_inv_frames;
+ }
+ }
+}
+
void update_player(
Player* p,
World* w,
@@ -158,6 +181,7 @@ void update_player(
const Map* map
) {
update_player_move(p, app, w);
+ update_player_hurt(p, w);
update_player_phys(p, map);
update_player_anim(p);
}