From a875d3d3593f44b273beccc51a72d03f2feba64b Mon Sep 17 00:00:00 2001 From: bgiraudr Date: Fri, 18 Feb 2022 15:44:41 +0100 Subject: [PATCH] Add self buff with move --- CMakeLists.txt | 1 + assets-cg/capacites/Charge.json | 1 + assets-cg/capacites/Cheat.json | 1 + assets-cg/capacites/Deuxieme.json | 7 --- assets-cg/capacites/Soin.json | 9 ++++ assets-cg/capacites/TestCapacite.json | 3 +- assets-cg/categories.png | Bin 0 -> 267 bytes assets-cg/converters.py | 14 +++++- assets-cg/fxconv-metadata.txt | 5 ++ include/battle.h | 4 +- include/capacite.h | 20 ++++++-- include/monster.h | 2 +- src/battle.c | 50 ++++++++++++++------ src/capacite.c | 64 ++++++++++++++++++++------ src/monster.c | 8 ++-- src/player.c | 2 +- 16 files changed, 143 insertions(+), 48 deletions(-) delete mode 100644 assets-cg/capacites/Deuxieme.json create mode 100644 assets-cg/capacites/Soin.json create mode 100644 assets-cg/categories.png diff --git a/CMakeLists.txt b/CMakeLists.txt index de26c66..29aa970 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ set(SOURCES set(ASSETS_cg assets-cg/tileset.png + assets-cg/categories.png assets-cg/dialogue.png assets-cg/capacite.png assets-cg/battle_ui.png diff --git a/assets-cg/capacites/Charge.json b/assets-cg/capacites/Charge.json index 1dec32f..1beb7e0 100644 --- a/assets-cg/capacites/Charge.json +++ b/assets-cg/capacites/Charge.json @@ -1,6 +1,7 @@ { "name":"Charge", "id":2, + "categorie":"PHYSICAL", "pp":25, "atk":15, "precision":100 diff --git a/assets-cg/capacites/Cheat.json b/assets-cg/capacites/Cheat.json index 2d05065..5218493 100644 --- a/assets-cg/capacites/Cheat.json +++ b/assets-cg/capacites/Cheat.json @@ -1,6 +1,7 @@ { "name":"Cheat", "id":3, + "categorie":"PHYSICAL", "pp":25, "atk":45, "precision":100 diff --git a/assets-cg/capacites/Deuxieme.json b/assets-cg/capacites/Deuxieme.json deleted file mode 100644 index 9508df8..0000000 --- a/assets-cg/capacites/Deuxieme.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name":"Deuxième", - "id":1, - "pp":100, - "atk":11, - "precision":50 -} diff --git a/assets-cg/capacites/Soin.json b/assets-cg/capacites/Soin.json new file mode 100644 index 0000000..81b6ade --- /dev/null +++ b/assets-cg/capacites/Soin.json @@ -0,0 +1,9 @@ +{ + "name":"Soin", + "id":1, + "categorie":"STATUT", + "pp":100, + "boost_atk":15, + "boost_hp":15, + "boost_def":15 +} diff --git a/assets-cg/capacites/TestCapacite.json b/assets-cg/capacites/TestCapacite.json index 74b8e81..388b744 100644 --- a/assets-cg/capacites/TestCapacite.json +++ b/assets-cg/capacites/TestCapacite.json @@ -1,7 +1,8 @@ { "name":"Test capacité", "id":0, + "categorie":"PHYSICAL", "pp":5, "atk":20, - "precision":50 + "precision":80 } diff --git a/assets-cg/categories.png b/assets-cg/categories.png new file mode 100644 index 0000000000000000000000000000000000000000..c74d2266e2caf5cc31cabf24d94a81e0581b4b3c GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^8bHj&!3HFc&5{WKQY^(zo*^7SP{WbZ0puU@ba4!^ z=si1SBky4a5ts8}OH9r@hhwi3pd|y(apuxCihRD8CGLOEL%((wh zb&?!!(Yex>zv3%nIgDRLecHg8tl_!7IC|a<+x7NMw_9$$_m?bHc=L#|+ulsIXK+2{AChAb>YZ)b z`82WE@hDrP?3oqLzxvtMyY9DHptT_I`_&lkn3Y?lK0H0{BeO1C_KN@9OPTs7?w struct Monster { - const char *name; + char *name; bopti_image_t *sprite; int nbMoves; struct Stats *stats; diff --git a/src/battle.c b/src/battle.c index a46f63d..78ebdcf 100644 --- a/src/battle.c +++ b/src/battle.c @@ -39,7 +39,7 @@ int battle(struct Player *player, struct Monster *monster) { dupdate(); wait_for_input(KEY_SHIFT); status = execute_move(&player->stats, monster->stats, player->moves[selection], 0); - check_move_status(status, player, monster); + check_move_status(status, player, monster, 0); draw_battle(player, monster); @@ -55,7 +55,7 @@ int battle(struct Player *player, struct Monster *monster) { dupdate(); wait_for_input(KEY_SHIFT); status = execute_move(&player->stats, monster->stats, monster_move, 1); - check_move_status(status, player, monster); + check_move_status(status, player, monster, 1); if(player->stats.pv <= 0) { return LOSE; @@ -68,17 +68,32 @@ 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) { +void check_move_status(int status, struct Player *player, struct Monster *monster, int is_monster) { + char *name = is_monster ? monster->name : "Player"; + if(status != SUCCESS) { draw_battle(player, monster); - draw_status("Coup critique !"); - dupdate(); - wait_for_input(KEY_SHIFT); - } - if(status == MISS) { - draw_battle(player, monster); - draw_status("Mais cela échoue !"); + switch(status){ + case CRIT: + draw_status(name, "réalise un coup critique !"); + break; + case MISS: + draw_status(name, "rate son attaque !"); + break; + case HEAL: + draw_status(name, "regagne des PVs !"); + break; + case ATK: + draw_status(name, "améliore son attaque !"); + break; + case DEF: + draw_status(name, "améliore sa défense !"); + break; + case MULTIPLE: + draw_status(name, "améliore ses statistiques !"); + break; + } + dupdate(); wait_for_input(KEY_SHIFT); } @@ -107,7 +122,6 @@ void finish_battle(int status, struct Game *game, struct Monster *monster) { wait_for_input(KEY_SHIFT); } game->player->stats.level = calc_level; - set_stats_level_from(&game->player->base_stats, &game->player->stats); } else if(status == LOSE) { draw_battle(game->player, monster); @@ -118,6 +132,8 @@ void finish_battle(int status, struct Game *game, struct Monster *monster) { game->player->stats.pv = 0; } + //On retire les changements de status en revenant à la base + set_stats_level_from(&game->player->base_stats, &game->player->stats); free_monster(monster); } @@ -143,6 +159,12 @@ 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_OPTN)) { + draw_stats(player->stats); + dupdate(); + wait_for_input(KEY_OPTN); + } + if(keydown(KEY_SHIFT)) { if(buffer) buffer = 0; else if(player->moves[selection]->pp > 0) break; @@ -204,7 +226,7 @@ void draw_executed_move(struct Move *move, struct Monster *monster, int is_monst } } -void draw_status(char *message) { +void draw_status(char *name, char *message) { dimage(42,DHEIGHT-75,&img_dialogue); - dprint(50,DHEIGHT-47, C_BLACK, "%s", message); + dprint(50,DHEIGHT-47, C_BLACK, "%s %s", name, message); } \ No newline at end of file diff --git a/src/capacite.c b/src/capacite.c index 5c91e5c..1383c73 100644 --- a/src/capacite.c +++ b/src/capacite.c @@ -33,25 +33,40 @@ struct Move *copy_move(struct Move move) { copyMove->name = move.name; copyMove->init_pp = move.init_pp; copyMove->id = move.id; + copyMove->categorie = move.categorie; copyMove->pp = move.pp; copyMove->atk = move.atk; copyMove->precision = move.precision; + copyMove->boost_atk = move.boost_atk; + copyMove->boost_def = move.boost_def; + copyMove->boost_hp = move.boost_hp; return copyMove; } void draw_move(int x, int y, int x2, int y2, struct Move *move) { extern bopti_image_t img_capacite; + extern bopti_image_t img_categories; + const int font_size = 8; dimage(x, y, &img_capacite); + dsubimage(x+96, y+7, &img_categories, 20*move->categorie, 0, 20, 10, DIMAGE_NONE); + int color = move->pp > 0 ? C_BLACK : C_RED; dprint(x+15, y+5, color, "PP : %d", move->pp); - 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); + + if(move->categorie == PHYSICAL) { + dprint(x+15, y2-17, C_BLACK, "ATK : %d", move->atk); + dprint(x+70, y2-17, C_BLACK, "PRE : %d", move->precision); + } else { + if(move->boost_atk > 0) dprint(x+10, y2-17, C_BLACK, "A+%d%%", move->boost_atk); + if(move->boost_hp > 0) dprint(x+47, y2-17, C_BLACK, "H+%d%%", move->boost_hp); + if(move->boost_def > 0) dprint(x+85, y2-17, C_BLACK, "D+%d%%", move->boost_def); + } } void draw_classic_move(int x, int y, struct Move *move) { @@ -60,24 +75,34 @@ void draw_classic_move(int x, int y, struct Move *move) { 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(move->categorie == PHYSICAL) { + if(is_miss(move)) { + move->pp--; + return MISS; + } - if(ismonster) { - player_stats->pv-=calc_damage(monster_stats, player_stats, move); + 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; } else { - move->pp--; - monster_stats->pv-=calc_damage(player_stats, monster_stats, move); + if(ismonster) { + return self_effect(monster_stats, move); + } else { + move->pp--; + return self_effect(player_stats, move); + } + return HEAL; } - - if(is_crit()) return CRIT; return SUCCESS; } int calc_damage(struct Stats *attacker, struct Stats *target, struct Move *move) { - return (floor(((2*attacker->level / 5 + 2) * attacker->atk * move->atk / target->def) / 50) + 2)*crit(attacker); + return floor((floor(((2*attacker->level / 5 + 2) * attacker->atk * move->atk / target->def) / 50) + 2)*crit(attacker)); } int is_crit() { @@ -97,4 +122,17 @@ float crit(struct Stats *attacker) { /*1 if miss, else 0*/ int is_miss(struct Move *move) { return rand_range(0, 101) > move->precision; +} + +int self_effect(struct Stats *stats, struct Move *move) { + stats->pv += stats->max_pv * move->boost_hp/100; + stats->atk *= (float)(100+move->boost_atk)/100; + stats->def *= (float)(100+move->boost_def)/100; + + if(stats->pv > stats->max_pv) stats->pv = stats->max_pv; + + if((move->boost_hp > 0 && move->boost_atk > 0) || + (move->boost_hp > 0 && move->boost_def > 0) || + (move->boost_atk > 0 && move->boost_def > 0)) return MULTIPLE; + return move->boost_hp > 0 ? HEAL : move->boost_atk > 0 ? ATK : DEF; } \ No newline at end of file diff --git a/src/monster.c b/src/monster.c index bd262d9..fd375ce 100644 --- a/src/monster.c +++ b/src/monster.c @@ -44,10 +44,10 @@ struct Move *monster_select(struct Player *player, struct Monster *monster) { for(int i = 0; i < monster->nbMoves; i++) { struct Move *move = get_move_id_pointer(monster->moves[i]); int damage = calc_damage(monster->stats, &player->stats, move); - if(damage >= player->stats.pv) { - stoMove = move; - if(move->precision > 80) return move; - } + // if(damage >= player->stats.pv) { + // stoMove = move; + // if(move->precision > 80) return move; + // } if(damage > stoDamage) { stoMove = move; stoDamage = damage; diff --git a/src/player.c b/src/player.c index 23dfb39..f485256 100644 --- a/src/player.c +++ b/src/player.c @@ -36,7 +36,7 @@ struct Player init_player(void) { .anim.dir = DIR_DOWN }; player.idle = !anim_player_idle(&player.anim, 1); - player.moves[0] = copy_move(default_move()); + player.moves[0] = copy_move(get_move_id(1)); set_stats_level_from(&player.base_stats, &player.stats); return player;