From a77544120ac13f0c54acd00ead991ab6d680b8e7 Mon Sep 17 00:00:00 2001 From: bgiraudr Date: Thu, 8 Dec 2022 23:55:25 +0100 Subject: [PATCH] Multiple self effects are now displayed correctly --- .gitignore | 2 + assets-cg/capacites/Soin.json | 6 ++- assets-cg/converters.py | 2 + assets-cg/monsters/test.json | 2 +- assets-cg/uf8x9/U+0020.png | Bin 954 -> 2469 bytes assets-cg/uf8x9/U+00A0.png | Bin 1000 -> 2449 bytes include/battle.h | 2 +- include/capacite.h | 9 ++--- src/battle.c | 72 ++++++++++++++++++++-------------- src/capacite.c | 23 +++++------ src/engine.c | 4 +- src/player.c | 2 +- 12 files changed, 72 insertions(+), 52 deletions(-) diff --git a/.gitignore b/.gitignore index 9ccbbfc..dec1509 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ __pycache__/ *.sublime-project *.sublime-workspace .vscode +.idea +cmake-build-debug diff --git a/assets-cg/capacites/Soin.json b/assets-cg/capacites/Soin.json index a78271c..d3fe53d 100644 --- a/assets-cg/capacites/Soin.json +++ b/assets-cg/capacites/Soin.json @@ -5,6 +5,8 @@ "type":"Rédacteur", "pp":100, "boost_atk":15, - "boost_hp":15, - "boost_def":15 + "boost_spe_atk":0, + "boost_spe_def":0, + "boost_def":15, + "boost_hp":15 } diff --git a/assets-cg/converters.py b/assets-cg/converters.py index 1174c64..8e095b7 100644 --- a/assets-cg/converters.py +++ b/assets-cg/converters.py @@ -296,6 +296,8 @@ def convert_capa(input, output, params, target): move += fxconv.u32(0) + fxconv.u32(100) move += fxconv.u32(data["boost_atk"]) move += fxconv.u32(data["boost_def"]) + move += fxconv.u32(data["boost_spe_atk"]) + move += fxconv.u32(data["boost_spe_def"]) move += fxconv.u32(data["boost_hp"]) except KeyError: raise Exception(f"convert_capa() : La capacité {data['name']} est mal configurée") diff --git a/assets-cg/monsters/test.json b/assets-cg/monsters/test.json index 4a067db..ac3dd1b 100644 --- a/assets-cg/monsters/test.json +++ b/assets-cg/monsters/test.json @@ -19,4 +19,4 @@ 1, 2 ] -} +} \ No newline at end of file diff --git a/assets-cg/uf8x9/U+0020.png b/assets-cg/uf8x9/U+0020.png index ba41f2b54ec33f11afe67a19ecd89e475398def5..a4a10e4cec0a99d79b093dbed0c6f051762f8aea 100644 GIT binary patch literal 2469 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 M>4fOElbP552XerJj{pDw delta 990 zcmV<410np86X*w!7=Hl(0001PHpLeJ00XZ{L_t(|ob8ysa^qAOh9Ak!4>MWpp#ZwL z-~zUwNU=jyZ~?gl_cVJ4K2VU$z;{6UW!DrE^{i$-jv+ z%P>&v=xcnAo}=%4=kxg0E2E`2T^OhGS%@nDYwB4CA3~Ub%YTLCGiU{~#XcZxHSs{( z^_{mpK$26YXD)HNmTXasBuQB!`4CP5*zumi1Q>dzG~d))OQUggre_*S7n1!-8p}$5 zeXpw8-p8PWYTxc{kO3&H3aW}Z65Bw!6<*ZE&ESp>pandJkMMz@hB4;GJAw_M4<7*d zHT3&`@FhSB-hU2k7{GfBo&(y0EoyZ8Wff4g6;?U%DD&t^ofWWUl5g zv<5=)2=H$}!6Ul0pkWk1;89Rknm_^ILI4Bc$Two}cYttXr4mPe9k)RmIXTH?<4BT5 z<=|AAA`J>5jmrJY3Ko)frMF5naw>#eN0Q{SJSrq9-+v$LcMWWm$;UgYH`=5PuoZ5Y z*E(=vZtm+)VSdng83NO1fqUbkdiYjnO5AQTnD6@Y!L5N`0k(-1K)3ps{do0VzMC%F zM{%r9xqqMPSe>zw!Pjmp-;D=9YquO+isvpXqGa&gWn(3SkyD{$s$k32nzcun1b2?| zlCBLdc}aIOgkR`cb2WocNLyitC!_#-#4R&(V(+@=J?&c<_dN3>+qQRUUeR}E%#wnY z?FZ79D`^|;YhVNa2e>C3=j>GmEyPTCO$>nCiGK!#PTh$eNmArA)~QC4#Nm?K9lNZE zB-yOcrTov8*E(baxCKbf3jmAngN8B_oohIMx$|-xfWIg{shO)nYbg8!g4u7>u5*l*iw7K|VbL+_PAoXa+o`CeI?;ZqYhkOmU#rYj#<7T!!PGI%ec$A+dn=VH z6s1xZK)v*ybH?xmc`NRid*I!)ZLjME9&NAN3OrNK8sFEz2ENbm)f&fGl0mY@F%}w& z-xjp4kX;x{{-5eDIL4opmvL%dD7Qgs{8tI*GsoCwJS(O(T&ebKMNgLC?#kbrD>{@u z)P&wL+yt-hnN9Cguixg|nG)K*w^qUOb{m84k4~Yqaf}UY;C~MP1|CXYhez#jHvj+t M07*qoM6N<$f}Zu`YXATM diff --git a/include/battle.h b/include/battle.h index b710a7f..668646b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -15,4 +15,4 @@ void draw_battle(struct Player *player, struct Monster *monster); void draw_executed_move(struct Move *move, struct Monster *monster, int is_monster); void draw_status(char *name, 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, int is_monster); \ No newline at end of file +void check_move_status(int status, struct Player *player, struct Monster *monster, struct Move *move, int is_monster); \ No newline at end of file diff --git a/include/capacite.h b/include/capacite.h index f193098..ebd8ed4 100644 --- a/include/capacite.h +++ b/include/capacite.h @@ -14,6 +14,8 @@ struct Move { //self effect (%) int boost_atk; int boost_def; + int boost_spe_atk; + int boost_spe_def; int boost_hp; }; @@ -25,10 +27,7 @@ struct Capacities { enum status { MISS, SUCCESS, - HEAL, - ATK, - DEF, - MULTIPLE, + EFFECT, SUPER_EFFECTIVE, LESS_EFFECTIVE, NOT_EFFECTIVE @@ -51,6 +50,6 @@ struct Move *get_move_id_pointer(int id); float crit(struct Stats *attacker); int is_crit(); int is_miss(struct Move *move); -int self_effect(struct Stats *stats, struct Move *move); +void self_effect(struct Stats *stats, struct Move *move); float stab(char *type, char *move); void draw_special_move(int x, int y, struct Move *move, int selected); \ No newline at end of file diff --git a/src/battle.c b/src/battle.c index 728eab0..f87fee7 100644 --- a/src/battle.c +++ b/src/battle.c @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include "engine.h" #include "battle.h" @@ -41,7 +43,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, 0); + check_move_status(status, player, monster, player->moves[selection], 0); draw_battle(player, monster); @@ -57,7 +59,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, 1); + check_move_status(status, player, monster, monster_move, 1); if(player->stats.pv <= 0) { return LOSE; @@ -70,37 +72,49 @@ int battle(struct Player *player, struct Monster *monster) { return LOSE; } -void check_move_status(int status, struct Player *player, struct Monster *monster, int is_monster) { +void check_move_status(int status, struct Player *player, struct Monster *monster, struct Move *move, int is_monster) { char *name = is_monster ? monster->name : "Player"; if(status != SUCCESS) { draw_battle(player, monster); - switch(status){ - 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; - case SUPER_EFFECTIVE: - draw_status(name, "utilise une attaque super efficace !"); - break; - case LESS_EFFECTIVE: - draw_status(name, "utilise une attaque peu efficace"); - break; - case NOT_EFFECTIVE: - draw_status(name, "utilise une attaque non efficace..."); - break; - } + if(status == EFFECT) { + char *boost_strings[5] = {"", "", "", "", ""}; + int boost_count = 0; + + if(move->boost_spe_atk > 0) boost_strings[boost_count++] = "son attaque spéciale"; + if(move->boost_spe_def > 0) boost_strings[boost_count++] = "sa défense spéciale"; + if(move->boost_atk > 0) boost_strings[boost_count++] = "son attaque"; + if(move->boost_def > 0) boost_strings[boost_count++] = "sa défense"; + if(move->boost_hp > 0) boost_strings[boost_count++] = "ses points de vie"; + + if(boost_count > 0) { + char boost_message[128] = "augmente "; + for(int i = 0; i < boost_count; i++) { + if(i > 0) sprintf(boost_message + strlen(boost_message), (i == boost_count - 1) ? " et " : ", "); + sprintf(boost_message + strlen(boost_message), "%s", boost_strings[i]); + } + sprintf(boost_message + strlen(boost_message), " !"); + draw_status(name, boost_message); + + if(is_monster) self_effect(monster->stats, move); + else self_effect(&player->stats, move); + } + } else { + switch (status) { + case MISS: + draw_status(name, "rate son attaque !"); + break; + case SUPER_EFFECTIVE: + draw_status(name, "utilise une attaque super efficace !"); + break; + case LESS_EFFECTIVE: + draw_status(name, "utilise une attaque peu efficace"); + break; + case NOT_EFFECTIVE: + draw_status(name, "utilise une attaque inefficace sur le type adverse !"); + break; + } + } dupdate(); wait_for_input(KEY_SHIFT); diff --git a/src/capacite.c b/src/capacite.c index dcf3eff..8761570 100644 --- a/src/capacite.c +++ b/src/capacite.c @@ -44,6 +44,8 @@ struct Move *copy_move(struct Move move) { copyMove->precision = move.precision; copyMove->boost_atk = move.boost_atk; copyMove->boost_def = move.boost_def; + copyMove->boost_spe_atk = move.boost_spe_atk; + copyMove->boost_spe_def = move.boost_spe_def; copyMove->boost_hp = move.boost_hp; return copyMove; @@ -91,27 +93,29 @@ int execute_move(struct Stats *player_stats, struct Stats *monster_stats, struct return MISS; } - float typeEffect; + float typeEffect = ismonster ? + getTypeEffect(getTypeFromName(move->type), getTypeFromName(player_stats->type)) : + getTypeEffect(getTypeFromName(move->type), getTypeFromName(monster_stats->type)); + if(ismonster) { player_stats->pv-=calc_damage(monster_stats, player_stats, move); - typeEffect = getTypeEffect(getTypeFromName(move->type), getTypeFromName(player_stats->type)); } else { move->pp--; monster_stats->pv-=calc_damage(player_stats, monster_stats, move); - typeEffect = getTypeEffect(getTypeFromName(move->type), getTypeFromName(monster_stats->type)); } if(typeEffect == 2) return SUPER_EFFECTIVE; if(typeEffect == 0.5) return LESS_EFFECTIVE; if(typeEffect == 0) return NOT_EFFECTIVE; } else { - if(ismonster) { + return EFFECT; + /*if(ismonster) { return self_effect(monster_stats, move); } else { move->pp--; return self_effect(player_stats, move); } - return HEAL; + return HEAL;*/ } return SUCCESS; } @@ -159,15 +163,12 @@ int is_miss(struct Move *move) { return rand_range(0, 101) > move->precision; } -int self_effect(struct Stats *stats, struct Move *move) { +void 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; + stats->spe_atk *= (float)(100+move->boost_spe_atk)/100; + stats->spe_def *= (float)(100+move->boost_spe_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/engine.c b/src/engine.c index cae64cd..a04e876 100644 --- a/src/engine.c +++ b/src/engine.c @@ -58,8 +58,8 @@ void engine_draw_map(struct Game const *game) { unsigned int tile_x = TILE_SIZE * (tile_id % tileset_size); unsigned int tile_y = TILE_SIZE * (tile_id / tileset_size); - dsubimage(x * TILE_SIZE - x_offset%TILE_SIZE, - y * TILE_SIZE - y_offset%TILE_SIZE, game->map->tileset, + dsubimage(x * TILE_SIZE - x_offset%TILE_SIZE, + y * TILE_SIZE - y_offset%TILE_SIZE, game->map->tileset, tile_x, tile_y, TILE_SIZE, TILE_SIZE, DIMAGE_NONE); } } diff --git a/src/player.c b/src/player.c index eb63095..50e20d8 100644 --- a/src/player.c +++ b/src/player.c @@ -54,7 +54,7 @@ struct Player init_player(void) { .anim.dir = DIR_DOWN }; player.idle = !anim_player_idle(&player.anim, 1); - player.moves[0] = copy_move(get_move_id(0)); + player.moves[0] = copy_move(get_move_id(1)); player.moves[1] = copy_move(get_move_id(4)); set_stats_level_from(&player.base_stats, &player.stats);