/* set.c */
#include "config.h"
/*
* This file is part of TeenyMUD II.
* Copyright(C) 1993, 1994, 1995 by Jason Downs.
* All rights reserved.
*
* TeenyMUD II is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* TeenyMUD II is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (see the file 'COPYING'); if not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*
*/
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif /* HAVE_STDLIB_H */
#include <stdio.h>
#include <sys/types.h>
#ifdef HAVE_STRING_H
#include <string.h>
#else
#include <strings.h>
#endif /* HAVE_STRING_H */
#include <ctype.h>
#include "conf.h"
#include "flaglist.h"
#include "teeny.h"
#include "commands.h"
#include "sha/sha_wrap.h"
#include "externs.h"
/* commands dealing with setting things. */
static void set_attrflags _ANSI_ARGS_((int player, int cause, int switches,
int obj, char *name, char *flags));
VOID do_charge(player, cause, switches, argone, argtwo)
int player, cause, switches;
char *argone, *argtwo;
{
int obj, charges;
char *ptr;
if((argone == (char *)NULL) || (argone[0] == '\0')) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Charge what?", NOT_QUIET);
return;
}
obj = resolve_object(player, cause, argone,
(!(switches & CMD_QUIET) ? RSLV_EXITS|RSLV_NOISY
: RSLV_EXITS));
if(obj == -1)
return;
if(!controls(player, cause, obj)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Permission denied.", NOT_QUIET);
return;
}
if((argtwo == (char *)NULL) || (argtwo[0] == '\0')) {
charges = -1;
} else {
charges = (int)strtol(argtwo, &ptr, 10);
if(ptr == argtwo) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Numerical argument required.",
NOT_QUIET);
return;
}
if(charges < -1)
charges = -1;
}
if(set_int_elt(obj, CHARGES, charges) == -1)
notify_bad(player);
else if(!(switches & CMD_QUIET)) {
switch(charges) {
case -1:
notify_player(player, cause, player, "Charged removed.", NOT_QUIET);
break;
case 0:
notify_player(player, cause, player, "Charge emptied.", NOT_QUIET);
break;
default:
notify_player(player, cause, player, "Charge set.", NOT_QUIET);
break;
}
}
}
VOID do_set(player, cause, switches, argone, argtwo)
int player, cause, switches;
char *argone, *argtwo;
{
int obj, unset, objflags[FLAGS_LEN], ohear;
char *msg, *name, *data;
register FlagList *flist;
FlagList *match;
if ((argtwo == (char *)NULL) || (argtwo[0] == '\0')) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player,"Set what?", NOT_QUIET);
return;
}
obj = resolve_object(player, cause, argone,
(!(switches & CMD_QUIET) ? RSLV_EXITS|RSLV_NOISY
: RSLV_EXITS));
if(obj == -1)
return;
if (!exists_object(obj) || !controls(player, cause, obj)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "You can't set anything on that!",
NOT_QUIET);
return;
}
/* Okie. What's this doof want to set? */
/* attributes */
if ((data = strchr(argtwo, ':')) != (char *) NULL) {
for (name = (data - 1); name >= argtwo && isspace(*name); name--);
name[1] = 0;
data++;
while (*data && isspace(*data))
data++;
set_attribute(player, cause, switches, obj, argtwo, data);
return;
} else if ((data = strchr(argtwo, '/')) != (char *) NULL) {
for (name = (data - 1); name >= argtwo && isspace(*name); name--);
name[1] = 0;
data++;
while (*data && isspace(*data))
data++;
set_attrflags(player, cause, switches, obj, argtwo, data);
return;
}
/* object flags */
if (*argtwo == '!') {
unset = 1;
argtwo++;
} else
unset = 0;
match = (FlagList *)NULL;
for (flist = GenFlags; flist->name; flist++) {
if (!strncasecmp(flist->name, argtwo, flist->matlen)) {
match = flist;
break;
}
}
/* no match yet? */
if (match == (FlagList *)NULL) {
switch(Typeof(obj)) {
case TYP_PLAYER:
for(flist = PlayerFlags; flist->name; flist++) {
if(!strncasecmp(flist->name, argtwo, flist->matlen)) {
match = flist;
break;
}
}
break;
case TYP_ROOM:
for(flist = RoomFlags; flist->name; flist++) {
if(!strncasecmp(flist->name, argtwo, flist->matlen)) {
match = flist;
break;
}
}
break;
case TYP_THING:
for(flist = ThingFlags; flist->name; flist++) {
if(!strncasecmp(flist->name, argtwo, flist->matlen)) {
match = flist;
break;
}
}
break;
case TYP_EXIT:
for(flist = ExitFlags; flist->name; flist++) {
if(!strncasecmp(flist->name, argtwo, flist->matlen)) {
match = flist;
break;
}
}
break;
}
}
if (match == (FlagList *)NULL) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "I don't understand that flag.",
NOT_QUIET);
return;
}
/* permission checks */
if (((match->perm & PERM_GOD) && !isGOD(player))
|| ((match->perm & PERM_WIZ) && !isWIZARD(player))
|| (match->perm & PERM_INTERNAL)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Permission denied.", NOT_QUIET);
return;
}
/* special permissions */
if ((obj == mudconf.player_god) && unset && (match->code == GOD)
&& (match->word == 1)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "That player is always God.",
NOT_QUIET);
return;
}
if ((match->perm & PERM_DARK) && !isWIZARD(player) && isTHING(obj)) {
int loc;
if (get_int_elt(obj, LOC, &loc) == -1) {
notify_bad(player);
return;
}
if (!controls(player, cause, loc)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "You must pick it up, first.",
NOT_QUIET);
return;
}
}
if (match->perm & PERM_PLAYER) {
int powner;
if(get_int_elt(player, OWNER, &powner) == -1) {
notify_bad(player);
return;
}
if(!isPLAYER(player) || (player != powner)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player,
"Only a player may set that flag.", NOT_QUIET);
return;
}
}
/* Set the flags */
ohear = can_hear(obj);
stamp(obj, STAMP_MODIFIED);
if (get_flags_elt(obj, FLAGS, objflags) == -1) {
notify_bad(player);
return;
}
if (unset) {
objflags[match->word] &= ~(match->code);
msg = "Flag unset.";
} else {
objflags[match->word] |= match->code;
msg = "Flag set.";
}
if (set_flags_elt(obj, FLAGS, objflags) == -1) {
notify_bad(player);
return;
}
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, msg, NOT_QUIET);
hear_alert(cause, ohear, obj);
}
VOID do_password(player, cause, switches, argone, argtwo)
int player, cause, switches;
char *argone, *argtwo;
{
char *pwd;
int aflags;
if ((argone == (char *)NULL) || (argone[0] == '\0')) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player,
"Usage: @password <oldpassword> = <newpassword>",
NOT_QUIET);
return;
}
if (attr_get(player, PASSWORD, &pwd, &aflags) == -1) {
notify_bad(player);
return;
}
if ((pwd == (char *)NULL) || (pwd[0] == '\0')) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player,
"You can't change your password.", NOT_QUIET);
return;
}
if (!comp_password(pwd, argone)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Incorrect password.", NOT_QUIET);
return;
}
if (attr_add(player, PASSWORD, cryptpwd(argtwo), aflags) == -1) {
notify_bad(player);
return;
}
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Password changed.", NOT_QUIET);
}
void do_set_string(player, cause, switches, argone, argtwo, str)
int player, cause, switches;
char *argone, *argtwo;
StringList *str;
{
int obj, ret;
char buf[MEDBUFFSIZ];
/* Find the thing to set the string ON */
if ((argone == (char *)NULL) || (argone[0] == '\0')) {
if(!(switches & CMD_QUIET)) {
snprintf(buf, sizeof(buf), "Set the %s string on what?", str->name);
notify_player(player, cause, player, buf, NOT_QUIET);
}
return;
}
obj = resolve_object(player, cause, argone,
(!(switches & CMD_QUIET) ? RSLV_EXITS|RSLV_NOISY
: RSLV_EXITS));
if(obj == -1)
return;
if (!controls(player, cause, obj)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "You can't do that!", NOT_QUIET);
return;
}
if ((argtwo != (char *)NULL) && argtwo[0] && !ok_attr_value(argtwo)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player,
"You can't set an attribute to that!", NOT_QUIET);
return;
}
stamp(obj, STAMP_MODIFIED);
if ((argtwo != (char *)NULL) && argtwo[0]) {
ret = attr_add(obj, str->name, argtwo, str->flags);
} else {
ret = attr_delete(obj, str->name);
}
if (ret == -1) {
notify_bad(player);
return;
}
if(!(switches & CMD_QUIET)) {
snprintf(buf, sizeof(buf), "%s set.", str->name);
notify_player(player, cause, player, buf, NOT_QUIET);
}
}
static void set_attrflags(player, cause, switches, obj, name, flags)
int player, cause, switches, obj;
char *name, *flags;
{
int aflags;
int unset = 0;
char *data, buf[MEDBUFFSIZ];
AFlagList *Aflags;
if (attr_get(obj, name, &data, &aflags) == -1) {
notify_bad(player);
return;
}
if (data == (char *) NULL) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "No such attribute.", NOT_QUIET);
return;
}
if (flags[0] == '!') {
unset = 1;
flags++;
}
for (Aflags = AFlags; Aflags->name &&
strncasecmp(Aflags->name, flags, Aflags->matlen); Aflags++);
if (!Aflags->name) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "No such attribute flag.",
NOT_QUIET);
return;
}
if (!can_set_attr(player, cause, obj, Aflags->code)) {
if(!(switches & CMD_QUIET)) {
snprintf(buf, sizeof(buf), "%s(#%d): Permission denied.", name, obj);
notify_player(player, cause, player, buf, NOT_QUIET);
}
return;
}
if (unset) {
aflags &= ~(Aflags->code);
} else {
aflags |= Aflags->code;
}
if (attr_set(obj, name, aflags) == -1) {
notify_bad(player);
return;
}
if(!(switches & CMD_QUIET))
notify_player(player, cause, player,
((unset) ? "Attribute flag unset." : "Attribute flag set."),
NOT_QUIET);
}
void set_attribute(player, cause, switches, obj, name, data)
int player, cause, switches, obj;
char *name, *data;
{
int aflags;
char *p, buf[MEDBUFFSIZ];
if (!ok_attr_name(name)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player,
"That's a silly name for an attribute!", NOT_QUIET);
return;
}
if (attr_get(obj, name, &p, &aflags) == -1) {
notify_bad(player);
return;
}
if ((p != (char *)NULL) && !can_set_attr(player, cause, obj, aflags)) {
if(!(switches & CMD_QUIET)) {
snprintf(buf, sizeof(buf), "%s(#%d): Permission denied.", name, obj);
notify_player(player, cause, player, buf, NOT_QUIET);
}
return;
}
if (p == (char *)NULL)
aflags = DEFATTR_FLGS;
if ((data != (char *)NULL) && data[0]) {
if (!ok_attr_value(data)) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player,
"You can't set an attribute to that!", NOT_QUIET);
return;
}
if (attr_add(obj, name, data, aflags) == -1) {
notify_bad(player);
return;
}
/* special case */
if(strcasecmp(name, STARTUP) == 0) {
if(setHAS_STARTUP(obj) == -1) {
notify_bad(player);
return;
}
}
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Attribute set.", NOT_QUIET);
} else {
if (attr_delete(obj, name) == -1) {
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "No such attribute.", NOT_QUIET);
return;
}
/* special case */
if(strcasecmp(name, STARTUP) == 0) {
if(unsetHAS_STARTUP(obj) == -1) {
notify_bad(player);
return;
}
}
if(!(switches & CMD_QUIET))
notify_player(player, cause, player, "Attribute removed.", NOT_QUIET);
}
}