#include "copyright.h"
/* commands which set parameters */
#include <stdio.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.");
}
}