From 752b8c4b4703a5bc43d32b815aa713fab12e653c Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Thu, 6 Jul 2023 22:06:28 +0100 Subject: Add free enemy (Old Miner) --- src/old.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 src/old.c (limited to 'src/old.c') diff --git a/src/old.c b/src/old.c new file mode 100644 index 0000000..3451118 --- /dev/null +++ b/src/old.c @@ -0,0 +1,158 @@ +#include +#include + +#include "vga.h" +#include "map.h" +#include "entities.h" + +#include "player.h" + +#include "old.h" + +#define FRAME_STANDING 0 +#define FRAME_JUMPING 1 +#define WALK_CYCLE_FRAMES 4 + +#define JUMP_DELAY 2 + +static const Rect frames[2 * 4] = +{ + /* right */ + { 0, 80, 144, 144 }, + { 16, 80, 144, 144 }, + { 0, 80, 144, 144 }, + { 32, 80, 144, 144 }, + + /* left */ + { 48, 80, 144, 144 }, + { 64, 80, 144, 144 }, + { 48, 80, 144, 144 }, + { 80, 80, 144, 144 }, +}; + +void old_init(Entity *e) +{ + e->frames = (const Rect *)frames; + e->update = old_update; +} + +static uint8_t is_bottom_deadly(uint16_t x, uint16_t y) +{ + while (1) + { + if (map_is_deadly(x, y)) + return 1; + + if (map_is_blocked(x, y)) + return 0; + + y += 8; + } +} + +void old_update(Entity *e) +{ + if (e->gravity == GRAVITY_OFF + && !map_is_blocked(e->x + 4, e->y + 16) + && !map_is_blocked(e->x + 11, e->y + 16)) + { + e->gravity = GRAVITY_DOWN; + e->frame = FRAME_JUMPING; + } + + if (e->gravity != GRAVITY_OFF) + { + uint8_t steps = gravity_seq[e->gravity - 1]; + + if (e->gravity > GRAVITY_DOWN) + { + /* going down! */ + for (uint8_t i = 0; i < steps; i++) + { + /* hit the floor */ + if ((map_is_blocked(e->x + 11, e->y + 16) + || map_is_blocked(e->x + 4, e->y + 16)) + && !map_is_blocked(e->x + 4, e->y + 15) + && !map_is_blocked(e->x + 11, e->y + 15)) + { + e->gravity = GRAVITY_OFF; + e->frame = FRAME_STANDING; + e->flags = rand() % (JUMP_DELAY * 2); + break; + } + e->y++; + } + } + else + { + /* going up! */ + if (e->y < steps) + e->y = 0; + else + e->y -= steps; + } + + if (e->gravity != GRAVITY_OFF && e->gravity != GRAVITY_SEQ_LEN) + e->gravity++; + } + else + { + if (e->delay & 1) + { + if (e->dir == DIR_RIGHT) + { + if (map_is_blocked(e->x + 16, e->y + 15) + || is_bottom_deadly(e->x + 16, e->y + 16)) + { + e->dir = DIR_LEFT; + e->flags++; + } + else + e->x++; + + if (e->flags > JUMP_DELAY + && map_is_blocked(e->x + 7, e->y - 1) + && !map_is_blocked(e->x + 7, e->y - 9)) + { + e->gravity = GRAVITY_UP; + e->frame = FRAME_JUMPING; + } + } + else + { + /* dir is LEFT */ + if (map_is_blocked(e->x - 1, e->y + 15) + || is_bottom_deadly(e->x - 1, e->y + 16)) + { + e->dir = DIR_RIGHT; + e->flags++; + } + else + e->x--; + + if (e->flags > JUMP_DELAY + && map_is_blocked(e->x + 7, e->y - 1) + && !map_is_blocked(e->x + 7, e->y - 9)) + { + e->gravity = GRAVITY_UP; + e->frame = FRAME_JUMPING; + } + } + } + + if (e->delay++ == WALK_DELAY) + { + e->delay = 0; + e->frame++; + if (e->frame == WALK_CYCLE_FRAMES) + e->frame = FRAME_STANDING; + } + } + + if (player_collision(e)) + { + player_hit(); + /* change direction */ + e->dir ^= 1; + } +} -- cgit v1.2.3