From 0c820ace5a4688b68849fb149811fb7331e53f78 Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Tue, 27 Jun 2023 21:49:22 +0100 Subject: Add Bat enemy --- src/bat.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/bat.c (limited to 'src/bat.c') diff --git a/src/bat.c b/src/bat.c new file mode 100644 index 0000000..73ea4b2 --- /dev/null +++ b/src/bat.c @@ -0,0 +1,94 @@ +#include + +#include +#include "map.h" +#include "entities.h" + +#include "player.h" + +#include "bat.h" + +#define DIR_UP 0 +#define DIR_DOWN 1 + +/* limit of the animation cycle */ +#define MAX_FRAME 4 + +static const Rect frames[2 * 4] = +{ + /* right */ + { 64, 32, 144, 144 }, + { 80, 32, 144, 144 }, + { 96, 32, 144, 144 }, + { 80, 32, 144, 144 }, + + /* left */ + { 64, 32, 144, 144 }, + { 80, 32, 144, 144 }, + { 96, 32, 144, 144 }, + { 80, 32, 144, 144 }, +}; + +void bat_init(Entity *e) +{ + e->frames = (const Rect *)frames; + e->update = bat_update; + /* will control vertical movement */ + e->flags = DIR_UP; +} + +void bat_update(Entity *e) +{ + if (e->delay & 1) + { + /* horizontal */ + if (e->dir == DIR_RIGHT) + { + if (map_is_blocked(e->x + 16, e->y + 7)) + e->dir = DIR_LEFT; + else + e->x++; + } + else + { + /* dir is LEFT */ + if (map_is_blocked(e->x - 1, e->y + 7)) + e->dir = DIR_RIGHT; + else + e->x--; + } + + /* vertical */ + if (e->flags == DIR_DOWN) + { + if (map_is_blocked(e->x + 7, e->y + 16)) + e->flags = DIR_UP; + else + e->y++; + } + else + { + /* dir is UP */ + if (map_is_blocked(e->x + 7, e->y - 1)) + e->flags = DIR_DOWN; + else + e->y--; + } + } + + if (player_collision(e)) + { + player_hit(); + /* change direction */ + e->dir ^= 1; + e->flags ^= 1; + } + + if (e->delay++ == WALK_DELAY - 2) + { + e->delay = 0; + e->frame++; + if (e->frame == MAX_FRAME) + e->frame = 0; + } +} -- cgit v1.2.3