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:
parent
8f6650919d
commit
db21bdacdd
4 changed files with 185 additions and 41 deletions
32
src/enemy.c
32
src/enemy.c
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue