#include "copyright.h"
/* Wizard-only commands */
#include <stdlib.h>
#include "db.h"
#include "interface.h"
#include "match.h"
#include "externs.h"
void do_teleport (dbref player, const char *arg1, const char *arg2)
{
dbref victim;
dbref destination;
const char *to;
if (!Wizard (player)) {
notify (player, "Only a Wizard may teleport at will.");
return;
}
/* get victim, destination */
if (*arg2 == '\0') {
victim = player;
to = arg1;
} else {
init_match (player, arg1, NOTYPE);
match_neighbor ();
match_possession ();
match_me ();
match_absolute ();
match_player ();
if ((victim = noisy_match_result ()) == NOTHING) {
return;
}
to = arg2;
}
/* get destination */
init_match (player, to, TYPE_PLAYER);
match_neighbor ();
match_me ();
match_here ();
match_absolute ();
match_player ();
switch (destination = match_result ()) {
case NOTHING:
notify (player, "Send it where?");
break;
case AMBIGUOUS:
notify (player, "I don't know which destination you mean!");
break;
default:
/* check victim, destination types, teleport if ok */
if (Typeof (destination) == TYPE_EXIT
|| Typeof (destination) == TYPE_THING
|| Typeof (victim) == TYPE_EXIT
|| Typeof (victim) == TYPE_ROOM
|| (Typeof (victim) == TYPE_PLAYER
&& Typeof (destination) != TYPE_ROOM)) {
notify (player, "Bad destination.");
} else if (Typeof (victim) == TYPE_PLAYER) {
notify (victim, "You feel a wrenching sensation...");
enter_room (victim, destination);
} else {
moveto (victim, destination);
}
}
}
void do_force (dbref player, const char *what, char *command)
{
dbref victim;
if (!Wizard (player)) {
notify (player, "Only Wizards may use this command.");
return;
}
/* get victim */
if ((victim = lookup_player (what)) == NOTHING) {
notify (player, "That player does not exist.");
return;
}
/* force victim to do command */
process_command (victim, command);
}
void do_stats (dbref player, const char *name)
{
dbref rooms;
dbref exits;
dbref things;
dbref players;
dbref unknowns;
dbref total;
dbref i;
dbref owner;
char buf[BUFFER_LEN];
if (!Wizard (player)) {
sprintf (buf, "The universe contains %d objects.", db_top);
notify (player, buf);
} else {
owner = lookup_player (name);
total = rooms = exits = things = players = unknowns = 0;
for (i = 0; i < db_top; i++) {
if (owner == NOTHING || owner == db[i].owner) {
total++;
switch (Typeof (i)) {
case TYPE_ROOM:
rooms++;
break;
case TYPE_EXIT:
exits++;
break;
case TYPE_THING:
things++;
break;
case TYPE_PLAYER:
players++;
break;
default:
unknowns++;
break;
}
}
}
sprintf (buf,
"%d objects = %d rooms, %d exits, %d things, %d players, %d unknowns.",
total, rooms, exits, things, players, unknowns);
notify (player, buf);
}
}
void do_toad (dbref player, const char *name)
{
dbref victim;
char buf[BUFFER_LEN];
if (!Wizard (player)) {
notify (player, "Only a Wizard can turn a person into a toad.");
return;
}
init_match (player, name, TYPE_PLAYER);
match_neighbor ();
match_absolute ();
match_player ();
if ((victim = noisy_match_result ()) == NOTHING)
return;
if (Typeof (victim) != TYPE_PLAYER) {
notify (player, "You can only turn players into toads!");
} else if (Wizard (victim)) {
notify (player, "You can't turn a Wizard into a toad.");
} else if (db[victim].contents != NOTHING) {
notify (player, "What about what they are carrying?");
} else {
/* we're ok */
/* do it */
if (db[victim].password) {
free (db[victim].password);
db[victim].password = 0;
}
db[victim].flags = TYPE_THING;
db[victim].owner = player; /* you get it */
db[victim].pennies = 1; /* don't let him keep his immense wealth */
/* notify people */
notify (victim, "You have been turned into a toad.");
sprintf (buf, "You turned %s into a toad!", db[victim].name);
notify (player, buf);
/* reset name */
sprintf (buf, "a slimy toad named %s", db[victim].name);
free (db[victim].name);
db[victim].name = alloc_string (buf);
}
}