#include <stdlib.h> #include "kernel.h" #include "objects.h" #include "mobiles.h" #include "mobile.h" #include "locations.h" #include "sflags.h" #include "pflags.h" #include "mflags.h" #include "oflags.h" #include "lflags.h" #include "cflags.h" #include "eflags.h" #include "quests.h" #include "sendsys.h" #include "levels.h" #include "parse.h" #include "objsys.h" #include "oflagnames.h" #include "rooms.h" #include "objsys.h" #include "bprintf.h" #include "fight.h" #include "commands.h" #include "log.h" #include "clone.h" typedef struct { char *class_name; long class_mask; short class_state; } CLASS_DATA; static int value_class (CLASS_DATA * cl, int plx, Boolean silent); static CLASS_DATA *findclass (char *n); 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 CLASS_DATA class_data[] = { {"clothing", 1 << OFL_WEARABLE, -2}, {"weapons", 1 << OFL_WEAPON, -1}, {"containers", 1 << OFL_CONTAINER, -1}, {"food", 1 << OFL_FOOD, -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}; Boolean ispit (register int o) { register int i = 0; register int j; while ((j = pits[i++]) != o && j != -1) ; return (j >= 0); } void givecom (void) { int a, c; if (EMPTY (item1)) { bprintf ("Give what to who?\n"); return; } if (pl1 != -1) { 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; } if ((c = ob2) == -1) { bprintf ("You don't have it.\n"); return; } dogive (c, a); return; } if ((a = ob1) == -1) { bprintf ("You don't have any %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); } void dogive (int ob, int pl) { int i, j, o = 0; if (plev (mynum) < LVL_WIZARD && ploc (pl) != ploc (mynum)) { bprintf ("They aren't here.\n"); return; } if (!iscarrby (ob, mynum)) { bprintf ("You don't have any %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_RUINS if (pnum (pl) == MOB_RUINS_ZEPHERE && onum (ob) == OBJ_RUINS_HORN) { bprintf ("Zephere smiles at you and thanks you for the horn.\n"); if (!etstflg (mynum, EFL_BLUR)) { bprintf ("In return for your kindness, he teaches you the BLUR spell!\n"); esetflg (mynum, EFL_BLUR); } } #endif #ifdef LOCMIN_FANTASY if (pnum (pl) == MOB_FANTASY_SHOPKEEPERONE && onum (ob) == OBJ_FANTASY_GOLDNUGGET) { bprintf ("The shopkeeper smiles at you as he places the golden sword on the " "counter\nfor you to take.\n\n"); setobjstate (OBJ_FANTASY_GOLDSWORD, 0); } if (pnum (pl) == MOB_FANTASY_SHOPKEEPERTWO && onum (ob) == OBJ_FANTASY_SILVER) { bprintf ("The shopkeeper smiles at you as he places the silver sword and the " "silver\narmor on the counter for you to take.\n\n"); setobjstate (OBJ_FANTASY_SILVERSWORD, 0); setobjstate (OBJ_FANTASY_SILVERARMOR, 0); } #endif 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; } 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); } 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; } /* database.c */ 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; } if ((onum (ob) == OBJ_FOREST_PIPES) && (pnum (pl) == MOB_BLIZZARD_SEAMAS)) { setoloc (ob, pl, CARRIED_BY); setpscore (mynum, pscore (mynum) + 50); 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; } 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 stirring bagpipe rendition of " "'Amazing Grace.'\n"); return; } if (plev (mynum) < LVL_WIZARD) { if ((onum (ob) == OBJ_CASTLE_RUNESWORD)) { bprintf ("The Runesword does not wish to be given away.\n"); return; } } 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 who?\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_WIZARD && 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 to 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)); return; 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_WIZARD) { 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 (!strncasecmp (oname (obj), "shield", strlen (oname (obj)))); } /* Does player pl wear a shield ? */ 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 (!strncasecmp (oname (obj), "armor", strlen (oname (obj))) || !strncasecmp (oname (obj), "mail", strlen (oname (obj)))); } /* Does player pl wear armor ? */ 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 (!strncasecmp (oname (obj), "mask", strlen (oname (obj)))); } 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) { return onum (obj) == OBJ_VILLAGE_BOAT || onum (obj) == OBJ_VILLAGE_RAFT || onum (obj) == OBJ_ANCIENT_CANOE; } 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 removecom (void) { int a; int b; if ((a = ohereandget ()) == -1) return; if (!iswornby (a, mynum)) { bprintf ("You're not wearing it.\n"); return; } 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"); } static 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_WIZARD) 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 ("\nTotal value:%*d points.\n", plev (mynum) >= LVL_WIZARD ? 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_WIZARD) bprintf ("[%3d]", a); bprintf ("%12.12s:%5d points\n", oname (a), ovalue (a)); } } while (brkword () != -1); } } void putcom (void) { int a; 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; } #ifdef LOCMIN_ZODIAC /* Mancini */ if (c == OBJ_ZODIAC_PENTAGRAM) { switch (a) { default: bprintf ("You try to place the %s on the pentagram, but it falls through \n" "to the floor!\n", oname (a)); send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s try's to place the %s on the pentagram, but it falls through\n" "to the floor!\n", pname (mynum), oname (a)); send_msg (ploc (mynum), 0, LVL_MIN, pvis (mynum), mynum, NOBODY, "Someone try's to place the %s on the pentagram, but it falls through\n" "to the floor!\n", oname (a)); setoloc (a, ploc (mynum), IN_ROOM); return; break; case OBJ_ZODIAC_FIREBALL: case OBJ_ZODIAC_WATERBALL: case OBJ_ZODIAC_AIRBALL: case OBJ_ZODIAC_DIRTBALL: case OBJ_ZODIAC_WINE: setobjstate (a, 1); setoloc (a, ploc (mynum), IN_ROOM); if (((state (OBJ_ZODIAC_FIREBALL) == 1) && (state (OBJ_ZODIAC_WATERBALL) == 1) && (state (OBJ_ZODIAC_AIRBALL) == 1) && (state (OBJ_ZODIAC_DIRTBALL) == 1) && (state (OBJ_ZODIAC_WINE) == 1))) { bprintf ("As you place the %s upon the altar, the altar suddenly flares to an\n" "intense blinding light! When your vision clears, you are somewhere else!\n\n", oname (a)); send_msg (ploc (mynum), MODE_NSFLAG | MS (SFL_BLIND), pvis (mynum), LVL_MAX, mynum, NOBODY, "When %s places the %s upon the altar, the altar suddenly flares to\n" "an intense blinding flash! When your vision clears, you see that %s is gone!", pname (mynum), oname (a), psex (mynum) ? "she" : "he"); trapch (LOC_ZODIAC_FRONTDOOR); send_msg (ploc (mynum), MODE_NSFLAG | MS (SFL_BLIND), pvis (mynum), LVL_MAX, mynum, NOBODY, "%s suddenly appears beside you rubbing %s eyes!\n", pname (mynum), his_or_her (mynum)); } else { bprintf ("The pentagram lights briefly as you place the %s on the pentagram.\n", oname (a)); send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "The pentagram lights briefly as %s places the %s on the pentagram.\n", pname (mynum), oname (a)); send_msg (ploc (mynum), 0, LVL_MIN, pvis (mynum), mynum, NOBODY, "The pentagram lights briefly as someone places the %s on the pentagram.\n", oname (a)); } return; break; } } #endif /* LOCMIN_ZODIAC */ #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_TALON if (c == OBJ_TALON_STAFF) { if (a == OBJ_TALON_RUBY && otstbit (OBJ_TALON_FIRESTAFF, OFL_DESTROYED)) { oclrbit (OBJ_TALON_FIRESTAFF, OFL_DESTROYED); setoloc (OBJ_TALON_FIRESTAFF, oloc (OBJ_TALON_STAFF), ocarrf (OBJ_TALON_STAFF)); destroy (OBJ_TALON_STAFF); destroy (OBJ_TALON_RUBY); bprintf ("A blinding red light fills the room as the ruby clicks into " "place. When you\ncan see again, you find the staff is " "glowing a fiery red.\n"); send_msg (ploc (mynum), MODE_NOBLIND, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s affixes a small ruby on the end of a staff " "and suddenly the room is\nfilled with a blinding red light. " "When you can see again, you find the staff\nis glowing a " "fiery red.\n", pname (mynum)); send_msg (ploc (mynum), MODE_NODEAF, LVL_MIN, pvis (mynum) - 1, mynum, NOBODY, "You hear a soft click and an 'ouch' " "somewhere close by.\n"); } else { bprintf ("It doesn't fit, but it looks interesting. Maybe you could " "call it art.\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); set_quest (mynum, Q_SUNDISC); return; } } #endif /* database.c: Put chalice on altar */ if ((c == OBJ_MOOR_ALTAR) && (a == OBJ_MOOR_CHALICE)) { setobjstate (OBJ_MOOR_ALTAR, 1); destroy (OBJ_MOOR_CHALICE); return; } 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) { bprintf ("The wand seems to soak up energy.\n"); osetarmor (a, 4); return; } bprintf ("Nothing happens.\n"); return; } if (c == OBJ_BLIZZARD_SLIME_PIT) { if (state (c) == 0) { setoloc (a, LOC_BLIZZARD_SLIME, IN_ROOM); bprintf ("Ok\n"); return; } destroy (a); bprintf ("It dissappears with a fizzle into the slime.\n"); if (onum (a) == OBJ_BLIZZARD_SOAP) { bprintf ("The soap dissolves the slime away!\n"); setobjstate (OBJ_BLIZZARD_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_LIMBO_POUNCIE) { 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 blood 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); setpmagic (mynum, pmagic (mynum) + 6); 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); 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)); setpmagic (mynum, maxmagic (mynum)); bprintf ("You feel much much stronger!\n"); setoloc (b, LOC_DEAD_EATEN, IN_ROOM); destroy (b); break; case OBJ_TREEHOUSE_WAYBREAD: if (plev (mynum) < LVL_WIZARD && 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); setpmagic (mynum, maxmagic (mynum) + 16); eat (b); break; case OBJ_ICECAVE_FOUNTAIN: if (plev (mynum) >= LVL_NOVICE && plev (mynum) < LVL_HERO) { setpscore (mynum, pscore (mynum) + 40); bprintf ("You feel a wave of energy sweeping through you.\n"); } else { bprintf ("Faintly magical by the taste.\n"); if (plev (mynum) >= LVL_HERO && pstr (mynum) < 10) setpstr (mynum, pstr (mynum) + 4); } break; #ifdef LOCMIN_ANCIENT case OBJ_ANCIENT_FOUNTAIN_OF_YOUTH: if (pscore (mynum) >= 20) { setpscore (mynum, pscore (mynum) - 20); bprintf ("You feel younger and less experienced...\n"); } break; #endif #ifdef LOCMIN_TALON case OBJ_TALON_SPRING: bprintf ("You feel a shifting of the ground under your feet and a " "slight wind on your\nface, and looking about you you find " "you have been transported.\n"); send_msg (ploc (mynum), MODE_NOBLIND, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s bends to take a drink from the spring, and " "no sooner than %s does\nso, %s is suddenly gone. The whisper " "of a cold breeze blows against your\ncheek.\n", pname (mynum), psex (mynum) ? "she" : "he", psex (mynum) ? "she" : "he"); send_msg (ploc (mynum), 0, LVL_MIN, pvis (mynum) - 1, mynum, NOBODY, "The whisper of a cold breeze blows against your cheek " "suddenly, with no\nexplanation for its presence.\n"); trapch (LOC_TALON_TALON25); send_msg (ploc (mynum), MODE_NOBLIND, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s suddenly appears beside you in a kneeling " "position. %s stands up\nand brushes %sself off, surveying " "%s situation.\n", pname (mynum), he_or_she (mynum), him_or_her (mynum), his_or_her (mynum)); break; case OBJ_TALON_POTION: setpstr (mynum, maxstrength (mynum)); bprintf ("You feel magical energies coursing through your veins like " "fire, and when the\nsensations subside, you notice your " "physical wounds have disappeared.\n"); send_msg (ploc (mynum), MODE_NOBLIND, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s guzzles a potion, and shortly thereafter you " "notice %s physical\nwounds disappearing.\n", pname (mynum), his_or_her (mynum)); eat (OBJ_TALON_POTION); break; #endif default: if (otstbit (b, OFL_FOOD)) { eat (b); bprintf ("Delicious!\n"); setpstr (mynum, pstr (mynum) + 12); setpmagic (mynum, pmagic (mynum) + 15); sprintf (s, "\001P%s\003 greedily devours the %s.\n", pname (mynum), oname (b)); sillycom (s); } else { bprintf ("I think I've lost my appetite.\n"); return; } break; } } void inventory (void) { if (plev (mynum) < LVL_WIZARD) { send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s rummages through %s backpack.\n", pname (mynum), his_or_her (mynum)); } bprintf ("You are carrying:\n"); aobjsat (mynum, CARRIED_BY, 0); } 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)) { if (ovis (obj) > plev (mynum)) continue; 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_WIZARD && 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 ovis (x) <= plev (mynum) ? x : -1; /* 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') { if (ovis (num) > plev (mynum)) return -1; 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 && ovis (obj) <= plev (mynum)) { 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 && ovis (obj) <= plev (mynum)) { 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; char *s; char bf[81]; /* FANTASY */ #ifdef LOCMIN_FANTASY if (ob == OBJ_FANTASY_GOLDSWORD && state (ob) == 1) { bprintf ("As you go to take the sword the shopkeeper mentions he would " "like a gold\nnugget in exchange for it. He then mentions that " "in the mountains behind\nhis shop there are many gold mines.\n\n"); return 0; } if (ob == OBJ_FANTASY_SILVERSWORD && state (ob) == 1) { bprintf ("As you go to take the sword the shopkeeper mentions he would " "like a bag\nof silver in exchange for it. He then speaks of " "the dwarven cave to the west\nthat is said to have many hidden " "treasures guarded by a monster.\n\n"); return 0; } if (ob == OBJ_FANTASY_SILVERARMOR && state (ob) == 1) { bprintf ("As you go to take the armor the shopkeeper mentions he would " "like a bag\nof silver in exchange for it. He then speaks of " "the dwarven cave to the west\nthat is said to have many hidden " "treasures guarded by a monster.\n\n"); return 0; } #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 if (ob == OBJ_BLIZZARD_SHIELD) { if (ishere (OBJ_BLIZZARD_SHIELD1)) ob = OBJ_BLIZZARD_SHIELD1; else if (ishere (OBJ_BLIZZARD_SHIELD2)) ob = OBJ_BLIZZARD_SHIELD2; else if (container == -1) { if (otstbit (OBJ_BLIZZARD_SHIELD1, OFL_DESTROYED)) ob = OBJ_BLIZZARD_SHIELD1; else if (otstbit (OBJ_BLIZZARD_SHIELD2, OFL_DESTROYED)) ob = OBJ_BLIZZARD_SHIELD2; if (ob == OBJ_BLIZZARD_SHIELD1 || ob == OBJ_BLIZZARD_SHIELD2) create (ob); else { bprintf ("The shields are too firmly secured to the walls.\n"); return 0; } } } 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); set_quest (mynum, Q_GRAIL); trapch (LOC_START_CHURCH); return 0; } bprintf ("Ok\n"); return 0; } int getcom (void) { CLASS_DATA *cl; int ob; int i; int container = -1; char bf[1024]; if (brkword () == -1) { bprintf ("Get what?\n"); return -1; } if (isdark ()) { bprintf ("It's dark!\n"); return -1; } if ((cl = findclass (wordbuf)) != NULL) { getall (cl); return 0; } ob = fobnh (wordbuf); #ifdef LOCMIN_RUINS if (ob == OBJ_BLIZZARD_LITTABLET) { if (etstflg (mynum, EFL_LIGHT)) { bprintf ("Something won't let you take the tablet.\n"); return -1; } } if (ob == OBJ_RUINS_CROWN && state (OBJ_RUINS_CROWN) == 1) { setobjstate (OBJ_RUINS_CROWN, 0); setobjstate (OBJ_RUINS_SCROLL, 1); } if (ob == OBJ_RUINS_SCROLL) { if (state (OBJ_RUINS_CROWN) == 1) { bprintf ("Try moving the crown first.\n"); return -1; } if (state (OBJ_RUINS_SCROLL) == 1) { setobjstate (OBJ_RUINS_SCROLL, 0); } } #endif #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); 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 #ifdef LOCMIN_ZODIAC /* Mancini */ switch (ob) { default: break; case OBJ_ZODIAC_FIREBALL: case OBJ_ZODIAC_WATERBALL: case OBJ_ZODIAC_AIRBALL: case OBJ_ZODIAC_DIRTBALL: case OBJ_ZODIAC_WINE: setobjstate (ob, 0); setoloc (ob, mynum, CARRIED_BY); send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s takes the %s from the pentagram.\n", pname (mynum), oname (ob)); send_msg (ploc (mynum), 0, LVL_MIN, pvis (mynum), mynum, NOBODY, "Someone takes the %s from the pentagram.\n", oname (ob)); bprintf ("Ok\n"); return 0; break; } #endif /* LOCMIN_ZODIAC */ 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; } 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) return; } } } /* Is the item in the same room as the player ? */ Boolean p_ishere (int plr, int item) { if (plev (plr) < LVL_WIZARD && 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) { if (plev (mynum) < LVL_WIZARD && 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 (void) { CLASS_DATA *cl; int a, i, l, j; 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; } if (plev (mynum) < LVL_WIZARD && onum (a) == OBJ_CASTLE_RUNESWORD) { bprintf ("You can't let go of it!\n"); return 0; } if (plev (mynum) < LVL_WIZARD && onum (a) == OBJ_LIMBO_POUNCIE) { 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_TUNNEL || l == LOC_QUARRY_LADDER_UU) { bprintf ("The %s falls down the ladder.\n", oname (a)); l = LOC_QUARRY_LADDER_UD; } if ((l >= LOC_QUARRY_LADDER_D4 && l <= LOC_QUARRY_LADDER_D2) || (l >= LOC_QUARRY_LADDER_D1 && l <= LOC_QUARRY_LADDER_UD)) { bprintf ("The %s falls down the ladder.\n", oname (a)); l = LOC_QUARRY_MINE; } /* 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; } /* 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; if (ozone (o) >= num_const_zon && plev (mynum) < LVL_WIZARD) { send_msg (DEST_ALL, 0, LVL_PROPHET, LVL_MAX, NOBODY, NOBODY, "&+B[&+CCheat (Object)&*: Zone: &+W%s &*Pitted by: &+W%s&+B]\n", zname (ozone (o)), pname (mynum)); mudlog ("CHEAT: Object from Zone: %s, Pitted By: %s", zname (ozone (o)), pname (mynum)); bprintf ("&+WYou were just caught pitting a cloned item!\n"); if (pscore (mynum) >= ovalue (o)) { bprintf ("&+WYou lose &+C%d &+Wpoints from your score!\n", ovalue (o) / 2); setpscore (mynum, pscore (mynum) - (ovalue (o) / 2)); } } else { setpscore (mynum, pscore (mynum) + ovalue (o)); } osetbit (o, OFL_DESTROYED); setoloc (o, LOC_PIT_PIT, IN_ROOM); #ifdef LOCMIN_MITHDAN if (o == OBJ_MITHDAN_CRYSTAL) { set_quest (mynum, Q_MITHDAN); } #endif #ifdef LOCMIN_TALON if (o == OBJ_TALON_CLAW) { if (alive (i = max_players + MOB_TALON_TALON) == -1 && pscore (i) == mynum) { set_quest (mynum, Q_TALON); } } #endif if (o == OBJ_WASTE_THRONE) { if (alive (i = max_players + MOB_WASTE_DJINNI) == -1 && pscore (i) == mynum) { set_quest (mynum, Q_FIERY_KING); } } else if (o == OBJ_TOWER_CROWN) { if (alive (i = max_players + MOB_TOWER_SHAZARETH) == -1 && pscore (i) == mynum) { set_quest (mynum, Q_TOWER); } } if (otstbit (o, OFL_CONTAINER)) { for (i = ofirst_obj (o); i != SET_END; i = onext_obj (o)) if (iscontin (i, o)) { dropinpit (i); } } } #if (OFL_MAX == 96) void list_objects (int n) { int i, a; for (i = 0; i < lnumobs (ploc (mynum)); i++) { a = lobj_nr (i, ploc (mynum)); if (ishere (a) && (n == OFL_MAX || ltstflg (ploc (mynum), n)) && ovis (a) <= plev (mynum)) { 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)); } } } } #else /* 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) && ovis (a) <= plev (mynum)) { 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)); } } } } #endif 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 allready 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; } static 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))); } Boolean is_classname (char *name) { return name != NULL && findclass (name) != NULL; } /* Can player 'plyr' carry any more objects now ? */ Boolean cancarry (int plyr) { int i, a; int num = 0; if (plev (plyr) >= LVL_WIZARD || 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; } Boolean 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 = 0; 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); 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 ("ERROR: 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) { /* The object is already in the right place/status */ if (oloc (obj) == loc && ocarrf (obj) == c) return; /* 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).l & mask)) return True; } for (i = 0; i < pnumobs (plr); i++) { a = pobj_nr (i, plr); if (iscarrby (a, plr) && (obits (a).l & mask)) return True; } return False; } Boolean ohany (int mask) { return p_ohany (mynum, mask); } int ovalue (int ob) { #ifdef USE_TSCALE return (tscale () * obaseval (ob) / 9); #else return obaseval (ob); #endif } 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_WIZARD) 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)); } int getobjloc (int obj) { int loc = oloc (obj); while (ocarrf (obj) == IN_CONTAINER) { obj = loc; loc = oloc (obj); } if (ocarrf (obj) != IN_ROOM) return (ploc (loc)); else return loc; } Boolean otstmask (int ob, int v) { return dtst_bit (&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_WIZARD && 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_WIZARD) sprintf (v, "| %s", xshowname (k, loc)); else *v = 0; sprintf (b, "%-30.30s %s", sdesc (loc), v); return b; } void desrm (int loc, int cf) { char b[80]; bprintf ("%s\n", xdesrm (b, loc, cf)); } char * odescrm (int obj) { static char b[300]; char buff[300]; if (ocarrf (obj) == IN_CONTAINER) { odescrm (oloc (obj)); } else { if (ocarrf (obj) >= CARRIED_BY) { sprintf (b, "%s", xshowname (buff, ploc (oloc (obj)))); return b; } if (!exists (oloc (obj))) { sprintf (b, "Unknown (%d)", oloc (obj)); return b; } sprintf (b, "%s", xshowname (buff, oloc (obj))); return b; } return NULL; } void move_pouncie (void) { int ok = 1; int room; while (ok != 0) { room = my_random () % num_const_locs; /* Get a random room */ room = room - (room * 2); /* MUST be negative */ if (room == LOC_CASTLE_TORTURE || room == LOC_CASTLE_MAIDEN) { ok = 1; } else { if (plev (mynum) < LVL_AVATAR) { if (!ltstflg (room, LFL_DEATH) && /* Cannot be deathroom */ !ltstflg (room, LFL_ON_WATER) && /* Cannot be on water */ !ltstflg (room, LFL_ONE_PERSON) && /* Cannot be one-person */ !ltstflg (room, LFL_PRIVATE)) /* Cannot be private */ ok = 0; } else { ok = 0; } } } setoloc (OBJ_LIMBO_POUNCIE, room, IN_ROOM); } /************************************************************************ * Wear Commands * ************************************************************************/ /* This function is where all the specials for wearcom() must be placed * so that wearcom and wearall will be able to handle wearcom specials. */ void wearspecials (int a) { #ifdef LOCMIN_FANTASY if (onum (a) == OBJ_FANTASY_MANA && ploc (mynum) == LOC_FANTASY_TREE2) { bprintf ("As you put the Pendant of Mana around your " "neck the world begins to blur and\nshake around " "as your eyes close. You feel yourself floating in " "air and then\nthe moving stops. You open your eyes " "in a different part of the world..\n\n"); setploc (mynum, LOC_FANTASY_START); trapch (ploc (mynum)); bprintf ("You have freed the mana tree from the grasp of the " "evil Lord Glaive.\n\n"); set_quest (mynum, Q_MANA); } #endif #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 dissappear.\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...\n", SAVE_ME); return; } #endif } void wearcom (void) { int a, b; if ((a = ohereandget ()) == -1) return; if (!iscarrby (a, mynum)) { bprintf ("You don't have it.\n"); return; } wearspecials (a); if (iswornby (a, mynum)) { bprintf ("You're already wearing it.\n"); return; } if (check_armor (mynum, a)) { bprintf ("You have reached the maximum armor class of %d.\n", MAXARMOR); bprintf ("Wearing more armor will not increase your AC beyond that number.\n"); } if (is_shield (a) && wears_shield (mynum)) { bprintf ("You can't use two shields at once.\n"); return; } if (is_armor (a) && wears_armor (mynum)) { bprintf ("You can't wear two suits of armor at once.\n"); return; } if (is_mask (a) && wears_mask (mynum)) { bprintf ("You can't wear two masks at once.\n"); return; } if (!otstbit (a, OFL_WEARABLE)) { bprintf ("Is this a new fashion?\n"); 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 wearall (void) { int obj, objlst[100], objidx = 0; Boolean worn = False; bprintf ("You wear: "); for (obj = 0; obj < numobs; obj++) { if (iscarrby (obj, mynum) && otstbit (obj, OFL_WEARABLE)) { worn = True; objlst[objidx++] = obj; bprintf ("%s ", oname (obj)); if (is_mask (obj) && wears_mask (mynum)) continue; if (is_armor (obj) && wears_armor (mynum)) continue; if (is_shield (obj) && wears_shield (mynum)) continue; setcarrf (obj, WORN_BY); } } if (!worn) { bprintf ("Nothing.\n"); } else { bprintf ("\n"); for (obj = 0; obj < objidx; obj++) { wearspecials (objlst[obj]); } } /* Report if player has reached MaxArmor */ if (player_armor (mynum) > MAXARMOR) bprintf ("You have reached the maximum armor class of %d.\n", MAXARMOR); } void lockcom () { if (ob1 == -1) { bprintf ("Lock what?\n"); return; } switch (ob1) { default: if (!otstbit (ob1, OFL_LOCKABLE)) bprintf ("You can't lock that!\n"); else if (state (ob1) > 2) 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; } switch (ob1) { default: if (!otstbit (ob1, OFL_LOCKABLE)) bprintf ("You can't unlock that!\n"); else if (state (ob1) == 2) bprintf ("It's already unlocked.\n"); else if (!ohany (1 << OFL_KEY)) bprintf ("You have no key.\n"); else setobjstate (ob1, 1); } } void closecom () { if (ob1 == -1) { bprintf ("What would you like to close?\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 ("Ok.\n"); } } } void opencom () { char *cant_open = "You can't open that!\n"; if (ob1 == -1) { bprintf ("What would you like to open?\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 (cant_open); } else { if (state (ob1) == 0) { bprintf ("It's already open.\n"); } else { if (state (ob1) == 1) { bprintf ("Ok.\n"); 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 ringcom (void) { switch (ob1) { case OBJ_VILLAGE_BELL: broad ("There is an almighty &+WBONG&*!\n"); break; default: bprintf ("You can't ring that.\n"); break; } } void digcom (void) { if (ploc (mynum) == oloc (OBJ_ICECAVE_HOLE_SNOW_CAVE) || ploc (mynum) == oloc (OBJ_ICECAVE_HOLE_G_HALL)) { if (state (OBJ_ICECAVE_HOLE_G_HALL) == 1) { if (iscarrby (ob1, mynum) && otstbit (ob1, OFL_WEAPON)) { bprintf ("You rapidly dig through to another passage.\n"); setobjstate (OBJ_ICECAVE_HOLE_G_HALL, 0); return; } else { bprintf ("The ice and snow are thick, you'll need something " "to hack through it with.\n"); return; } } else { bprintf ("You widen the hole but with little effect."); return; } } if ((ploc (mynum) == oloc (OBJ_LEDGE_TUNNWEST) || ploc (mynum) == oloc (OBJ_LEDGE_TUNNEAST)) && state (OBJ_LEDGE_TUNNEAST) == 1) { bprintf ("You dig your way through the rockfall, and soon clear " "the passage.\n"); setobjstate (OBJ_LEDGE_TUNNEAST, 0); return; } if (ploc (mynum) == oloc (OBJ_CHURCH_SLAB_TOP) && otstbit (OBJ_CHURCH_SLAB_TOP, OFL_DESTROYED)) { bprintf ("You uncover a stone slab!\n"); oclrbit (OBJ_CHURCH_SLAB_TOP, OFL_DESTROYED); return; } if (ploc (mynum) == oloc (OBJ_OAKTREE_TOPFOXHOLE) && state (OBJ_OAKTREE_TOPFOXHOLE) == 1) { bprintf ("Although there are fox tracks in the grass, you can't " "find the fox hole.\n"); return; } bprintf ("You find nothing.\n"); return; } void tiecom (void) { switch (ob1) { case OBJ_LIMBO_ROPE: switch (ploc (mynum)) { case LOC_TREEHOUSE_PORCH: case LOC_VALLEY_ESIDE: if (state (OBJ_VALLEY_LADDER2ELF) == 0) { bprintf ("Why? There is already a rope there!\n"); break; } setobjstate (OBJ_TREEHOUSE_LADDER, 0); destroy (OBJ_LIMBO_ROPE); bprintf ("You tie the rope to the tree.\n"); break; case LOC_LEDGE_PIT: case LOC_MOOR_PIT: if (state (OBJ_LEDGE_ROPEBOTPIT) == 0) { bprintf ("Why? There is already a rope there!\n"); break; } setobjstate (OBJ_LEDGE_ROPEBOTPIT, 0); destroy (OBJ_LIMBO_ROPE); bprintf ("You tie the rope to the pit.\n"); break; default: bprintf ("You have nothing to tie the rope to.\n"); break; } break; default: bprintf ("You cannot tie that!\n"); break; } return; } void untiecom (void) { if (ploc (mynum) != oloc (ob1)) { bprintf ("It isn't here.\n"); return; } switch (ob1) { case OBJ_VALLEY_LADDER2ELF: case OBJ_TREEHOUSE_LADDER: if (state (OBJ_VALLEY_LADDER2ELF) == 1) { sendf (mynum, "You can't untie that.\n"); break; } else setobjstate (OBJ_VALLEY_LADDER2ELF, 1); oclrbit (OBJ_VALLEY_LADDER2ELF, OFL_NOGET); setoloc (OBJ_VALLEY_LADDER2ELF, mynum, CARRIED_BY); sendf (mynum, "You untie the rope.\n"); break; } switch (ob1) { case OBJ_VALLEY_LADDER2ELF: case OBJ_TREEHOUSE_LADDER: if (state (OBJ_VALLEY_LADDER2ELF) == 1) { sendf (mynum, "You cannot untie that!\n"); break; } create (OBJ_LIMBO_ROPE); setoloc (OBJ_LIMBO_ROPE, ploc (mynum), IN_ROOM); setobjstate (OBJ_VALLEY_LADDER2ELF, 1); bprintf ("You untie the rope.\n"); break; case OBJ_LEDGE_ROPEWEST: case OBJ_VALLEY_ROPEEAST: if (state (OBJ_VALLEY_ROPEEAST) == 1) { sendf (mynum, "You cannot untie that!\n"); break; } if (oloc (OBJ_LIMBO_ROPE) == LOC_DEAD_DESTROYED || oloc (OBJ_LIMBO_ROPE) == LOC_LIMBO_LIMBO) { create (OBJ_LIMBO_ROPE); setoloc (OBJ_LIMBO_ROPE, ploc (mynum), IN_ROOM); } setobjstate (OBJ_VALLEY_ROPEEAST, 1); bprintf ("You untie the rope.\n"); break; case OBJ_MOOR_ROPETOPPIT: case OBJ_LEDGE_ROPEBOTPIT: if (state (OBJ_MOOR_ROPETOPPIT) == 1) { sendf (mynum, "You cannot untie that!\n"); break; } create (OBJ_LIMBO_ROPE); setoloc (OBJ_LIMBO_ROPE, ploc (mynum), IN_ROOM); setobjstate (OBJ_MOOR_ROPETOPPIT, 1); bprintf ("You untie the rope.\n"); break; default: sendf (mynum, "You cannot untie that!\n"); break; } return; } void playcom (void) { if (ob1 == OBJ_FOREST_PIPES) { bprintf ("Much as you try, the pipes only make nasty squeaking noises.\n"); return; } if (ob1 == OBJ_BLIZZARD_HARP) { bprintf ("A beautiful harp melody floats to you on a gentle breeze.\n"); return; } } void rollcom (void) { int a; if ((a = ohereandget ()) == -1) return; switch (a) { case OBJ_BLIZZARD_PILLAR_WEST: case OBJ_BLIZZARD_PILLAR_EAST: gamecom ("push pillar", True); break; case OBJ_BLIZZARD_BOULDER: gamecom ("push boulder", True); break; default: bprintf ("You can't roll that.\n"); } } void emptycom (void) { int a, b; char x[128]; if ((a = ohereandget ()) == -1) return; if (otstbit (a, OFL_LOCKABLE) && state (a) == 2 && !ohany (1 << OFL_KEY)) { bprintf ("The %s is locked, and you have no key.\n", oname (a)); return; } else if ((otstbit (a, OFL_OPENABLE) || otstbit (a, OFL_LOCKABLE)) && state (a) > 0) { bprintf ("You open the %s.\n", oname (a)); setobjstate (a, 0); } for (b = ofirst_obj (a); b != SET_END; b = onext_obj (a)) { if (iscontin (b, a)) { setoloc (b, mynum, CARRIED_BY); bprintf ("You empty the %s from the %s.\n", oname (b), oname (a)); sprintf (x, "drop %s", oname (b)); gamecom (x, False); } } } void blowcom (void) { int a; char s[100]; if ((a = ohereandget ()) == -1) return; if (onum (a) == OBJ_CAVE_BAGPIPES) { broad ("\001dA hideous wailing sounds echos all around.\n\003"); return; } if (onum (a) == OBJ_OAKTREE_WHISTLE) { broad ("\001dA strange ringing fills your head.\n\003"); if (alive (max_players + MOB_OAKTREE_OTTIMO) != -1) { bprintf ("A small dachshund bounds into the room " "and leaps on you playfully.\n"); sprintf (s, "A small dachshund bounds into the room " "and leaps on %s playfully.\n", pname (mynum)); sillycom (s); setploc (max_players + MOB_OAKTREE_OTTIMO, ploc (mynum)); } return; } if (onum (a) == OBJ_LABYRINTH_HORN) { broad ("\001dA mighty horn blast echoes around you.\n\003"); if (ploc (mynum) >= LOC_SEA_TREASURE && ploc (mynum) <= LOC_SEA_1 && oarmor (OBJ_SEA_EXCALIBUR) == 0) { setoloc (OBJ_SEA_EXCALIBUR, ploc (mynum), IN_ROOM); setobjstate (OBJ_SEA_EXCALIBUR, 1); bprintf ("A hand breaks through the water holding up " "the sword Excalibur!\n"); osetarmor (OBJ_SEA_EXCALIBUR, 1); set_quest (mynum, Q_EXCALIBUR); } return; } bprintf ("You can't blow that.\n"); } void lightcom (void) { int a; char s[100]; if ((a = ohereandget ()) == -1) return; if (!ohany (1 << OFL_LIT) && !ststflg (mynum, SFL_LIT)) { bprintf ("You have nothing to light things from.\n"); return; } #ifdef LOCMIN_EFOREST if (a == OBJ_EFOREST_THORNS || a == OBJ_EFOREST_THORNSEAST) { if (state (OBJ_EFOREST_THORNS) == 0) { bprintf ("The thorns have already been burned away.\n"); return; } setobjstate (OBJ_EFOREST_THORNS, 0); bprintf ("You burn the wall of thorns away!\n"); bprintf ("Behind them you can see the entrance to a cave.\n"); sprintf (s, "%s burns the wall of thorns away!\n", pname (mynum)); send_msg (LOC_EFOREST_THORNY, 0, LVL_MIN, LVL_MAX, mynum, NOBODY, s); send_msg (LOC_EFOREST_CAVE, 0, LVL_MIN, LVL_MAX, mynum, NOBODY, s); return; } #endif if (a == OBJ_FOREST_INSIDETREE) { bprintf ("The tree screams and thrashes around. In its dying throes " "you dash free!\n"); trapch (LOC_FOREST_F4); destroy (OBJ_FOREST_TREEEATING); setpscore (mynum, pscore (mynum) + 100); return; } if (!otstbit (a, OFL_LIGHTABLE)) bprintf ("You can\'t light that!\n"); else if (otstbit (a, OFL_LIT)) bprintf ("It\'s already lit.\n"); else { setobjstate (a, 0); osetbit (a, OFL_LIT); bprintf ("Ok\n"); } } void extinguishcom (void) { int a; if ((a = ohereandget ()) == -1) return; if (!otstbit (a, OFL_LIT)) bprintf ("It\'s not lit!\n"); else if (!otstbit (a, OFL_EXTINGUISH)) bprintf ("You can\'t extinguish that!\n"); else { setobjstate (a, 1); oclrbit (a, OFL_LIT); bprintf ("Ok\n"); } } void pushcom (void) { int x; char s[128]; if (brkword () == -1) { bprintf ("Push what?\n"); return; } if ((x = fobna (wordbuf)) == -1) { bprintf ("That is not here.\n"); return; } /* If it's the original object OR a copy: */ switch (onum (x)) { case OBJ_BLIZZARD_TRIPWIRE: bprintf ("The tripwire moves and a huge stone crashes down from above!\n"); broad ("\001dYou hear a thud and a squelch in the distance.\n\003"); crapup (" S P L A T !\n", SAVE_ME); break; case OBJ_BLIZZARD_BOOKCASE: bprintf ("A trapdoor opens at your feet and you plumment downwards!\n"); sillycom ("\001p%s\003 disappears through a trapdoor!\n"); teletrap (LOC_BLIZZARD_FISSURE); return; } /* If it's the original object (only), not a copy: */ switch (x) { #ifdef LOCMIN_EFOREST case OBJ_EFOREST_BUTTON: setobjstate (OBJ_EFOREST_BUTTON, 0); setobjstate (OBJ_EFOREST_THRONE_CATHEDRAL, 1 - state (OBJ_EFOREST_THRONE_CATHEDRAL)); sendf (ploc (mynum), "You hear a grinding sound from near the entrance of the caves.\n"); sprintf (s, "You hear a grinding sound as a mysterious force moves " "the throne!\n"); sendf (LOC_EFOREST_EASTEND, s); sendf (LOC_EFOREST_BOTTOM, s); break; #endif #ifdef LOCMIN_FROBOZZ case OBJ_FROBOZZ_BUTTON_OUTSIDE: if (state (OBJ_FROBOZZ_VAULTDOOR_OUTSIDE) == 1) { setobjstate (OBJ_FROBOZZ_VAULTDOOR_OUTSIDE, 0); sendf (LOC_FROBOZZ_OUTSIDE, "Without a sound the whole southern " "wall moves some feet westwards!\n"); sendf (LOC_FROBOZZ_VAULT, "Without a sound the whole northern wall " "moves some feet westwards!\n"); break; } if (state (OBJ_FROBOZZ_VAULTDOOR_OUTSIDE) == 0) { setobjstate (OBJ_FROBOZZ_VAULTDOOR_OUTSIDE, 2); sendf (LOC_FROBOZZ_OUTSIDE, "The southern wall glides some feet " "to the east closing the vault!\n"); sendf (LOC_FROBOZZ_VAULT, "The northern wall glides some feet to " "the east closing the vault!\n"); break; } if (state (OBJ_FROBOZZ_VAULTDOOR_OUTSIDE) == 2) { bprintf ("Nothing happens.\n"); break; } case OBJ_FROBOZZ_RUG_LIVING: if (state (OBJ_FROBOZZ_RUG_LIVING) == 1) { setobjstate (OBJ_FROBOZZ_RUG_LIVING, 0); setobjstate (OBJ_FROBOZZ_TRAPDOOR_LIVING, 2); bprintf ("You move the rug and uncover a trapdoor!\n"); sprintf (s, "%s moves the heavy rug and uncovers a trapdoor!\n", pname (mynum)); sillycom (s); } else { bprintf ("You move the rug, but find nothing.\n"); sprintf (s, "%s moves the rug.\n", pname (mynum)); sillycom (s); } break; #endif #ifdef LOCMIN_ANCIENT case OBJ_ANCIENT_MOONCROSS: if (state (OBJ_ANCIENT_MOONCROSS) > 0) { setobjstate (OBJ_ANCIENT_MOONCROSS, 0); if (state (OBJ_ANCIENT_BIGCROSS) > 0) { bprintf ("You move the cross to one side, but nothing happens.\n"); } else { bprintf ("You hear a loud hollow sound from a room nearby!\n"); setobjstate (OBJ_ANCIENT_HOLE_ANC31, 0); } } else { setobjstate (OBJ_ANCIENT_MOONCROSS, 1); setobjstate (OBJ_ANCIENT_HOLE_ANC31, 1); bprintf ("You move the cross back into place.\n"); } break; case OBJ_ANCIENT_BIGCROSS: if (state (OBJ_ANCIENT_BIGCROSS) > 0) { setobjstate (OBJ_ANCIENT_BIGCROSS, 0); if (state (OBJ_ANCIENT_MOONCROSS) > 0) { bprintf ("You move the cross to one side, but nothing happens.\n"); } else { bprintf ("You hear a loud hollow sound from a room nearby!\n"); setobjstate (OBJ_ANCIENT_HOLE_ANC31, 0); } } else { setobjstate (OBJ_ANCIENT_BIGCROSS, 1); setobjstate (OBJ_ANCIENT_HOLE_ANC31, 1); bprintf ("You move the cross back into place.\n"); } break; #endif #ifdef LOCMIN_RUINS case OBJ_BLIZZARD_ALTAR: if (state (OBJ_BLIZZARD_PLATFORM_ALTAR) == 2) { setobjstate (OBJ_BLIZZARD_PLATFORM_ALTAR, 1); setobjstate (OBJ_BLIZZARD_ALTAR, 0); bprintf ("You move the altar to the side, uncovering the platform.\n"); break; } case OBJ_BLIZZARD_BRICK: if (state (OBJ_BLIZZARD_ALTAR) == 1) { bprintf ("That is not here.\n"); break; } else { setobjstate (OBJ_BLIZZARD_PLATFORM_ALTAR, 0); setobjstate (OBJ_BLIZZARD_BRICK, 0); bprintf ("You push the brick, and the platform opens!\n"); break; } case OBJ_RUINS_OUTSIDETORCH: if (state (OBJ_RUINS_OUTSIDETORCH) == 1) { setobjstate (OBJ_RUINS_OUTSIDETORCH, 0); bprintf ("You pull the torch down and the west wall collapses!\n"); break; } else { bprintf ("The torch has already been moved.\n"); break; } #endif #ifdef LOCMIN_PLAYHOUSE case OBJ_PLAYHOUSE_SINKHANDLE: if (state (OBJ_PLAYHOUSE_SINKHANDLE) == 1) { setobjstate (OBJ_PLAYHOUSE_SINKHANDLE, 0); bprintf ("You turn the &+Wfaucet &*on.\n"); broad ("You hear running &+Bwater &*in the distance.\n"); break; } else { setobjstate (OBJ_PLAYHOUSE_SINKHANDLE, 1); bprintf ("You turn the &+Wfaucet &*off.\n"); broad ("The running &+Bwater &*in the distance stops.\n"); break; } #endif case OBJ_BLIZZARD_IRONBAR: if (state (OBJ_BLIZZARD_PASS_STONE) == 1) { setobjstate (OBJ_BLIZZARD_PASS_FISSURE, 0); bprintf ("A secret panel opens in the east wall!\n"); break; } bprintf ("Nothing happens.\n"); break; case OBJ_BLIZZARD_BOULDER: bprintf ("With a mighty heave you manage to move the boulder a few feet\n"); if (state (OBJ_BLIZZARD_HOLE_CRACK) == 1) { bprintf ("uncovering a hole behind it.\n"); setobjstate (OBJ_BLIZZARD_HOLE_CRACK, 0); } else { bprintf ("covering a hole behind it.\n"); setobjstate (OBJ_BLIZZARD_HOLE_CRACK, 1); } break; case OBJ_BLIZZARD_LEVER: if (ptothlp (mynum) == -1) { bprintf ("It's too stiff. Maybe you need help.\n"); return; } bprintf ("Ok\n"); if (state (OBJ_BLIZZARD_SLIME_PIT) != 0) { sillycom ("\001s%s\002%s pulls the lever.\n\003"); sendf (oloc (OBJ_BLIZZARD_LEVER), "\001dYou hear a gurgling noise and then silence.\n\003"); setobjstate (OBJ_BLIZZARD_SLIME_PIT, 0); sendf (oloc (OBJ_BLIZZARD_SLIME_PIT), "\001cThere is a muffled click and the slime drains away.\n\003"); } break; case OBJ_BLIZZARD_THRONE_CURTAINS: case OBJ_BLIZZARD_ROUGH_CURTAINS: setobjstate (OBJ_BLIZZARD_THRONE_CURTAINS, 1 - state (OBJ_BLIZZARD_THRONE_CURTAINS)); bprintf ("Ok\n"); break; case OBJ_CASTLE_LEVER: setobjstate (OBJ_CASTLE_PORT_INSIDE, 1 - state (OBJ_CASTLE_PORT_INSIDE)); if (state (OBJ_CASTLE_PORT_INSIDE)) { sendf (oloc (OBJ_CASTLE_PORT_INSIDE), "\001cThe portcullis falls.\n\003"); sendf (oloc (OBJ_CASTLE_PORT_OUTSIDE), "\001cThe portcullis falls.\n\003"); } else { sendf (oloc (OBJ_CASTLE_PORT_INSIDE), "\001cThe portcullis rises.\n\003"); sendf (oloc (OBJ_CASTLE_PORT_OUTSIDE), "\001cThe portcullis rises.\n\003"); } break; case OBJ_BLIZZARD_BRIDGE_LEVER: setobjstate (OBJ_BLIZZARD_BRIDGE_HALL, 1 - state (OBJ_BLIZZARD_BRIDGE_HALL)); if (state (OBJ_BLIZZARD_BRIDGE_HALL)) { sendf (oloc (OBJ_BLIZZARD_BRIDGE_HALL), "\001cThe drawbridge rises.\n\003"); sendf (oloc (OBJ_BLIZZARD_BRIDGE_FIRE), "\001cThe drawbridge rises.\n\003"); } else { sendf (oloc (OBJ_BLIZZARD_BRIDGE_HALL), "\001cThe drawbridge is lowered.\n\003"); sendf (oloc (OBJ_BLIZZARD_BRIDGE_FIRE), "\001cThe drawbridge is lowered.\n\003"); } break; case OBJ_CASTLE_TORCH: if (state (OBJ_CASTLE_DOOR_GOLEM) == 1) { setobjstate (OBJ_CASTLE_DOOR_GOLEM, 0); sendf (oloc (OBJ_CASTLE_DOOR_GOLEM), "A secret door slides quietly open in the south wall!\n"); } else bprintf ("It moves but nothing seems to happen.\n"); return; case OBJ_CHURCH_ROPE: if (oarmor (OBJ_CHURCH_ROPE) >= 12) bprintf ("\001dChurch bells ring out around you.\n\003"); else { broad ("\001dChurch bells ring out around you.\n\003"); if (++oarmor (OBJ_CHURCH_ROPE) == 12) { bprintf ("A strange ghostly guitarist shimmers briefly before you.\n"); setpscore (mynum, pscore (mynum) + 300); broad ("\001dA faint ghostly guitar solo " "floats through the air.\n\003"); } } break; case OBJ_CATACOMB_DUST: bprintf ("Great clouds of dust billow up, causing you to sneeze " "horribly.\nWhen you're finished sneezing, you notice " "a message carved into one wall.\n"); broad ("\001dA loud sneeze echoes through the land.\n\003"); destroy (OBJ_CATACOMB_DUST); create (OBJ_CATACOMB_KOAN); break; case OBJ_ORCHOLD_BOTCOVER: bprintf ("You can't seem to get enough leverage to move it.\n"); return; case OBJ_ORCHOLD_TOPCOVER: if (ptothlp (mynum) == -1) { bprintf ("You try to shift it, but it's too heavy.\n"); break; } sillytp (ptothlp (mynum), "pushes the cover aside with your help."); setobjstate (x, 1 - state (x)); oplong (x); return; case OBJ_ORCHOLD_SWITCH: if (state (x)) { bprintf ("A hole slides open in the north wall!\n"); setobjstate (x, 0); } else bprintf ("You hear a little 'click' sound.\n"); return; case OBJ_BLIZZARD_STATUE_DOWN: if (ptothlp (mynum) == -1) { bprintf ("You can't shift it alone, maybe you need help.\n"); break; } sillytp (ptothlp (mynum), "pushes the statue with your help."); #ifdef LOCMIN_TALON case OBJ_TALON_CHINA_FIG: if (state (x)) { bprintf ("A large stone slab slides away in the floor, revealing a " "passage leading down.\n"); send_msg (ploc (mynum), MODE_NOBLIND, pvis (mynum), LVL_MAX, mynum, NOBODY, "As %s pushes the china figurine, a large " "stone slab slides away in the\nfloor, revealing a passage " "leading down.\n", pname (mynum)); send_msg (ploc (mynum), MODE_NOBLIND, LVL_MIN, pvis (mynum) - 1, mynum, NOBODY, "The china figurine suddenly leans over and " "a large stone slab slides away in\nthe floor, revealing a " "passage leading down.\n"); setobjstate (x, 0); setobjstate (OBJ_TALON_DOOR, 0); return; } else { bprintf ("The slab of stone slides over the hole in the floor, " "blocking the passage.\n"); send_msg (ploc (mynum), MODE_NOBLIND, pvis (mynum), LVL_MAX, mynum, NOBODY, "%s returns the china figurine to an upright " "position, and the slab of\nstone slides over the hole, " "blocking the passage.\n", pname (mynum)); send_msg (ploc (mynum), MODE_NOBLIND, LVL_MIN, pvis (mynum) - 1, mynum, NOBODY, "The china figurine suddenly returns to an " "upright position and the slab of\nstone slides over the " "hole, blocking the passage.\n"); setobjstate (x, 1); setobjstate (OBJ_TALON_DOOR, 1); return; } break; #endif /* FALLTHROUGH */ default: if (otstbit (x, OFL_PUSHABLE)) { setobjstate (x, 0); oplong (x); return; } if (otstbit (x, OFL_PUSHTOGGLE)) { setobjstate (x, 1 - state (x)); oplong (x); return; } bprintf ("Nothing happens.\n"); } } void usecom (void) { int obj; if ((obj = ob1) == -1) { bprintf ("That isn't here.\n"); return; } #ifdef LOCMIN_PLAYHOUSE if (obj == OBJ_PLAYHOUSE_TOILET) { if (state (OBJ_PLAYHOUSE_TOILETLID) == 1) { bprintf ("You may want to lift the lid first.\n"); return; } if (state (OBJ_PLAYHOUSE_TOILET) == 1) { bprintf ("&+GEwww!! &*Someone forgot to flush last time " "they used it!!\n"); bprintf ("You decide &+Wnot &*to use the toilet. If only " "they had &+Cflushed&*.\n"); return; } else { if (psex (mynum) && !psitting (mynum)) { bprintf ("Shouldn't you sit down, ma'am?\n"); return; } setobjstate (OBJ_PLAYHOUSE_TOILET, 1); bprintf ("Isn't that &+Cr&+Be&+Cf&+Br&+Ce&+Bs&+Ch&+Bi&+Cn&+Bg&+W? " "&+WDon't &*forget to &+Wflush!&*\n"); send_msg (ploc (mynum), 0, LVL_MIN, LVL_MAX, mynum, NOBODY, "\001p%s\003 uses the toilet and looks more refreshed.\n", pname (mynum)); broad ("A &+Wloud, &+Cr&+Be&+Cf&+Br&+Ce&+Bs&+Ch&+Bi&+Cn&+Bg " "&+Ytinkle &*is heard throughout the land.\n"); return; } } #endif bprintf ("You can't use that!\n"); } void flushcom (void) { int obj; if ((obj = ob1) == -1) { bprintf ("That isn't here.\n"); return; } #ifdef LOCMIN_PLAYHOUSE if (obj == OBJ_PLAYHOUSE_TOILET) { if (plev (mynum) < LVL_ENCHANTER) setpscore (mynum, pscore (mynum) + 10); setobjstate (OBJ_PLAYHOUSE_TOILET, 0); bprintf ("You flush the toilet. Wow! Look at the pretty &+Bblue &*water!\n"); broad ("You hear a &+WPorcelain God &*gargling in the distance.\n"); return; } #endif bprintf ("You can't flush that!\n"); }