From e139f5df6dd5ba5d952b2f61e4a2764baea7da91 Mon Sep 17 00:00:00 2001 From: bgiraudr Date: Thu, 17 Feb 2022 19:05:21 +0100 Subject: [PATCH] add precision --- assets-cg/capacites/capacites.txt | 8 +++--- include/battle.h | 5 ++-- include/capacite.h | 12 ++++++-- src/battle.c | 46 +++++++++++++++++-------------- src/capacite.c | 24 ++++++++++++---- src/monster.c | 3 +- 6 files changed, 63 insertions(+), 35 deletions(-) diff --git a/assets-cg/capacites/capacites.txt b/assets-cg/capacites/capacites.txt index 3e029ee..be598ad 100644 --- a/assets-cg/capacites/capacites.txt +++ b/assets-cg/capacites/capacites.txt @@ -1,4 +1,4 @@ -Test capacité;5;5;3 -Deuxième;100;100;11 -Charge;25;25;15 -Cheat;25;25;45 +Test capacité;5;5;3;20 +Deuxième;100;100;11;50 +Charge;25;25;15;100 +Cheat;25;25;45;100 diff --git a/include/battle.h b/include/battle.h index 44bb8ce..a557799 100644 --- a/include/battle.h +++ b/include/battle.h @@ -13,5 +13,6 @@ 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); -void draw_crit(); -void finish_battle(int status, struct Game *game, struct Monster *monster); \ No newline at end of file +void draw_status(char *message); +void finish_battle(int status, struct Game *game, struct Monster *monster); +void check_move_status(int status, struct Player *player, struct Monster *monster); \ No newline at end of file diff --git a/include/capacite.h b/include/capacite.h index d2778ef..57d1f3e 100644 --- a/include/capacite.h +++ b/include/capacite.h @@ -6,6 +6,7 @@ struct Move { int init_pp; int pp; int atk; + int precision; }; struct Capacities { @@ -13,15 +14,22 @@ struct Capacities { struct Move *moves[]; }; +enum status { + MISS = 0, + SUCCESS = 1, + CRIT = 2 +}; + struct Move default_move(); struct Move get_move_id(int id); void draw_move(int x, int y, int x2, int y2, struct Move *move); void draw_classic_move(int x, int y, struct Move *move); -void execute_move(struct Stats *player_stats, struct Stats *monster_stats, struct Move *move, int ismonster); +int execute_move(struct Stats *player_stats, struct Stats *monster_stats, struct Move *move, int ismonster); int calc_damage(struct Stats *attacker, struct Stats *target, struct Move *move); struct Move *copy_move(struct Move move); struct Move *get_move_id_pointer(int id); float crit(struct Stats *attacker); -int is_crit(); \ No newline at end of file +int is_crit(); +int is_miss(struct Move *move); \ No newline at end of file diff --git a/src/battle.c b/src/battle.c index 82f16cc..1767d37 100644 --- a/src/battle.c +++ b/src/battle.c @@ -30,6 +30,7 @@ void create_battle(struct Game *game) { int battle(struct Player *player, struct Monster *monster) { int tour = 0; int selection = 0; + int status; while(1) { draw_battle(player, monster); dupdate(); @@ -37,14 +38,8 @@ int battle(struct Player *player, struct Monster *monster) { draw_executed_move(player->moves[selection], monster, 0); dupdate(); wait_for_input(KEY_SHIFT); - execute_move(&player->stats, monster->stats, player->moves[selection], 0); - - if(is_crit()) { - draw_battle(player, monster); - draw_crit(); - dupdate(); - wait_for_input(KEY_SHIFT); - } + status = execute_move(&player->stats, monster->stats, player->moves[selection], 0); + check_move_status(status, player, monster); draw_battle(player, monster); @@ -59,14 +54,8 @@ int battle(struct Player *player, struct Monster *monster) { draw_executed_move(monster_move, monster, 1); dupdate(); wait_for_input(KEY_SHIFT); - execute_move(&player->stats, monster->stats, monster_move, 1); - - if(is_crit()) { - draw_battle(player, monster); - draw_crit(); - dupdate(); - wait_for_input(KEY_SHIFT); - } + status = execute_move(&player->stats, monster->stats, monster_move, 1); + check_move_status(status, player, monster); if(player->stats.pv <= 0) { return LOSE; @@ -79,6 +68,22 @@ int battle(struct Player *player, struct Monster *monster) { return LOSE; } +void check_move_status(int status, struct Player *player, struct Monster *monster) { + if(status == CRIT) { + draw_battle(player, monster); + draw_status("Coup critique !"); + dupdate(); + wait_for_input(KEY_SHIFT); + } + + if(status == MISS) { + draw_battle(player, monster); + draw_status("Mais il rate !"); + dupdate(); + wait_for_input(KEY_SHIFT); + } +} + /*When a battle is finish, compute xp gain and gain level*/ void finish_battle(int status, struct Game *game, struct Monster *monster) { if(status == WIN) { @@ -86,7 +91,6 @@ void finish_battle(int status, struct Game *game, struct Monster *monster) { int xp = ceil((monster->stats->xp*monster->stats->level*1.5)/7); dimage(42,DHEIGHT-75,&img_dialogue); - dprint(50,DHEIGHT-47, C_BLACK, "Vous remportez %d points d'experience", xp); dupdate(); wait_for_input(KEY_SHIFT); @@ -139,9 +143,9 @@ int select_move(struct Player *player, struct Monster *monster, int prec_selecte dtext(58 + (selection * 130), DHEIGHT-15 , C_RED, "[X]"); dupdate(); - if(keydown(KEY_SHIFT) && player->moves[selection]->pp > 0) { + if(keydown(KEY_SHIFT)) { if(buffer) buffer = 0; - else break; + else if(player->moves[selection]->pp > 0) break; } if(keydown(KEY_EXIT)) { break; @@ -200,7 +204,7 @@ void draw_executed_move(struct Move *move, struct Monster *monster, int is_monst } } -void draw_crit() { +void draw_status(char *message) { dimage(42,DHEIGHT-75,&img_dialogue); - dprint(50,DHEIGHT-47, C_BLACK, "Coup critique !"); + dprint(50,DHEIGHT-47, C_BLACK, "%s", message); } \ No newline at end of file diff --git a/src/capacite.c b/src/capacite.c index f417c3f..db5aa82 100644 --- a/src/capacite.c +++ b/src/capacite.c @@ -29,6 +29,7 @@ struct Move *copy_move(struct Move move) { copyMove->pp = move.pp; copyMove->atk = move.atk; + copyMove->precision = move.precision; return copyMove; } @@ -39,7 +40,8 @@ void draw_move(int x, int y, int x2, int y2, struct Move *move) { dimage(x, y, &img_capacite); int color = move->pp > 0 ? C_BLACK : C_RED; dprint(x+15, y+5, color, "PP : %d", move->pp); - dprint(x+15, y2-20, C_BLACK, "ATK : %d", move->atk); + dprint(x+15, y2-17, C_BLACK, "ATK : %d", move->atk); + dprint(x+70, y2-17, C_BLACK, "PRE : %d", move->precision); dprint((int)((x+x2)/2)-(int)(strlen(move->name)/2*font_size), (int)((y+y2)/2)-font_size/2, C_BLACK, "%s", move->name); @@ -49,13 +51,22 @@ void draw_classic_move(int x, int y, struct Move *move) { draw_move(x, y, x+125, y+60, move); } -void execute_move(struct Stats *player_stats, struct Stats *monster_stats, struct Move *move, int ismonster) { +int execute_move(struct Stats *player_stats, struct Stats *monster_stats, struct Move *move, int ismonster) { + srand(rtc_ticks()); + if(is_miss(move)) { + move->pp--; + return MISS; + } + if(ismonster) { player_stats->pv-=calc_damage(monster_stats, player_stats, move); } else { move->pp--; monster_stats->pv-=calc_damage(player_stats, monster_stats, move); } + + if(is_crit()) return CRIT; + return SUCCESS; } int calc_damage(struct Stats *attacker, struct Stats *target, struct Move *move) { @@ -65,15 +76,18 @@ int calc_damage(struct Stats *attacker, struct Stats *target, struct Move *move) int is_crit() { //une chance sur 16 d'avoir un coup critique const int proba_crit = 16; - return rand_range(0,proba_crit)==0 ? 1 : 0; + return rand_range(0,proba_crit)==0; } float crit(struct Stats *attacker) { - srand(rtc_ticks()); float taux = 1.0f; - //une chance sur 16 d'avoir un coup critique if(is_crit()) { taux = (float)(2 * attacker->level + 5)/(attacker->level+5); } return taux; +} + +/*1 if miss, else 0*/ +int is_miss(struct Move *move) { + return rand_range(0, 101) > move->precision; } \ No newline at end of file diff --git a/src/monster.c b/src/monster.c index f7ed096..bd262d9 100644 --- a/src/monster.c +++ b/src/monster.c @@ -45,7 +45,8 @@ struct Move *monster_select(struct Player *player, struct Monster *monster) { struct Move *move = get_move_id_pointer(monster->moves[i]); int damage = calc_damage(monster->stats, &player->stats, move); if(damage >= player->stats.pv) { - return move; + stoMove = move; + if(move->precision > 80) return move; } if(damage > stoDamage) { stoMove = move;