core: fix enemy movement collision with the player

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I8bfcc0f8816fbc02dbd7ad462b5c0a4e6a6a6964
This commit is contained in:
raf 2026-03-24 17:09:47 +03:00
commit 5fbe7c8c60
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
3 changed files with 66 additions and 57 deletions

View file

@ -5,7 +5,7 @@
#include "rng.h"
// Forward declaration
int is_enemy_at(Enemy *enemies, int count, int x, int y);
int is_enemy_at(const Enemy *enemies, int count, int x, int y);
void enemy_spawn(Enemy enemies[], int *count, Map *map, Player *p, int floor) {
*count = 0;
@ -47,19 +47,23 @@ void enemy_spawn(Enemy enemies[], int *count, Map *map, Player *p, int floor) {
// Stats based on type and floor
switch (e.type) {
case ENEMY_GOBLIN:
e.hp = ENEMY_BASE_HP + floor;
e.max_hp = ENEMY_BASE_HP + floor;
e.hp = e.max_hp;
e.attack = ENEMY_BASE_ATTACK;
break;
case ENEMY_SKELETON:
e.hp = ENEMY_BASE_HP + floor + 2;
e.max_hp = ENEMY_BASE_HP + floor + 2;
e.hp = e.max_hp;
e.attack = ENEMY_BASE_ATTACK + 1;
break;
case ENEMY_ORC:
e.hp = ENEMY_BASE_HP + floor + 4;
e.max_hp = ENEMY_BASE_HP + floor + 4;
e.hp = e.max_hp;
e.attack = ENEMY_BASE_ATTACK + 2;
break;
default:
e.hp = ENEMY_BASE_HP;
e.max_hp = ENEMY_BASE_HP;
e.hp = e.max_hp;
e.attack = ENEMY_BASE_ATTACK;
break;
}
@ -70,7 +74,7 @@ void enemy_spawn(Enemy enemies[], int *count, Map *map, Player *p, int floor) {
}
// Check if position has an enemy
int is_enemy_at(Enemy *enemies, int count, int x, int y) {
int is_enemy_at(const Enemy *enemies, int count, int x, int y) {
for (int i = 0; i < count; i++) {
if (enemies[i].alive && enemies[i].x == x && enemies[i].y == y) {
return 1;
@ -86,9 +90,13 @@ static int can_see_player(Enemy *e, Player *p) {
return (dx >= -1 && dx <= 1 && dy >= -1 && dy <= 1);
}
// Check if position is occupied by player
static int is_player_at(Player *p, int x, int y) {
return (p->x == x && p->y == y);
}
// Move enemy toward player
static void enemy_move_toward_player(Enemy *e, Player *p, Map *map,
Enemy *all_enemies, int enemy_count) {
static void enemy_move_toward_player(Enemy *e, Player *p, Map *map, Enemy *all_enemies, int enemy_count) {
int dx = 0, dy = 0;
if (p->x > e->x)
@ -105,14 +113,14 @@ static void enemy_move_toward_player(Enemy *e, Player *p, Map *map,
int new_x = e->x + dx;
int new_y = e->y;
if (dx != 0 && is_floor(map, new_x, new_y) &&
!is_enemy_at(all_enemies, enemy_count, new_x, new_y)) {
if (dx != 0 && is_floor(map, new_x, new_y) && !is_enemy_at(all_enemies, enemy_count, new_x, new_y) &&
!is_player_at(p, new_x, new_y)) {
e->x = new_x;
} else if (dy != 0) {
new_x = e->x;
new_y = e->y + dy;
if (is_floor(map, new_x, new_y) &&
!is_enemy_at(all_enemies, enemy_count, new_x, new_y)) {
if (is_floor(map, new_x, new_y) && !is_enemy_at(all_enemies, enemy_count, new_x, new_y) &&
!is_player_at(p, new_x, new_y)) {
e->x = new_x;
e->y = new_y;
}