84 lines
1.9 KiB
C
84 lines
1.9 KiB
C
/*
|
|
* BreakHack - A dungeone crawler RPG
|
|
* Copyright (C) 2018 Linus Probert <linus.probert@gmail.com>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include "item.h"
|
|
#include "util.h"
|
|
#include "mixer.h"
|
|
#include "gui.h"
|
|
|
|
Item *
|
|
item_create(void)
|
|
{
|
|
Item *item = ec_malloc(sizeof(Item));
|
|
item->sprite = NULL;
|
|
item->collected = false;
|
|
item->openable = false;
|
|
item->opened = 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)
|
|
{
|
|
sprite_render(item->sprite, cam);
|
|
}
|
|
|
|
void
|
|
item_collected(Item *item, Player *player)
|
|
{
|
|
if (item->collected || item->opened)
|
|
return;
|
|
|
|
if (!item->openable) {
|
|
item->collected = true;
|
|
} else {
|
|
mixer_play_effect(CHEST_OPEN);
|
|
gui_log("You open a container");
|
|
item->opened = true;
|
|
item->sprite->texture_index = 1;
|
|
if (!item->items)
|
|
gui_log("You find nothing inside");
|
|
}
|
|
|
|
if (item->effect != NULL)
|
|
item->effect(item, player);
|
|
|
|
while (item->items) {
|
|
Item *subitem = linkedlist_pop(&item->items);
|
|
item_collected(subitem, player);
|
|
item_destroy(subitem);
|
|
}
|
|
}
|
|
|
|
void
|
|
item_destroy(Item *item)
|
|
{
|
|
if (item->sprite)
|
|
sprite_destroy(item->sprite);
|
|
|
|
while (item->items != NULL)
|
|
item_destroy(linkedlist_pop(&item->items));
|
|
|
|
free(item);
|
|
}
|