/* wiz.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>
#if defined(ALLOCA_H) && !defined(NO_ALLOCA)
#include <alloca.h>
#endif
#include "teeny.h"
extern char cmdwork[];
/*
* Admin only commands.
*/
voidfunc do_boot(player, arg)
int player;
char *arg;
{
int victim;
if (!iswiz(player)) {
notify_player(player, "You can't boot anyone!\r\n");
return;
}
if (!arg || !*arg) {
notify_player(player, "Boot whom?\r\n");
return;
}
if ((victim = match_player(arg)) == -1) {
notify_player(player, "I can't find that player.\r\n");
return;
}
if (!isalive(victim)) {
notify_player(player, "That player is not connected.\r\n");
return;
}
if (isgod(victim) && !isgod(player)) {
notify_player(player, "You can't boot God!\r\n");
return;
}
notify_player(victim, "You have been booted off the game.\r\n");
iobdisconnect(victim);
disconnect_player(victim);
notify_player(player, "Booted.\r\n");
}
voidfunc do_chown(player, argone, argtwo)
int player;
char *argone, *argtwo;
{
int owner, obj, flags;
if (!iswiz(player)) {
notify_player(player, "Permission denied.\r\n");
return;
}
if (!argone || !*argone || !argtwo || !*argtwo) {
notify_player(player, "Chown what to who?\r\n");
return;
}
if ((owner = resolve_player(player, argtwo, 1)) == -1) {
notify_player(player, "I can't find that owner.\r\n");
return;
}
if ((obj = resolve_object(player, argone, 0)) == -1) {
if ((obj = resolve_exit(player, argone)) == -1) {
notify_player(player, "I can't find that object.\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 chownbomb;
if (((flags & TYPE_MASK) == TYP_PLAYER) && !isgod(player)) {
notify_player(player, "Players always own themselves.\r\n");
return;
}
/* OK. Do it. */
stamp(obj);
if (set_int_elt(obj, OWNER, owner) == -1)
goto chownbomb;
notify_player(player, "Owner changed.\r\n");
return;
chownbomb:
notify_bad(player);
}
voidfunc do_dump(player)
int player;
{
if (!iswiz(player)) {
notify_player(player, "You're in a no dumping zone.\r\n");
return;
}
notify_player(player, "Dumping...\r\n");
dump_db();
}
voidfunc do_force(player, argone, argtwo)
int player;
char *argone, *argtwo;
{
int obj;
if (!iswiz(player)) {
notify_player(player, "Permission denied.\r\n");
return;
}
if (!argone || !*argone || !argtwo || !*argtwo) {
notify_player(player, "Force who to do what?\r\n");
return;
}
if ((obj = resolve_player(player, argone, 1)) == -1) {
notify_player(player, "I can't find that player.\r\n");
return;
}
if (isgod(obj) && (player != PLAYER_GOD)) {
notify_player(player, "You can't force God to do anything!\r\n");
return;
}
handle_cmd(obj, argtwo);
notify_player(player, "Ok.\r\n");
}
voidfunc do_newpassword(player, argone, argtwo)
int player;
char *argone, *argtwo;
{
int obj;
if (!iswiz(player)) {
notify_player(player, "Permission denied.\r\n");
return;
}
if (!argone || !*argone) {
notify_player(player, "Change who's password to what?\r\n");
return;
}
if ((obj = resolve_player(player, argone, 1)) == -1) {
notify_player(player, "I can't find that player.\r\n");
return;
}
if (isgod(obj) && !isgod(player)) {
notify_player(player, "You can't change God's password!\r\n");
return;
}
if (!argtwo || !*argtwo) {
notify_player(player, "Change their password to what?\r\n");
return;
}
if (set_str_elt(obj, PASSWORD, (argtwo && *argtwo) ?
crypt(argtwo, CRYPT_KEY) : (char *) 0) == -1)
goto newbomb;
if (isalive(obj) && (argtwo && *argtwo)) {
sprintf(cmdwork, "Your password has been changed to \"%s\".\r\n", argtwo);
notify_player(obj, cmdwork);
}
notify_player(player, "Password changed.\r\n");
return;
newbomb:
notify_bad(player);
return;
}
voidfunc do_textdump(player, file)
int player;
char *file;
{
if (!isgod(player)) {
notify_player(player, "You're in a no textdumping zone.\r\n");
return;
}
if (mudstat() == DUMPING) { /* eeek */
notify_player(player, "Come back later.\r\n");
return;
}
unlock_cache(); /* whoever said text_dump() was meant to run
* with a locked cache?? */
if (!file || !*file || (player != PLAYER_GOD)) {
text_dump(DEFAULT_TEXTDUMP, 0); /* no offset */
} else {
text_dump(file, 0); /* no offset */
}
lock_cache(); /* handle_at_cmd() will (re)unlock it.. */
notify_player(player, "Ok.\r\n");
}
voidfunc do_toad(player, argone, argtwo)
int player;
char *argone, *argtwo;
{
int newowner, victim, total, flags, loc, list, next;
char *name, *buff = (char *) 0;
char work[128];
if (!iswiz(player)) {
notify_player(player, "Permission denied, doof.\r\n");
return;
}
if (!argone || !*argone) {
notify_player(player, "Whom do you want to toad?\r\n");
return;
}
if (!argtwo || !*argtwo) {
newowner = -1;
} else {
if ((newowner = resolve_player(player, argtwo, 1)) == -1 ||
newowner == -2) {
notify_player(player, "I can't find that owner.\r\n");
return;
}
}
if ((victim = resolve_player(player, argone, 1)) == -1 || victim == -2) {
notify_player(player, "I can't find that player.\r\n");
return;
}
if (isgod(victim)) {
notify_player(player, "God may not be toaded.\r\n");
return;
}
if (player == victim) {
notify_player(player, "Toading yourself would be quite stupid.\r\n");
return;
}
if (iswiz(victim) && !isgod(player)) {
notify_player(player, "You can't toad another wizard!\r\n");
return;
}
notify_player(victim, "You sense that everything you own is vanishing...\r\n");
if (newowner != -1) {
total = chownall(victim, newowner);
} else {
total = purgepossessions(victim);
}
if (get_int_elt(victim, FLAGS, &flags) == -1)
goto toadbomb;
flags &= ~TYPE_MASK;
flags |= TYP_THING;
if (set_int_elt(victim, FLAGS, flags) == -1)
goto toadbomb;
notify_player(victim, "You have been turned into a slimy toad!\r\n");
iobdisconnect(victim);
if (get_str_elt(victim, NAME, &name) == -1)
goto toadbomb;
#ifdef NO_ALLOCA
buff = ty_malloc(strlen(name) + 1, "do_toad");
#else
buff = (char *) alloca(strlen(name) + 1);
#endif
(void) strcpy(buff, name); /* save a copy */
(void) sprintf(work, "A slimy toad named %s.", buff);
if (set_str_elt(victim, NAME, work) == -1)
goto toadbomb;
if (get_int_elt(victim, LOC, &loc) == -1)
goto toadbomb;
if (exists_object(loc)) {
(void) strcpy(work, buff);
(void) strcat(work, " vanishes in a puff of smoke.\r\n");
notify_oall(victim, work);
list_drop(victim, loc, CONTENTS_LIST);
list_add(victim, player, CONTENTS_LIST);
if (set_int_elt(victim, LOC, player) == -1)
goto toadbomb;
}
if (get_int_elt(victim, CONTENTS, &list) == -1)
goto toadbomb;
while (list != -1) {
int home;
if (get_int_elt(list, NEXT, &next) == -1)
goto toadbomb;
if (get_int_elt(list, HOME, &home) == -1) {
list = next;
continue;
}
if (!exists_object(home)) {
int owner;
if (get_int_elt(list, OWNER, &owner) == -1) {
list = next;
continue;
}
if (get_int_elt(owner, HOME, &home) == -1) {
list = next;
continue;
}
if (!exists_object(home)) {
home = STARTING_LOC;
}
}
if (set_int_elt(list, LOC, home) == -1) {
list = next;
continue;
}
list_drop(list, victim, CONTENTS_LIST);
list_add(list, home, CONTENTS_LIST);
list = next;
}
if (get_int_elt(victim, EXITS, &list) == -1)
goto toadbomb;
if (list) {
while (list != -1) {
if (get_int_elt(list, NEXT, &next) == -1)
goto toadbomb;
recycleobj(list);
list = next;
}
if (set_int_elt(victim, EXITS, -1) == -1)
goto toadbomb;
}
stamp(victim);
(void) sprintf(work, "Toaded. %d objects %s.\r\n", total, (newowner == -1) ?
"purged" : "chowned");
notify_player(player, work);
log_command("TOAD: %s(#%d) toaded by player #%d.\r\n", buff, victim, player);
#ifdef NO_ALLOCA
ty_free(buff);
#endif
return;
toadbomb:
notify_bad(player);
#ifdef NO_ALLOCA
if (buff)
ty_free(buff);
#endif
}
voidfunc do_wall(player, arg)
int player;
char *arg;
{
char *name;
if (!iswiz(player)) {
notify_player(player, "But what do you want to do with a wall?\r\n");
return;
}
if (!arg || !*arg) {
notify_player(player, "But what do you want with the wall?\r\n");
return;
}
if (get_str_elt(player, NAME, &name) == -1)
goto wallbomb;
sprintf(cmdwork, "%s shouts, \"%s\"\r\n", name, arg);
notify_wall(cmdwork);
log_command("WALL: %s(#%d) \"%s\"\n", name, player, arg);
return;
wallbomb:
notify_bad(player);
return;
}
voidfunc do_shutdown(player)
int player;
{
if (isgod(player)) {
set_mudstat(STOPPED);
log_command("SHUTDOWN: by %s(#%d)\n", getname(player), player);
notify_player(player, "Ok.\r\n");
} else {
notify_player(player, "Permission denied. Doof.\r\n");
}
}
voidfunc do_teleport(player, argone, argtwo)
int player;
char *argone;
char *argtwo;
{
int object, loc, dest, objflags, locflags, destflags;
char *name;
if (!argone || !*argone) {
notify_player(player, "Teleport what to where?\r\n");
return;
}
if (!argtwo || !*argtwo) {
object = player;
if (!strcasecmp(argone, "home")) {
dest = -3;
} else {
if ((dest = resolve_object(player, argone, 0)) == -1) {
notify_player(player, "I can't find that destination.\r\n");
return;
} else if (dest == -2) {
notify_player(player, "I don't know which destination you mean.\r\n");
return;
}
}
} else {
if ((object = resolve_object(player, argone, iswiz(player))) == -1) {
if ((object = resolve_exit(player, argone)) == -1) {
notify_player(player, "I can't find what you wish to teleport.\r\n");
return;
}
}
if (object == -2) {
notify_player(player, "I can't tell which one you wish to teleport.\r\n");
return;
}
if (!strcasecmp(argtwo, "home")) {
dest = -3;
} else {
if ((dest = resolve_object(player, argtwo, iswiz(player))) == -1) {
notify_player(player, "I can't find that destination.\r\n");
return;
} else if (dest == -2) {
notify_player(player, "I don't know which destination you mean.\r\n");
return;
}
}
}
/* do it */
if (get_int_elt(object, FLAGS, &objflags) == -1)
goto telbomb;
if (get_int_elt(object, LOC, &loc) == -1)
goto telbomb;
switch (objflags & TYPE_MASK) {
case TYP_ROOM: /* parent */
if (dest != ROOT_PARENT) {
if (!exists_object(dest) || (object == dest)) {
notify_player(player, "Illegal parent.\r\n");
return;
}
if (!isroom(dest)) {
notify_player(player, "That's not a room!\r\n");
return;
}
if (!controls(player, dest) && dest != ROOT_PARENT && !isabode(dest)) {
notify_player(player, "Permission denied.\r\n");
return;
}
if (!legal_parent_check(dest, loc)) {
notify_player(player, "Illegal parent.\r\n");
return;
}
}
if (set_int_elt(object, LOC, dest) == -1)
goto telbomb;
list_drop(object, loc, ROOMS_LIST);
list_add(object, dest, ROOMS_LIST);
notify_player(player, "Parent set.\r\n");
return;
case TYP_EXIT: /* no go */
notify_player(player, "You can't teleport that!\r\n");
return;
case TYP_PLAYER: /* our most complex */
if (get_int_elt(loc, FLAGS, &locflags) == -1)
goto telbomb;
if (dest == -3) { /* home */
int home;
if (get_int_elt(object, HOME, &home) == -1)
goto telbomb;
if (!exists_object(home))
home = STARTING_LOC;
dest = home;
}
if (get_int_elt(dest, FLAGS, &destflags) == -1)
goto telbomb;
if ((!controls(player, loc) && !(locflags & JUMP_OK)) ||
(!controls(player, dest) && !(destflags & JUMP_OK)) ||
(!controls(player, object) && !(objflags & JUMP_OK))) {
notify_player(player, "Permission denied.\r\n");
return;
}
if ((destflags & TYPE_MASK) == TYP_EXIT) {
notify_player(player, "You can't teleport a player to that!\r\n");
return;
}
notify_player(object, "You feel a wrenching sensation...\r\n");
if (get_str_elt(object, NAME, &name) == -1)
goto telbomb;
act_object(object, object, -1, (!isdark(object)) ? OTELEPORT : -1,
-1, (char *) 0, (char *) 0);
if (!(locflags & DARK) && !isdark(object)) {
sprintf(cmdwork, "%s has left.\r\n", name);
notify_oall(object, cmdwork);
}
act_object(object, object, -1,
(!isdark(object)) ? OXTELEPORT : -1, dest, (char *) 0, (char *) 0);
list_drop(object, loc, CONTENTS_LIST);
list_add(object, dest, CONTENTS_LIST);
if (set_int_elt(object, LOC, dest) == -1)
goto telbomb;
if (!(destflags & DARK) && !isdark(object)) {
sprintf(cmdwork, "%s has arrived.\r\n", name);
notify_oall(object, cmdwork);
}
do_look(object, (char *) 0);
flush_room(loc);
break;
case TYP_THING: /* gotta check for non-sticky drop-tos... */
if (get_int_elt(loc, FLAGS, &locflags) == -1)
goto telbomb;
if (dest == -3) {
int home;
if (get_int_elt(object, HOME, &home) == -1)
goto telbomb;
if (!exists_object(home)) {
int owner;
if (get_int_elt(object, OWNER, &owner) == -1)
goto telbomb;
if (get_int_elt(owner, HOME, &home) == -1)
goto telbomb;
if (!exists_object(home))
home = STARTING_LOC;
}
dest = home;
}
if (get_int_elt(dest, FLAGS, &destflags) == -1)
goto telbomb;
if ((!controls(player, object) && !(objflags & JUMP_OK)) ||
(!controls(player, dest) && !(destflags & JUMP_OK))) {
notify_player(player, "Permission denied.\r\n");
return;
}
if ((destflags & TYPE_MASK) == TYP_EXIT) {
notify_player(player, "You can't teleport an object to an exit!\r\n");
return;
}
stamp(object);
act_object(player, object, -1, OTELEPORT, -1, (char *) 0, (char *) 0);
act_object(player, object, -1, OXTELEPORT, dest, (char *) 0,
(char *) 0);
list_drop(object, loc, CONTENTS_LIST);
list_add(object, dest, CONTENTS_LIST);
if (set_int_elt(object, LOC, dest) == -1)
goto telbomb;
#if 0
if ((destflags & TYPE_MASK) == TYP_ROOM && !(destflags & STICKY)) {
char *odrop;
int dropto;
if (get_int_elt(dest, DROPTO, &dropto) == -1)
goto telbomb;
if (dropto == -3) {
if (get_int_elt(object, HOME, &dropto) == -1)
goto telbomb;
if (!exists_object(dropto)) {
dropto = STARTING_LOC;
}
}
if (dropto != -1) {
if (get_str_elt(object, NAME, &name) == -1)
goto telbomb;
if (get_str_elt(dest, ODROP, &odrop) == -1)
goto telbomb;
if (*odrop) {
notify_oall(object, name);
notify_oall(object, " ");
notify_oall(object, odrop);
notify_oall(object, "\r\n");
} else {
notify_oall(object, name);
notify_oall(object, " falls through the floor!\r\n");
}
list_drop(object, dest, CONTENTS_LIST);
list_add(object, dropto, CONTENTS_LIST);
if (set_int_elt(object, LOC, dropto) == -1)
goto telbomb;
}
}
#endif
break;
default:
goto telbomb;
}
notify_player(player, "Teleported.\r\n");
return;
telbomb:
notify_bad(player);
}
voidfunc do_pcreate(player, argone, argtwo)
int player;
char *argone;
char *argtwo;
{
int loc, newplayer;
#ifdef GOD_ONLY_PCREATE
if (!isgod(player)) {
notify_player(player, "Permission denied.\r\n");
return;
}
#else
if (!iswiz(player)) {
notify_player(player, "Permission denied.\r\n");
return;
}
#endif /* GOD_ONLY_PCREATE */
if (!argone || !*argone || !argtwo || !*argtwo) {
notify_player(player, "Usage: @pcreate <name> = <password>\r\n");
return;
}
if (match_player(argone) != -1) {
notify_player(player, "A player with that name already exists.\r\n");
return;
}
#ifndef REGISTRATION
if (get_int_elt(player, LOC, &loc) == -1) {
notify_player(player, "I can't get your location!\r\n");
return;
}
#endif /* REGISTRATION */
strncpy(cmdwork, argone, 16);
if (strlen(argone) > 16)
cmdwork[15] = '\0';
strcat(cmdwork, " ");
strcat(cmdwork, argtwo);
#ifndef REGISTRATION
if ((newplayer = create_player(cmdwork, loc)) == -1) {
#else
if ((newplayer = create_player(cmdwork, STARTING_LOC)) == -1) {
#endif /* REGISTRATION */
notify_player(player, "Pcreate failed.\r\n");
} else {
(void) sprintf(cmdwork, "Player \"%s\" created with object #%d.\r\n",
getname(newplayer), newplayer);
notify_player(player, cmdwork);
log_command("PCREATED: %s(#%d) created by %s(#%d).\n",
getname(newplayer), newplayer, getname(player), player);
}
}
voidfunc do_purge(player, arg)
int player;
char *arg;
{
int victim;
if (!iswiz(player)) {
notify_player(player, "Someone doesn't want you doing that.\r\n");
return;
}
if (!arg || !*arg) {
notify_player(player, "But who's possessions do you want to purge?\r\n");
return;
}
if ((victim = resolve_player(player, arg, 1)) == -1) {
notify_player(player, "That person does not exist.\r\n");
return;
}
if (isgod(victim)) {
notify_player(player, "You may not purge God's possessions.\r\n");
return;
}
sprintf(cmdwork, "Purged %d objects.\r\n", purgepossessions(victim));
notify_player(player, cmdwork);
}
voidfunc do_chownall(player, argone, argtwo)
int player;
char *argone;
char *argtwo;
{
int oldowner, newowner;
if (!iswiz(player)) {
notify_player(player, "Someone doesn't want you doing that.\r\n");
return;
}
if (!argone || !*argone || !argtwo || !argtwo) {
notify_player(player, "Usage: @chownall <oldowner> = <newowner>\r\n");
return;
}
if ((oldowner = resolve_player(player, argone, 1)) == -1) {
notify_player(player, "I can't find that person.\r\n");
return;
}
if ((newowner = resolve_player(player, argtwo, 1)) == -1) {
notify_player(player, "I couldn't find the new owner.\r\n");
return;
}
if (isgod(oldowner)) {
notify_player(player, "You may not chown all of God's possessions.\r\n");
return;
}
sprintf(cmdwork, "Chowned %d objects to #%d.\r\n", chownall(oldowner, newowner),
newowner);
notify_player(player, cmdwork);
}
voidfunc do_quota(player, argone, argtwo)
int player;
char *argone;
char *argtwo;
{
int quota, victim;
if (!argone || !*argone) {
victim = player;
} else {
if ((victim = resolve_player(player, argone, iswiz(player))) == -1 ||
victim == -2) {
notify_player(player, "No such player.\r\n");
return;
}
if (!iswiz(player) && victim != player) {
notify_player(player, "You're simply not perceptive enough.\r\n");
return;
}
}
if (!argtwo || !*argtwo) {
if (get_int_elt(victim, QUOTA, "a) == -1)
goto quotabomb;
(void) sprintf(cmdwork, "%s Object Quota: %d\r\n",
stuff_name(player, victim), quota);
notify_player(player, cmdwork);
} else {
if (!iswiz(player)) {
notify_player(player, "Contact a Wizard if your quota needs updated.\r\n");
return;
}
if (!isdigit(argtwo[0])) {
notify_player(player, "Please specify only a positive number.\r\n");
return;
}
quota = atoi(argtwo);
if (quota < 0) {
notify_player(player, "Please specify only a positive number.\r\n");
return;
}
if (set_int_elt(victim, QUOTA, quota) == -1)
goto quotabomb;
(void) sprintf(cmdwork, "Quota set to %d objects.\r\n", quota);
notify_player(player, cmdwork);
}
return;
quotabomb:
notify_bad(player);
}
voidfunc do_wizzwall(player, arg)
int player;
char *arg;
{
char *name;
if (!iswiz(player)) {
notify_player(player, "Someone doesn't want you doing that.\r\n");
return;
}
if (!arg || !*arg) {
notify_player(player, "But what do you want to shout?\r\n");
return;
}
if (get_str_elt(player, NAME, &name) == -1) {
notify_bad(player);
return;
}
(void) sprintf(cmdwork, "%s wizzes: %s\r\n", name, arg);
notify_wizz(cmdwork);
}