76 lines
1.8 KiB
C
76 lines
1.8 KiB
C
#include "player.h"
|
|
#include "item.h"
|
|
#include <gint/defs/util.h>
|
|
|
|
static int xp_to_next_level(int level)
|
|
{
|
|
return 5 * (level + 2) * (level + 2);
|
|
}
|
|
|
|
fighter_stats_t player_compute_growth(entity_t *e, int *equips)
|
|
{
|
|
player_data_t *p = getcomp(e, fighter)->player;
|
|
|
|
fighter_stats_t m[3] = {
|
|
item_stat_model(p->inventory[equips[0]]),
|
|
item_stat_model(p->inventory[equips[1]]),
|
|
item_stat_model(p->inventory[equips[2]]),
|
|
};
|
|
|
|
return fighter_stats_add(4, m[0], m[1], m[2], p->stats_growth);
|
|
}
|
|
|
|
bool player_add_xp(entity_t *e, int points)
|
|
{
|
|
fighter_t *f = getcomp(e, fighter);
|
|
player_data_t *p = f->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);
|
|
|
|
fighter_stats_t growth = player_compute_growth(e, p->equipment);
|
|
fighter_increase_stats(f, &growth);
|
|
leveled_up = true;
|
|
}
|
|
|
|
return leveled_up;
|
|
}
|
|
|
|
void player_compute_skills(entity_t *e, int *equips, int *skills)
|
|
{
|
|
player_data_t *p = getcomp(e, fighter)->player;
|
|
int *inv = p->inventory;
|
|
|
|
for(int i = 0; i < 6; i++)
|
|
skills[i] = -1;
|
|
|
|
/* Sword/staff */
|
|
if(equips[0] >= 0)
|
|
item_skills(inv[equips[0]], &skills[0], &skills[1], &skills[2]);
|
|
/* Armor */
|
|
if(equips[1] >= 0)
|
|
item_skills(inv[equips[1]], &skills[3], &skills[4], NULL);
|
|
/* Accessory */
|
|
if(equips[2] >= 0)
|
|
item_skills(inv[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 < 8; i++) {
|
|
if(p->inventory[i] < 0) {
|
|
p->inventory[i] = item;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|