From f71c203ae154662f5de42b7552fa43fa865ef461 Mon Sep 17 00:00:00 2001 From: bgiraudr Date: Mon, 18 Apr 2022 00:06:32 +0200 Subject: [PATCH] inventory now can store items. Of course. --- CMakeLists.txt | 4 +++ assets-cg/converters.py | 1 + assets-cg/items/1.json | 3 +- assets-cg/items/2.json | 3 +- assets-cg/items/fxconv-metadata.txt | 4 +++ assets-cg/items/item.png | Bin 0 -> 150 bytes assets-cg/items/item2.png | Bin 0 -> 152 bytes include/define.h | 3 +- include/inventory.h | 26 ++++++++++++++ include/player.h | 2 ++ src/engine.c | 7 ++-- src/event.c | 6 ++++ src/inventory.c | 51 ++++++++++++++++++++++++++++ src/player.c | 5 +++ 14 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 assets-cg/items/item.png create mode 100644 assets-cg/items/item2.png create mode 100644 include/inventory.h create mode 100644 src/inventory.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e8eff3..fe2675e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,7 @@ set(SOURCES src/capacite.c src/monster.c src/event.c + src/inventory.c ) set(ASSETS_cg @@ -65,6 +66,9 @@ set(ASSETS_cg assets-cg/monsters/test2.png assets-cg/monsters/monsters.txt assets-cg/player_moves.txt + assets-cg/items/items.txt + assets-cg/items/item.png + assets-cg/items/item2.png ) fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA) diff --git a/assets-cg/converters.py b/assets-cg/converters.py index dd436fe..f295b19 100644 --- a/assets-cg/converters.py +++ b/assets-cg/converters.py @@ -311,6 +311,7 @@ def convert_items(input, output, params, target): item += fxconv.string(data["name"]) item += fxconv.u32(data["id"]) + item += fxconv.ptr(f"img_{data['sprite']}") items += fxconv.ptr(item) fxconv.elf(items, output, "_" + params["name"], **target) \ No newline at end of file diff --git a/assets-cg/items/1.json b/assets-cg/items/1.json index 55a1f5d..693759e 100644 --- a/assets-cg/items/1.json +++ b/assets-cg/items/1.json @@ -1,4 +1,5 @@ { "name":"Test1", - "id":1 + "id":1, + "sprite":"item" } diff --git a/assets-cg/items/2.json b/assets-cg/items/2.json index ead0251..12b7e1c 100644 --- a/assets-cg/items/2.json +++ b/assets-cg/items/2.json @@ -1,4 +1,5 @@ { "name":"Obj2", - "id":2 + "id":2, + "sprite":"item2" } diff --git a/assets-cg/items/fxconv-metadata.txt b/assets-cg/items/fxconv-metadata.txt index d8bd253..e68dfab 100644 --- a/assets-cg/items/fxconv-metadata.txt +++ b/assets-cg/items/fxconv-metadata.txt @@ -1,3 +1,7 @@ +*.png: + type: bopti-image + name_regex: (.*)\.png img_\1 + items.txt: custom-type: items name: items diff --git a/assets-cg/items/item.png b/assets-cg/items/item.png new file mode 100644 index 0000000000000000000000000000000000000000..1f6affc85c28ac759342e9c0873e0a9e59ba1a50 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf33sCed6dl_~W + +struct Item { + char *name; + int id; + bopti_image_t *sprite; + char *description; +}; + +struct Items { + int nbItems; + struct Item *items[]; +}; + +struct Inventory { + int nbItems; + struct Item *items[NB_PLAYER_ITEMS]; +}; + +struct Item *get_item_id(int id); +bool add_item_to_inventory(struct Inventory *inventory, struct Item *item); +int get_first_free_space(struct Inventory *inventory); +void remove_item_pos(struct Inventory *inventory, int pos); +void display_inventory(struct Inventory *inventory); \ No newline at end of file diff --git a/include/player.h b/include/player.h index 52defce..bcecf97 100644 --- a/include/player.h +++ b/include/player.h @@ -4,6 +4,7 @@ #include "vec2.h" #include "stats.h" #include "capacite.h" +#include "inventory.h" #include "define.h" struct Player { @@ -15,6 +16,7 @@ struct Player { const struct Stats base_stats; struct Stats stats; struct Move *moves[NB_PLAYER_MOVES]; + struct Inventory inventory; /*player mid - offset pixels*/ int x_mid, y_mid; /*the direction the player facing to*/ diff --git a/src/engine.c b/src/engine.c index 28a6411..a2dce12 100644 --- a/src/engine.c +++ b/src/engine.c @@ -13,6 +13,7 @@ #include "battle.h" #include "capacite.h" #include "util.h" +#include "inventory.h" /*draw the current state of the game*/ void engine_draw(struct Game const *game) { @@ -124,8 +125,10 @@ void engine_action(struct Game *game, int action) { } } if(action == ACTION_F1) { - game->player->sprint = game->player->sprint ? 0 : 1; - add_move(game->player, get_move_id(3)); + /*game->player->sprint = game->player->sprint ? 0 : 1; + add_move(game->player, get_move_id(3));*/ + add_item_to_inventory(&game->player->inventory, get_item_id(1)); + display_inventory(&game->player->inventory); } if(action == ACTION_OPTN) { draw_stats(game->player->stats); diff --git a/src/event.c b/src/event.c index 1d6d762..7648cd4 100644 --- a/src/event.c +++ b/src/event.c @@ -4,6 +4,7 @@ #include "game.h" #include "event.h" #include "player.h" +#include "capacite.h" bool handle_event(struct Game *game, char const *event) { @@ -20,6 +21,11 @@ bool handle_event(struct Game *game, char const *event) add_xp(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; diff --git a/src/inventory.c b/src/inventory.c new file mode 100644 index 0000000..7953c3c --- /dev/null +++ b/src/inventory.c @@ -0,0 +1,51 @@ +#include +#include +#include + +#include "inventory.h" +#include "util.h" +#include "define.h" + +extern struct Items items; + +struct Item *get_item_id(int id) { + for(int i = 0; i < items.nbItems; i++) { + if(items.items[i]->id == id) return items.items[i]; + } + return items.items[0]; +} + +int get_first_free_space(struct Inventory *inventory) { + for(int i = 0; i < NB_PLAYER_ITEMS; i++) { + if(inventory->items[i] == NULL) { + return i; + } + } + return NB_PLAYER_ITEMS; +} + +bool add_item_to_inventory(struct Inventory *inventory, struct Item *item) { + int index = get_first_free_space(inventory); + if(index < NB_PLAYER_ITEMS) { + inventory->items[index] = item; + inventory->nbItems++; + return true; + } + return false; +} + +void remove_item_pos(struct Inventory *inventory, int pos) { + inventory->items[pos] = NULL; + inventory->nbItems--; +} + +void display_inventory(struct Inventory *inventory) { + dclear(C_WHITE); + for(int i = 0 ; i < NB_PLAYER_ITEMS ; i++) { + if(inventory->items[i] != NULL) { + dimage(0,18*i,inventory->items[i]->sprite); + } + } + dupdate(); + wait_for_input(KEY_SHIFT); +} \ No newline at end of file diff --git a/src/player.c b/src/player.c index f4783fa..7daa72f 100644 --- a/src/player.c +++ b/src/player.c @@ -28,11 +28,16 @@ struct Player init_player(void) { .xp = 0 }; + struct Inventory inventory = { + .nbItems = 0 + }; + struct Player player = { .pos = VEC2(32, 30), .pos_visual = VEC2F(32*TILE_SIZE, 30*TILE_SIZE), .base_stats = bstats, .stats = stats, + .inventory = inventory, .x_mid = 6, .y_mid = 1, .show_x = 12,