Split eating non-food into separate function
This commit is contained in:
162
src/eat.c
162
src/eat.c
@@ -33,6 +33,7 @@ static void fprefx(struct obj *);
|
|||||||
static void fpostfx(struct obj *);
|
static void fpostfx(struct obj *);
|
||||||
static int bite(void);
|
static int bite(void);
|
||||||
static int edibility_prompts(struct obj *);
|
static int edibility_prompts(struct obj *);
|
||||||
|
static int doeat_nonfood(struct obj *);
|
||||||
static int tinopen_ok(struct obj *);
|
static int tinopen_ok(struct obj *);
|
||||||
static int rottenfood(struct obj *);
|
static int rottenfood(struct obj *);
|
||||||
static void eatspecial(void);
|
static void eatspecial(void);
|
||||||
@@ -2607,13 +2608,95 @@ edibility_prompts(struct obj *otmp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
doeat_nonfood(struct obj *otmp)
|
||||||
|
{
|
||||||
|
int basenutrit; /* nutrition of full item */
|
||||||
|
int ll_conduct = 0;
|
||||||
|
boolean nodelicious = FALSE;
|
||||||
|
int material;
|
||||||
|
|
||||||
|
gc.context.victual.reqtime = 1;
|
||||||
|
gc.context.victual.piece = otmp;
|
||||||
|
gc.context.victual.o_id = otmp->o_id;
|
||||||
|
/* Don't split it, we don't need to if it's 1 move */
|
||||||
|
gc.context.victual.usedtime = 0;
|
||||||
|
gc.context.victual.canchoke = (u.uhs == SATIATED);
|
||||||
|
/* Note: gold weighs 1 pt. for each 1000 pieces (see
|
||||||
|
pickup.c) so gold and non-gold is consistent. */
|
||||||
|
if (otmp->oclass == COIN_CLASS)
|
||||||
|
basenutrit = ((otmp->quan > 200000L) ? 2000
|
||||||
|
: (int) (otmp->quan / 100L));
|
||||||
|
else if (otmp->oclass == BALL_CLASS || otmp->oclass == CHAIN_CLASS)
|
||||||
|
basenutrit = weight(otmp);
|
||||||
|
/* oc_nutrition is usually weight anyway */
|
||||||
|
else
|
||||||
|
basenutrit = objects[otmp->otyp].oc_nutrition;
|
||||||
|
#ifdef MAIL_STRUCTURES
|
||||||
|
if (otmp->otyp == SCR_MAIL) {
|
||||||
|
basenutrit = 0;
|
||||||
|
nodelicious = TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
gc.context.victual.nmod = basenutrit;
|
||||||
|
gc.context.victual.eating = 1; /* needed for lesshungry() */
|
||||||
|
|
||||||
|
if (!u.uconduct.food++) {
|
||||||
|
ll_conduct++;
|
||||||
|
livelog_printf(LL_CONDUCT, "ate for the first time (%s)",
|
||||||
|
food_xname(otmp, FALSE));
|
||||||
|
}
|
||||||
|
material = objects[otmp->otyp].oc_material;
|
||||||
|
if (material == LEATHER || material == BONE
|
||||||
|
|| material == DRAGON_HIDE || material == WAX) {
|
||||||
|
if (!u.uconduct.unvegan++ && !ll_conduct) {
|
||||||
|
livelog_printf(LL_CONDUCT,
|
||||||
|
"consumed animal products for the first time, by eating %s",
|
||||||
|
an(food_xname(otmp, FALSE)));
|
||||||
|
ll_conduct++;
|
||||||
|
}
|
||||||
|
if (material != WAX) {
|
||||||
|
if (!u.uconduct.unvegetarian && !ll_conduct)
|
||||||
|
livelog_printf(LL_CONDUCT,
|
||||||
|
"tasted meat by-products for the first time, by eating %s",
|
||||||
|
an(food_xname(otmp, FALSE)));
|
||||||
|
violated_vegetarian();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otmp->cursed) {
|
||||||
|
(void) rottenfood(otmp);
|
||||||
|
nodelicious = TRUE;
|
||||||
|
} else if (objects[otmp->otyp].oc_material == PAPER)
|
||||||
|
nodelicious = TRUE;
|
||||||
|
|
||||||
|
if (otmp->oclass == WEAPON_CLASS && otmp->opoisoned) {
|
||||||
|
pline("Ecch - that must have been poisonous!");
|
||||||
|
if (!Poison_resistance) {
|
||||||
|
poison_strdmg(rnd(4), rnd(15), xname(otmp), KILLED_BY_AN);
|
||||||
|
} else
|
||||||
|
You("seem unaffected by the poison.");
|
||||||
|
} else if (!nodelicious) {
|
||||||
|
pline("%s%s is delicious!",
|
||||||
|
(obj_is_pname(otmp)
|
||||||
|
&& otmp->oartifact < ART_ORB_OF_DETECTION)
|
||||||
|
? ""
|
||||||
|
: "This ",
|
||||||
|
(otmp->oclass == COIN_CLASS)
|
||||||
|
? foodword(otmp)
|
||||||
|
: singular(otmp, xname));
|
||||||
|
}
|
||||||
|
eatspecial();
|
||||||
|
return ECMD_TIME;
|
||||||
|
}
|
||||||
|
|
||||||
/* the #eat command */
|
/* the #eat command */
|
||||||
int
|
int
|
||||||
doeat(void)
|
doeat(void)
|
||||||
{
|
{
|
||||||
struct obj *otmp;
|
struct obj *otmp;
|
||||||
int basenutrit; /* nutrition of full item */
|
int basenutrit; /* nutrition of full item */
|
||||||
boolean dont_start = FALSE, nodelicious = FALSE,
|
boolean dont_start = FALSE,
|
||||||
already_partly_eaten;
|
already_partly_eaten;
|
||||||
int ll_conduct = 0;
|
int ll_conduct = 0;
|
||||||
|
|
||||||
@@ -2711,82 +2794,9 @@ doeat(void)
|
|||||||
trycall(otmp);
|
trycall(otmp);
|
||||||
return ECMD_TIME;
|
return ECMD_TIME;
|
||||||
}
|
}
|
||||||
if (otmp->oclass != FOOD_CLASS) {
|
if (otmp->oclass != FOOD_CLASS)
|
||||||
int material;
|
return doeat_nonfood(otmp);
|
||||||
|
|
||||||
gc.context.victual.reqtime = 1;
|
|
||||||
gc.context.victual.piece = otmp;
|
|
||||||
gc.context.victual.o_id = otmp->o_id;
|
|
||||||
/* Don't split it, we don't need to if it's 1 move */
|
|
||||||
gc.context.victual.usedtime = 0;
|
|
||||||
gc.context.victual.canchoke = (u.uhs == SATIATED);
|
|
||||||
/* Note: gold weighs 1 pt. for each 1000 pieces (see
|
|
||||||
pickup.c) so gold and non-gold is consistent. */
|
|
||||||
if (otmp->oclass == COIN_CLASS)
|
|
||||||
basenutrit = ((otmp->quan > 200000L) ? 2000
|
|
||||||
: (int) (otmp->quan / 100L));
|
|
||||||
else if (otmp->oclass == BALL_CLASS || otmp->oclass == CHAIN_CLASS)
|
|
||||||
basenutrit = weight(otmp);
|
|
||||||
/* oc_nutrition is usually weight anyway */
|
|
||||||
else
|
|
||||||
basenutrit = objects[otmp->otyp].oc_nutrition;
|
|
||||||
#ifdef MAIL_STRUCTURES
|
|
||||||
if (otmp->otyp == SCR_MAIL) {
|
|
||||||
basenutrit = 0;
|
|
||||||
nodelicious = TRUE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
gc.context.victual.nmod = basenutrit;
|
|
||||||
gc.context.victual.eating = 1; /* needed for lesshungry() */
|
|
||||||
|
|
||||||
if (!u.uconduct.food++) {
|
|
||||||
ll_conduct++;
|
|
||||||
livelog_printf(LL_CONDUCT, "ate for the first time (%s)",
|
|
||||||
food_xname(otmp, FALSE));
|
|
||||||
}
|
|
||||||
material = objects[otmp->otyp].oc_material;
|
|
||||||
if (material == LEATHER || material == BONE
|
|
||||||
|| material == DRAGON_HIDE || material == WAX) {
|
|
||||||
if (!u.uconduct.unvegan++ && !ll_conduct) {
|
|
||||||
livelog_printf(LL_CONDUCT,
|
|
||||||
"consumed animal products for the first time, by eating %s",
|
|
||||||
an(food_xname(otmp, FALSE)));
|
|
||||||
ll_conduct++;
|
|
||||||
}
|
|
||||||
if (material != WAX) {
|
|
||||||
if (!u.uconduct.unvegetarian && !ll_conduct)
|
|
||||||
livelog_printf(LL_CONDUCT,
|
|
||||||
"tasted meat by-products for the first time, by eating %s",
|
|
||||||
an(food_xname(otmp, FALSE)));
|
|
||||||
violated_vegetarian();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (otmp->cursed) {
|
|
||||||
(void) rottenfood(otmp);
|
|
||||||
nodelicious = TRUE;
|
|
||||||
} else if (objects[otmp->otyp].oc_material == PAPER)
|
|
||||||
nodelicious = TRUE;
|
|
||||||
|
|
||||||
if (otmp->oclass == WEAPON_CLASS && otmp->opoisoned) {
|
|
||||||
pline("Ecch - that must have been poisonous!");
|
|
||||||
if (!Poison_resistance) {
|
|
||||||
poison_strdmg(rnd(4), rnd(15), xname(otmp), KILLED_BY_AN);
|
|
||||||
} else
|
|
||||||
You("seem unaffected by the poison.");
|
|
||||||
} else if (!nodelicious) {
|
|
||||||
pline("%s%s is delicious!",
|
|
||||||
(obj_is_pname(otmp)
|
|
||||||
&& otmp->oartifact < ART_ORB_OF_DETECTION)
|
|
||||||
? ""
|
|
||||||
: "This ",
|
|
||||||
(otmp->oclass == COIN_CLASS)
|
|
||||||
? foodword(otmp)
|
|
||||||
: singular(otmp, xname));
|
|
||||||
}
|
|
||||||
eatspecial();
|
|
||||||
return ECMD_TIME;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (otmp == gc.context.victual.piece) {
|
if (otmp == gc.context.victual.piece) {
|
||||||
boolean one_bite_left
|
boolean one_bite_left
|
||||||
|
|||||||
Reference in New Issue
Block a user