#include "comp/entity.h" #include "comp/fighter.h" #include "comp/visible.h" #include "enemies.h" #include #include static int instantiate_stat(fixed_t affinity, fixed_t multiplier, int level) { float a = f2double(affinity); float x = level; float y = powf(x, a) + x + 3 * a; return fround(multiplier * (int)y); } void fighter_set_stats(fighter_t *f, fighter_stat_model_t const *model, int level, fixed_t factor) { f->HP_max = instantiate_stat(model->HP, fmul(fix(2.0), factor), level); f->ATK = instantiate_stat(model->ATK, fix(1.6), level); f->MAG = instantiate_stat(model->MAG, fix(1.6), level); f->DEF = instantiate_stat(model->DEF, fix(0.7), level); } int fighter_damage(entity_t *e, int base_damage) { fighter_t *f = getcomp(e, fighter); if(f->HP == 0) return 0; base_damage -= f->DEF; if(base_damage <= 0) return 0; int variation = (base_damage >= 4) ? (rand() % (base_damage / 4)) : 0; int damage = (base_damage * 7) / 8 + variation; if(f->HP < damage) f->HP = 0; else f->HP -= damage; if(f->enemy_data != NULL) { if(f->HP == 0) visible_set_anim(e, f->enemy_data->anim_death, 4); else visible_set_anim(e, f->enemy_data->anim_hit, 3); } else { visible_set_anim(e, &anims_player_Hit, 3); } return damage; }