2022-04-22 00:32:31 +02:00
|
|
|
#include <stdio.h>
|
2022-04-18 00:06:32 +02:00
|
|
|
#include <gint/display.h>
|
|
|
|
#include <gint/keyboard.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
|
|
#include "inventory.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "define.h"
|
2022-04-18 02:14:07 +02:00
|
|
|
#include "vec2.h"
|
2022-04-22 00:32:31 +02:00
|
|
|
#include "talkable.h"
|
|
|
|
#include "event.h"
|
|
|
|
#include "item.h"
|
2022-05-16 23:57:25 +02:00
|
|
|
#include "draw_util.h"
|
2022-04-22 00:32:31 +02:00
|
|
|
#include "game.h"
|
2022-04-18 00:06:32 +02:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2022-05-26 17:06:17 +02:00
|
|
|
int get_nb_items(struct Inventory *inventory) {
|
|
|
|
int ret = 0;
|
|
|
|
for(int i = 0; i < NB_PLAYER_ITEMS; i++) {
|
|
|
|
if(inventory->items[i] != NULL) {
|
|
|
|
ret++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2022-04-22 00:32:31 +02:00
|
|
|
bool add_item_to_inventory(struct Game *game, struct Inventory *inventory, struct Item *item) {
|
2022-04-18 00:06:32 +02:00
|
|
|
int index = get_first_free_space(inventory);
|
2022-04-18 02:14:07 +02:00
|
|
|
|
2022-04-18 00:06:32 +02:00
|
|
|
if(index < NB_PLAYER_ITEMS) {
|
2022-05-16 23:57:25 +02:00
|
|
|
draw_text(50, DHEIGHT-47, C_BLACK, "Vous ajoutez %s à votre inventaire !", item->name);
|
2022-04-18 02:14:07 +02:00
|
|
|
dupdate();
|
|
|
|
wait_for_input(KEY_SHIFT);
|
2022-04-18 00:06:32 +02:00
|
|
|
inventory->items[index] = item;
|
|
|
|
inventory->nbItems++;
|
|
|
|
return true;
|
2022-04-18 02:14:07 +02:00
|
|
|
} else {
|
2022-05-16 23:57:25 +02:00
|
|
|
draw_text(50, DHEIGHT-47, C_BLACK, "Plus de place pour ajouter %s à votre inventaire !", item->name);
|
2022-04-18 02:14:07 +02:00
|
|
|
dupdate();
|
|
|
|
wait_for_input(KEY_SHIFT);
|
2022-04-22 00:32:31 +02:00
|
|
|
int pos = open_inventory(game, inventory, "Remplacer", false);
|
2022-04-18 02:14:07 +02:00
|
|
|
if(pos != -1) {
|
|
|
|
inventory->items[pos] = item;
|
|
|
|
inventory->nbItems++;
|
|
|
|
return true;
|
|
|
|
}
|
2022-04-18 00:06:32 +02:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void display_inventory(struct Inventory *inventory) {
|
2022-05-26 17:06:17 +02:00
|
|
|
const int x_inventory = 30;
|
|
|
|
const int y_inventory = 56;
|
2022-04-18 00:06:32 +02:00
|
|
|
for(int i = 0 ; i < NB_PLAYER_ITEMS ; i++) {
|
2022-04-18 02:14:07 +02:00
|
|
|
int x = i%10;
|
|
|
|
int y = i/10;
|
2022-04-18 00:06:32 +02:00
|
|
|
if(inventory->items[i] != NULL) {
|
2022-05-26 17:06:17 +02:00
|
|
|
dimage(34*x+x_inventory, 41*y+y_inventory, inventory->items[i]->sprite);
|
2022-04-18 02:14:07 +02:00
|
|
|
} else {
|
2022-05-26 17:06:17 +02:00
|
|
|
drect(34*x+x_inventory, 41*y+y_inventory, 34*x+x_inventory+31, 41*y+y_inventory+31, C_BLACK);
|
2022-04-18 00:06:32 +02:00
|
|
|
}
|
|
|
|
}
|
2022-04-18 02:14:07 +02:00
|
|
|
}
|
|
|
|
|
2022-04-22 00:32:31 +02:00
|
|
|
int open_inventory(struct Game *game, struct Inventory *inventory, char* context, bool keep_open) {
|
2022-05-26 17:06:17 +02:00
|
|
|
extern bopti_image_t img_inventory;
|
2022-04-18 02:14:07 +02:00
|
|
|
int buffer = keydown(KEY_SHIFT);
|
|
|
|
struct Vec2 cursor = VEC2(0,0);
|
|
|
|
int pos = 0;
|
|
|
|
int suppression = 0;
|
|
|
|
|
2022-05-26 17:06:17 +02:00
|
|
|
const int x_inventory = 30;
|
|
|
|
const int y_inventory = 56;
|
|
|
|
|
2022-04-18 02:14:07 +02:00
|
|
|
while(1) {
|
|
|
|
clearevents();
|
|
|
|
|
|
|
|
cursor.x += keydown(KEY_RIGHT) - keydown(KEY_LEFT);
|
|
|
|
cursor.y += keydown(KEY_DOWN) - keydown(KEY_UP);
|
|
|
|
|
|
|
|
if(cursor.x > 9) cursor.x = 9;
|
|
|
|
if(cursor.x < 0) cursor.x = 0;
|
|
|
|
if(cursor.y > 2) cursor.y = 2;
|
|
|
|
if(cursor.y < 0) cursor.y = 0;
|
|
|
|
|
|
|
|
pos = cursor.x + cursor.y*10;
|
|
|
|
|
2022-05-26 17:06:17 +02:00
|
|
|
dclear(C_RGB(25,25,25));
|
|
|
|
dimage(0, 0, &img_inventory);
|
|
|
|
dtext(5,2,C_BLACK,context);
|
|
|
|
drect(34*cursor.x+x_inventory-2, 41*cursor.y+y_inventory-2, 34*cursor.x+x_inventory+33, 41*cursor.y+y_inventory+33, suppression ? C_RED : C_GREEN);
|
|
|
|
if(suppression) dtext(5,16,C_RED,"Suppression");
|
|
|
|
dprint(5, 185, C_BLACK, "%d/%d", get_nb_items(inventory), NB_PLAYER_ITEMS);
|
2022-04-18 02:14:07 +02:00
|
|
|
display_inventory(inventory);
|
|
|
|
|
|
|
|
if(inventory->items[pos] != NULL) {
|
2022-05-26 17:06:17 +02:00
|
|
|
dtext(5, 30, C_BLACK, inventory->items[pos]->name);
|
|
|
|
dtext(104, 30, C_BLACK, inventory->items[pos]->description);
|
2022-04-18 02:14:07 +02:00
|
|
|
}
|
|
|
|
dupdate();
|
|
|
|
|
|
|
|
if(keydown(KEY_SHIFT)) {
|
|
|
|
if(buffer) buffer = 0;
|
|
|
|
else if(inventory->items[pos] != NULL) {
|
2022-04-22 00:32:31 +02:00
|
|
|
if(!suppression && !keep_open) break;
|
|
|
|
else if(!suppression) {
|
2022-05-26 18:47:58 +02:00
|
|
|
if(select_item(game, pos)) remove_item_pos(inventory, pos);
|
|
|
|
else {
|
|
|
|
draw_text(50, DHEIGHT-47, C_BLACK, "Ça n'aura aucun effet.");
|
|
|
|
dupdate();
|
|
|
|
wait_for_input(KEY_SHIFT);
|
|
|
|
}
|
2022-04-22 00:32:31 +02:00
|
|
|
}
|
2022-04-18 02:14:07 +02:00
|
|
|
else remove_item_pos(inventory, pos);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(keydown(KEY_OPTN)) {
|
|
|
|
suppression = suppression ? 0 : 1;
|
|
|
|
}
|
|
|
|
if(keydown(KEY_EXIT)) {
|
|
|
|
pos = -1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
while(keydown_any(KEY_RIGHT, KEY_LEFT, KEY_DOWN, KEY_UP, KEY_SHIFT, KEY_OPTN, 0)) clearevents();
|
|
|
|
}
|
|
|
|
return pos;
|
2022-04-18 00:06:32 +02:00
|
|
|
}
|