52 lines
1.4 KiB
C
52 lines
1.4 KiB
C
#include "comp/entity.h"
|
|
#include "comp/fighter.h"
|
|
#include "comp/visible.h"
|
|
#include "enemies.h"
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
|
|
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;
|
|
}
|