#include "AppHdr.h"
#include "cluautil.h"
#include "l_libs.h"
#include "food.h"
#include "invent.h"
#include "itemprop.h"
#include "items.h"
#include "player.h"
/////////////////////////////////////////////////////////////////////
// Food information.
static int food_do_eat(lua_State *ls)
{
bool eaten = false;
if (!you.turn_is_over)
eaten = eat_food(-1);
lua_pushboolean(ls, eaten);
return (1);
}
static int food_prompt_eat_chunks(lua_State *ls)
{
int eaten = 0;
if (!you.turn_is_over)
eaten = prompt_eat_chunks();
lua_pushboolean(ls, (eaten != 0));
return (1);
}
static int food_prompt_floor(lua_State *ls)
{
int eaten = 0;
if (!you.turn_is_over)
{
eaten = eat_from_floor();
if (eaten == 1)
burden_change();
}
lua_pushboolean(ls, (eaten != 0));
return (1);
}
static int food_prompt_inventory(lua_State *ls)
{
bool eaten = false;
if (!you.turn_is_over)
eaten = eat_from_inventory();
lua_pushboolean(ls, eaten);
return (1);
}
static int food_prompt_inventory_menu(lua_State *ls)
{
bool eaten = false;
if (!you.turn_is_over)
eaten = prompt_eat_inventory_item();
lua_pushboolean(ls, eaten);
return (1);
}
static int food_can_eat(lua_State *ls)
{
LUA_ITEM(item, 1);
bool hungercheck = true;
if (lua_isboolean(ls, 2))
hungercheck = lua_toboolean(ls, 2);
bool edible = item && can_ingest(item->base_type,
item->sub_type,
true,
true,
hungercheck);
lua_pushboolean(ls, edible);
return (1);
}
static bool eat_item(const item_def &item)
{
if (in_inventory(item))
{
eat_inventory_item(item.link);
return (true);
}
else
{
int ilink = item_on_floor(item, you.pos());
if (ilink != NON_ITEM)
{
eat_floor_item(ilink);
return (true);
}
return (false);
}
}
static int food_eat(lua_State *ls)
{
LUA_ITEM(item, 1);
bool eaten = false;
if (!you.turn_is_over)
{
// When we get down to eating, we don't care if the eating is courtesy
// an un-ided amulet of the gourmand.
bool edible = item && can_ingest(item->base_type,
item->sub_type,
false,
false);
if (edible)
eaten = eat_item(*item);
}
lua_pushboolean(ls, eaten);
return (1);
}
static int food_rotting(lua_State *ls)
{
LUA_ITEM(item, 1);
bool rotting = false;
if (item && item->base_type == OBJ_FOOD && item->sub_type == FOOD_CHUNK)
rotting = food_is_rotten(*item);
lua_pushboolean(ls, rotting);
return (1);
}
static int food_dangerous(lua_State *ls)
{
LUA_ITEM(item, 1);
bool dangerous = false;
if (item)
{
dangerous = (is_poisonous(*item) || is_mutagenic(*item)
|| causes_rot(*item) || is_forbidden_food(*item));
}
lua_pushboolean(ls, dangerous);
return (1);
}
static int food_ischunk(lua_State *ls)
{
LUA_ITEM(item, 1);
lua_pushboolean(ls,
item && item->base_type == OBJ_FOOD
&& item->sub_type == FOOD_CHUNK);
return (1);
}
static const struct luaL_reg food_lib[] =
{
{ "do_eat", food_do_eat },
{ "prompt_eat_chunks", food_prompt_eat_chunks },
{ "prompt_floor", food_prompt_floor },
{ "prompt_inventory", food_prompt_inventory },
{ "prompt_inv_menu", food_prompt_inventory_menu },
{ "can_eat", food_can_eat },
{ "eat", food_eat },
{ "rotting", food_rotting },
{ "dangerous", food_dangerous },
{ "ischunk", food_ischunk },
{ NULL, NULL },
};
void cluaopen_food(lua_State *ls)
{
luaL_openlib(ls, "food", food_lib, 0);
}