#include "kernel.h"
#include "objects.h"
#include "mobiles.h"
#include "locations.h"
#include "oflagnames.h"
#include "stdinc.h"
#define MAX_ARMOR 60 /* Take a WIIIILD guess. :P */
int value_class(CLASS_DATA *cl, int plx, Boolean silent);
static Boolean classmatch(int ob,CLASS_DATA *cl);
static void dropall(CLASS_DATA *cl);
static void getall(CLASS_DATA *cl);
static void getallfr(CLASS_DATA *cl);
static void trywear(int a, Boolean print_stuff);
static CLASS_DATA class_data[] = {
{ "clothing", 1 << OFL_WEARABLE, -2},
{ "weapons", 1 << OFL_WEAPON, -1},
{ "containers", 1 << OFL_CONTAINER, -1},
{ "food", 1 << OFL_FOOD, -1},
{ "drink", 1 << OFL_DRINK, -1},
{ "keys", 1 << OFL_KEY, -1},
{ "all", 0, -1},
{ NULL, 0, -1}};
int pits[] = {
OBJ_START_PIT, OBJ_START_CHURCH_PIT,
OBJ_CATACOMB_PIT_NORTH, OBJ_CATACOMB_PIT_EAST,
OBJ_CATACOMB_PIT_SOUTH, OBJ_CATACOMB_PIT_WEST,
-1};
#define is_wearable(O) (otstbit(O, OFL_WEARABLE) || \
otstbit(O, OFL_WEARONHANDS) || otstbit(O, OFL_WEARONBODY) || \
otstbit(O, OFL_WEARONHEAD) || otstbit(O, OFL_WEARONBACK) || \
otstbit(O, OFL_WEARONLEGS) || otstbit(O, OFL_WEARONFACE) || \
otstbit(O, OFL_WEARONFEET) || otstbit(O, OFL_WEARONNECK) || \
otstbit(O, OFL_WEARONARMS))
static int cmp_reg_obj(int *a, int *b)
{
return ovalue(*b) - ovalue(*a);
}
static int cmp_arm_obj(int *a, int *b)
{
return oarmor(*b) - oarmor(*a);
}
/*
Boolean inorigloc (int i)
{
if (!opermanent(i)) {
if (ocarrf_reset(i) == IN_ROOM)
return (oloc(i) == find_loc_by_id (oloc_reset(i)));
if (ocarrf_reset(i) == IN_CONTAINER)
return (oloc(i) == find_object_by_id (oloc_reset(i)));
if (ocarrf_reset(i) >= CARRIED_BY)
return (oloc(i) == find_mobile_by_id (oloc_reset(i)));
}
else
if (ocarrf_reset(i) >= CARRIED_BY)
return (oloc(i) == (oloc_reset(i) + max_players));
else
return (oloc(i) == (oloc_reset(i)));
}
*/
Boolean ispit(register int o)
{
register int i = 0;
register int j;
while ((j = pits[i++]) != o && j != -1);
return (j >= 0);
}
void giveallcom (void)
{
int obj;
int_set *inv;
int a;
if (EMPTY(item1))
{
bprintf ("Give all to who?? \n");
return;
}
if ((a = pl1) == -1)
{
bprintf("Who's that?\n");
return;
}
inv = pinv(mynum);
if (mynum == a)
{
bprintf("Cheap skate!\n");
return;
}
if ((plev(mynum) < LVL_APPREN) && (ploc(mynum) != ploc(a)))
{
bprintf ("They're not here.\n");
return;
}
for (obj=first_obj(inv); obj!=SET_END; obj=next_obj(inv))
{
dogive (obj, a);
bprintf ("%s: Ok\n", oname(obj));
}
}
void givecom(void)
{
int a, c;
if (EMPTY(item1))
{
bprintf("Give what to whom?\n");
return;
}
if (ltstflg(ploc(mynum), LFL_JAIL) && (plev(mynum) < LVL_DEMI)) {
bprintf ("You can't give items to people in this room\n");
return;
}
if (pl1 != -1)
{
if ((c = ob2) == -1)
{
bprintf("You don't have a %s\n", item1);
return;
}
if ((a = pl1) == -1)
{
bprintf("Who's that?\n");
return;
}
if (mynum == a)
{
bprintf("Cheap skate!\n");
return;
}
if (EMPTY(item2))
{
bprintf("Give them what?\n");
return;
}
dogive(c, a);
bprintf("Ok.\n");
return;
}
if ((a = ob1) == -1)
{
bprintf("You don't have a %s\n", item1);
return;
}
if (EMPTY(item2))
{
bprintf("To who?\n");
return;
}
if ((c = pl2) == -1)
{
bprintf("Who's that?\n");
return;
}
if (mynum == c)
{
bprintf("Cheap skate!\n");
return;
}
dogive(a, c);
bprintf("Ok.\n");
}
void dogive(int ob, int pl)
{
int i, j, o, p;
o = 0;
p = 0;
if (plev(mynum) < LVL_APPREN && ploc(pl) != ploc(mynum))
{
bprintf("They aren't here.\n");
return;
}
if (!iscarrby(ob, mynum))
{
bprintf("You don't have a %s.\n", oname(ob));
return;
}
if (!cancarry(pl))
{
bprintf("They can't carry it.\n");
return;
}
if (pl >= max_players && mtstflg(pl, MFL_QFOOD) && otstbit(ob, OFL_FOOD))
{
bprintf("%s thanks you.\n", pname(pl));
sendf(ploc(mynum), "%s has left the game.\n", pname(pl));
setpscore(pl, pscore(pl) + 50);
dumpstuff(pl, ploc(pl));
strcpy(pname(pl), "");
eat(ob);
return;
}
#ifdef LOCMIN_CATACOMB
if (pnum(pl) == MOB_CATACOMB_BEGGAR && otstbit(ob, OFL_FOOD))
{
bprintf("The Beggar thanks you and greedily devours the %s.\n", oname(ob));
setpscore(mynum, pscore(mynum) + 50);
eat(ob);
bprintf("After finishing his meal, the beggar stares at you and says '");
switch(my_random() % 4)
{
case 0: bprintf("Charity");
o = OBJ_CATACOMB_PIT_NORTH;
break;
case 1: bprintf("Faith");
o = OBJ_CATACOMB_PIT_EAST;
break;
case 2: bprintf("Wisdom");
o = OBJ_CATACOMB_PIT_SOUTH;
break;
case 3: bprintf("Courage");
o = OBJ_CATACOMB_PIT_WEST;
break;
}
bprintf("'\n");
for (i = 0; (j = pits[i++]) != -1;)
setobjstate(j, 0);
setobjstate(o, 1);
sendf(oloc(o), "A faint glow emanates from the pit.\n");
return;
}
#endif
#ifdef LOCMIN_OAKTREE
if (pnum(pl) == MOB_OAKTREE_VIOLA && onum(ob) == OBJ_OAKTREE_FAN)
{
bprintf("Viola kisses you%s.\n", psex(mynum) == 0 ? "" : " on the cheek");
bprintf("Viola says 'Thank you, %s. Won't you please come in?'\n",
psex(mynum) == 0 ? "kind sir" : "madame");
setpscore(mynum, pscore(mynum) + 50);
setoloc(ob, pl, CARRIED_BY);
return;
}
#endif
#ifdef LOCMIN_NARNIA
if (pnum(pl) == MOB_NARNIA_PETER && onum(ob) == OBJ_NARNIA_PETERSHIELD)
{
bprintf("You kneel before Peter and offer him his shield.\n");
bprintf("Peter smiles at you sagely and thanks you for returning it safely.\n");
bprintf("He gestures at Lucy, who hands you a healing potion.\n");
setoloc(OBJ_NARNIA_CORDIAL, mynum, CARRIED_BY);
questsdone[Q_NARNIA] = True;
if (!qtstflg(mynum, Q_NARNIA))
{
qsetflg(mynum, Q_NARNIA);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX,
NOBODY, NOBODY, "[%s solved the Narnia Quest]\n", pname(mynum));
bprintf("You have solved the Narnia Quest!\n");
}
return;
}
#endif
#ifdef LOCMIN_JBS
if (pnum(pl) == MOB_JBS_GOAT && onum(ob) == OBJ_JBS_CAN)
{
bprintf("The goat eats the tin can!\n");
bprintf("After a few minutes of straining the goat excretes a helmet!\n");
setobjstate(ob,0);
destroy(ob);
setoloc(OBJ_JBS_HELMET,ploc(mynum),IN_ROOM);
}
#endif
#ifdef LOCMIN_START
if ((onum(ob) == OBJ_START_UMBRELLA) && (pnum(pl) == MOB_VALLEY_CHICKEN))
{
setoloc(ob, pl, CARRIED_BY);
bprintf("It looks confused.\n");
bprintf("It probably doesn't know how to use it, but it takes the umbrella anyway.\n");
setpscore(mynum, pscore(mynum) + 50);
return;
}
#endif
#ifdef LOCMIN_FOREST
if ((onum(ob) == OBJ_FOREST_PIPES) && (pnum(pl) == MOB_BLIZZARD_SEAMAS))
{
setoloc(ob, pl, CARRIED_BY);
bprintf("Seamas takes the pipes, thanks you, and begins to play a haunting melody.\n");
broad("A haunting pipe melody echoes through the air.\n");
return;
}
#endif
#ifdef LOCMIN_CAVE
if ((onum(ob) == OBJ_CAVE_BAGPIPES) && (pnum(pl) == MOB_VALLEY_PIPER))
{
setoloc(ob, pl, CARRIED_BY);
bprintf("The Piper thanks you and begins to play.\n");
setpscore(mynum, pscore(mynum) + 50);
broad("In the distance, you hear a piper playing \"Scotland the Brave.\"\n");
return;
}
#endif
#ifdef LOCMIN_CASTLE
if (plev(mynum) < LVL_APPREN)
{
if ((onum(ob) == OBJ_CASTLE_RUNESWORD))
{
bprintf("The Runesword does not wish to be given away.\n");
return;
}
}
#endif
#ifdef LOCMIN_OAKTREE /* Ithor. Orig zone from aberIV */
if ((onum(ob) == OBJ_OAKTREE_WATER) && (pnum(pl) == MOB_OAKTREE_ENT))
{
sendf(ploc(mynum), "The Ent says 'Ahhh! I needed that. Thanks you. A "
"word of advice to you:'\n 'Beware, to touch the silver "
"spriti is death.'");
setploc(pl, LOC_DEAD_DEAD);
strcpy(pname(pl), "");
eat(ob);
dumpstuff(pl, ploc(pl));
sendf(ploc(mynum), "The Ent makes like a tree and leaves east.\n");
return;
}
if ((onum(ob) == OBJ_BLIZZARD_GARLAND) && (pnum(pl) == MOB_OAKTREE_DRYAD))
{
sendf(ploc(mynum), "The Dryad says 'Thank you! It's very lovely.\n");
bprintf("Ok\n");
setobjstate(OBJ_OAKTREE_PORTAL1, 0);
strcpy(pname(pl), "");
setploc(pl, LOC_DEAD_DEAD);
dumpstuff(pl, ploc(pl));
destroy(ob);
sendf(ploc(mynum),"The Dryad opens a portal in her tree and goes inside\n");
return;
}
#endif
#ifdef LOCMIN_RHOME
if ((onum(ob) == OBJ_RHOME_INVRING) && (EQ(pname(mynum), "Rex"))) {
setpvis(mynum,0);
return;
}
#endif
#ifdef LOCMIN_VALLEY
if (onum(ob) == OBJ_VALLEY_ROSE && psex(mynum) != psex(pl)) {
bprintf("You give %s the %s.\n", him_or_her(pl), oname(ob));
setpscore(mynum, pscore(mynum) + 60);
setpscore(pl, pscore(pl) + 50);
sendf(pl, "%s gives you the %s.\n", see_name(pl, mynum), oname(ob));
setoloc(ob, pl, CARRIED_BY);
if (++odamage(ob) >= 2) {
sendf(ploc(pl), "The %s turns to dust.\n", oname(ob));
destroy(ob);
}
return;
}
#endif
setoloc(ob, pl, CARRIED_BY);
sendf(pl, "%s gives you the %s.\n", see_name(pl, mynum), oname(ob));
send_msg(ploc(pl), 0, LVL_MIN, LVL_MAX, pl, mynum,
"\001p%s\003 gives \001p%s\003 the %s.\n",
pname(mynum), pname(pl), oname(ob));
return;
}
void stealcom(void)
{
int a, c, e, f;
char x[128];
if (EMPTY(item1))
{
bprintf("Steal what?\n");
return;
}
strcpy(x, item1);
if (EMPTY(item2))
{
bprintf("From whom?\n");
return;
}
if ((c = pl2) == -1)
{
bprintf("Who is that?\n");
return;
}
if (mynum == c)
{
bprintf("A true kleptomaniac.\n");
return;
}
if ((a = fobncb(x, c)) == -1)
{
bprintf("They don't have it.\n");
return;
}
if (plev(mynum) < LVL_APPREN && ploc(c) != ploc(mynum))
{
bprintf("They're not here.\n");
return;
}
if (ocarrf(a) == WORN_BY)
{
bprintf("They're wearing it.\n");
return;
}
if (pwpn(c) == a)
{
bprintf("They have it firmly in hand... for KILLING people with!\n");
return;
}
if (pnum(c) == MOB_CATACOMB_DEFENDER || mtstflg(c, MFL_NOSTEAL))
{
sendf(ploc(c), "%s says 'How dare you steal from me, %s!'\n", pname(c), pname(mynum));
hit_player(c, mynum, -1);
return;
}
if (!do_okay(mynum, c, PFL_NOSTEAL))
{
int i = randperc() % 3;
switch (i)
{
case 0:
bprintf("%s is too watchful.\n", he_or_she(c));
return;
case 1:
bprintf("%s is too alert.\n", he_or_she(c));
break;
case 2:
bprintf("%s is too crafty.\n", he_or_she(c));
return;
}
}
if (!cancarry(mynum))
{
bprintf("You can't carry any more.\n");
return;
}
f = randperc();
e = (10 + plev(mynum) - plev(c)) * 5;
if (f < e || plev(mynum) >> LVL_APPREN)
{
bprintf("Got it!\n");
sendf(c, "%s steals the %s from you!\n", see_name(c, mynum), oname(a));
setoloc(a, mynum, CARRIED_BY);
if ((f & 1) && (c >= max_players))
hit_player(c, mynum, -1);
return;
}
bprintf("Your attempt fails.\n");
}
Boolean is_shield(int obj)
{
return
onum(obj) == OBJ_TREEHOUSE_SHIELD ||
onum(obj) == OBJ_WINDOW_SHIELD1 ||
onum(obj) == OBJ_WINDOW_SHIELD2 ||
onum(obj) == OBJ_CATACOMB_SHIELD ||
onum(obj) == OBJ_EFOREST_SHIELD ||
onum(obj) == OBJ_FROBOZZ_SHIELD_ATTIC ||
onum(obj) == OBJ_ANCIENT_BSHIELD;
}
Boolean wears_shield(int pl)
{
int i;
for (i = 0; i < pnumobs(pl); i++)
{
if (iswornby(pobj_nr(i, pl), pl) && is_shield(pobj_nr(i, pl)))
return True;
}
return False;
}
Boolean is_armor(int obj)
{
return onum(obj) == OBJ_CAVE_ARMOR ||
onum(obj) == OBJ_ANCIENT_ACLOAK ||
onum(obj) == OBJ_ORCHOLD_CHAINMAIL ||
onum(obj) == OBJ_FROBOZZ_MITHRIL_JACKET;
}
Boolean wears_armor(int pl)
{
int i;
for (i = 0; i < pnumobs(pl); i++)
{
if (iswornby(pobj_nr(i, pl), pl) && is_armor(pobj_nr(i, pl)))
return True;
}
return False;
}
Boolean is_mask(int obj)
{
return
onum(obj) == OBJ_LABYRINTH_MASK || onum(obj) == OBJ_ANCIENT_WARMASK;
}
Boolean wears_mask(int pl)
{
int i;
for (i = 0; i < pnumobs(pl); i++)
{
if (iswornby(pobj_nr(i, pl), pl) && is_mask(pobj_nr(i, pl)))
return True;
}
return False;
}
Boolean is_boat(int obj)
{
if (otstbit(obj, OFL_BOAT))
return True;
return False;
}
Boolean carries_boat(int pl)
{
int i;
for (i = 0; i < pnumobs(pl); i++)
{
if (iscarrby(pobj_nr(i, pl), pl) && is_boat(pobj_nr(i, pl)))
return True;
}
return False;
}
/* Does pl carry object type or a clone of it ? */
int carries_obj_type(int pl, int type)
{
int i;
for (i = 0; i < pnumobs(pl); i++)
{
if (iscarrby(pobj_nr(i, pl), pl) &&
onum(pobj_nr(i, pl)) == type)
return pobj_nr(i, pl);
}
return -1;
}
/* Does pl wear object type or a clone of it ? */
int wears_obj_type(int pl, int type)
{
int i;
for (i = 0; i < pnumobs(pl); i++)
{
if (iswornby(pobj_nr(i, pl), pl) &&
onum(pobj_nr(i, pl)) == type)
return pobj_nr(i, pl);
}
return -1;
}
void wearcom(void)
{
int a;
if ((a = ohereandget()) == -1) return;
if (!iscarrby(a, mynum))
{
bprintf("You don't have it.\n");
return;
}
if (iswornby(a, mynum))
{
bprintf("You're already wearing it.\n");
return;
}
trywear(a, True);
}
static void trywear(int a, Boolean print_stuff)
{
int b;
int_set *inv = pinv(mynum);
int obj;
#ifdef LOCMIN_ANCIENT
if (onum(a) == OBJ_ANCIENT_HEALBALSAM)
{
if(pstr(mynum) < maxstrength(mynum) - 20)
{
setpstr(mynum, pstr(mynum) + 20);
bprintf("You feel some of your wounds disappear.\n");
}
else if (pstr(mynum) < maxstrength(mynum))
{
setpstr(mynum, maxstrength(mynum));
bprintf("The balsam heals all your wounds!\n");
}
else
{
bprintf("The balsam has a nice cooling effect.\n");
}
destroy(a);
return;
}
if (onum(a) == OBJ_ANCIENT_EMBBALSAM)
{
bprintf("You start applying the embalming balsam ...\n");
bprintf("You begin to feel sleepy, and after a while some mummies\n"
"turn up helping you with the embalming ...\n");
destroy(a);
crapup("\tThe mummies carry you away to a safe restingplace."
" You are dead...", SAVE_ME);
return;
}
#endif
#ifdef LOCMIN_RHOME
if ((onum(a) == OBJ_RHOME_INVRING) && (EQ(pname(mynum), "Rex")))
{
send_msg(ploc(mynum),0,pvis(mynum), LVL_MAX,mynum,NOBODY,
"%s wears the %s.\n", pname(mynum),oname(a));
setpvis (mynum, 100000);
setcarrf(a,WORN_BY);
bprintf ("You slip the ring onto your finger.\n");
return;
}
#endif
if (!otstbit(a, OFL_WEARONHEAD) &&
!otstbit(a, OFL_WEARONFACE) &&
!otstbit(a, OFL_WEARONNECK) &&
!otstbit(a, OFL_WEARONFACE) &&
!otstbit(a, OFL_WEARONARMS) &&
!otstbit(a, OFL_WEARONHANDS) &&
!otstbit(a, OFL_WEARONBODY) &&
!otstbit(a, OFL_WEARONLEGS) &&
!otstbit(a, OFL_WEARONFEET) &&
!otstbit(a, OFL_WEARONBACK) &&
!otstbit(a, OFL_WEARABLE))
{
bprintf("Is this a new fashion?\n");
return;
}
/**************************************************-=-=-=-=-=-=-******/
if (otstbit(a,OFL_EXCLUDEWEAR)) {
for (obj = first_obj(inv); obj != SET_END; obj = next_obj(inv)) {
if (otstbit(obj,OFL_EXCLUDEWEAR) && obj != a && isworn(obj)) {
if ((otstbit(a,OFL_WEARONARMS) && otstbit(obj,OFL_WEARONARMS)) ||
(otstbit(a,OFL_WEARONHANDS)&& otstbit(obj,OFL_WEARONHANDS)) ||
(otstbit(a,OFL_WEARONBODY) && otstbit(obj,OFL_WEARONBODY)) ||
(otstbit(a,OFL_WEARONBACK) && otstbit(obj,OFL_WEARONBACK)) ||
(otstbit(a,OFL_WEARONLEGS) && otstbit(obj,OFL_WEARONLEGS)) ||
(otstbit(a,OFL_WEARONFEET) && otstbit(obj,OFL_WEARONFEET)) ||
(otstbit(a,OFL_WEARONNECK) && otstbit(obj,OFL_WEARONNECK)) ||
(otstbit(a,OFL_WEARONFACE) && otstbit(obj,OFL_WEARONFACE)) ||
(otstbit(a,OFL_WEARONHEAD) && otstbit(obj,OFL_WEARONHEAD))) {
if (!strcasecmp(oname(a),oname(obj)) && print_stuff) {
bprintf("You can't wear the two %ss at the same time.\n",
oname(a));
return;
} else if(print_stuff) {
bprintf("You can't wear the %s and the %s at the same time.\n",
oname(a),oname(obj));
return;
}
return;
}
}
}
}
if((player_armor(mynum) + oarmor(a)) > MAX_ARMOR && otstbit(a, OFL_ARMOR)) {
if(print_stuff)
bprintf("You can't wear that with all that armor you're wearing.\n");
return;
}
if(ocarrf(a) == IN_CONTAINER) return;
b = WORN_BY;
if (ocarrf(a) == WIELDED_BY)
b = BOTH_BY;
setcarrf(a, b);
send_msg( ploc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
"\001p%s\003 wears the %s.\n", pname(mynum), oname(a));
bprintf("Ok\n");
}
void removecom(void)
{
int a;
int b;
if ((a = ohereandget()) == -1) return;
if (!iswornby(a, mynum)) {
bprintf("You're not wearing it.\n");
return;
}
#ifdef LOCMIN_RHOME
if ((onum(a) == OBJ_RHOME_INVRING) && EQ(pname(mynum), "Rex")) {
setpvis(mynum, 0);
setcarrf(a,CARRIED_BY);
send_msg( ploc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
"%s removes the %s.\n",pname(mynum), oname(a));
bprintf("You slip the ring off of your finger.\n");
return;
}
#endif
b = (ocarrf(a) == BOTH_BY) ? WIELDED_BY : CARRIED_BY;
setcarrf(a, b);
send_msg( ploc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
"%s removes the %s.\n", pname(mynum), oname(a));
bprintf("Ok\n");
}
/* VALUE command:
*****************************************************************/
int value_class(CLASS_DATA *cl, int plx, Boolean silent)
{
int obj, sum = 0;
for (obj = 0; obj < numobs; obj++ ) {
if (in_inventory(obj, plx) && classmatch(obj, cl)) {
sum += ovalue(obj);
if (!silent) {
if (plev(plx) >= LVL_APPREN) bprintf("[%3d]", obj);
bprintf("%12.12s:%5d points\n",
oname(obj), ovalue(obj));
}
}
}
return sum;
}
void valuecom(void)
{
CLASS_DATA *c;
int a;
if (brkword() == -1) {
bprintf("Total value of all your possessions: %d points.\n",
value_class(findclass("all"), mynum, True));
} else {
do {
if ((c = findclass(wordbuf)) != NULL) {
bprintf("\n&+GTotal value:&+g%*d points.&*\n",
plev(mynum) >= LVL_APPREN ? 11 : 6,
value_class(c, mynum, False));
} else if ((a = fobn(wordbuf)) == -1) {
bprintf("%s: no such object\n", wordbuf);
} else {
if (plev(mynum) >= LVL_APPREN) bprintf("[%3d]", a);
bprintf("%12.12s:%5d points\n", oname(a), ovalue(a));
}
} while (brkword() != -1);
}
}
/*End, VALUE command
****************************************************************/
void putcom(void)
{
int a, i;
char ar[128];
int c;
if ((a = ohereandget()) == -1)
return;
if (EMPTY(item2)) {
bprintf("Where?\n");
return;
}
if ((c = ob2) == -1) {
bprintf( "I can't see any %s here.\n", item2);
return;
}
if (ststflg(mynum, SFL_GHOST)) {
bprintf("Your ghostly fingers pass right through solid objects!\n");
return; }
#ifdef LOCMIN_ABYSS
if (c == OBJ_ABYSS_FORGE && state(c)==1)
if (a == OBJ_ABYSS_LANCE && state(a)) {
setobjstate(a, 0);
bprintf("The lance heats up quickly and begins to glow.\n");
osetdamage(a,26);
return;
}
if (c == OBJ_ABYSS_BOX) {
if ((a == OBJ_EFOREST_PURSE_COIN) || (a == OBJ_ABYSS_COIN1)) {
bprintf("An unseen magical force whisks you away...\n");
destroy(a);
teletrap(LOC_HEAVEN_1);
return;
}
if ((a == OBJ_EFOREST_TRASH_COIN) || (a == OBJ_ABYSS_COIN2)) {
bprintf("An unseen magical force whisks you away...\n");
destroy(a);
teletrap(LOC_WASTE_BEFORE);
return;
}
}
if (c == OBJ_ABYSS_SLOT1)
if (a == OBJ_ABYSS_CARD2) {
setobjstate(OBJ_ABYSS_HOMEDOOR, 0);
bprintf("You slide the card into the slot, and the front door opens.\n");
return;
}
if (c == OBJ_ABYSS_SLOT2)
if (a == OBJ_ABYSS_CARD1) {
setobjstate(OBJ_ABYSS_CELLWALL, 0);
bprintf("You slide the card into the slot, and hear a soft click.\n");
bprintf("The west wall slides back!\n");
return;
}
#endif
#ifdef LOCMIN_OAKTREE
if (c == OBJ_OAKTREE_MOUTH1)
{
if (a != OBJ_OAKTREE_QUARTZ)
{
bprintf("It won't fit.\n");
return;
}
else if (state(OBJ_OAKTREE_MOUTH1) == 0)
{
bprintf("Nothing happens.\n");
return;
}
setobjstate(OBJ_OAKTREE_MOUTH1, 0);
destroy(OBJ_OAKTREE_QUARTZ);
bprintf("The quartz slides into its mouth and fits perfectly.\n");
send_msg(ploc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
"%s slides the quartz into the lion's mouth.\n",pname(mynum));
send_msg(ploc(mynum), 0, LVL_MIN, pvis(mynum), mynum, NOBODY,
"Someone slides the quartz into the lion's mouth.\n");
return;
}
#endif
#ifdef LOCMIN_JBS /* code written by Rendor(ken@esu.edu) Nov 1993 */
if( c==OBJ_JBS_POND && a==OBJ_JBS_LINE ) {
if( state(OBJ_JBS_POND) ) {
bprintf("Your line thrashes about! You caught a fish!\n");
create(OBJ_JBS_FISH);
setoloc(OBJ_JBS_FISH,mynum,CARRIED_BY);
setobjstate(c,0);
return;
}
bprintf("The line just hangs there, I think the pond is empty.\n");
return;
}
if( c==OBJ_JBS_HOLE_GROUND && a==OBJ_JBS_SEEDS ) {
bprintf("The seeds sprout into a giant beanstalk!\n");
setobjstate(OBJ_JBS_STALK_BOTTOM,0);
destroy(OBJ_JBS_SEEDS);
return;
}
if( c==OBJ_JBS_HOLE_BED && a==OBJ_JBS_STAFF && state(OBJ_JBS_PANEL_BED) ) {
bprintf("A panel clicks open in the floor!\n");
setobjstate(OBJ_JBS_PANEL_BED,0);
return;
}
#endif
#ifdef LOCMIN_MOOR
if ((c == OBJ_MOOR_ALTAR) && (a == OBJ_MOOR_CHALICE))
{
setobjstate(OBJ_MOOR_ALTAR, 1);
destroy(OBJ_MOOR_CHALICE);
bprintf("Ok.\n");
return;
}
#endif
#ifdef LOCMIN_PIRATE
if ((c == OBJ_PIRATE_TABLE) && (a == OBJ_VILLAGE_MAP))
{
if (state(OBJ_PIRATE_PLANK1) == 0)
{
bprintf("Nothing happens...\n");
return;
}
if (state(OBJ_PIRATE_SAIL) == 1) /* Sail raised, switch exits */
{
send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, NOBODY, NOBODY,
"A ghost pirate fades into view. After carefully studying "
"the map, he goes\n"
"outside and sails the ship to a new land.\n");
setobjstate(OBJ_PIRATE_LADDER2COVE, 1);
setobjstate(OBJ_PIRATE_PLANK1, 0);
destroy(OBJ_VILLAGE_MAP);
}
else /* if sail NOT raised... */
{
send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, NOBODY, NOBODY,
"A ghostly pirate fades into view. After testing the wind "
"carefully, he\n"
"shakes his head sadly and fades away.\n");
}
return;
}
if ((c == OBJ_PIRATE_SABRE) && (a == OBJ_PIRATE_RUBY)) /* Repair sabre */
{
bprintf("You put the ruby in the hilt, the sabre glows and eerie green.\n")
;
send_msg(ploc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
"%s puts the ruby in the hilt, the sabre glows and eerie green.\n",
pname(mynum));
send_msg(ploc(mynum), 0, LVL_MIN, pvis(mynum), mynum, NOBODY,
"Someone puts the ruby in the hilt, the sabre glows an eerie green.\n");
osetdamage(OBJ_PIRATE_SABRE, 25); /* aberIV normal is 28 */
destroy(OBJ_PIRATE_RUBY);
questsdone[Q_SABRE] = True;
if (!qtstflg(mynum, Q_SABRE))
{
qsetflg(mynum, Q_SABRE);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX,
NOBODY, NOBODY, "[%s solved the Sabre Quest]\n", pname(mynum));
bprintf("You have solved the Sabre Quest!\n");
}
return;
}
#endif /* PIRATE.ZONE */
#ifdef LOCMIN_EFOREST
if (onum(c) == OBJ_EFOREST_HOLE) {
if (onum(a) != OBJ_EFOREST_HOPE) {
bprintf("Nothing happens.\n");
return;
}
if (state(c) == 0) {
bprintf("You hear a 'click' sound but nothing seems to happen.\n");
return;
}
bprintf("The gem clicks into place...\n...and the door opens!\n");
send_msg(LOC_EFOREST_HOT, 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
"You hear a 'click' sound and the door opens!\n");
setobjstate(OBJ_EFOREST_HOLE, 0);
return;
}
if (c == OBJ_EFOREST_LAKE) {
if (a != OBJ_EFOREST_SPONGE) {
bprintf("Nothing happens.\n");
return;
}
if (state(OBJ_EFOREST_LAKE) == 0) {
bprintf("What lake ? It is dried up!\n");
return;
} else {
setobjstate(OBJ_EFOREST_LAKE, 0);
setobjstate(OBJ_EFOREST_SPONGE, 1);
bprintf("The sponge seems to miraculously suck up the"
" water in the lake!\n");
bprintf("It has dried the entire lake...wow!\n");
send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
"A sponge seems to suck up the water in the lake!\n");
return;
}
}
#endif
#ifdef LOCMIN_FROBOZZ
if(c == OBJ_FROBOZZ_WINDOW_OUTSIDE) {
if(a != OBJ_FROBOZZ_LEAFLET_MAILBOX) {
bprintf("Nothing happens.\n");
return;
} else if(state(OBJ_FROBOZZ_VAULTDOOR_OUTSIDE) == 2) {
setobjstate(OBJ_FROBOZZ_VAULTDOOR_OUTSIDE,1);
bprintf("You hear a nearly inaudible click from "
"the southern wall.\n");
return;
} else {
bprintf("Nothing happens.\n");
return;
}
}
#endif
#ifdef LOCMIN_ANCIENT
if (c == OBJ_ANCIENT_PEDESTAL)
if (a != OBJ_ANCIENT_SUNDISC) {
bprintf("Nothing happens.\n");
return;
} else {
bprintf("The sundisc fits perfectly on top of the pedestal with a loud "
"click!\n");
send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
"You hear a loud click as %s puts the sundisc on "
"the pedestal.", pname(mynum));
setoloc(OBJ_ANCIENT_SUNDISC, ploc(mynum), IN_ROOM);
osetbit(OBJ_ANCIENT_SUNDISC, OFL_NOGET);
setobjstate(OBJ_ANCIENT_SUNDISC, 2);
setobjstate(OBJ_ANCIENT_PEDESTAL, 0);
setpscore(mynum, pscore(mynum) + ovalue(OBJ_ANCIENT_SUNDISC)*3);
questsdone[Q_SUNDISC] = True;
if (!qtstflg(mynum, Q_SUNDISC))
{
qsetflg(mynum, Q_SUNDISC);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX,
NOBODY, NOBODY, "[%s solved the SunDisc Quest]\n", pname(mynum));
bprintf("You have solved the SunDisc Quest!\n");
}
return;
}
#endif
if (onum(c) == OBJ_TOWER_CANDLESTICK) {
if (onum(a) != OBJ_TOWER_RED_CANDLE && onum(a) != OBJ_TOWER_BLUE_CANDLE &&
onum(a) != OBJ_TOWER_GREEN_CANDLE) {
bprintf("You can't do that.\n");
return;
}
if (state(c) != 2) {
bprintf("There's already a candle in it!\n");
return;
}
bprintf("The candle fixes firmly into the candlestick.\n");
setpscore(mynum, pscore(mynum) + 50);
destroy(a);
osetarmor(c, a);
osetbit(c, OFL_LIGHTABLE);
osetbit(c, OFL_EXTINGUISH);
if (otstbit(a, OFL_LIT)) {
osetbit(c, OFL_LIT);
setobjstate(c, 0);
return;
}
setobjstate(c, 1);
oclrbit(c, OFL_LIT);
return;
}
if (onum(c) == OBJ_TOWER_BALL) {
if (onum(a) == OBJ_TOWER_WAND && oarmor(a) == 0) {
if (alive(i = max_players + MOB_TOWER_SHAZARETH) == -1 &&
pscore(i) == mynum)
{
questsdone[Q_INVISWAND] = True;
if (!qtstflg(mynum, Q_INVISWAND))
{
qsetflg(mynum, Q_INVISWAND);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX,
NOBODY, NOBODY, "[%s solved the InvisWand quest]\n",pname(mynum));
bprintf("You have solved the InvisWand Quest!\n");
}
}
bprintf("The wand seems to soak up energy.\n");
osetarmor(a, 4);
return;
}
bprintf("Nothing happens.\n");
return;
}
if (c == OBJ_WINDOW_SLIME_PIT) {
if (state(c) == 0) {
setoloc(a, LOC_WINDOW_SLIME, IN_ROOM);
bprintf("Ok\n");
return;
}
destroy(a);
bprintf("It dissappears with a fizzle into the slime.\n");
if (onum(a) == OBJ_WINDOW_SOAP) {
bprintf("The soap dissolves the slime away!\n");
setobjstate(OBJ_WINDOW_SLIME_PIT, 0);
}
return;
}
if (c == OBJ_TOWER_CHUTE_BOT) {
bprintf("You can't do that, the chute leads up from here!\n");
return;
}
if (c == OBJ_TOWER_CHUTE_TOP) {
if (onum(a) == OBJ_CASTLE_RUNESWORD) {
bprintf("You can't let go of it!\n");
return;
}
bprintf("It vanishes down the chute....\n");
sendf(oloc(OBJ_TOWER_CHUTE_BOT),
"The %s comes out of the chute.\n", oname(a));
setoloc(a, oloc(OBJ_TOWER_CHUTE_BOT), IN_ROOM);
return;
}
if (c == OBJ_TOWER_HOLE) {
if (onum(a) == OBJ_TOWER_SCEPTRE && state(OBJ_TOWER_DOOR_SHAZARETH) == 1) {
setobjstate(OBJ_TOWER_DOOR_TREASURE, 0);
strcpy(ar, "The door clicks open!\n");
sendf( oloc(OBJ_TOWER_DOOR_TREASURE), ar);
sendf( oloc(OBJ_TOWER_DOOR_SHAZARETH), ar);
return;
}
bprintf("Nothing happens.\n");
return;
}
if (c == a) {
bprintf("What do you think this is, the goon show?\n");
return;
}
if (otstbit(c, OFL_CONTAINER) == 0) {
bprintf("You can't do that.\n");
return;
}
if (state(c) != 0) {
bprintf("It's not open.\n");
return;
}
if (oflannel(a)) {
bprintf("You can't take that!\n");
return;
}
if ((ishere(a)) && (dragget()))
return;
if (onum(a) == OBJ_CASTLE_RUNESWORD) {
bprintf("You can't let go of it!\n");
return;
}
if (onum(a) == OBJ_START_UMBRELLA && state(a) == 1) {
bprintf("Close it first...\n");
return;
}
if (otstbit(a, OFL_LIT)) {
bprintf("I'd try putting it out first!\n");
return;
}
if (!willhold(c, a)) {
bprintf("It won't fit.\n");
return;
}
setoloc(a, c, IN_CONTAINER);
bprintf("Ok\n");
send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
"\001D%s\003\001c puts the %s in the %s.\n\003",
pname(mynum), oname(a), oname(c));
if (otstbit(a, OFL_GETFLIPS))
setobjstate(a, 0);
if (ploc(mynum) == LOC_TOWER_TREASURE && state(OBJ_TOWER_DOOR_TREASURE) == 0
&& ishere(a)) {
setobjstate(OBJ_TOWER_DOOR_TREASURE, 1);
strcpy(ar, "The door clicks shut....\n");
sendf( LOC_TOWER_TREASURE, ar);
sendf( oloc(OBJ_TOWER_DOOR_SHAZARETH), ar);
}
}
void eatcom(void)
{
int b;
char s[100];
if (brkword() == -1) {
bprintf("Eat what?\n");
return;
}
if (EQ(wordbuf, "water"))
strcpy(wordbuf, "spring");
if ((b = ob1 == -1 ? ob2 : ob1) == -1) {
bprintf("It isn't here.\n");
return;
}
switch (onum(b)) {
case OBJ_MOOR_CHALICE:
bprintf("However much &+rblood&* you drink from the chalice it "
"stays just as stained!\n");
break;
case OBJ_OAKTREE_TART:
case OBJ_OAKTREE_CAKES:
case OBJ_OAKTREE_TOAST:
bprintf("That was delicious, but not very filling.\n");
eat(b);
setpstr(mynum, pstr(mynum) + 6);
calibme();
break;
case OBJ_NARNIA_TURKISHDELIGHT:
bprintf("You dive eagerly into the dish of turkish delight.\n");
bprintf("It tastes so good! Unfortunately, because it is magical, it\n");
bprintf("replenishing itself, and you keep eating until your stomach bursts.\n");
eat(b);
p_crapup(mynum, "In your dying moments you recall that gluttony is one of the seven deadly sins.", CRAP_SAVE);
break;
case OBJ_OAKTREE_SOUP:
bprintf("As you finish off the last of the caterpillar consume\n");
bprintf("you notice a small diamond in the bottom of the cup.\n");
eat(b);
create(OBJ_OAKTREE_CUPDIAMOND);
setoloc(OBJ_OAKTREE_CUPDIAMOND, mynum, CARRIED_BY);
create(OBJ_OAKTREE_CUPCHINA);
setoloc(OBJ_OAKTREE_CUPCHINA, mynum, CARRIED_BY);
setpstr(mynum, pstr(mynum) + 6);
calibme();
break;
case OBJ_TOWER_CAULDRON:
bprintf("You feel funny and pass out....\n");
bprintf("You wake up elsewhere....\n");
teletrap(LOC_TOWER_MAGICAL);
break;
case OBJ_VALLEY_SPRING:
bprintf("Very refreshing.\n");
break;
case OBJ_TOWER_POTION:
setpstr(mynum, maxstrength(mynum));
bprintf("You feel much much stronger!\n");
setoloc(b, LOC_DEAD_EATEN, IN_ROOM);
destroy(b);
break;
case OBJ_NARNIA_CORDIAL:
setpstr(mynum, maxstrength(mynum));
bprintf("You drink a few drops of the potion and instantly feel much stronger.\n");
setoloc(b, LOC_DEAD_EATEN, IN_ROOM);
destroy(b);
break;
case OBJ_TREEHOUSE_WAYBREAD1:
if (plev(mynum) < LVL_APPREN && cur_player->pretend < 0) {
pl1 = (my_random() >> 3) % (numchars - 1);
if (ststflg(pl1, SFL_OCCUPIED) || pl1 < max_players) {
bprintf("There is a sudden feeling of failure...\n");
break;
}
polymorph(pl1,25); /* aliased for 25 moves */
}
setpstr(mynum, pstr(mynum) + 16);
eat(b);
break;
case OBJ_ICECAVE_FOUNTAIN:
if (plev(mynum) >= LVL_ONE && plev(mynum) < LVL_FOUR) {
setpscore(mynum, pscore(mynum) + 40);
calibme();
bprintf("&+CYou feel a wave of energy sweeping through you.&*\n");
} else {
bprintf("Faintly magical by the taste.\n");
if (plev(mynum) >= LVL_FOUR && pstr(mynum) < 10)
setpstr(mynum, pstr(mynum) + 4);
calibme();
}
break;
#ifdef LOCMIN_JBS /* code written by Rendor(ken@esu.edu) Nov 1993 */
case OBJ_JBS_SEEDS:
bprintf("A &+gbeanstalk&* starts growing in your stomach!\n");
eat(b);
crapup("Oh dear, your stomach seems to have burst!\n", SAVE_ME );
return;
case OBJ_JBS_SHROOMS:
bprintf("Everything shimmers as the world around you melts and you are\n\
transported to a world of infinite alls and nothings.\n" );
teletrap(LOC_JBS_FGATE);
eat(b);
return;
case OBJ_JBS_COFFEE:
bprintf("Everything twists around and resumes normal dimensions.\n");
teletrap(LOC_JBS_SEPASTURE);
eat(b);
return;
#endif
#ifdef LOCMIN_NIBELUNG /* Potion must eat to go down from bench */
case OBJ_NIBELUNG_POTION:
setpstr(mynum, ((randperc() % 21) + 1)); /* strength from 1 - 22 */
osetbit(b, OFL_DESTROYED);
setoloc(b, mynum, CARRIED_BY);
break;
#endif
#ifdef LOCMIN_ABYSS
case OBJ_ABYSS_SODA:
setpstr(mynum, maxstrength(mynum));
bprintf("As the &+Ysoda&* gurgles down your dry throat you "
"feel invigourated!\n");
setoloc(OBJ_ABYSS_SODA, LOC_DEAD_EATEN, IN_ROOM);
eat(OBJ_ABYSS_SODA);
break;
case OBJ_ABYSS_POTION1:
osetarmor(OBJ_TOWER_WAND, oarmor(OBJ_TOWER_WAND) - 1);
cur_player->me_ivct = 60;
setpvis(mynum, 10);
bprintf("You seem to &+Cs&+Wh&+ci&+wm&+Cm&+We&+cr and blur.\n");
setoloc(OBJ_ABYSS_POTION1, LOC_DEAD_EATEN, IN_ROOM);
eat(OBJ_ABYSS_POTION1);
break;
case OBJ_ABYSS_POTION2:
if (pstr(MOB_ABYSS_QBERT + max_players) < 0)
{
bprintf("There is a sudden feeling of failure...\n");
break;
}
else {
polymorph(max_players + MOB_ABYSS_QBERT, 10);
}
setpstr(mynum, pstr(mynum) + 16);
setoloc(OBJ_ABYSS_POTION2, LOC_DEAD_EATEN, IN_ROOM);
eat (OBJ_ABYSS_POTION2);
break;
#endif
#ifdef LOCMIN_ANCIENT
case OBJ_ANCIENT_FOUNTAIN_OF_YOUTH:
if (pscore(mynum) >= 20) {
setpscore(mynum, pscore(mynum) - 20);
calibme();
bprintf("You feel younger and less experienced...\n");
}
break;
#endif
#ifdef LOCMIN_MITHDAN
case OBJ_MITHDAN_FOUNTAIN:
bprintf("As you drink from the fountain, you feel the world altering\n");
bprintf("around you, and you wake up in a new realm.\n");
teletrap(LOC_MITHDAN_51);
break;
#endif
default:
if (otstbit(b, OFL_FOOD))
{
sprintf(s, "\001P%s\003 greedily devours the %s.\n", pname(mynum), oname(b));
eat(b);
bprintf("Delicious!\n");
setpstr(mynum, pstr(mynum) + 12);
calibme();
sillycom(s);
}
else if (otstbit(b, OFL_DRINK))
{
sprintf(s, "\001P%s\003 guzzles the %s.\n", pname(mynum), oname(b));
eat(b);
bprintf("Refreshing!\n");
setpstr(mynum, pstr(mynum) + 8);
calibme();
sillycom(s);
}
else
{
bprintf("I think I've lost my appetite.\n");
return;
}
break;
}
}
void inventory(void)
{
if (ststflg(mynum, SFL_GHOST)) {
bprintf("You have no means of carrying items!\n");
return; }
if (plev(mynum) < LVL_APPREN) {
send_msg(ploc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
"%s rummages through %s backpack.\n",
pname(mynum), his_or_her(mynum));
}
print_inventory(mynum);
}
void listobject(int loc,int mode)
{
aobjsat(loc, mode, 0);
}
void mlobjsat(int x, int m)
{
aobjsat(x, CARRIED_BY, m);
}
/* All OBJectS AT - list all objects at the destination given.
*/
void aobjsat(int loc, int mode, int marg)
{
int ostack[64], ostackp = 0;
char b[80], *s;
int col;
Boolean wwl; /* worn, wielded or lit ?*/
Boolean d, show_contents, empty = True;
int obj;
int stp;
int_set *inv = mode == IN_ROOM ? linv(loc) :
mode == IN_CONTAINER ? oinv(loc) : pinv(loc);
for (col = 0; col < marg; col++) bprintf(" ");
for (obj = first_obj(inv); obj != SET_END; obj = next_obj(inv)) {
show_contents = False;
s = b;
if ((mode == CARRIED_BY && iscarrby(obj, loc))
|| (mode == IN_CONTAINER && iscontin(obj, loc))) {
empty = False;
show_contents = True;
if ((d = (otstbit(obj, OFL_DESTROYED)))) {
*s++ = '(';
}
strcpy(s, oname(obj));
s += strlen(oname(obj));
if (d) {
*s++ = ')';
}
*s++ = ' ';
wwl = False;
if (mode == CARRIED_BY) {
if (iswornby(obj, loc)) {
strcpy(s,"<worn ");
s += strlen(s);
wwl = True;
}
if (pwpn(loc) == obj
&& ocarrf(obj) == WIELDED_BY) {
if (wwl) *s++ = ',';
else {
*s++ = '<';
wwl = True;
}
strcpy(s,"wielded");
s += strlen(s);
}
if (otstbit(obj, OFL_LIT)) {
if (wwl) *s++ = ',';
else {
*s++ = '<';
wwl = True;
}
strcpy(s,"lit");
s += strlen(s);
}
if (wwl) *s++ = '>';
}
*s = 0;
if (s - b + 1 + col > 79) {
bprintf("\n");
for (col = 0; col < marg; col++) bprintf(" ");
}
bprintf( "%s ", b);
col += strlen(b) + 1;
if (otstbit(obj, OFL_CONTAINER) && show_contents &&
(!otstbit(obj, OFL_OPENABLE) || state(obj) == 0)) {
ostack[ostackp++] = obj;
}
}
}
if (empty) bprintf("Nothing");
bprintf("\n");
for (stp = 0; stp < ostackp; stp++) {
for (col = 0; col < marg; col++) bprintf(" ");
obj = ostack[stp];
bprintf(" The %s contains:\n", oname(obj));
/* pbfr();*/
aobjsat(obj, IN_CONTAINER, marg + 8);
}
}
/* Is o1 contained in o2 ?
*/
Boolean iscontin(int o1, int o2)
{
if (ocarrf(o1) != IN_CONTAINER || oloc(o1) != o2)
return False;
if (plev(mynum) < LVL_APPREN && otstbit(o1, OFL_DESTROYED))
return False;
return True;
}
/* The room where an object, or its container or its carrier, are at.
*/
int obj_loc(int obj)
{
for (; ocarrf(obj) == IN_CONTAINER; obj = oloc(obj))
;
return ocarrf(obj) >= CARRIED_BY ? ploc(oloc(obj)) : oloc(obj);
}
/* The 'Find Object By Name' system.
*
* Name can be either 1) <object-number>
* or 2) <object-name>
* or 3) <object-name><number-in-sequence-with-that-name>
*/
static int fobnsys(char *name, int ctrl, int ct_inf, int_set *inv);
int fobn(char *word)
{
int x;
/* Look for all available objects (=in room or inventory)
*/
if ((x = fobna(word)) != -1) return x;
/* we didn't find any available object...look for *any* object
*/
return fobnsys(word, 0, 0, NULL);
}
/* Look for available objects */
int fobna(char *word)
{
int i;
return (i = fobnc(word)) >= 0 ? i : fobnh(word);
}
/* Look for objects contained in ct */
int fobnin(char *word, int ct)
{
return fobnsys(word, 5, ct, oinv(ct));
}
/* look for objects carried by me */
int fobnc(char *word)
{
return fobncb(word, mynum);
}
/* look for objects carried by 'by' */
int fobncb(char *word, int by)
{
return fobnsys(word, 3, by, pinv(by));
}
/* Look for objects that's here */
int fobnh(char *word)
{
return fobnsys(word, 4, ploc(mynum), linv(ploc(mynum)));
}
/* Look for a obj. that's here and not scenery (can be taken) */
int fobn_can_take(char *word)
{
return fobnsys(word, 6, ploc(mynum), linv(ploc(mynum)));
}
static int fobnsys(char *name, int ctrl, int ct_inf, int_set *inv)
{
char b[ONAME_LEN + 1], *p = b;
int i, obj, num;
char *n;
if (name == NULL || strlen(name) > ONAME_LEN) return -1;
while (*name != '\0' && isalpha(*name)) *p++ = *name++;
*p = '\0';
if (isdigit(*name)) {
num = atoi(name);
while (isdigit(*++name));
if (*name != '\0') return -1;
}
else if (*name != '\0') {
return -1;
}
else num = 1;
if (num < 0 || num >= numobs) return -1;
if (*b == '\0') {
switch(ctrl) {
case 0: return num;
case 3: return iscarrby(num, ct_inf) ? num : -1;
case 4: return ishere(num) ? num : -1;
case 5: return iscontin(num, ct_inf) ? num : -1;
case 6: return ishere(num) && !oflannel(num) ? num : -1;
default: return -1;
}
}
if (ctrl == 0) { /* Look for first object with this name*/
for (obj = 0; obj < numobs; obj++) {
n = EQ(b, oname(obj)) ? oname(obj) :
EQ(b, oaltname(obj)) ? oaltname(obj) : NULL;
if (n != NULL && --num == 0) {
cur_player->wd_it = n;
return obj;
}
}
return -1;
}
for (i = 0; i < set_size(inv); i++) {
obj = int_number(i, inv);
n = EQ(b, oname(obj)) ? oname(obj) :
EQ(b, oaltname(obj)) ? oaltname(obj) : NULL;
if (n != NULL) {
cur_player->wd_it = n;
switch (ctrl) {
case 3: /* Look for objects carried by ct_inf */
if (iscarrby(obj, ct_inf) && --num == 0)
return obj;
break;
case 4: /* Look for objects that's here */
if (ishere(obj) && --num == 0)
return obj;
break;
case 5: /* look for objects contained in ct_inf*/
if (iscontin(obj, ct_inf) && --num == 0)
return obj;
break;
case 6: /* objects that are here and gettable */
if (ishere(obj) && !oflannel(obj) && --num ==0)
return obj;
break;
default: return -1;
}
}
}
return -1;
}
/* Find an object's in-game index from its ID.
* Return -1 if not found.
*/
int find_object_by_id(long int id)
{
long int x;
if (id >= 0 && id < num_const_obs) return id;
return (x = lookup_entry(id, &id_table)) == NOT_IN_TABLE
|| x < 0 || x >= numobs ? -1 : x;
}
int get1objfrom(int ob,int container)
{
int l,i;
char *s;
char bf[81];
if (ststflg(mynum, SFL_GHOST)) {
bprintf("Your ghostly fingers pass right through solid objects!\n");
return; }
#ifdef LOCMIN_HEAVEN
if( ob == OBJ_HEAVEN_VASE && state(ob) )
{
bprintf("The vase slips from your hands and crashes to the floor.\n");
bprintf("The reverberations caused by the crash cause the ceiling to "
"cave in!\n");
destroy(ob);
send_msg(ploc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
"%s has left.",pname(mynum));
setploc(mynum,LOC_HEAVEN_1);
lookin(ploc(mynum),0);
broad("You hear ambulance sirens in the distance.\n");
return 0;
}
if ((ob == OBJ_HEAVEN_MJOLNIR) && ((alive((max_players + MOB_HEAVEN_THOR))) == -1) &&
(pscore(max_players + MOB_HEAVEN_THOR) == mynum))
{
questsdone[Q_MJOLNIR] = True;
if (!qtstflg(mynum, Q_MJOLNIR))
{
qsetflg(mynum, Q_MJOLNIR);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX,
NOBODY, NOBODY, "[%s solved the Mjolnir Quest]\n", pname(mynum));
bprintf("You have solved the Mjolnir Quest!\n");
}
}
#endif
#ifdef LOCMIN_NEWBIE
if (ob == OBJ_NEWBIE_DIAMOND)
{
bprintf("The diamond is packed into the wall a little better than you thought.\n");
bprintf("By pulling it out you cause the mine to settle, sealing the tunnel.\n");
setoloc(ob, mynum, CARRIED_BY);
setexit(LOC_NEWBIE_MINE, 0, 0);
}
#endif
#ifdef LOCMIN_LEDGE
if ((ploc(mynum) == LOC_LEDGE_7) && (ob == OBJ_LEDGE_ORB))
{
questsdone[Q_ORB] = True;
if (!qtstflg(mynum, Q_ORB))
{
qsetflg(mynum, Q_ORB);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX,
NOBODY, NOBODY, "[%s solved the Orb Quest]\n", pname(mynum));
bprintf("You have solved the Orb Quest!\n");
}
}
#endif
#ifdef LOCMIN_WINDOW
if (ob == OBJ_WINDOW_ROD)
{
if (alive(i = max_players + MOB_WINDOW_RIATHA) == -1 && pscore(i) == mynum)
{
questsdone[Q_ROD] = True;
if (!qtstflg(mynum, Q_ROD))
{
qsetflg(mynum, Q_ROD);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX, NOBODY, NOBODY, "[%s solved the Rod Quest]\n", pname(mynum));
bprintf("You have solved the Rod Quest!\n");
}
}
}
#endif
#ifdef LOCMIN_ABYSS
if (ob == OBJ_ABYSS_BANK1TIMBER) {
setobjstate(OBJ_ABYSS_BANK1TIMBER, 1);
ob = OBJ_ABYSS_TIMBER;
create(ob);
}
if (ob == OBJ_ABYSS_BANK2TIMBER) {
setobjstate(OBJ_ABYSS_BANK2TIMBER, 1);
ob = OBJ_ABYSS_TIMBER;
create(ob);
}
#endif
#ifdef LOCMIN_ANCIENT
if (ob == OBJ_ANCIENT_SUNDISC && state(ob) == 1) {
if (!iscarrby(OBJ_ANCIENT_ESTONE, mynum) ||
!iscarrby(OBJ_ANCIENT_QFEATHER, mynum)) {
bprintf("You feel that you need more magical equipment "
"than just your hands for this job.\n");
return 0;
}
else {
setobjstate(OBJ_ANCIENT_SUNDISC, 0);
}
}
#endif
#ifdef LOCMIN_OAKTREE /* Ithor. Orig zone from aberIV */
if ((ob == OBJ_OAKTREE_PICTURE) && (state(OBJ_OAKTREE_PICTURE) == 1))
{
bprintf("You uncover a wall safe behind the picture.\n");
send_msg(LOC_OAKTREE_OAKTREE37, 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
"%s uncovers a wall safe behind the picture.\n",pname(mynum));
send_msg(LOC_OAKTREE_OAKTREE37, 0, LVL_MIN, pvis(mynum), mynum, NOBODY,
"Someone uncovers a wall safe behind the picture.\n");
create(OBJ_OAKTREE_SAFE);
setoloc(OBJ_OAKTREE_SAFE, LOC_OAKTREE_OAKTREE37, IN_ROOM);
}
if ((ob == OBJ_OAKTREE_SPIKE) && (!iswornby(OBJ_OAKTREE_GLOVE, mynum)))
{
crapup(" As you touch the spike, you feel a powerful spirit take "
"control of\n your body very briefly before your life winks "
"out like a light...",SAVE_ME);
return 0;
}
#endif
if (ob == OBJ_WINDOW_SHIELD) {
if (ishere(OBJ_WINDOW_SHIELD1)) ob = OBJ_WINDOW_SHIELD1;
else if (ishere(OBJ_WINDOW_SHIELD2)) ob = OBJ_WINDOW_SHIELD2;
else if (container == -1) {
if (otstbit(OBJ_WINDOW_SHIELD1, OFL_DESTROYED))
ob = OBJ_WINDOW_SHIELD1;
else if (otstbit(OBJ_WINDOW_SHIELD2, OFL_DESTROYED))
ob = OBJ_WINDOW_SHIELD2;
if (ob == OBJ_WINDOW_SHIELD1 || ob == OBJ_WINDOW_SHIELD2)
create(ob);
else {
bprintf("The shields are too firmly secured to the walls.\n");
return 0;
}
}
}
if ((otstbit(ob, OFL_NEWBIE)) && (plev(mynum) > LVL_SEVEN) && (plev(mynum) < LVL_EMERITUS))
{
bprintf("A strange force prevents you from picking it up.\n");
return -1;
}
if (oflannel(ob)) {
int i = fobn_can_take(oaltname(ob));
if (i == -1) i = fobn_can_take(oname(ob));
if (i == -1) {
bprintf("You can't take that!\n");
return -1;
} else ob = i;
}
if (container == -1 || !iscarrby(container, mynum)) {
if (dragget())
return -1;
}
if (!cancarry(mynum))
{
bprintf("You can't carry any more.\n");
return -1;
}
if (onum(ob) == OBJ_CASTLE_RUNESWORD && state(ob) == 1 &&
ptothlp(mynum) == -1) {
bprintf("It's too well embedded to shift alone.\n");
return 0;
}
if (ob == OBJ_CATACOMB_CUPSERAPH &&
(l = alive((max_players + MOB_CATACOMB_SERAPH))) != -1 &&
ploc(l) == ploc(mynum)) {
bprintf("\001pThe Seraph\003 says 'Well done, my %s. "
"Truly you are a %s of virtue.'\n",
psex(mynum) ? "daughter" : "son", psex(mynum) ? "woman" : "man");
}
setoloc(ob, mynum, CARRIED_BY);
if (container == -1) {
*bf = '\0';
} else {
sprintf(bf, " from the %s", oname(container));
}
send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
"\001p%s\003 takes the %s%s.\n", pname(mynum), oname(ob), bf);
if (otstbit(ob, OFL_GETFLIPS))
setobjstate(ob, 0);
if ((ploc(mynum) == LOC_TOWER_TREASURE) &&
(state(OBJ_TOWER_DOOR_TREASURE) == 0)) {
setobjstate(OBJ_TOWER_DOOR_TREASURE, 1);
sendf(LOC_TOWER_TREASURE, s = "The door clicks shut...\n");
sendf(obj_loc(olinked(OBJ_TOWER_DOOR_TREASURE)), s); /*Other side of door*/
}
if (ob == OBJ_CATACOMB_CUPSERAPH &&
(l = alive((max_players + MOB_CATACOMB_SERAPH))) != -1 &&
ploc(l) == ploc(mynum)) {
bprintf("The Seraph gestures and you are transported to ...\n");
send_msg( ploc(mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
"%s vanishes, taking \001p%s\003 with him!\n",
pname(l), pname(mynum));
sendf(LOC_START_CHURCH,
"\001p%s\003 appears, accompanied by an angel!\n", pname(mynum));
setploc((max_players + MOB_CATACOMB_SERAPH), LOC_START_CHURCH);
questsdone[Q_GRAIL] = True;
if (!qtstflg(mynum, Q_GRAIL)) {
qsetflg(mynum, Q_GRAIL);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX, NOBODY,
NOBODY, "[%s solved the FindGrail quest]\n",pname(mynum));
bprintf("You have solved the FindGrail Quest!\n");
}
trapch(LOC_START_CHURCH);
return 0;
}
bprintf("Ok\n");
return 0;
}
int getcom(void)
{
CLASS_DATA *cl;
int ob;
int i, m;
int loc;
int container = -1;
char bf[1024];
if (brkword() == -1) {
bprintf("Get what?\n");
return -1;
}
if (isdark()) {
bprintf("It's dark!\n");
return -1;
}
loc = ploc( mynum );
for (i=0; i <lnumchars(loc); i++)
{
m = lmob_nr(i, loc);
if (m >= max_players && m != mynum && alive(m) != -1)
{
if (mtstflg(m, MFL_GRABH))
{
bprintf("%s looks at you and shouts: 'You can't take that!'\n", pname(m));
send_msg(ploc(mynum), MODE_NODEAF, pvis(mynum), LVL_MAX, mynum, NOBODY, "%s looks at %s and shouts: 'You can't take that!'\n",pname (m), pname(mynum));
setpfighting(m, mynum);
setpfighting(mynum, m);
return -1;
}
else if (mtstflg(m, MFL_NOGRAB))
{
bprintf("%s won't let you near it.\n", pname(m));
return -1;
}
}
}
if ((cl = findclass(wordbuf)) != NULL) {
getall(cl);
return 0;
}
ob = fobnh(wordbuf);
/* Hold */
i = stp;
strcpy(bf, wordbuf);
if (brkword() != -1 && (EQ(wordbuf, "from") || EQ(wordbuf, "out"))) {
if (brkword() == -1) {
bprintf("From what?\n");
return -1;
}
if ((container = fobna(wordbuf)) == -1) {
bprintf("You can't take things from that! It's not here!\n");
return -1;
}
if (otstbit(container, OFL_LOCKABLE) &&
state(container) == 2 && !ohany(1<<OFL_KEY)) {
bprintf("The %s is locked, and you have no key.\n", oname(container));
return -1;
}
if ((otstbit(container, OFL_OPENABLE) || otstbit(container, OFL_LOCKABLE))
&& state(container) > 0) {
bprintf("You open the %s.\n", oname(container));
setobjstate(container, 0);
}
ob = fobnin(bf, container);
}
stp = i;
if (ob == -1) {
bprintf("It's not here.\n");
return -1;
}
/* Mithdan Druids get PO'd if you take their statue. */
#ifdef LOCMIN_MITHDAN
if ((ob == OBJ_MITHDAN_CRYSTAL) && (state (OBJ_MITHDAN_CRYSTAL) == 1))
{
setploc(MOB_MITHDAN_DRUID + max_players, oloc(OBJ_MITHDAN_CRYSTAL));
setploc(MOB_MITHDAN_DRUID2 + max_players, oloc(OBJ_MITHDAN_CRYSTAL));
bprintf("The druids, angered at you for defiling their sacred relic, shout an\n");
bprintf("ancient oath and leap towards you.\n");
send_msg (ploc(mynum),0,pvis(mynum), LVL_MAX,mynum,NOBODY,
"A pair of druids appear on each side of %s and attack!\n",pname(mynum));
setpagg (MOB_MITHDAN_DRUID + max_players, 100);
setpagg (MOB_MITHDAN_DRUID2 + max_players, 100);
setpspeed (MOB_MITHDAN_DRUID + max_players, 0);
setpspeed (MOB_MITHDAN_DRUID2 + max_players, 0);
setobjstate (OBJ_MITHDAN_CRYSTAL, 0);
hit_player (MOB_MITHDAN_DRUID + max_players, mynum, -1);
hit_player (MOB_MITHDAN_DRUID2 + max_players, mynum, -1);
}
#endif
return get1objfrom(ob,container);
}
static void getall(CLASS_DATA *cl)
{
int x;
if (brkword() != -1) {
getallfr(cl);
return;
}
for (x = lfirst_obj(ploc(mynum)); x != SET_END; x=lnext_obj(ploc(mynum))) {
if (ishere(x) && !oflannel(x) && classmatch(x, cl)) {
strcpy(strbuf, oname(x));
stp = 0;
bprintf("%s: ", oname(x));
if (getcom() == -1)
break;
}
}
}
static void getallfr(CLASS_DATA *cl)
{
int container;
int ob;
if (EQ(wordbuf,"from")) {
if (brkword() == -1) {
bprintf("From what?\n");
return;
}
}
if ((container = fobna(wordbuf)) == -1) {
bprintf("That isn't here.\n");
return;
}
/* Do items */
for (ob = ofirst_obj(container); ob != SET_END; ob = onext_obj(container)){
if (iscontin(ob, container) && !oflannel(ob) && classmatch(ob, cl)) {
sprintf(strbuf, "%s from %s", oname(ob), oname(container));
stp = 0;
bprintf("%s: ", oname(ob));
if (getcom() == -1)
break;
}
}
}
static void dropall(CLASS_DATA *cl)
{
int ob;
for (ob = pfirst_obj(mynum); ob != SET_END; ob = pnext_obj(mynum)) {
if (iscarrby(ob, mynum) && classmatch(ob, cl)) {
strcpy(strbuf, oname(ob));
stp = 0;
bprintf("%s: ", oname(ob));
if (dropobj(-1) == -1)
return;
}
}
}
/* Is the item in the same room as the player ?
*/
Boolean p_ishere(int plr,int item)
{
if (plev(plr) < LVL_APPREN && otstbit(item, OFL_DESTROYED))
return False;
if (ocarrf(item) != IN_ROOM || oloc(item) != ploc(plr)
|| ploc(plr) == 0)
return False;
return True;
}
Boolean ishere(int item)
{
return p_ishere(mynum,item);
}
Boolean iscarrby(int item, int user)
{
/*****************8
if (plev(mynum) < LVL_APPREN && otstbit(item, OFL_DESTROYED))
return False;
*******************/
if (user < max_players && plev(user) < LVL_APPREN && otstbit(item, OFL_DESTROYED))
return False;
if (ocarrf(item) < CARRIED_BY)
return False;
if (oloc(item) != user)
return False;
return True;
}
/* Is the object in a players inventory ?
* (also handles objects in a container in a container etc...)
*/
Boolean in_inventory(int obj, int player)
{
while (ocarrf(obj) == IN_CONTAINER) obj = oloc(obj);
return iscarrby(obj, player);
}
int dropobj(int obj)
{
CLASS_DATA *cl;
int a, i, l, j;
if(obj == -1) {
if (brkword() == -1) {
bprintf("Drop what?\n");
return -1;
}
if ((cl = findclass(wordbuf)) != NULL) {
dropall(cl);
return 0;
}
if ((a = fobnc(wordbuf)) == -1) {
bprintf("You don't have it.\n");
return -1;
}
} else a = obj;
if (plev(mynum) < LVL_APPREN && onum(a) == OBJ_CASTLE_RUNESWORD) {
bprintf("You can't let go of it!\n");
return 0;
}
if (a == OBJ_CATACOMB_CUPSERAPH
&& ploc((max_players + MOB_CATACOMB_SERAPH)) == LOC_START_CHURCH)
setplev((max_players + MOB_CATACOMB_SERAPH), -2);
l = ploc(mynum);
/* MINE LADDER */
if (l == LOC_QUARRY_4 || l == LOC_QUARRY_5)
{
bprintf("The %s falls down the ladder.\n", oname(a));
l = LOC_QUARRY_9;
}
if ((l >= LOC_QUARRY_16 && l <= LOC_QUARRY_14) ||
(l >= LOC_QUARRY_10 && l <= LOC_QUARRY_9))
{
bprintf("The %s falls down the ladder.\n", oname(a));
l = LOC_QUARRY_8;
}
/* ALL AT SEA */
if (ltstflg(l, LFL_ON_WATER) && onum(a) != OBJ_VILLAGE_BOAT &&
onum(a) != OBJ_VILLAGE_RAFT && onum(a) != OBJ_ANCIENT_CANOE) {
bprintf("The %s sinks into the sea.\n", oname(a));
l = LOC_SEA_7;
}
#ifdef LOCMIN_RHOME
if ((onum(a) == OBJ_RHOME_INVRING) && (EQ(pname(mynum), "Rex"))) {
send_msg (ploc(mynum),0,pvis(mynum), LVL_MAX,mynum,NOBODY,
"%s drops the %s.\n",pname(mynum),oname(a));
setpvis (mynum, 0);
setoloc(a, ploc(mynum), IN_ROOM);
bprintf("You drop the ring.\n");
return 0;
}
#endif
#ifdef LOCMIN_ABYSS
if (a == OBJ_ABYSS_TIMBER)
if (ploc(mynum) == LOC_ABYSS_BANK1) {
setobjstate(OBJ_ABYSS_BANK1TIMBER, 0);
setoloc(a, ploc(mynum), IN_ROOM);
destroy(a);
bprintf("You place the timber across the river of slime.\n");
return 0;
}
if (a == OBJ_ABYSS_TIMBER)
if (ploc(mynum) == LOC_ABYSS_BANK2) {
setobjstate(OBJ_ABYSS_BANK2TIMBER, 0);
setoloc(a, ploc(mynum), IN_ROOM);
destroy(a);
bprintf("You place the timber across the river of slime.\n");
return 0;
}
#endif
/* OAKTREE */
if ((l >= LOC_OAKTREE_MAGNOLIA && l <= LOC_OAKTREE_TREE1)
|| l == LOC_OAKTREE_ILEX
|| (l >= LOC_OAKTREE_WALNUT && l <= LOC_OAKTREE_FIG)) {
bprintf("The %s falls through the leaves to the ground far below.\n",
oname(a));
l = LOC_OAKTREE_GROVE;
sendf(l, "Something falls to the ground.\n");
}
for (j = 0; (i = pits[j++]) != -1;)
if (oloc(i) == l)
break;
if ((i >= 0 && state(i) == 0) || oloc(OBJ_SEA_HOLE) == l) {
bprintf("The %s disappears into the bottomless pit.....\n", oname(a));
send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
"\001p%s\003 drops the %s into the pit.\n",
pname(mynum), oname(a));
dropinpit(a);
return 0;
}
else if (i >= 0) {
bprintf("The %s disappears into the bottomless pit....."
"and hits bottom.\n", oname(a));
send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
"\001p%s\003 drops the %s into the pit.\n",
pname(mynum), oname(a));
l = LOC_CATACOMB_CHAMBER;
setoloc(a, l, IN_ROOM); /* to spherical room in CATACOMB section */
sendf(l, "Something falls to the ground.\n");
return 0;
}
setoloc(a, l, IN_ROOM);
send_msg(ploc(mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY,
"\001p%s\003 drops the %s.\n", pname(mynum), oname(a));
if ((l = (ploc(mynum))))
bprintf("Ok\n");
return 0;
}
void dropinpit(int o)
{
int i;
setpscore(mynum, pscore(mynum) + ovalue(o));
calib_player(mynum);
if (otstbit(o, OFL_PITRESET))
{
osetbaseval(o, 0);
setoloc(o, LOC_START_DONATION, IN_ROOM);
}
/*
if (otstbit(o, OFL_PITRESET))
{
if(inorigloc(o))
{
osetbaseval(o, 0);
}
else if (!reset_object(o))
{
osetbit(o, OFL_DESTROYED);
setoloc(o, LOC_PIT_PIT, IN_ROOM);
}
else osetbaseval(o, 0);
}
*/
else
{
osetbit(o, OFL_DESTROYED);
setoloc(o, LOC_PIT_PIT, IN_ROOM);
}
#ifdef LOCMIN_WASTE
if (o == OBJ_WASTE_THRONE)
{
if (alive(i = max_players + MOB_WASTE_DJINNI) == -1 &&
pscore(i) == mynum)
{
questsdone[Q_FIERY_KING] = True;
if (!qtstflg(mynum, Q_FIERY_KING))
{
qsetflg(mynum, Q_FIERY_KING);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX, NOBODY,
NOBODY, "[%s solved the Greatsword Quest]\n", pname(mynum));
bprintf("You have solved the Greatsword Quest!\n");
}
}
}
#endif
#ifdef LOCMIN_OAKTREE
else if (o == OBJ_OAKTREE_MARBLEBUST)
{
questsdone[Q_BUST] = True;
if (!qtstflg(mynum, Q_BUST))
{
qsetflg(mynum, Q_BUST);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX,
NOBODY, NOBODY, "[%s solved the Bust Quest]\n", pname(mynum));
bprintf("You have solved the Bust Quest!\n");
}
}
#endif
else if (o == OBJ_OAKTREE_SPIKE)
{
if (alive(i = max_players + MOB_OAKTREE_SAPLING) == -1 &&
pscore(i) == mynum)
{
questsdone[Q_SPIKE] = True;
if (!qtstflg(mynum, Q_SPIKE))
{
qsetflg(mynum, Q_SPIKE);
send_msg(DEST_ALL, MODE_QUIET|MODE_COLOR, LVL_APPREN, LVL_MAX,
NOBODY, NOBODY, "[%s solved the Spike Quest]\n", pname(mynum));
bprintf("You have solved the Spike Quest!\n");
}
}
}
if (otstbit(o, OFL_CONTAINER))
{
for (i = ofirst_obj(o); i != SET_END; i = onext_obj(o))
if (iscontin(i, o))
{
dropinpit(i);
}
}
}
/* List the objects at the current players location.
*/
void list_objects(int n, Boolean f)
{
int i, a;
for (i = 0; i < lnumobs(ploc(mynum)); i++) {
a = lobj_nr(i, ploc(mynum));
if (ishere(a) && (n == 0 || otstmask(a,n) == f)) {
if (state(a) > 3)
continue;
if (!EMPTY(olongt(a, state(a)))) {
if (otstbit(a, OFL_DESTROYED))
bprintf("--");
oplong(a);
cur_player->wd_it = oname(a);
} else if (plev(mynum) >= LVL_ARCHWIZARD) {
bprintf("<marker>%s\n", oname(a));
}
}
}
}
void dumpitems()
{
dumpstuff(mynum, ploc(mynum));
}
void dumpstuff(int n, int loc)
{
int b;
for (b = pfirst_obj(n); b != SET_END; b = pnext_obj(n))
if (iscarrby(b, n)) {
if (loc == LOC_PIT_PIT)
dropinpit(b);
else
setoloc(b, loc, IN_ROOM);
}
}
/* Set a players weapon. Sets both the carry-flag of the weapon and the
* 'pweapon' entry for that player in the world. A negative value removes
* any current weapon. Return True if a new weapon got set for the player,
* else False.
*/
Boolean set_weapon(int plr, int wpn)
{
int owpn, i;
/* Erase any weapon we were already wielding:
*/
if ((owpn = pwpn(plr)) != -1 && oloc(owpn) == plr) {
if (ocarrf(owpn) == BOTH_BY)
setcarrf(owpn, WORN_BY);
else if (ocarrf(owpn) == WIELDED_BY)
setcarrf(owpn, CARRIED_BY);
}
if (wpn < 0 || odamage(wpn) == 0 || ocarrf(wpn) < CARRIED_BY
|| oloc(wpn) != plr) {
setpwpn(plr, -1);
return False;
}
i = WIELDED_BY;
if (ocarrf(wpn) == WORN_BY) i = BOTH_BY;
setpwpn(plr, wpn);
setcarrf(wpn, i);
return True;
}
void oplong(int x)
{
char *t = olongt(x, state(x));
if (!EMPTY(t)) {
bprintf("%s\n", t);
}
}
int gotanything(int x)
{
int ct;
for (ct = 0; ct < pnumobs(x); ct++) {
if (iscarrby( pobj_nr(ct, x), x)) return 1;
}
return 0;
}
CLASS_DATA *findclass(char *n)
{
CLASS_DATA *cl;
for (cl = class_data; cl->class_name != NULL; cl++) {
if (EQ(cl->class_name,n)) return cl;
}
return NULL;
}
static Boolean classmatch(int ob, CLASS_DATA *cl)
{
register short st;
return (cl == NULL ||
((st = cl->class_state) < 0 || ((st == state(ob)) &&
otstmask(ob,cl->class_mask))));
}
/* Can player 'plyr' carry any more objects now ?
*/
Boolean cancarry(int plyr)
{
int i, a;
int num = 0;
if (plev(plyr) >= LVL_APPREN || plyr >= max_players)
return True;
for (i = 0; i < pnumobs(plyr); i++) {
a = pobj_nr(i, plyr);
if (iscarrby(a, plyr) && !iswornby(a, plyr)) num++;
}
return num < plev(plyr) + 5;
}
int iswornby( int ob, int plr)
{
return isworn(ob) && iscarrby(ob, plr);
}
/* Is object 'ob' available ?
*/
Boolean isavl(int ob)
{
return ishere(ob) || iscarrby(ob, mynum);
}
/* Try to reset an object, return True on success.
*/
Boolean reset_object(int o)
{
int loc;
osetbaseval(o, ovalue_reset(o));
osetsize(o, osize_reset(o));
osetvis(o, ovis_reset(o));
osetdamage(o, odamage_reset(o));
osetarmor(o, oarmor_reset(o));
state(o) = state_reset(o);
obits(o) = obits_reset(o);
loc = 0;
if (!opermanent(o)) {
if (ocarrf_reset(o) == IN_ROOM) {
if ((loc = find_loc_by_id(oloc_reset(o))) == 0) {
destroy(o);
return False;
}
}
else
if (ocarrf_reset(o) == IN_CONTAINER) {
if ((loc = find_object_by_id(oloc_reset(o))) < 0) {
destroy(o);
return False;
}
}
else
if (ocarrf_reset(o) >= CARRIED_BY) {
if ((loc = find_mobile_by_id(oloc_reset(o))) < 0) {
destroy(o);
return False;
}
}
} else {
loc = oloc_reset(o);
if (ocarrf_reset(o) >= CARRIED_BY) loc += max_players;
}
setoloc(o, loc, ocarrf_reset(o));
return True;
}
void setobjstate(int obj, int state)
{
if (state >= 0 && state <= omaxstate(obj)
&& (olinked(obj) == -1 || state <= omaxstate(olinked(obj)))) {
state(obj) = state;
if (olinked(obj) != -1) {
state( olinked(obj) ) = state;
}
} else {
mudlog( "Attempt to set object %s[%d] to state %d",
oname(obj), obj, state);
}
}
void destroy(int ob)
{
osetbit(ob, OFL_DESTROYED);
setoloc(ob, LOC_DEAD_DESTROYED, IN_ROOM);
}
void eat(int ob)
{
if (!opermanent(ob) && otemporary(ob)) {
destruct_object(ob, NULL);
}
else {
osetbit(ob, OFL_DESTROYED);
setoloc(ob, LOC_DEAD_EATEN, IN_ROOM);
}
}
void create(int ob)
{
oclrbit(ob, OFL_DESTROYED);
}
/* SET Object LOCation.
*/
void setoloc(int obj, int loc, int c)
{
/* First remove the object from wherever it is:
*/
switch( ocarrf(obj) ) {
case IN_ROOM:
if (exists(oloc(obj))) remove_int(obj, linv(oloc(obj)));
break;
case IN_CONTAINER:
if (oloc(obj) >= 0 && oloc(obj) < numobs)
remove_int(obj, oinv(oloc(obj)));
break;
case CARRIED_BY:
case WORN_BY:
case WIELDED_BY:
case BOTH_BY:
if (oloc(obj) >= 0 && oloc(obj) < numchars)
remove_int(obj, pinv(oloc(obj)));
break;
}
/* Then add it to the right place:
*/
switch(c) {
case IN_ROOM:
if (exists(loc)) add_int(obj, linv(loc));
break;
case IN_CONTAINER:
if (loc >= 0 && loc < numobs) add_int(obj, oinv(loc));
break;
case CARRIED_BY:
case WORN_BY:
case WIELDED_BY:
case BOTH_BY:
if (loc >= 0 && loc < numchars) add_int(obj, pinv(loc));
break;
}
oloc(obj) = loc;
ocarrf(obj) = c;
if (c >= WIELDED_BY) set_weapon(loc, obj);
}
/* is there an object, either carried by the player or in the same
* room that satisfies certain criteria (determined by mask) ?
*/
Boolean p_ohany(int plr,int mask)
{
int i, a;
mask &= 0xffff;
for (i = 0; i < lnumobs(ploc(plr)); i++) {
a = lobj_nr(i, ploc(plr));
if (p_ishere(plr, a) && (obits(a) & mask)) return True;
}
for (i = 0; i < pnumobs(plr); i++) {
a = pobj_nr(i, plr);
if (iscarrby(a, plr) && (obits(a) & mask)) return True;
}
return False;
}
Boolean ohany(int mask)
{
return p_ohany(mynum,mask);
}
int ovalue(int ob)
{
return (tscale() * obaseval(ob) / 9);
}
char *xdesloc(char *b, int loc, int cf)
{
char k[256];
char v[256];
char buff[256];
*buff = '\0';
while (cf == IN_CONTAINER) {
sprintf(v,"In the %s ", oname(loc));
strcat(buff, v);
cf = ocarrf(loc);
loc = oloc(loc);
}
if (cf >= CARRIED_BY) {
if (cf == CARRIED_BY) strcat(buff, "Carried");
if (cf == WORN_BY) strcat(buff, "Worn");
if (cf == WIELDED_BY) strcat(buff, "Wielded");
if (cf == BOTH_BY) strcat(buff, "Worn & Wielded");
sprintf(v," by %s ", see_name(mynum, loc));
strcat(buff, v);
loc = ploc(loc);
}
if (!exists(loc)) {
if (plev(mynum) < LVL_GOD) return strcpy(b,"Out in the void");
else {
sprintf(b,"NOT IN UNIVERSE[%d]", loc);
return b;
}
}
if (*buff != '\0') strcat(buff, "in ");
if (plev(mynum) >= LVL_APPREN)
sprintf(v, "| %s", xshowname(k,loc));
else
*v = '\0';
strcat(buff, sdesc(loc));
sprintf(b,"%-40.40s%s", buff, v);
return b;
}
void desloc(int loc, int cf)
{
char b[512];
bprintf("%s\n", xdesloc(b,loc,cf));
}
Boolean otstmask(int ob, int v)
{
return tstbits(obits(ob),v);
}
/* Will the container x hold object y ?
*/
Boolean willhold(int x, int y)
{
int i, a, sum = 0;
for (i = 0; i < onumobs(x); i++) {
a = oobj_nr(i, x);
if (iscontin(a, x)) sum += osize(a);
}
sum += osize(y);
return sum <= osize(x);
}
int ohereandget(void)
{
int obj;
if (EMPTY(item1)) {
bprintf("Tell me more?\n");
return -1;
}
if ((obj = ob1) == -1) {
bprintf("It isn't here.\n");
}
return obj;
}
/* plx drops the objects that he carries that are not worn or wielded,
*/
void drop_some_objects(int plx)
{
int obj;
for (obj = pfirst_obj(plx); obj != SET_END; obj = pnext_obj(plx)) {
if (ocarrf(obj) == CARRIED_BY && oloc(obj) == plx) {
setoloc(obj, ploc(plx), IN_ROOM);
}
}
}
char *xdesrm(char *b, int loc, int cf)
{
char k[25];
char v[30];
if (plev(mynum) < LVL_APPREN && cf == IN_ROOM && loc == LOC_LIMBO_LIMBO) {
return strcpy(b,"Somewhere.....");
}
if (cf == IN_CONTAINER) {
sprintf(b,"In the %s", oname(loc));
return b;
}
if (cf >= CARRIED_BY) {
if (!seeplayer(loc))
return strcpy(b,"Somewhere.....");
else {
sprintf(b,"Carried by %s", pname(loc));
return b;
}
}
if (!exists(loc)) {
if (plev(mynum) < LVL_ARCHWIZARD)
return strcpy(b,"Out in the void");
else {
sprintf(b,"NOT IN UNIVERSE[%d]", loc);
return b;
}
}
if (plev(mynum) >= LVL_APPREN)
sprintf(v, "| %s", xshowname(k,loc));
else
*v = 0;
sprintf(b,"%-30s%s", sdesc(loc), v);
return b;
}
void desrm(int loc, int cf)
{
char b[80];
bprintf("%s\n", xdesrm(b,loc,cf));
}
/*
void print_inventory(int who)
{
int wielded = -1;
char outline[256];
int obj;
int_set *inv = pinv(who);
int len = 0;
int xen = 0;
Boolean first = True;
int o1, o2;
wielded = pwpn(who);
if (first_obj(inv) == SET_END) {
if (who == mynum) bprintf("You are not carrying anything.\n");
return;
}
o1 = first_obj(inv);
o2 = next_obj(inv);
if ((o1 == wielded && o2 > -1) || (o1 != wielded))
bprintf("%s %s carrying:\n",
who == mynum ? "You" : psex(who) ? "She" : "He",
who == mynum ? "are" : "is");
bprintf(" ");
for (obj = first_obj(inv); obj != SET_END; obj = next_obj(inv)) {
if (obj == wielded && iswielded(obj)) continue;
sprintf(outline,"%s%s", otstbit(obj,OFL_DESTROYED) ? "(" : "",
oname(obj));
if (isworn(obj)) {
strcat(outline, " <worn> ");
outline[strlen(outline) - 1] = '\0';
}
xen = strlen(outline);
len += xen;
len += 2;
if (len >= 70) {
bprintf("\n ");
len = xen + 3;
first = True;
}
if (otstbit(obj, OFL_LIT)) strcat(outline, " <lit>");
if (otstbit(obj,OFL_DESTROYED)) strcat(outline,")");
if (first) bprintf("%s",outline);
else bprintf(", %s",outline);
first = False;
}
bprintf("\n");
if (wielded >= 0 && iswielded(wielded)) {
bprintf("%s %s %s %s drawn and ready for battle.\n",
who == mynum ? "You" : pname(who),
who == mynum ? "have" : "has",
who == mynum ? "your" : psex(who) ? "her" : "his",
oname(wielded));
}
}
*/
void print_inventory(int who)
{
int obj, len=0, xen, weapon=-1, found=0;
char outline[256];
int_set *inv = pinv(who);
for (obj=first_obj(inv); obj!=SET_END; obj=next_obj(inv)) {
int started = 0;
if (otstbit(obj, OFL_DESTROYED) && plev(mynum) < LVL_APPREN)
continue;
if (obj == pwpn(who) && iswielded(obj)) {
weapon = pwpn(who);
continue;
}
sprintf (outline,"%s%s", otstbit(obj,OFL_DESTROYED) ? "(" : "",
oname(obj));
if (isworn(obj)) {
strcat (outline, " &+G<worn&*");
started = 1;
}
if (otstbit(obj, OFL_LIT)) {
if (!started)
strcat (outline, " &+Y<&*");
else
strcat (outline, ",");
started = 1;
strcat (outline, "&+Ylit&*");
}
if (started)
strcat (outline, "&+Y>&*");
if (otstbit(obj,OFL_DESTROYED)) strcat(outline,")");
xen = strlen(outline);
if (!found) {
bprintf ("%s %s carrying:\n %s", who == mynum ? "You" : he_or_she(who),
who == mynum ? "are" : "is", outline);
len = 3 + xen;
found = 1;
} else if (len + xen+2 >= 75) {
bprintf (",\n %s", outline);
len = 3 + xen;
} else {
bprintf (", %s", outline);
len += xen+2;
}
}
if (found)
bprintf ("\n");
else if (who == mynum)
bprintf ("You are not carrying anything.\n");
if (found && (who == mynum || plev(mynum) >= LVL_APPREN)) {
int obj2;
int_set *inv2;
for (obj=first_obj(inv); obj!=SET_END; obj=next_obj(inv)) {
if (otstbit(obj, OFL_DESTROYED) && plev(mynum) < LVL_APPREN)
continue;
if (otstbit(obj, OFL_CONTAINER)) {
inv2 = oinv(obj);
found = 0;
for (obj2=first_obj(inv2); obj2!=SET_END; obj2=next_obj(inv2)) {
if (otstbit(obj2, OFL_DESTROYED) && plev(mynum) < LVL_APPREN)
continue;
sprintf (outline, "%s%s%s", otstbit(obj2, OFL_DESTROYED) ? "(" : "",
oname(obj2), otstbit(obj2, OFL_DESTROYED) ? ")" : "");
xen = strlen (outline);
if (!found) {
bprintf (" The %s contains:\n %s", oname(obj), outline);
len = 6 + xen;
found = 1;
} else if (len + xen+2 >= 75) {
bprintf (",\n %s", outline);
len = 6 + xen;
} else {
bprintf (", %s", outline);
len += xen+2;
}
}
if (found)
bprintf ("\n");
}
}
}
if (weapon != -1)
bprintf("&+R%s %s %s %s drawn and ready for battle.&*\n",
who == mynum ? "You" : pname(who), who == mynum ? "have" : "has",
who == mynum ? "your" : his_or_her(who), oname(weapon));
}
void
equipcom ()
{
int who;
int weapon = -1, light = -1, olight = 0, found = 0;
int num_ofl = WEAR_LAST - WEAR_OFFSET + 1,
wornset[WEAR_LAST - WEAR_OFFSET + 1][10];
int i, j, obj;
int_set *inv;
if (EMPTY(item1))
who = mynum;
else if (pl1 == -1) {
bprintf ("No one with that name is playing.\n");
return;
} else if (plev(mynum) < LVL_APPREN && ploc(pl1) != ploc(mynum)) {
bprintf ("%s's not here!\n", he_or_she(pl1));
return;
} else
who = pl1;
inv = pinv(who);
for (i=0; i<num_ofl; i++)
for (j=0; j<10; j++)
wornset[i][j] = -1;
for (obj = first_obj(inv); obj != SET_END; obj = next_obj(inv))
if (obj == pwpn(who) && iswielded(obj)) {
weapon = obj;
found = 1;
} else if (isworn(obj)) {
for (i=0; i<num_ofl && !otstbit(obj,WEAR_OFFSET+i); i++);
if (i >= num_ofl)
mudlog ("case slip in equipcom, no match for wear type");
else {
for (j=0; j<10 && wornset[i][j]!=-1; j++);
if (j<10)
wornset[i][j] = obj;
found = 1;
}
} else if (light == -1 && otstbit(obj, OFL_LIT)) {
light = obj;
found = 1;
}
if (!found) {
bprintf ("&+B%s %s nothing equipped.&*\n",
who == mynum ? "You" : pname(who),
who == mynum ? "have" : "has");
return;
}
bprintf ("&+B%s %s equipped:&*\n",
who == mynum ? "You" : pname(who),
who == mynum ? "have" : "has");
if (weapon != -1) {
bprintf (" &+G<wielded>&* : %s", oname(weapon));
if (otstbit(weapon, OFL_LIT)) {
bprintf (" (providing light)");
olight = 1;
}
bprintf ("\n");
}
for (i=0; i<num_ofl; i++)
for (j=0; j<10 && wornset[i][j]!=-1; j++) {
int valid = 1;
switch (i + WEAR_OFFSET) {
case OFL_WEARONHEAD:
bprintf (" <worn on head> : ");
break;
case OFL_WEARONFACE:
bprintf (" <worn over face> : ");
break;
case OFL_WEARONNECK:
bprintf (" <worn around neck> : ");
break;
case OFL_WEARONARMS:
bprintf (" <worn on arms> : ");
break;
case OFL_WEARONHANDS:
bprintf (" <worn on hands> : ");
break;
case OFL_WEARONBODY:
bprintf (" <worn on body> : ");
break;
case OFL_WEARONBACK:
bprintf (" <worn over back> : ");
break;
case OFL_WEARONLEGS:
bprintf (" <worn on legs> : ");
break;
case OFL_WEARONFEET:
bprintf (" <worn on feet> : ");
break;
default:
mudlog ("case slip in equipcom");
valid = 0;
}
if (valid) {
bprintf ("%s", oname(wornset[i][j]));
if (otstbit(wornset[i][j], OFL_LIT)) {
bprintf (" (providing light)");
olight = 1;
}
bprintf ("\n");
}
}
if (light != -1 && !olight)
bprintf (" &+Y<providing light>&* : %s\n", oname(light));
}
void lockcom()
{
if (ob1 == -1)
{
bprintf("Lock what?\n");
return;
}
if (ststflg(mynum, SFL_GHOST)) {
bprintf("Your ghostly fingers pass right through solid objects!\n");
return; }
switch (ob1)
{
default:
if (!otstbit(ob1, OFL_LOCKABLE))
bprintf("You can't lock that!\n");
else if (state(ob1) > 1)
bprintf("It's already locked.\n");
else if (!ohany (1<<OFL_KEY))
bprintf("You have no key.\n");
else
{
setobjstate(ob1, 2);
bprintf("OK.\n");
}
}
}
void unlockcom()
{
if (ob1 == -1)
{
bprintf("What do you want to unlock?\n");
return;
}
if (ststflg(mynum, SFL_GHOST)) {
bprintf("Your ghostly fingers pass right through solid objects!\n");
return; }
switch (ob1)
{
default:
if (!otstbit(ob1, OFL_LOCKABLE))
bprintf("You can't unlock that!\n");
else if (state(ob1) == 1)
bprintf("It's already unlocked.\n");
else if (!ohany (1<<OFL_KEY))
bprintf("You have no key.\n");
else
{
setobjstate(ob1, 1);
bprintf("Ok.\n");
}
}
}
void closecom()
{
if (ob1 == -1)
{
bprintf("What would you like to close?\n");
return;
}
if (ststflg(mynum, SFL_GHOST)) {
bprintf("Your ghostly fingers pass right through solid objects!\n");
return; }
switch (ob1)
{
case OBJ_START_UMBRELLA:
bprintf("You close the umbrella.\n");
setobjstate(OBJ_START_UMBRELLA, 0);
break;
default:
if (!otstbit (ob1, OFL_OPENABLE))
bprintf("You can't close that!\n");
else if (state(ob1) > 0)
bprintf("It's already closed.\n");
else
{
setobjstate(ob1, 1);
bprintf("You close the %s.\n", oname(ob1));
}
}
}
void opencom()
{
char *cant_open ="You can't open that!\n";
if (ob1 == -1)
{
bprintf("What would you like to open?\n");
return;
}
if (ststflg(mynum, SFL_GHOST)) {
bprintf("Your ghostly fingers pass right through solid objects!\n");
return; }
switch(ob1)
{
case OBJ_FOREST_TREEEATING:
case OBJ_FOREST_INSIDETREE:
bprintf("You can't shift the tree!\n");
break;
case OBJ_VILLAGE_BOT_BOARDS:
case OBJ_VILLAGE_TOP_BOARDS:
bprintf("You shift the floorboards, with much heaving and tugging, to "
"reveal an exit\nbeyond.\n");
setobjstate(OBJ_VILLAGE_TOP_BOARDS, 0);
break;
case OBJ_TOWER_DOOR_SHAZARETH:
if (state(ob1) >= 1)
bprintf("It seems to be magically closed.\n");
else
bprintf("It's already open.\n");
break;
case OBJ_TOWER_DOOR_TREASURE:
bprintf("You can't shift the door at all from this side.\n");
break;
case OBJ_START_UMBRELLA:
bprintf("You open the umbrella.\n");
setobjstate(OBJ_START_UMBRELLA, 1);
break;
default:
if (!otstbit (ob1, OFL_OPENABLE))
bprintf("%s", cant_open);
else if (state(ob1) == 0)
bprintf("It's already open.\n");
else if (state(ob1) == 1)
{
bprintf("You open the %s.\n", oname(ob1));
setobjstate(ob1, 0);
}
else if (state(ob1) == 2)
if (!ohany (1<<OFL_KEY))
bprintf("It seems to be locked.\n");
else
{
bprintf("Ok.\n");
setobjstate(ob1, 0);
}
break;
}
}
void wearall(void)
{
int reg[1024], arm[1024], reg_len = 0, arm_len = 0;
int ob;
for(ob = 0; ob < numobs; ob++)
if(in_inventory(ob, mynum) && is_wearable(ob) && !iswornby(ob, mynum))
if(otstbit(ob, OFL_ARMOR)) arm[arm_len++] = ob;
else reg[reg_len++] = ob;
/* qsort(reg, reg_len, sizeof(int), cmp_reg_obj);
* qsort(arm, arm_len, sizeof(int), cmp_arm_obj); :P Rex
*/
for(ob = 0; ob < arm_len; ob++)
trywear(arm[ob], False);
for(ob = 0; ob < reg_len; ob++)
trywear(reg[ob], False);
}