/* powers.c
* code for powers, except unparse_power (in unparse.c)
*/
#include "copyright.h"
#include "autoconf.h"
#include "externs.h"
#include "command.h"
#include "flags.h"
/* find_power: returns a nametab entry corresponding to a power name
* e.g., find_power("change_quotas") returns one for POW_CHG_QUOTAS
* by Alloy [4-1-95]
*/
NAMETAB *
find_power(name)
char *name;
{
char *cp;
for (cp = name; *cp; cp++)
*cp = ToLower(*cp);
return (NAMETAB *) hashfind(name, &mudstate.powers_htab);
}
/* do_power: grant and ungrant powers */
void
do_power(player, cause, key, arg1, arg2)
dbref player, cause;
int key;
char *arg1, *arg2;
{
char *p = arg2;
dbref thing;
NAMETAB *power;
int clear = 0;
/* find victim */
init_match(player, arg1, NOTYPE);
match_everything(0);
thing = noisy_match_result();
if (thing == NOTHING)
return;
if (!Controls(player, thing)) {
notify_quiet(player, "Permission denied.");
return;
}
/* what power do we want? */
if (*p == NOT_TOKEN) {
clear++;
p++;
}
power = find_power(p);
if (power == NULL) {
notify(player, "That isn't a valid power.");
return;
}
if (!check_access(player, power->perm)) {
notify(player, "Permission denied.");
return;
}
/* do it */
if (clear)
Powers(thing) &= ~power->flag;
else
Powers(thing) |= power->flag;
notify(player, clear ? "Cleared." : "Set.");
}
void
NDECL(init_powertab)
{
NAMETAB *fp;
char *nbuf, *np, *bp;
hashinit(&mudstate.powers_htab, 40);
nbuf = alloc_sbuf("init_powerstab");
for (fp = powers_nametab; fp->name; fp++) {
for (np = nbuf, bp = (char *) fp->name; *bp; np++, bp++)
*np = ToLower(*bp);
*np = '\0';
hashadd(nbuf, (int *) fp, &mudstate.powers_htab);
}
free_sbuf(nbuf);
}
void
decompile_powers(player, thing, thingname)
dbref player, thing;
char *thingname;
{
FLAG f1;
NAMETAB *fp;
/* Report generic flags */
f1 = Powers(thing);
for (fp = powers_nametab; fp->name; fp++) {
/* Skip if we shouldn't decompile this flag, er... power */
if (fp->perm & CA_NO_DECOMP)
continue;
/* Skip if this flag is not set */
if (!(f1 & fp->flag))
continue;
/* Skip if we can't see this flag */
if (!check_access(player, fp->perm))
continue;
/* We made it this far, report this flag */
notify(player, tprintf("@power %s=%s", thingname, fp->name));
}
}