2022-01-17 18:29:05 +01:00
|
|
|
#include "player.h"
|
2022-03-18 23:36:32 +01:00
|
|
|
#include "item.h"
|
2022-01-17 18:29:05 +01:00
|
|
|
#include <gint/defs/util.h>
|
|
|
|
|
|
|
|
static int xp_to_next_level(int level)
|
|
|
|
{
|
|
|
|
return 3 * (level + 2) * (level + 2);
|
|
|
|
}
|
|
|
|
|
2022-02-16 17:42:05 +01:00
|
|
|
bool player_add_xp(entity_t *e, int points)
|
2022-01-17 18:29:05 +01:00
|
|
|
{
|
2022-02-16 17:42:05 +01:00
|
|
|
player_data_t *p = getcomp(e, fighter)->player;
|
|
|
|
|
2022-01-17 18:29:05 +01:00
|
|
|
bool leveled_up = false;
|
|
|
|
p->xp_current += max(points, 0);
|
|
|
|
|
|
|
|
while(p->xp_current >= p->xp_to_next_level) {
|
|
|
|
p->xp_current -= p->xp_to_next_level;
|
|
|
|
p->xp_level++;
|
|
|
|
p->xp_to_next_level = xp_to_next_level(p->xp_level);
|
|
|
|
leveled_up = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Recompute statistics */
|
|
|
|
if(leveled_up) {
|
|
|
|
fighter_t *f = getcomp(p->entity, fighter);
|
|
|
|
int previous_HP_max = f->HP_max;
|
2022-03-18 23:36:32 +01:00
|
|
|
|
|
|
|
fighter_stat_model_t stats = player_compute_stats(e, p->equipment);
|
|
|
|
fighter_set_stats(getcomp(p->entity, fighter), &stats);
|
2022-01-17 18:29:05 +01:00
|
|
|
f->HP += (f->HP_max - previous_HP_max);
|
|
|
|
}
|
|
|
|
|
|
|
|
return leveled_up;
|
|
|
|
}
|
2022-03-18 22:21:30 +01:00
|
|
|
|
2022-03-18 23:36:32 +01:00
|
|
|
fighter_stat_model_t player_compute_stats(entity_t *e, int *equips)
|
|
|
|
{
|
|
|
|
player_data_t *p = getcomp(e, fighter)->player;
|
|
|
|
|
|
|
|
fighter_stat_model_t m[4] = {
|
|
|
|
p->stat_model,
|
|
|
|
item_stat_model(equips[0]),
|
|
|
|
item_stat_model(equips[1]),
|
|
|
|
item_stat_model(equips[2]),
|
|
|
|
};
|
|
|
|
|
|
|
|
fighter_stat_model_t model = fighter_stat_model_add(4,
|
|
|
|
m[0], m[1], m[2], m[3]);
|
|
|
|
|
|
|
|
return fighter_stat_model_instantiate(&model, p->xp_level, fix(2.0));
|
|
|
|
}
|
|
|
|
|
2022-03-18 22:21:30 +01:00
|
|
|
bool player_give_item(entity_t *e, int item)
|
|
|
|
{
|
|
|
|
player_data_t *p = getcomp(e, fighter)->player;
|
|
|
|
|
|
|
|
for(int i = 0; i < 9; i++) {
|
|
|
|
if(p->inventory[i] < 0) {
|
|
|
|
p->inventory[i] = item;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|