/* cmds.c */
#include "copyright.h"
#include "config.h"
#include <stdio.h>
#ifdef STRING_H
#include <string.h>
#else
#include <strings.h>
#endif /* STRING_H */
#include <ctype.h>
#include "teeny.h"
#include "match.h"
#include "db.h"
/*
* These routines, together with those in buildcmds.c, wiz.c and speech.c
* actually implement the commands of TeenyMUD. Hrm. Actually WHO and QUIT
* are caught in the network interface code.
*/
/*
* Workspace for building strings. None of this sprintf() shit. A little
* extra space so we can be non-anal about counting.
*/
char cmdwork[BUFFSIZ + 16];
char poll[36]; /* Poll for the @doing command */
void
do_home(player)
int player;
{
int here, home, list, count, next;
char *name, *p;
if (get_int_elt(player, HOME, &home) == -1)
goto homebomb;
if (!exists_object(home))
{
notify_player(player, "Your home does not exist!\r\n");
home = STARTING_LOC;
}
if (get_int_elt(player, LOC, &here) == -1)
goto homebomb;
/* Tell people here. */
if (get_str_elt(player, NAME, &name) == -1)
goto homebomb;
p = cmdwork;
if (name != NULL)
{
for (count = 0; !isspace(*name) && *name && count < BUFFSIZ; count++)
{
*p++ = *name++;
}
}
if (!isdark(here) && !isdark(player))
{
strcpy(p, " goes home.\r\n");
notify_oall(player, cmdwork);
strcpy(p, " has left.\r\n");
notify_oall(player, cmdwork);
}
send_home(player, here);
flush_room(here);
if (!isdark(player) && !isdark(home))
{
strcpy(p, " has arrived.\r\n");
notify_oall(player, cmdwork);
}
/* Send all the player's stuff home too */
if (get_int_elt(player, CONTENTS, &list) == -1)
goto homebomb;
while (list != -1)
{
/* send_home() will change the NEXT element of list */
if (get_int_elt(list, NEXT, &next) == -1)
goto homebomb;
send_home(list, player);
list = next;
}
/* Tell the player */
notify_player(player, "There's no place like home...\r\n");
notify_player(player, "There's no place like home...\r\n");
notify_player(player, "There's no place like home...\r\n");
notify_player(player, "You wake up back home, without your possessions.\r\n");
do_look(player, (char *) NULL);
return;
homebomb:
notify_bad(player);
return;
}
voidfunc
do_drop(player, arg)
int player;
char *arg;
{
int here, obj, flags, i, dest, hereflags;
char *p, *q, *name;
#ifdef DROP_FIELDS
char *drop, *odrop;
#endif /* DROP_FIELDS */
if (!arg || !*arg)
{
notify_player(player, "Drop what?\r\n");
return;
}
if ((obj = match_here(player, player, arg, MAT_THINGS)) == -1)
{
if ((obj = match_here(player, player, arg, MAT_EXITS)) == -1)
{
notify_player(player, "You don't have that!\r\n");
return;
}
}
if (obj == -2)
{
notify_player(player, "I can't tell which one you want to drop.\r\n");
return;
}
if (get_int_elt(obj, FLAGS, &flags) == -1)
goto dropbomb;
if (get_int_elt(player, LOC, &here) == -1)
goto dropbomb;
switch (flags & TYPE_MASK)
{
case TYP_EXIT:
#ifndef BUILDING_OK
if (!controls(player, here))
{
notify_player(player, "You can't drop that here!\r\n");
return;
}
#else
if (!controls(player, here) && !isbuilder(here))
{
notify_player(player, "You can't drop that here!\r\n");
return;
}
#endif /* BUILDING_OK */
/* Drop from player exits, add to room exits */
list_drop(obj, player, 0); /* 0 == exits list */
list_add(obj, here, 0);
dest = here; /* For setting the LOC later */
#ifdef TIMESTAMPS
stamp(obj);
#endif
break;
case TYP_THING:
/* Figure out where it's supposed to go */
if (get_int_elt(here, FLAGS, &hereflags) == -1)
goto dropbomb;
if ((flags & STICKY) || (hereflags & TEMPLE))
{
/* If the object is STICKY, or this is a temple */
/* Send the object to home if you can. */
if (get_int_elt(obj, HOME, &dest) == -1)
goto dropbomb;
} else
if (!(hereflags & STICKY))
{
/* If this place is !STICKY, see if there's a dropto */
if (get_int_elt(here, DROPTO, &dest) == -1)
goto dropbomb;
if (dest == -1)
{ /* No dropto */
dest = here;
} else
if (dest == -3)
{ /* Dropto home */
if (get_int_elt(obj, HOME, &dest) == -1)
goto dropbomb;
}
} else
{
dest = here;
}
list_drop(obj, player, 1); /* 1 == contents list */
list_add(obj, dest, 1);
#ifdef TIMESTAMPS
stamp(obj);
#endif
/* Tell the room */
#ifndef DROP_FIELDS
if (get_str_elt(player, NAME, &name) == -1)
goto dropbomb;
p = cmdwork;
if (name != NULL)
{
for (i = 0; !isspace(*name) && *name
&& i < BUFFSIZ - 128; i++)
{
*p++ = *name++;
}
}
strcpy(p, " dropped ");
p += 9;
i += 9;
if (get_str_elt(obj, NAME, &name) == -1)
goto dropbomb;
if (name != NULL)
{
for (q = name; *q && i < BUFFSIZ - 4; i++)
{
*p++ = *q++;
}
}
*p++ = '.';
*p++ = '\r';
*p++ = '\n';
*p = '\0';
notify_oall(player, cmdwork);
#else
if (get_str_elt(obj, DROP, &drop) == -1)
goto dropbomb;
if (drop != NULL)
{
notify_player(player, drop);
notify_player(player, "\r\n");
}
if (get_str_elt(player, NAME, &name) == -1)
goto dropbomb;
if (get_str_elt(obj, ODROP, &odrop) == -1)
goto dropbomb;
p = cmdwork;
if (name != NULL)
{
for (i = 0; !isspace(*name) && *name
&& i < BUFFSIZ - 128; i++)
{
*p++ = *name++;
}
}
if (odrop != NULL)
{
char *sub;
sub = pronoun_sub(player, odrop);
*p++ = ' ';
i++;
for (; sub && *sub && i < BUFFSIZ - 2; i++)
*p++ = *sub++;
if (get_str_elt(obj, NAME, &name) == -1)
goto dropbomb;
} else
{
strcpy(p, " dropped ");
p += 9;
i += 9;
if (get_str_elt(obj, NAME, &name) == -1)
goto dropbomb;
if (name != NULL)
{
for (q = name; *q && i < BUFFSIZ - 3; i++)
{
*p++ = *q++;
}
}
*p++ = '.';
}
*p++ = '\r';
*p++ = '\n';
*p = '\0';
notify_oall(player, cmdwork);
if (dest != here)
{
p = cmdwork;
q = name;
if (name != NULL)
{
while (*q && (p - cmdwork) < BUFFSIZ)
*p++ = *q++;
*p++ = ' ';
if (get_str_elt(here, ODROP, &odrop) == -1)
goto dropbomb;
if (odrop != NULL)
{
while (*odrop && (p - cmdwork) < BUFFSIZ - 3)
*p++ = *odrop++;
*p++ = '\r';
*p++ = '\n';
*p++ = '\0';
notify_all(player, cmdwork);
}
}
}
#endif /* DROP_FIELDS */
break;
default:
notify_player(player, "You have no business carrying that!\r\n");
return;
}
if (set_int_elt(obj, LOC, dest) == -1)
goto dropbomb;
notify_player(player, "Dropped.\r\n");
return;
dropbomb:
notify_bad(player);
return;
}
#ifdef VERBOSE_FLAGS
static char *
display_flags(obj)
int obj;
{
static char buffer[1024];
int flags;
if (get_int_elt(obj, FLAGS, &flags) == -1)
{
strcpy(buffer, "<spammed flags>");
return buffer;
} else
{
strcpy(buffer, "Type: ");
switch (flags & TYPE_MASK)
{
case TYP_ROOM:
strcat(buffer, "Room");
break;
case TYP_EXIT:
strcat(buffer, "Exit");
break;
case TYP_PLAYER:
strcat(buffer, "Player");
break;
case TYP_THING:
strcat(buffer, "Thing");
break;
default:
strcat(buffer, "*UNKNOWN TYPE*");
}
if (flags & ~(TYPE_MASK | INTERNAL_FLAGS))
{
strcat(buffer, " Flags: ");
if (flags & WIZARD)
strcat(buffer, "WIZARD ");
if (flags & TEMPLE)
{
if((flags & TYPE_MASK) != TYP_PLAYER)
strcat(buffer, "TEMPLE ");
else
strcat(buffer, "TEMPORAL ");
}
if (flags & STICKY)
strcat(buffer, "STICKY ");
if (flags & LINK_OK)
strcat(buffer, "LINK_OK ");
if (flags & JUMP_OK)
strcat(buffer, "JUMP_OK ");
if (flags & ABODE)
strcat(buffer, "ABODE ");
if (flags & HAVEN)
{
if((flags & TYPE_MASK) != TYP_PLAYER)
strcat(buffer, "HAVEN ");
else
strcat(buffer, "HURIN ");
}
if (flags & DARK)
strcat(buffer, "DARK ");
#ifdef BUILDING_OK
if (flags & BUILDER)
{
if((flags & TYPE_MASK) != TYP_PLAYER)
strcat(buffer, "BUILDING_OK ");
else
strcat(buffer, "BUILDER ");
}
#else
if (flags & BUILDER)
strcat(buffer, "BUILDER ");
#endif /* BUILDING_OK */
}
return buffer;
}
}
#endif /* VERBOSE_FLAGS */
voidfunc
do_examine(player, arg)
int player;
char *arg;
{
int obj, loc1, loc2, num, len, flags;
int *lock;
char *p, *msg;
if (!arg || !*arg)
{
if (get_int_elt(player, LOC, &obj) == -1)
goto exbomb;
} else
{
if ((obj = resolve_anything(player, arg, 0)) == -1)
{
notify_player(player, "I can't find that.\r\n");
return;
}
if (obj == -2)
{
notify_player(player, "I can't tell which one you mean.\r\n");
return;
}
}
if (!exists_object(obj))
{
notify_player(player, "No such object.\r\n");
return;
}
if (!controls(player, obj)
#ifdef ABODE_EXAMINE
&& !isabode(obj)
#endif /* ABODE_EXAMINE */
)
{
if (get_int_elt(player, LOC, &loc1) == -1)
goto exbomb;
if (get_int_elt(obj, LOC, &loc2) == -1)
goto exbomb;
if (obj == loc1)
do_look(player, (char *) NULL);
if (player == loc2 || loc1 == loc2)
do_look(player, arg);
/* Owner */
if (get_int_elt(obj, OWNER, &num) == -1)
goto exbomb;
if ((len = stuff_name(player, num, cmdwork, BUFFSIZ)) == -1)
{
strcpy(cmdwork, "<spammed name>");
} else
{
cmdwork[len] = '\0';
}
notify_player(player, "Owner: ");
notify_player(player, cmdwork);
notify_player(player, "\r\n");
return;
}
if (get_int_elt(obj, FLAGS, &flags) == -1)
goto exbomb;
/* OK. Get this things data, and print it out! */
/* name */
if ((len = stuff_name(player, obj, cmdwork, BUFFSIZ)) == -1)
{
strcpy(cmdwork, "<spammed name>");
} else
{
cmdwork[len] = '\0';
}
notify_player(player, cmdwork);
notify_player(player, "\r\n");
/* Owner */
if (get_int_elt(obj, OWNER, &num) == -1)
goto exbomb;
if ((len = stuff_name(player, num, cmdwork, BUFFSIZ)) == -1)
{
strcpy(cmdwork, "<spammed name>");
} else
{
cmdwork[len] = '\0';
}
notify_player(player, "Owner: ");
notify_player(player, cmdwork);
if (get_lock_elt(obj, LOCK, &lock) == -1)
goto exbomb;
notify_player(player, " Key: ");
if (bool_display(player, lock, cmdwork, BUFFSIZ) == -1)
{
notify_player(player, "Bad lock.");
} else
{
notify_player(player, cmdwork);
}
if (isplayer(obj))
{
if (get_int_elt(obj, SITE, &num) == -1)
goto exbomb;
#ifndef BACKWARDS_IP
sprintf(cmdwork, " Site: %d.%d.%d.%d\r\n", (num >> 24) & 0xff,
(num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff);
#else
sprintf(cmdwork, " Site: %d.%d.%d.%d\r\n", num & 0xff, (num >> 8) & 0xff,
(num >> 16) & 0xff, (num >> 24) & 0xff);
#endif
notify_player(player, cmdwork);
} else
{
notify_player(player, "\r\n");
}
#ifdef VERBOSE_FLAGS
notify_player(player, display_flags(obj));
notify_player(player, "\r\n");
#endif /* VERBOSE_FLAGS */
#ifdef TIMESTAMPS
{
extern char *ctime();
long timestamp;
char temp[30], *ti;
if (get_int_elt(obj, TIMESTAMP, &num) == -1)
goto exbomb;
timestamp = (long) (num * 60);
if (isplayer(obj))
notify_player(player, "Last: ");
else
notify_player(player, "Timestamp: ");
ti = ctime(×tamp);
ti[24] = '\0'; /* make one break here */
ti[16] = '\0'; /* and another here */
(void) strcpy(temp, ti); /* chainsaw, please */
(void) strcat(temp, ti + 19);
(void) strcat(temp, "\r\n");
notify_player(player, temp);
}
#endif /* TIMESTAMPS */
/* desc */
if (get_str_elt(obj, DESC, &p) == -1)
goto exbomb;
if (p != NULL)
{
notify_player(player, p);
notify_player(player, "\r\n");
}
/* fail, succ, etc.. */
if (get_str_elt(obj, FAIL, &p) == -1)
goto exbomb;
if (p != NULL)
{
if(isplayer(obj))
notify_player(player, "Oarrive: ");
else
notify_player(player, "Fail: ");
notify_player(player, p);
notify_player(player, "\r\n");
}
if (get_str_elt(obj, SUC, &p) == -1)
goto exbomb;
if (p != NULL)
{
if(isplayer(obj))
notify_player(player, "Oleave: ");
else
notify_player(player, "Success: ");
notify_player(player, p);
notify_player(player, "\r\n");
}
#ifdef DROP_FIELDS
if (get_str_elt(obj, DROP, &p) == -1)
goto exbomb;
if (p != NULL)
{
notify_player(player, "Drop: ");
notify_player(player, p);
notify_player(player, "\r\n");
}
#endif /* DROP_FIELDS */
if (get_str_elt(obj, OFAIL, &p) == -1)
goto exbomb;
if (p != NULL)
{
notify_player(player, "Ofail: ");
notify_player(player, p);
notify_player(player, "\r\n");
}
if (get_str_elt(obj, OSUC, &p) == -1)
goto exbomb;
if (p != NULL)
{
notify_player(player, "Osuccess: ");
notify_player(player, p);
notify_player(player, "\r\n");
}
#ifdef DROP_FIELDS
if (get_str_elt(obj, ODROP, &p) == -1)
goto exbomb;
if (p != NULL)
{
notify_player(player, "Odrop: ");
notify_player(player, p);
notify_player(player, "\r\n");
}
#endif /* DROP_FIELDS */
if (get_str_elt(obj, GENDER, &p) == -1)
goto exbomb;
if (p != NULL)
{
notify_player(player, "Sex: ");
notify_player(player, p);
notify_player(player, "\r\n");
}
/* home NOTE: Home == DropTo == Dest, depending on object type */
if (get_int_elt(obj, HOME, &num) == -1)
goto exbomb;
switch (flags & TYPE_MASK)
{
case TYP_ROOM:
notify_player(player, "Dropto: ");
if (num == -3)
msg = "*HOME*\r\n";
else
msg = "None.\r\n";
break;
case TYP_EXIT:
notify_player(player, "Destination: ");
if (num == -3)
msg = "*HOME*\r\n";
else
msg = "*UNLINKED*\r\n";
break;
case TYP_THING:
case TYP_PLAYER:
notify_player(player, "Home: ");
msg = "Does not exist!\r\n";
break;
}
if (exists_object(num))
{
if ((len = stuff_name(player, num, cmdwork, BUFFSIZ)) == -1)
{
strcpy(cmdwork, "<spammed name>");
} else
{
cmdwork[len] = '\0';
}
notify_player(player, cmdwork);
notify_player(player, "\r\n");
} else
{
notify_player(player, msg);
}
/* location */
if ((flags & TYPE_MASK) != TYP_ROOM)
{
if (get_int_elt(obj, LOC, &num) == -1)
goto exbomb;
if (!(!exists_object(num) && isexit(obj)) && (controls(player, num)
|| islinkok(num)))
{
notify_player(player, "Location: ");
if (exists_object(num))
{
if ((len = stuff_name(player, num, cmdwork, BUFFSIZ)) == -1)
{
strcpy(cmdwork, "<spammed name>");
} else
{
cmdwork[len] = '\0';
}
notify_player(player, cmdwork);
notify_player(player, "\r\n");
} else
{
notify_player(player,
"Location does not exist! Obj number: ");
if (num < 0)
{
notify_player(player, "-");
num = -num;
}
p = ty_itoa(cmdwork, num);
*p++ = '\r';
*p++ = '\n';
*p = '\0';
notify_player(player, cmdwork);
}
}
}
if (!isexit(obj))
{
/* contents list */
if (get_int_elt(obj, CONTENTS, &num) == -1)
goto exbomb;
if (num != -1)
{
if (!isplayer(obj))
{
notify_player(player, "Contents:\r\n");
} else
{
notify_player(player, "Carrying:\r\n");
}
/* last arg == 1 == show dark objects. */
notify_list(player, num, cmdwork, BUFFSIZ, 1);
} else
{
notify_player(player, "No contents.\r\n");
}
/* exits list */
if (get_int_elt(obj, EXITS, &num) == -1)
goto exbomb;
if (num != -1)
{
notify_player(player, "Exits:\n");
/* last arg == 1 == show dark objects */
notify_list(player, num, cmdwork, BUFFSIZ, 1);
} else
{
notify_player(player, "No exits.\r\n");
}
}
return;
exbomb:
notify_bad(player);
return;
}
voidfunc
do_take(player, arg)
int player;
char *arg;
{
int here, obj, flags, dest;
if (!arg || !*arg)
{
notify_player(player, "Take what?\r\n");
return;
}
if (get_int_elt(player, LOC, &here) == -1)
goto takebomb;
if ((obj = match_here(player, here, arg, MAT_THINGS)) == -1)
{
if ((obj = match_here(player, here, arg, MAT_EXITS)) == -1)
{
if ((obj = match_here(player, here, arg, MAT_PLAYERS)) == -1)
{
notify_player(player, "I don't see that here.\r\n");
return;
}
}
}
if (obj == -2)
{
notify_player(player, "I can't tell which one you mean.\r\n");
return;
}
if (get_int_elt(obj, FLAGS, &flags) == -1)
goto takebomb;
switch (flags & TYPE_MASK)
{
case TYP_EXIT:
/* If it's unlinked, you can take it */
if (get_int_elt(obj, DESTINATION, &dest) == -1)
goto takebomb;
if (dest != -1)
{
notify_player(player, "That exit is linked.\r\n");
return;
}
/* Drop it from exits list here. */
list_drop(obj, here, 0); /* 0 == exits list */
/* Add it to player exits list. */
list_add(obj, player, 0); /* 0 == exits list */
#ifdef TIMESTAMPS
stamp(obj);
#endif
notify_player(player, "Taken.\r\n");
break;
case TYP_THING:
/* If it's unlocked, you can take it */
if (islocked(player, obj))
{
fail_object(player, obj, "You can't pick that up.");
#ifdef TIMESTAMPS
stamp(obj);
#endif
return;
}
/* Do the succ/osucc */
succeed_object(player, obj, "Taken.");
/* Drop it from contents list here. */
list_drop(obj, here, 1); /* 1 == contents list */
/* Add to player contenst list */
list_add(obj, player, 1); /* 1 == contents list */
#ifdef TIMESTAMPS
stamp(obj);
#endif
break;
default:
notify_player(player, "You can't take that!\r\n");
return;
}
if (set_int_elt(obj, LOC, player) == -1)
goto takebomb;
return;
takebomb:
notify_bad(player);
return;
}
voidfunc
do_go(player, arg)
int player;
char *arg;
{
struct match *exlist;
int here, list, count;
if (!arg || !*arg)
{
notify_player(player, "Go where?\r\n");
return;
}
if (!strcmp(arg, "home"))
{
do_home(player);
return;
}
if (get_int_elt(player, LOC, &here) == -1)
goto gobomb;
if (get_int_elt(here, EXITS, &list) == -1)
goto gobomb;
if ((exlist = match_exits(arg, list, &count)) != NULL)
{
/* Ok. We have a list of exits. Cope with 'em. */
do_go_attempt(player, here, exlist);
return;
} else
{
notify_player(player, "You can't go that way.\r\n");
}
return;
gobomb:
notify_bad(player);
return;
}
voidfunc
do_gripe(player, gripe)
int player;
char *gripe;
{
char *name, *p;
if (gripe == NULL)
{
notify_player(player, "What do you wish to gripe about?\r\n");
return;
}
if (get_str_elt(player, NAME, &name) == -1)
goto gripebomb;
p = cmdwork;
while (!isspace(*name) && *name)
*p++ = *name++;
*p = '\0';
log_gripe("GRIPE: From %s(#%d), \"%s\"\n", cmdwork, player, gripe);
if (!issticky(GOD))
{
notify_player(GOD, "GRIPE: From ");
notify_player(GOD, cmdwork);
notify_player(GOD, ", \"");
notify_player(GOD, gripe);
notify_player(GOD, "\"\r\n");
}
notify_player(player, "Your complaint has been duly noted.\r\n");
return;
gripebomb:
notify_bad(player);
return;
}
voidfunc
do_inventory(player)
int player;
{
int list, header;
header = 0;
if (get_int_elt(player, CONTENTS, &list) == -1)
goto invbomb;
if (list != -1)
{
notify_player(player, "You are carrying:\r\n");
header = 1;
notify_list(player, list, cmdwork, BUFFSIZ, 1);
}
if (get_int_elt(player, EXITS, &list) == -1)
goto invbomb;
if (list != -1)
{
if (!header)
{
notify_player(player, "You are carrying:\r\n");
header = 1;
}
notify_list(player, list, cmdwork, BUFFSIZ, 1);
}
if (!header)
notify_player(player, "You aren't carrying anything.\r\n");
return;
invbomb:
notify_bad(player);
return;
}
voidfunc
do_kill(player, argone)
int player;
char *argone;
{
int here, victim, flags;
int list, next;
char *name, *p, *q, *r;
if (!argone || !*argone)
{
notify_player(player, "Who would you like to kill?\r\n");
return;
}
if (ishaven(player))
{
notify_player(player, "You may not kill anyone.\r\n");
return;
}
/* Find who we are supposed to kill */
if (get_int_elt(player, LOC, &here) == -1)
goto killbomb;
if (ishaven(here) && !iswiz(player))
{
notify_player(player, "It's too peaceful here.\r\n");
return;
}
if ((victim = match_here(player, here, argone, MAT_PLAYERS)) == -1)
{
notify_player(player, "I don't see that player here.\r\n");
return;
}
if (victim == -2)
{
notify_player(player, "I can't tell which person you want to kill.\r\n");
return;
}
/* Grab the killer-dude's name, and stow it away. We'll want it */
if (get_str_elt(player, NAME, &name) == -1)
goto killbomb;
p = cmdwork;
if (name != NULL)
{
while (!isspace(*name) && *name)
{
*p++ = *name++;
}
}
*p = '\0';
/* Have a whack at it. */
if (get_int_elt(victim, FLAGS, &flags) == -1)
goto killbomb;
if (flags & WIZARD)
{
/* Fail the kill */
notify_player(player, "Your kill attempt failed.\n");
notify_player(victim, cmdwork);
notify_player(victim, " tried to kill you!\n");
} else
{
/* The kill succeeded! Do it! */
#ifdef DROP_FIELDS
char *drop, *odrop;
#endif /* DROP_FIELDS */
notify_player(victim, cmdwork);
notify_player(victim, " killed you!\r\n");
/* Tell everyone. p cleverly points at the right spot */
/* No need to count. names are guaranteed pretty short */
#ifndef DROP_FIELDS
strcpy(p, " killed ");
q = p + 8;
if (get_str_elt(victim, NAME, &name) == -1)
goto killbomb;
r = name;
while (!isspace(*r) && *r)
*q++ = *r++;
strcpy(q, "!\r\n");
notify_oall(victim, cmdwork);
#else
if (get_str_elt(victim, DROP, &drop) == -1)
goto killbomb;
if (drop != NULL)
{
notify_player(player, drop);
notify_player(player, "\r\n");
}
if (get_str_elt(victim, ODROP, &odrop) == -1)
goto killbomb;
if (odrop != NULL)
{
char *sub, *pname;
if (get_str_elt(victim, NAME, &name) == -1)
goto killbomb;
if (get_str_elt(player, NAME, &pname) == -1)
goto killbomb;
sub = pronoun_sub(player, odrop);
strcpy(p, " killed ");
q = p + 8;
r = name;
while (!isspace(*r) && *r)
*q++ = *r++;
strcpy(q, "! ");
q += 3;
while (sub && *sub && (q - cmdwork) < BUFFSIZ - 3)
*q++ = *sub++;
*q++ = '\r';
*q++ = '\n';
*q = '\0';
notify_oall(victim, cmdwork);
} else
{
strcpy(p, " killed ");
q = p + 8;
if (get_str_elt(victim, NAME, &name) == -1)
goto killbomb;
r = name;
while (!isspace(*r) && *r)
*q++ = *r++;
strcpy(q, "!\r\n");
notify_oall(victim, cmdwork);
}
#endif /* DROP_FIELDS */
p = cmdwork;
r = name;
while (!isspace(*r) && *r)
*p++ = *r++;
strcpy(p, " has left.\r\n");
notify_oall(victim, cmdwork);
/* Send the victim home. */
send_home(victim, here);
strcpy(p, " has arrived.\r\n");
notify_oall(victim, cmdwork);
flush_room(here);
/* Send all the player's stuff home too */
if (get_int_elt(victim, CONTENTS, &list) == -1)
goto killbomb;
while (list != -1)
{
/* send_home() will change the NEXT element of list */
if (get_int_elt(list, NEXT, &next) == -1)
goto killbomb;
send_home(list, victim);
list = next;
}
do_look(victim, (char *) NULL);
}
return;
killbomb:
notify_bad(player);
return;
}
voidfunc
do_look(player, arg)
int player;
char *arg;
{
int here, contents, len;
int obj, loc;
char *str;
if (arg && *arg)
{
/* Look at a thing. */
if (get_int_elt(player, LOC, &here) == -1)
goto lookbomb;
if ((obj = resolve_object_or_exit(player, arg, iswiz(player))) == -1)
{
notify_player(player, "I don't see that here.\r\n");
return;
}
if (obj == -2)
{
notify_player(player, "I don't know which one you mean.\r\n");
return;
}
if (obj == here)
{
do_look(player, (char *) NULL);
return;
}
if (get_int_elt(obj, LOC, &loc) == -1)
goto lookbomb;
if ((loc != here && loc != player && !iswiz(player)) || isroom(obj))
{
notify_player(player, "That's much too far away to see.\r\n");
return;
}
#ifdef TIMESTAMPS
if (!isplayer(obj))
stamp(obj);
#endif
if (get_str_elt(obj, DESC, &str) == -1)
goto lookbomb;
if (str == NULL)
{
str = "You see nothing special.";
}
notify_player(player, str);
notify_player(player, "\r\n");
if (get_int_elt(obj, CONTENTS, &contents) == -1)
goto lookbomb;
if (contents != -1)
{
notify_player(player, "Carrying:\r\n");
/* last argument: 0 == No dark objs. */
notify_list(player, contents, cmdwork, BUFFSIZ, 0);
}
return;
}
if (get_int_elt(player, LOC, &here) == -1)
goto lookbomb;
#ifdef TIMESTAMPS
stamp(here);
#endif
/* Grab and show the name */
if ((len = stuff_name(player, here, cmdwork, BUFFSIZ)) == -1)
{
strcpy(cmdwork, "<spammed name>");
} else
{
cmdwork[len] = '\0';
}
notify_player(player, cmdwork);
notify_player(player, "\r\n");
/* The desc. */
if (get_str_elt(here, DESC, &str) == -1)
goto lookbomb;
if (str != NULL)
{
notify_player(player, str);
notify_player(player, "\r\n");
}
/* Do the room succ/osucc thing */
if (islocked(player, here))
{
fail_object(player, here, (char *) NULL);
} else
{
succeed_object(player, here, (char *) NULL);
}
/* Finally spew out the contents list, if the room is unDARK */
if (can_see_anything(player, here))
{
if (get_int_elt(here, CONTENTS, &contents) == -1)
{
warning("do_look", "bad contents ref on room");
notify_bad(player);
return;
}
notify_player(player, "Contents:\r\n");
/* last arg == 0 == no dark objects */
notify_list(player, contents, cmdwork, BUFFSIZ, 0);
}
return;
lookbomb:
notify_bad(player);
return;
}
voidfunc
do_password(player, argone, argtwo)
int player;
char *argone, *argtwo;
{
char *pwd, *p;
if (!argone || !*argone || !argtwo || !*argtwo)
{
notify_player(player,
"Usage: @password <oldpassword> = <newpassword>\r\n");
return;
}
if (get_str_elt(player, NAME, &pwd) == -1)
goto passbomb;
if (!pwd || !*pwd)
{
notify_player(player, "You have no name OR password!\r\n");
return;
}
/* Copy the actual name into cmdwork */
p = cmdwork;
while (!isspace(*pwd) && *pwd)
*p++ = *pwd++;
/* Find the current pwd */
while (isspace(*pwd) && *pwd)
pwd++;
if (strcmp(pwd, argone))
{
notify_player(player, "Incorrect password.\r\n");
return;
}
/* OK. Set the password up in cmdwork */
*p++ = ' ';
while (*argtwo)
*p++ = *argtwo++;
*p++ = '\0';
if (set_str_elt(player, NAME, cmdwork) == -1)
goto passbomb;
notify_player(player, "Password changed.\r\n");
return;
passbomb:
notify_bad(player);
return;
}
voidfunc
do_poll(player, arg)
int player;
char *arg;
{
int i;
if(!iswiz(player))
{
notify_player(player, "Having delusions of grandeur, are we?\r\n");
return;
}
if(arg == NULL)
{
notify_player(player, "Set.\r\n");
strcpy(poll, "");
return;
}
if(strlen(arg) > 35)
{
notify_player(player, "Too long -- clipped.\r\n");
arg[35] = '\0';
} else
{
notify_player(player, "Set.\r\n");
}
strcpy(poll, arg);
return;
}
voidfunc
do_set(player, argone, argtwo)
int player;
char *argone, *argtwo;
{
int obj, unset, newflag, objflags, playerflags;
char *msg;
if (!argone || !*argone || !argtwo || !*argtwo)
{
notify_player(player, "Set what?\r\n");
return;
}
if ((obj = resolve_object_or_exit(player, argone, 0)) == -1)
{
notify_player(player, "I can't find what you want to set.\r\n");
return;
}
if (obj == -2)
{
notify_player(player, "I can't tell which one you want to set.\r\n");
return;
}
if (!exists_object(obj) || !controls(player, obj))
{
notify_player(player, "You can't set that!\r\n");
return;
}
#ifdef TIMESTAMPS
if (!isplayer(obj))
stamp(obj);
#endif
/* Okie. What's this doof want to set? */
if (*argtwo == '!')
{
unset = 1;
argtwo++;
} else
{
unset = 0;
}
if (stringprefix(argtwo, "LINK_OK"))
newflag = LINK_OK;
else
if (stringprefix(argtwo, "STICKY"))
newflag = STICKY;
else
if (stringprefix(argtwo, "DARK"))
newflag = DARK;
else
if (stringprefix(argtwo, "WIZARD"))
newflag = WIZARD;
else
if (stringprefix(argtwo, "TEMPLE"))
newflag = TEMPLE;
else
if (stringprefix(argtwo, "TEMPORAL"))
newflag = TEMPLE;
else
if (stringprefix(argtwo, "JUMP_OK"))
newflag = JUMP_OK;
else
if (stringprefix(argtwo, "ABODE"))
newflag = ABODE;
else
if (stringprefix(argtwo, "HAVEN"))
newflag = HAVEN;
#if defined(RESTRICT_BUILDING) || defined(BUILDING_OK)
else
if (stringprefix(argtwo, "BUILDER"))
newflag = BUILDER;
else
if (stringprefix(argtwo, "BUILDING_OK"))
newflag = BUILDER;
#endif /* RESTRICT_BUILDING || BUILDING_OK */
else
{
notify_player(player, "I don't understand that flag.\r\n");
return;
}
/* Check legalities */
if (get_int_elt(player, FLAGS, &playerflags) == -1)
goto setbomb;
if (get_int_elt(obj, FLAGS, &objflags) == -1)
goto setbomb;
if (!(playerflags & WIZARD) && !isexit(obj))
{
if ((newflag == DARK) && (objflags & TYPE_MASK) == TYP_PLAYER)
{
notify_player(player, "Permission denied.\r\n");
return;
}
if ((newflag == HAVEN || newflag == BUILDER)
&& (objflags & TYPE_MASK) != TYP_ROOM)
{
notify_player(player, "Permission denied.\r\n");
return;
} else
if (newflag == TEMPLE)
{
notify_player(player, "Permission denied.\r\n");
return;
}
}
if (newflag == WIZARD && player != GOD)
{
notify_player(player, "Permission denied.\r\n");
return;
}
/* Set the flags */
if (unset)
{
objflags &= ~newflag;
msg = "Flag unset.\r\n";
} else
{
objflags |= newflag;
msg = "Flag set.\r\n";
}
if (set_int_elt(obj, FLAGS, objflags) == -1)
goto setbomb;
notify_player(player, msg);
return;
setbomb:
notify_bad(player);
return;
}
voidfunc
do_recycle(player, arg)
int player;
char *arg;
{
int obj, loc;
if (!arg || !*arg)
{
notify_player(player, "Recycle what?\r\n");
return;
}
if (get_int_elt(player, LOC, &loc) == -1)
{
warning("do_recycle", "bad loc ref on player");
return;
}
if ((obj = match_here(player, player, arg, MAT_THINGS | MAT_EXITS)) == -1)
{
if ((obj = match_here(player, loc, arg, MAT_THINGS | MAT_EXITS)) == -1)
{
if (!strcmp(arg, "here"))
{
obj = loc;
} else
{
if (*arg == '#' && *(arg + 1) && exists_object(atoi(arg + 1)))
{
obj = atoi(arg + 1);
} else
{
notify_player(player, "I can't find what you want to recycle.\r\n");
return;
}
}
}
}
if (obj == -2)
{
notify_player(player, "I can't tell which one you want to recycle.\r\n");
return;
}
if (!controls(player, obj))
{
notify_player(player, "You don't own that!\r\n");
return;
}
if (obj == 0)
{
notify_player(player, "You may not recycle object Zero.\r\n");
return;
}
#if STARTING_LOC != 0
if (obj == STARTING_LOC)
{
notify_player(player, "You may not recycle that.\r\n");
return;
}
#endif
if (isplayer(obj))
{
notify_player(player, "You can't recycle players.\r\n");
return;
}
if (recycleobj(obj) > 0)
{
notify_player(player, "Thank you for recycling.\r\n");
} else
{
notify_bad(player);
}
}
voidfunc
do_version(player)
int player;
{
notify_player(player, "The code running is ");
notify_player(player, version);
notify_player(player, ".\r\n");
}