#include "enemies.h" #include static enemy_t const slime = { .name = "Slime", .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 }, .anim_damage = { anim_slime_damage_left, anim_slime_damage_right }, .movement_params = { .max_speed = fix(1), .propulsion = fix(12), }, .HP = { .base = fix(10), .growth = fix(5), .affinity = fix(3), }, .ATK = { .base = fix(5), .growth = fix(2), .affinity = fix(1), }, .DEF = { .base = fix(2), .growth = fix(1), .affinity = fix(0.5), }, }; static enemy_t const bat = { .name = "Bat", .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 }, .anim_damage = { anim_bat_damage_left, anim_bat_damage_right }, .movement_params = { .max_speed = fix(1.8), .propulsion = fix(8), }, .HP = { .base = fix(8), .growth = fix(4), .affinity = fix(2), }, .ATK = { .base = fix(8), .growth = fix(2), .affinity = fix(2), }, .DEF = { .base = fix(2), .growth = fix(2), .affinity = fix(1), }, }; enemy_t const * const enemies[] = { [ENEMY_SLIME] = &slime, [ENEMY_BAT] = &bat, }; 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) { 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; e->movement.dash = 0; e->movement.dash_facing = LEFT; e->movement_params = &data->movement_params; e->anim_priority = 0; entity_set_anim(e, data->anim_idle[0], 1); e->hitbox = data->hitbox; e->sprite = data->sprite; e->current_attack = NULL; e->attack_follows_movement = false; e->identity = enemy_id; 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; return e; }