RogueLife/src/enemies.c

116 lines
2.9 KiB
C
Raw Normal View History

2021-06-15 17:27:30 +02:00
#include "enemies.h"
#include <stdlib.h>
static enemy_t const slime = {
.name = "Slime",
2021-07-16 18:49:58 +02:00
.hitbox = (frect_t){ -fix(3)/16, fix(4)/16, -fix(2)/16, fix(3)/16 },
.sprite = (frect_t){ -fix(5)/16, fix(5)/16, -fix(4)/16, fix(3)/16 },
.anim_idle = { anim_slime_idle_left, anim_slime_idle_right },
.anim_death = { anim_slime_death_left, anim_slime_death_right },
2021-08-15 11:05:04 +02:00
.anim_damage = { anim_slime_damage_left, anim_slime_damage_right },
2021-06-15 17:27:30 +02:00
.movement_params = {
2021-07-16 18:49:58 +02:00
.max_speed = fix(1),
.propulsion = fix(12),
2021-06-15 17:27:30 +02:00
},
.HP = {
2021-07-16 18:49:58 +02:00
.base = fix(10),
.growth = fix(5),
.affinity = fix(3),
},
.ATK = {
2021-07-16 18:49:58 +02:00
.base = fix(5),
.growth = fix(2),
.affinity = fix(1),
},
.DEF = {
2021-07-16 18:49:58 +02:00
.base = fix(2),
.growth = fix(1),
.affinity = fix(0.5),
},
2021-06-15 17:27:30 +02:00
};
2021-06-25 12:07:22 +02:00
static enemy_t const bat = {
.name = "Bat",
2021-07-16 18:49:58 +02:00
.hitbox = (frect_t){ -fix(3)/16, fix(4)/16, -fix(2)/16, fix(3)/16 },
.sprite = (frect_t){ -fix(5)/16, fix(5)/16, -fix(4)/16, fix(3)/16 },
.anim_idle = { anim_bat_idle_left, anim_bat_idle_right },
.anim_death = { anim_bat_death_left, anim_bat_death_right },
2021-08-15 11:05:04 +02:00
.anim_damage = { anim_bat_damage_left, anim_bat_damage_right },
2021-06-25 12:07:22 +02:00
.movement_params = {
2021-07-16 18:49:58 +02:00
.max_speed = fix(1.8),
.propulsion = fix(8),
2021-06-25 12:07:22 +02:00
},
.HP = {
2021-07-16 18:49:58 +02:00
.base = fix(8),
.growth = fix(4),
.affinity = fix(2),
2021-06-25 12:07:22 +02:00
},
.ATK = {
2021-07-16 18:49:58 +02:00
.base = fix(8),
.growth = fix(2),
.affinity = fix(2),
2021-06-25 12:07:22 +02:00
},
.DEF = {
2021-07-16 18:49:58 +02:00
.base = fix(2),
.growth = fix(2),
.affinity = fix(1),
2021-06-25 12:07:22 +02:00
},
};
enemy_t const * const enemies[] = {
2021-06-15 17:27:30 +02:00
[ENEMY_SLIME] = &slime,
2021-06-25 12:07:22 +02:00
[ENEMY_BAT] = &bat,
2021-06-15 17:27:30 +02:00
};
int instantiate_stat(enemy_stat_t const *stat, int level)
{
fixed_t value = stat->base + stat->growth * (level - 1) +
stat->affinity * (level * (level - 1) / 2);
fixed_t variation = value / 8;
value = (value - variation) + (rand() % (2 * variation));
return ffloor(value);
}
entity_t *enemy_spawn(int enemy_id, int level)
2021-06-15 17:27:30 +02:00
{
if(enemy_id < 0 || (size_t)enemy_id >= sizeof enemies / sizeof *enemies)
return NULL;
entity_t *e = malloc(sizeof *e);
if(!e) return NULL;
enemy_t const *data = enemies[enemy_id];
/* These will probably be overridden by the caller */
e->movement.x = 0;
e->movement.y = 0;
e->movement.vx = 0;
e->movement.vy = 0;
e->movement.facing = LEFT;
2021-06-15 17:27:30 +02:00
e->movement.dash = 0;
e->movement.dash_facing = LEFT;
2021-06-15 17:27:30 +02:00
e->movement_params = &data->movement_params;
2021-08-30 11:39:14 +02:00
e->anim_priority = 0;
entity_set_anim(e, data->anim_idle[0], 1);
2021-06-15 17:27:30 +02:00
e->hitbox = data->hitbox;
e->sprite = data->sprite;
e->current_attack = NULL;
e->attack_follows_movement = false;
2021-06-15 17:27:30 +02:00
e->identity = enemy_id;
2021-08-30 19:07:22 +02:00
e->HP_max = instantiate_stat(&data->HP, level);
e->ATK = instantiate_stat(&data->ATK, level);
e->DEF = instantiate_stat(&data->DEF, level);
e->HP = e->HP_max;
2021-06-15 17:27:30 +02:00
return e;
}