From 53bf0daaa37e2f90786b3ee840cd794b62e66368 Mon Sep 17 00:00:00 2001 From: bgiraudr Date: Sat, 23 Apr 2022 00:47:27 +0200 Subject: [PATCH] add some events --- assets-cg/items/1.json | 3 ++- assets-cg/items/2.json | 3 +-- assets-cg/maps/testCarte.tmx | 2 +- include/item.h | 3 ++- include/player.h | 4 ++- src/event.c | 27 +++++++++++++++---- src/inventory.c | 3 --- src/item.c | 7 +++++ src/player.c | 50 +++++++++++++++++++++++++++++++++--- src/talkable.c | 7 +++-- 10 files changed, 88 insertions(+), 21 deletions(-) diff --git a/assets-cg/items/1.json b/assets-cg/items/1.json index c62250d..7c736da 100644 --- a/assets-cg/items/1.json +++ b/assets-cg/items/1.json @@ -4,6 +4,7 @@ "sprite":"item", "description":"Redonne 20HP", "action":[ - "xp:20" + "pp:all", + "give:Obj2*3" ] } diff --git a/assets-cg/items/2.json b/assets-cg/items/2.json index 52bc22d..b38286a 100644 --- a/assets-cg/items/2.json +++ b/assets-cg/items/2.json @@ -4,7 +4,6 @@ "sprite":"item2", "description":"test2", "action":[ - "xp:40", - "move:2" + "pp:3" ] } diff --git a/assets-cg/maps/testCarte.tmx b/assets-cg/maps/testCarte.tmx index 5292cb2..da54580 100644 --- a/assets-cg/maps/testCarte.tmx +++ b/assets-cg/maps/testCarte.tmx @@ -188,7 +188,7 @@ - + diff --git a/include/item.h b/include/item.h index 975a213..f45d2dd 100644 --- a/include/item.h +++ b/include/item.h @@ -18,4 +18,5 @@ struct Items { struct Item *get_item_id(int id); void select_item(struct Game *game, int pos); -void remove_item_pos(struct Inventory *inventory, int pos); \ No newline at end of file +void remove_item_pos(struct Inventory *inventory, int pos); +struct Item *get_item_from_name(const char *name); \ No newline at end of file diff --git a/include/player.h b/include/player.h index bcecf97..0e96554 100644 --- a/include/player.h +++ b/include/player.h @@ -52,4 +52,6 @@ void draw_ui(struct Player *player); int get_nb_moves(struct Player *player); void reset_pp(struct Player *player); void check_level(struct Player *player, int prec_level); -void add_xp(struct Player *player, int xp); \ No newline at end of file +void add_xp(struct Player *player, int xp); +int select_capacity(struct Player *player, char* context, bool allow_back); +void add_pp(struct Player *player, int amount); \ No newline at end of file diff --git a/src/event.c b/src/event.c index b2aceeb..898cada 100644 --- a/src/event.c +++ b/src/event.c @@ -15,8 +15,14 @@ bool handle_event(struct Game *game, char const *event) // Isoler le nom et la quantité int len=strlen(event), qty=1; char *star = strchr(event, '*'); + char name[20]; if(star) len=star-event, qty=atoi(star+1); - add_item_to_inventory(game, &game->player->inventory, get_item_id(2)); + strncpy(name,event,len); + name[len] = '\0'; + while(qty) { + add_item_to_inventory(game, &game->player->inventory, get_item_from_name(name)); + qty--; + } return true; } else if(!strncmp(event, "xp:", 3)) { @@ -24,14 +30,25 @@ bool handle_event(struct Game *game, char const *event) add_xp(game->player, atoi(event)); return true; } + else if(!strncmp(event, "hp:", 3)) { + event += 3; + game->player->stats.pv += atoi(event); + if(game->player->stats.pv > game->player->stats.max_pv) game->player->stats.pv = game->player->stats.max_pv; + return true; + } + else if(!strcmp(event, "pp:all")) { + reset_pp(game->player); + return true; + } + else if(!strncmp(event, "pp:", 3)) { + event += 3; + add_pp(game->player, atoi(event)); + return true; + } else if(!strncmp(event, "move:", 5)) { event += 5; add_move(game->player, get_move_id(atoi(event))); return true; } - else if(!strcmp(event, "test:test")) { - // etc, n'importe quoi de compliqué - return true; - } return false; } \ No newline at end of file diff --git a/src/inventory.c b/src/inventory.c index c8a8ec8..7c02b34 100644 --- a/src/inventory.c +++ b/src/inventory.c @@ -24,9 +24,6 @@ int get_first_free_space(struct Inventory *inventory) { bool add_item_to_inventory(struct Game *game, struct Inventory *inventory, struct Item *item) { int index = get_first_free_space(inventory); - extern bopti_image_t img_dialogue; - dimage(42,DHEIGHT-75,&img_dialogue); - if(index < NB_PLAYER_ITEMS) { format_text(50, DHEIGHT-47, C_BLACK, "Vous ajoutez %s à votre inventaire !", item->name); dupdate(); diff --git a/src/item.c b/src/item.c index 679a98c..b874e42 100644 --- a/src/item.c +++ b/src/item.c @@ -28,4 +28,11 @@ void select_item(struct Game *game, int pos) { handle_event(game, curr_line); curr_line = strtok(NULL, delim); } +} + +struct Item *get_item_from_name(const char *name) { + for(int i = 0; i < items.nbItems; i++) { + if(!strcmp(items.items[i]->name, name)) return items.items[i]; + } + return items.items[0]; } \ No newline at end of file diff --git a/src/player.c b/src/player.c index 7daa72f..ef37710 100644 --- a/src/player.c +++ b/src/player.c @@ -1,5 +1,6 @@ #include #include +#include #include #include "player.h" @@ -8,6 +9,8 @@ #include "stats.h" #include "capacite.h" #include "util.h" +#include "talkable.h" + extern struct LevelUpPlayer levelupplayer; extern bopti_image_t img_dialogue; @@ -125,6 +128,7 @@ void replace_capacities(struct Player *player, struct Move move) { if(selection > NB_PLAYER_MOVES-1) selection = NB_PLAYER_MOVES-1; if(selection < 0) selection = 0; + dtext(130,15,C_BLACK, "Remplacer"); draw_classic_move(200,DHEIGHT/2-30, &move); draw_player_moves(player); @@ -147,6 +151,36 @@ void replace_capacities(struct Player *player, struct Move move) { } } +int select_capacity(struct Player *player, char* context, bool allow_back) { + int selection = 0; + int buffer = keydown(KEY_SHIFT); + while(1) { + clearevents(); + dclear(C_WHITE); + + selection += keydown(KEY_DOWN) - keydown(KEY_UP); + if(selection > NB_PLAYER_MOVES-1) selection = NB_PLAYER_MOVES-1; + if(selection < 0) selection = 0; + + dtext(130,10,C_BLACK,context); + draw_player_moves(player); + + dtext(105, 42+65*selection , C_RED, "[X]"); + dupdate(); + + if(keydown(KEY_SHIFT)) { + if(buffer) buffer = 0; + else break; + } + if(keydown(KEY_EXIT) && allow_back) { + selection = -1; + break; + } + while(keydown_any(KEY_DOWN,KEY_UP, KEY_SHIFT,0)) clearevents(); + } + return selection; +} + void draw_ui(struct Player *player) { int index = get_nb_moves(player); @@ -160,6 +194,9 @@ void reset_pp(struct Player *player) { for(int i = 0; i < index; i++) { player->moves[i]->pp = player->moves[i]->init_pp; } + format_text(50, DHEIGHT-47, C_BLACK, "Vous regagnez les PPs de l'ensemble de vos capacités"); + dupdate(); + wait_for_input(KEY_SHIFT); } void add_xp(struct Player *player, int xp) { @@ -168,13 +205,20 @@ void add_xp(struct Player *player, int xp) { //niveau suivant une progession N³ int calc_level = (int)pow(player->stats.xp, 0.33); for(int i = player->stats.level; i < calc_level; i++) { - // draw_battle(game->player, monster); - dimage(42,DHEIGHT-75,&img_dialogue); - dprint(50,DHEIGHT-47,C_BLACK,"Vous passez au niveau %d !", i+1); + format_text(50, DHEIGHT-47, C_BLACK, "Vous passez au niveau %d !", i+1); dupdate(); wait_for_input(KEY_SHIFT); } int prec = player->stats.level; player->stats.level = calc_level; check_level(player, prec); +} + +void add_pp(struct Player *player, int amount) { + int selection = select_capacity(player, "Choisir une capacité", false); + player->moves[selection]->pp += amount; + if(player->moves[selection]->pp > player->moves[selection]->init_pp) player->moves[selection]->pp = player->moves[selection]->init_pp; + format_text(50, DHEIGHT-47, C_BLACK, "Vous regagnez %d PPs sur %s", amount, player->moves[selection]->name); + dupdate(); + wait_for_input(KEY_SHIFT); } \ No newline at end of file diff --git a/src/talkable.c b/src/talkable.c index da0ec4e..876ac0f 100644 --- a/src/talkable.c +++ b/src/talkable.c @@ -43,7 +43,6 @@ char *skip_spaces(char *str) /*draw the dialog of a specified talkable tile*/ void draw_dialog(struct Game *game) { - extern bopti_image_t img_dialogue; const char *delim = ";"; int direction = game->player->direction; @@ -58,10 +57,8 @@ void draw_dialog(struct Game *game) { char *event = strchr(curr_line, '~'); if(event) handle_event(game, curr_line+1); else { - dimage(43,31,&img_dialogue); - dprint(50,40, C_BLACK, "%s", talk->name); - format_text(50, 58, C_BLACK, curr_line); + dprint(50,40, C_BLACK, "%s", talk->name); dupdate(); wait_for_input(KEY_SHIFT); @@ -82,6 +79,8 @@ struct Talkable* get_dialog_xy(struct Map *map, int x, int y) { void format_text(int x, int y, const int color, char const *format, ...) { int const DIALOG_WIDTH = 295, LINE_HEIGHT = 13; + extern bopti_image_t img_dialogue; + dimage(x-7,y-26,&img_dialogue); char text_arg[512]; va_list args;