various: add speed/cooldown & initiative system

- Goblins act every ~2 turns, skeletons ~1.5, orcs ~1.2
- Enemies accumulate cooldown based on speed, act when <= 0
- Player always acts every turn (speed = 100)"

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Id822579a0326887d91a80bd4ab27a72d6a6a6964
This commit is contained in:
raf 2026-04-03 14:21:05 +03:00
commit db21bdacdd
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
4 changed files with 185 additions and 41 deletions

View file

@ -50,23 +50,28 @@ void enemy_spawn(Enemy enemies[], int *count, Map *map, Player *p, int floor) {
e.max_hp = ENEMY_BASE_HP + floor;
e.hp = e.max_hp;
e.attack = ENEMY_BASE_ATTACK;
e.speed = 55 + rng_int(0, 10);
break;
case ENEMY_SKELETON:
e.max_hp = ENEMY_BASE_HP + floor + 2;
e.hp = e.max_hp;
e.attack = ENEMY_BASE_ATTACK + 1;
e.speed = 70 + rng_int(0, 10);
break;
case ENEMY_ORC:
e.max_hp = ENEMY_BASE_HP + floor + 4;
e.hp = e.max_hp;
e.attack = ENEMY_BASE_ATTACK + 2;
e.speed = 85 + rng_int(0, 10);
break;
default:
e.max_hp = ENEMY_BASE_HP;
e.hp = e.max_hp;
e.attack = ENEMY_BASE_ATTACK;
e.speed = 60;
break;
}
e.cooldown = e.speed;
enemies[i] = e;
(*count)++;
@ -127,6 +132,21 @@ static void enemy_move_toward_player(Enemy *e, Player *p, Map *map, Enemy *all_e
}
}
// Perform a single action for an enemy (attack if adjacent, otherwise move)
void enemy_act(Enemy *e, Player *p, Map *map, Enemy *all_enemies, int enemy_count) {
if (!e->alive)
return;
// Check if adjacent to player - attack
if (can_see_player(e, p)) {
combat_enemy_attack(e, p);
return;
}
// Otherwise, move toward player
enemy_move_toward_player(e, p, map, all_enemies, enemy_count);
}
void enemy_update_all(Enemy enemies[], int count, Player *p, Map *map) {
for (int i = 0; i < count; i++) {
Enemy *e = &enemies[i];
@ -134,14 +154,10 @@ void enemy_update_all(Enemy enemies[], int count, Player *p, Map *map) {
if (!e->alive)
continue;
// Check if adjacent to player - attack
if (can_see_player(e, p)) {
// Use combat system
combat_enemy_attack(e, p);
continue;
e->cooldown -= e->speed;
if (e->cooldown <= 0) {
enemy_act(e, p, map, enemies, count);
e->cooldown = 100;
}
// Otherwise, move toward player
enemy_move_toward_player(e, p, map, enemies, count);
}
}