player can level up + xp

This commit is contained in:
bgiraudr 2022-02-12 02:05:10 +01:00
parent eb6469c2b5
commit 68f80917d6
3 changed files with 46 additions and 8 deletions

View File

@ -9,7 +9,7 @@ enum battle_state {
};
void create_battle(struct Game *game);
int during_battle(struct Player *player, struct Monster *monster);
int battle(struct Player *player, struct Monster *monster);
int select_move(struct Player *player, struct Monster *monster, int prec_selected);
void draw_battle(struct Player *player, struct Monster *monster);
void draw_executed_move(struct Move move, struct Monster *monster, int is_monster);

View File

@ -8,15 +8,45 @@
#include "player.h"
#include "monster.h"
#include <stdlib.h>
#include <math.h>
void create_battle(struct Game *game) {
game->player->stats.pv = game->player->stats.max_pv;
struct Monster *monster = generate_monster(game);
during_battle(game->player, monster);
int status = battle(game->player, monster);
if(status == WIN) {
//gain d'xp
int xp = ceil((monster->stats->xp*monster->stats->level*1.5)/7);
const int rect_size = 100;
drect(0,DHEIGHT,DWIDTH,DHEIGHT-rect_size,C_WHITE);
dprint(10,DHEIGHT-rect_size/2-8, C_BLACK, "Vous remportez %d points d'experience", xp);
dupdate();
wait_for_input(KEY_SHIFT);
game->player->stats.xp += xp;
//niveau suivant une progession N³
int calc_level = (int)pow(game->player->stats.xp, 0.34);
for(int i = game->player->stats.level; i < calc_level; i++) {
dclear(C_RGB(25,25,25));
draw_battle(game->player, monster);
drect(0,DHEIGHT,DWIDTH,DHEIGHT-rect_size,C_WHITE);
dprint(10,DHEIGHT-rect_size/2-8,C_BLACK,"Vous passez au niveau %d !", i+1);
dupdate();
wait_for_input(KEY_SHIFT);
}
game->player->stats.level = calc_level;
} else if(status == LOSE) {
game->player->stats.pv = 0;
}
free_monster(monster);
}
int during_battle(struct Player *player, struct Monster *monster) {
int battle(struct Player *player, struct Monster *monster) {
int tour = 0;
int selection = 0;
while(1) {
@ -29,6 +59,9 @@ int during_battle(struct Player *player, struct Monster *monster) {
wait_for_input(KEY_SHIFT);
execute_move(&player->stats, monster->stats, player->moves[selection], 0);
dclear(C_RGB(25,25,25));
draw_battle(player, monster);
if(player->stats.pv <= 0) {
return LOSE;
}
@ -36,9 +69,6 @@ int during_battle(struct Player *player, struct Monster *monster) {
return WIN;
}
dclear(C_RGB(25,25,25));
draw_battle(player, monster);
struct Move monster_move = monster_select(player, monster);
draw_executed_move(monster_move, monster, 1);
dupdate();
@ -90,6 +120,10 @@ int select_move(struct Player *player, struct Monster *monster, int prec_selecte
void draw_battle(struct Player *player, struct Monster *monster) {
const int WIDTH_HP = 100;
if(player->stats.pv < 0) player->stats.pv = 0;
if(monster->stats->pv < 0) monster->stats->pv = 0;
int posHP = (float)player->stats.pv / player->stats.max_pv * WIDTH_HP;
drect(10,15,10+WIDTH_HP,25,C_BLACK);
drect(10,15,10+posHP,25,C_GREEN);
@ -97,9 +131,10 @@ void draw_battle(struct Player *player, struct Monster *monster) {
dprint(15+WIDTH_HP,15,C_BLACK,"%d/%d", player->stats.pv, player->stats.max_pv);
int posHPmonster = (float)monster->stats->pv / monster->stats->max_pv * WIDTH_HP;
dtext(240,2,C_BLACK,monster->name);
dprint(240,2,C_BLACK,"%s",monster->name);
drect(240,15,240+WIDTH_HP,25,C_BLACK);
drect(240,15,240+posHPmonster,25,C_GREEN);
dprint(245+WIDTH_HP,2,C_BLACK,"%d",monster->stats->level);
dprint(245+WIDTH_HP,15,C_BLACK,"%d/%d", monster->stats->pv, monster->stats->max_pv);
dimage(260,30,monster->sprite);
}

View File

@ -9,7 +9,10 @@ struct Monster *generate_monster(struct Game *game) {
extern struct Monster monster_test;
return(copyMonster(&monster_test));
struct Monster *monster = copyMonster(&monster_test);
// TODO formule pour niveau du monstre adverse
monster->stats->level = game->player->stats.level;
return monster;
}
struct Move monster_select(struct Player *player, struct Monster *monster) {