#include "copyright.h"
/* commands which set parameters */
//#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "db.h"
#include "config.h"
#include "match.h"
#include "interface.h"
#include "externs.h"
static dbref match_controlled (dbref player, const char *name)
{
dbref match;
init_match (player, name, NOTYPE);
match_everything ();
match = noisy_match_result ();
if (match != NOTHING && !controls (player, match)) {
notify (player, "Permission denied.");
return NOTHING;
} else {
return match;
}
}
void do_name (dbref player, const char *name, char *newname)
{
dbref thing;
void free (void *);
char *password;
if ((thing = match_controlled (player, name)) != NOTHING) {
/* check for bad name */
if (*newname == '\0') {
notify (player, "Give it what new name?");
return;
}
/* check for renaming a player */
if (Typeof (thing) == TYPE_PLAYER) {
/* split off password */
for (password = newname; isgraph (*password); password++);
/* eat whitespace */
if (*password) {
*password++ = '\0'; /* terminate name */
while (*password && isspace (*password))
password++;
}
/* check for null password */
if (!*password) {
notify (player,
"You must specify a password to change a player name.");
notify (player, "E.g.: name player = newname password");
return;
} else if (strcmp (password, db[thing].password)) {
notify (player, "Incorrect password.");
return;
} else if (!payfor (player, LOOKUP_COST)
|| !ok_player_name (newname)) {
notify (player, "You can't give a player that name.");
return;
}
} else {
if (!ok_name (newname)) {
notify (player, "That is not a reasonable name.");
return;
}
}
/* everything ok, change the name */
if (db[thing].name) {
free ((void *) db[thing].name);
}
db[thing].name = alloc_string (newname);
notify (player, "Name set.");
}
}
void do_describe (dbref player, const char *name, const char *description)
{
dbref thing;
if ((thing = match_controlled (player, name)) != NOTHING) {
if (db[thing].description) {
free ((void *) db[thing].description);
}
db[thing].description = alloc_string (description);
notify (player, "Description set.");
}
}
void do_fail (dbref player, const char *name, const char *message)
{
dbref thing;
if ((thing = match_controlled (player, name)) != NOTHING) {
if (db[thing].fail_message) {
free ((void *) db[thing].fail_message);
}
db[thing].fail_message = alloc_string (message);
notify (player, "Message set.");
}
}
void do_success (dbref player, const char *name, const char *message)
{
dbref thing;
if ((thing = match_controlled (player, name)) != NOTHING) {
if (db[thing].succ_message) {
free ((void *) db[thing].succ_message);
}
db[thing].succ_message = alloc_string (message);
notify (player, "Message set.");
}
}
void do_osuccess (dbref player, const char *name, const char *message)
{
dbref thing;
if ((thing = match_controlled (player, name)) != NOTHING) {
if (db[thing].osuccess) {
free ((void *) db[thing].osuccess);
}
db[thing].osuccess = alloc_string (message);
notify (player, "Message set.");
}
}
void do_ofail (dbref player, const char *name, const char *message)
{
dbref thing;
if ((thing = match_controlled (player, name)) != NOTHING) {
if (db[thing].ofail) {
free ((void *) db[thing].ofail);
}
db[thing].ofail = alloc_string (message);
notify (player, "Message set.");
}
}
void do_lock (dbref player, const char *name, const char *keyname)
{
dbref thing;
dbref key;
int antilock;
init_match (player, name, NOTYPE);
match_everything ();
switch (thing = match_result ()) {
case NOTHING:
notify (player, "I don't see what you want to lock!");
return;
case AMBIGUOUS:
notify (player, "I don't know which one you want to lock!");
return;
default:
if (!controls (player, thing)) {
notify (player, "You can't lock that!");
return;
}
break;
}
/* now we know it's ok to lock */
if (antilock = (*keyname == NOT_TOKEN)) {
/* skip past ! and any following whitespace */
for (keyname++; *keyname && isspace (*keyname); keyname++);
}
/* match keyname */
init_match (player, keyname, TYPE_THING);
match_neighbor ();
match_possession ();
match_me ();
match_player ();
if (Wizard (player))
match_absolute ();
switch (key = match_result ()) {
case NOTHING:
notify (player, "I can't find that key!");
return;
case AMBIGUOUS:
notify (player, "I don't know which key you want!");
return;
default:
if (Typeof (key) != TYPE_PLAYER && Typeof (key) != TYPE_THING) {
notify (player, "Keys can only be players or things.");
return;
}
break;
}
/* everything ok, do it */
db[thing].key = key;
if (antilock) {
db[thing].flags |= ANTILOCK;
notify (player, "Anti-Locked.");
} else {
db[thing].flags &= ~ANTILOCK;
notify (player, "Locked.");
}
}
void do_unlock (dbref player, const char *name)
{
dbref thing;
if ((thing = match_controlled (player, name)) != NOTHING) {
db[thing].key = NOTHING;
db[thing].flags &= ~ANTILOCK;
notify (player, "Unlocked.");
}
}
void do_unlink (dbref player, const char *name)
{
dbref exit;
init_match (player, name, TYPE_EXIT);
match_exit ();
match_here ();
if (Wizard (player)) {
match_absolute ();
}
switch (exit = match_result ()) {
case NOTHING:
notify (player, "Unlink what?");
break;
case AMBIGUOUS:
notify (player, "I don't know which one you mean!");
break;
default:
if (!controls (player, exit)) {
notify (player, "Permission denied.");
} else {
switch (Typeof (exit)) {
case TYPE_EXIT:
db[exit].location = NOTHING;
notify (player, "Unlinked.");
break;
case TYPE_ROOM:
db[exit].location = NOTHING;
notify (player, "Dropto removed.");
break;
default:
notify (player, "You can't unlink that!");
break;
}
}
}
}
void do_chown (dbref player, const char *name, const char *newobj)
{
dbref thing;
dbref owner;
if (!Wizard (player)) {
notify (player, "Permission denied.");
} else {
init_match (player, name, NOTYPE);
match_everything ();
if ((thing = noisy_match_result ()) == NOTHING) {
return;
} else if ((owner = lookup_player (newobj)) == NOTHING) {
notify (player, "I couldn't find that player.");
} else if (Typeof (thing) == TYPE_PLAYER) {
notify (player, "Players always own themselves.");
} else {
db[thing].owner = owner;
notify (player, "Owner changed.");
}
}
}
void do_set (dbref player, const char *name, const char *flag)
{
dbref thing;
const char *p;
object_flag_type f;
/* find thing */
if ((thing = match_controlled (player, name)) == NOTHING)
return;
/* move p past NOT_TOKEN if present */
for (p = flag; *p && (*p == NOT_TOKEN || isspace (*p)); p++);
/* identify flag */
if (*p == '\0') {
notify (player, "You must specify a flag to set.");
return;
} else if (string_prefix ("LINK_OK", p)) {
f = LINK_OK;
} else if (string_prefix ("DARK", p)) {
f = DARK;
} else if (string_prefix ("STICKY", p)) {
f = STICKY;
} else if (string_prefix ("WIZARD", p)) {
f = WIZARD;
} else if (string_prefix ("TEMPLE", p)) {
f = TEMPLE;
#ifdef RESTRICTED_BUILDING
} else if (string_prefix ("BUILDER", p)) {
f = BUILDER;
#endif /* RESTRICTED_BUILDING */
} else {
notify (player, "I don't recognized that flag.");
return;
}
/* check for restricted flag */
if (!Wizard (player)
&& (f == WIZARD
#ifdef RESTRICTED_BUILDING
|| f == BUILDER
#endif /* RESTRICTED_BUILDING */
|| f == TEMPLE || f == DARK && Typeof (thing) != TYPE_ROOM)) {
notify (player, "Permission denied.");
return;
}
/* check for stupid wizard */
if (f == WIZARD && *flag == NOT_TOKEN && thing == player) {
notify (player, "You cannot make yourself mortal.");
return;
}
/* else everything is ok, do the set */
if (*flag == NOT_TOKEN) {
/* reset the flag */
db[thing].flags &= ~f;
notify (player, "Flag reset.");
} else {
/* set the flag */
db[thing].flags |= f;
notify (player, "Flag set.");
}
}