Items can now contain items.

This commit is contained in:
Linus_Probert 2018-01-30 13:44:21 +01:00
parent 76ddc6c529
commit b3d48bd397
6 changed files with 78 additions and 18 deletions

View File

@ -10,19 +10,51 @@ item_create(void)
item->collected = false;
m_strcpy(item->label, 50, "");
item->value = 0.0;
item->items = NULL;
item->effect = NULL;
return item;
}
void item_render(Item *item, Camera *cam)
void
item_render(Item *item, Camera *cam)
{
sprite_render(item->sprite, cam);
}
void
item_collected(Item *item, Player *player)
{
LinkedList *items = item->items;
while (items != NULL) {
Item *subitem = items->data;
items = items->next;
item_collected(subitem, player);
}
if (item->effect != NULL)
item->effect(item, player);
item->collected = true;
}
void
item_destroy(Item *item)
{
LinkedList *items;
Item *subitem;
if (item->sprite)
sprite_destroy(item->sprite);
items = item->items;
while (items != NULL) {
subitem = items->data;
items->data = NULL;
items = items->next;
item_destroy(subitem);
}
linkedlist_destroy(&items);
free(item);
}

View File

@ -7,18 +7,23 @@
#include "position.h"
#include "player.h"
#include "camera.h"
#include "linkedlist.h"
typedef struct Item_t {
Sprite *sprite;
bool collected;
char label[50];
double value;
LinkedList *items;
void (*effect)(struct Item_t *, Player *);
} Item;
Item *
item_create(void);
void
item_collected(Item*, Player*);
void
item_render(Item*, Camera*);

View File

@ -138,11 +138,15 @@ item_builder_build_item(ItemKey key)
item = create_treasure();
break;
case FLESH:
item = create_item(path_flesh, (SDL_Rect) { 0, 0, 16, 16 }, &eat_flesh);
item = create_item(path_flesh,
(SDL_Rect) { 0, 0, 16, 16 },
&eat_flesh);
item->value = 1;
break;
case HEALTH:
item = create_item(path_potion, (SDL_Rect) { 0, 0, 16, 16 }, &drink_health);
item = create_item(path_potion,
(SDL_Rect) { 0, 0, 16, 16 },
&drink_health);
item->value = 1 + (rand() % 2);
break;
default:
@ -153,6 +157,14 @@ item_builder_build_item(ItemKey key)
return item;
}
Item *
item_builder_build_sack(void)
{
return create_item("assets/Items/Chest0.png",
(SDL_Rect) { 0, 32, 16, 16 },
NULL);
}
void
item_builder_close(void)
{

View File

@ -30,6 +30,9 @@ item_builder_init(SDL_Renderer *);
Item *
item_builder_build_item(ItemKey key);
Item *
item_builder_build_sack(void);
void
item_builder_close(void);

View File

@ -244,27 +244,37 @@ monster_drop_loot(Monster *monster, Map *map)
{
static unsigned int item_drop_chance = 3;
static unsigned int treasure_drop_chance = 2;
bool dropped_something = false;
Item *item;
Item *items[2];
unsigned int item_count = 0;
// TODO(Linus):
// Perhaps store multidrops in an item containing items?
// A pouch or bag perhaps?
if ((rand() % treasure_drop_chance) == 0) {
if ((rand() % treasure_drop_chance) == 0 || true) {
item = item_builder_build_item(TREASURE);
item->sprite->pos = monster->sprite->pos;
dropped_something = true;
linkedlist_append(&map->items, item);
items[item_count++] = item;
}
if ((rand() % item_drop_chance) == 0) {
if ((rand() % item_drop_chance) == 0 || true) {
item = item_builder_build_item(rand() % TREASURE);
item->sprite->pos = monster->sprite->pos;
dropped_something = true;
linkedlist_append(&map->items, item);
items[item_count++] = item;
}
if (dropped_something)
gui_log("%s dropped something", monster->label);
if (item_count == 0)
return;
gui_log("%s dropped something", monster->label);
if (item_count == 1) {
linkedlist_append(&map->items, items[0]);
} else {
Item *container = item_builder_build_sack();
container->sprite->pos = monster->sprite->pos;
unsigned int i;
for (i = 0; i < item_count; ++i) {
linkedlist_append(&container->items, items[i]);
}
linkedlist_append(&map->items, container);
}
}
void

View File

@ -62,9 +62,7 @@ has_collided(Player *player, RoomMatrix *matrix)
while (items != NULL) {
Item *item = items->data;
items = items->next;
if (item->effect)
item->effect(item, player);
item->collected = true;
item_collected(item, player);
}
}