From 68f80917d6e7bad784cacfc8d2e0fd015df687eb Mon Sep 17 00:00:00 2001 From: bgiraudr Date: Sat, 12 Feb 2022 02:05:10 +0100 Subject: [PATCH] player can level up + xp --- include/battle.h | 2 +- src/battle.c | 47 +++++++++++++++++++++++++++++++++++++++++------ src/monster.c | 5 ++++- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/include/battle.h b/include/battle.h index 007639a..4379902 100644 --- a/include/battle.h +++ b/include/battle.h @@ -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); \ No newline at end of file diff --git a/src/battle.c b/src/battle.c index 59169c3..f63ace8 100644 --- a/src/battle.c +++ b/src/battle.c @@ -8,15 +8,45 @@ #include "player.h" #include "monster.h" #include +#include 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); } diff --git a/src/monster.c b/src/monster.c index 563bbc1..9c6e446 100644 --- a/src/monster.c +++ b/src/monster.c @@ -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) {