RogueLife/src/player.c

85 lines
2.0 KiB
C

#include "player.h"
#include "item.h"
#include <gint/defs/util.h>
static int xp_to_next_level(int level)
{
return 3 * (level + 2) * (level + 2);
}
bool player_add_xp(entity_t *e, int points)
{
player_data_t *p = getcomp(e, fighter)->player;
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;
fighter_stat_model_t stats = player_compute_stats(e, p->equipment);
fighter_set_stats(getcomp(p->entity, fighter), &stats);
f->HP += (f->HP_max - previous_HP_max);
}
return leveled_up;
}
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[3] = {
item_stat_model(equips[0]),
item_stat_model(equips[1]),
item_stat_model(equips[2]),
};
fighter_stat_model_t equip_model = fighter_stat_model_mul(3,
m[0], m[1], m[2]);
return fighter_stat_model_instantiate(&p->stat_model, &equip_model,
p->xp_level, fix(3.0));
}
void player_compute_skills(entity_t *e, int *equips, int *skills)
{
(void)e;
for(int i = 0; i < 6; i++)
skills[i] = -1;
/* Sword/staff */
if(equips[0] >= 0)
item_skills(equips[0], &skills[0], &skills[1], &skills[2]);
/* Armor */
if(equips[1] >= 0)
item_skills(equips[1], &skills[3], &skills[4], NULL);
/* Accessory */
if(equips[2] >= 0)
item_skills(equips[2], &skills[5], NULL, NULL);
}
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;
}