src/powers.c File Reference

#include "copyright.h"
#include "config.h"
#include "db.h"
#include "mudconf.h"
#include "externs.h"
#include "command.h"
#include "powers.h"
#include "alloc.h"

Include dependency graph for powers.c:

Go to the source code of this file.

Functions

int ph_any (dbref target, dbref player, POWER power, int fpowers, int reset)
int ph_god (dbref target, dbref player, POWER power, int fpowers, int reset)
int ph_wiz (dbref target, dbref player, POWER power, int fpowers, int reset)
int ph_wizroy (dbref target, dbref player, POWER power, int fpowers, int reset)
int ph_inherit (dbref target, dbref player, POWER power, int fpowers, int reset)
void init_powertab (void)
void display_powertab (dbref player)
POWERENTfind_power (dbref thing, char *powername)
int decode_power (dbref player, char *powername, POWERSET *pset)
void power_set (dbref target, dbref player, char *power, int key)
int has_power (dbref player, dbref it, char *powername)
char * power_description (dbref player, dbref target)
void decompile_powers (dbref player, dbref thing, char *thingname)

Variables

POWERENT gen_powers []


Function Documentation

int decode_power ( dbref  player,
char *  powername,
POWERSET pset 
)

Definition at line 171 of file powers.c.

References hashfind(), mudstate, notify_printf(), POWER_EXT, power_entry::powerpower, statedata::powers_htab, power_entry::powervalue, powerset::word1, and powerset::word2.

Referenced by search_setup().

00172 {
00173         POWERENT *pent;
00174 
00175         pset->word1 = 0;
00176         pset->word2 = 0;
00177 
00178         pent = (POWERENT *) hashfind(powername, &mudstate.powers_htab);
00179         if(!pent) {
00180                 notify_printf(player, "%s: Power not found.", powername);
00181                 return 0;
00182         }
00183         if(pent->powerpower & POWER_EXT)
00184                 pset->word2 = pent->powervalue;
00185         else
00186                 pset->word1 = pent->powervalue;
00187 
00188         return 1;
00189 }

void decompile_powers ( dbref  player,
dbref  thing,
char *  thingname 
)

Produce commands to set powers on target.

Definition at line 319 of file powers.c.

References CA_NO_DECOMP, check_access(), gen_powers, LBUF_SIZE, power_entry::listperm, notify_printf(), POWER_EXT, power_entry::powername, power_entry::powerpower, Powers, Powers2, power_entry::powervalue, and strip_ansi_r().

00320 {
00321         POWER f1, f2;
00322         POWERENT *fp;
00323         char new[LBUF_SIZE];
00324 
00325         /*
00326          * Report generic powers 
00327          */
00328 
00329         f1 = Powers(thing);
00330         f2 = Powers2(thing);
00331 
00332         for(fp = gen_powers; fp->powername; fp++) {
00333 
00334                 /*
00335                  * Skip if we shouldn't decompile this power 
00336                  */
00337 
00338                 if(fp->listperm & CA_NO_DECOMP)
00339                         continue;
00340 
00341                 /*
00342                  * Skip if this power is not set 
00343                  */
00344 
00345                 if(fp->powerpower & POWER_EXT) {
00346                         if(!(f2 & fp->powervalue))
00347                                 continue;
00348                 } else {
00349                         if(!(f1 & fp->powervalue))
00350                                 continue;
00351                 }
00352 
00353                 /*
00354                  * Skip if we can't see this power 
00355                  */
00356 
00357                 if(!check_access(player, fp->listperm))
00358                         continue;
00359 
00360                 /*
00361                  * We made it this far, report this power 
00362                  */
00363                 strncpy(new, thingname, LBUF_SIZE-1);
00364                 notify_printf(player, "@power %s=%s", strip_ansi_r(new,thingname,strlen(thingname)),
00365                                           fp->powername);
00366         }
00367 }

void display_powertab ( dbref  player  ) 

Display available powers.

Definition at line 138 of file powers.c.

References alloc_lbuf, CA_GOD, CA_WIZARD, free_lbuf, gen_powers, God, power_entry::listperm, notify, power_entry::powername, safe_chr, safe_str, and Wizard.

Referenced by do_list().

00139 {
00140         char *buf, *bp;
00141         POWERENT *fp;
00142 
00143         bp = buf = alloc_lbuf("display_powertab");
00144         safe_str((char *) "Powers:", buf, &bp);
00145         for(fp = gen_powers; fp->powername; fp++) {
00146                 if((fp->listperm & CA_WIZARD) && !Wizard(player))
00147                         continue;
00148                 if((fp->listperm & CA_GOD) && !God(player))
00149                         continue;
00150                 safe_chr(' ', buf, &bp);
00151                 safe_str((char *) fp->powername, buf, &bp);
00152         }
00153         *bp = '\0';
00154         notify(player, buf);
00155         free_lbuf(buf);
00156 }

POWERENT* find_power ( dbref  thing,
char *  powername 
)

Definition at line 158 of file powers.c.

References hashfind(), mudstate, statedata::powers_htab, and ToLower.

Referenced by has_power(), and power_set().

00159 {
00160         char *cp;
00161 
00162         /*
00163          * Make sure the power name is valid 
00164          */
00165 
00166         for(cp = powername; *cp; cp++)
00167                 *cp = ToLower(*cp);
00168         return (POWERENT *) hashfind(powername, &mudstate.powers_htab);
00169 }

int has_power ( dbref  player,
dbref  it,
char *  powername 
)

Does object have power visible to player?

Definition at line 246 of file powers.c.

References CA_GOD, CA_WIZARD, find_power(), God, power_entry::listperm, POWER_EXT, power_entry::powerpower, Powers, Powers2, power_entry::powervalue, and Wizard.

Referenced by fun_haspower().

00247 {
00248         POWERENT *fp;
00249         POWER fv;
00250 
00251         fp = find_power(it, powername);
00252         if(fp == NULL)
00253                 return 0;
00254 
00255         if(fp->powerpower & POWER_EXT)
00256                 fv = Powers2(it);
00257         else
00258                 fv = Powers(it);
00259 
00260         if(fv & fp->powervalue) {
00261                 if((fp->listperm & CA_WIZARD) && !Wizard(player))
00262                         return 0;
00263                 if((fp->listperm & CA_GOD) && !God(player))
00264                         return 0;
00265                 return 1;
00266         }
00267         return 0;
00268 }

void init_powertab ( void   ) 

Initialize power hash tables.

Definition at line 119 of file powers.c.

References alloc_sbuf, free_sbuf, gen_powers, HASH_FACTOR, hashadd(), hashinit(), mudstate, power_entry::powername, statedata::powers_htab, and ToLower.

Referenced by main().

00120 {
00121         POWERENT *fp;
00122         char *nbuf, *np, *bp;
00123 
00124         hashinit(&mudstate.powers_htab, 15 * HASH_FACTOR);
00125         nbuf = alloc_sbuf("init_powertab");
00126         for(fp = gen_powers; fp->powername; fp++) {
00127                 for(np = nbuf, bp = (char *) fp->powername; *bp; np++, bp++)
00128                         *np = ToLower(*bp);
00129                 *np = '\0';
00130                 hashadd(nbuf, (int *) fp, &mudstate.powers_htab);
00131         }
00132         free_sbuf(nbuf);
00133 }

int ph_any ( dbref  target,
dbref  player,
POWER  power,
int  fpowers,
int  reset 
)

set or clear indicated bit, no security checking

Definition at line 18 of file powers.c.

References POWER_EXT, Powers, Powers2, s_Powers, and s_Powers2.

Referenced by ph_god(), ph_inherit(), ph_wiz(), and ph_wizroy().

00019 {
00020         if(fpowers & POWER_EXT) {
00021                 if(reset)
00022                         s_Powers2(target, Powers2(target) & ~power);
00023                 else
00024                         s_Powers2(target, Powers2(target) | power);
00025         } else {
00026                 if(reset)
00027                         s_Powers(target, Powers(target) & ~power);
00028                 else
00029                         s_Powers(target, Powers(target) | power);
00030         }
00031         return 1;
00032 }

int ph_god ( dbref  target,
dbref  player,
POWER  power,
int  fpowers,
int  reset 
)

Only GOD may set or clear the bit

Definition at line 37 of file powers.c.

References God, and ph_any().

00038 {
00039         if(!God(player))
00040                 return 0;
00041         return (ph_any(target, player, power, fpowers, reset));
00042 }

int ph_inherit ( dbref  target,
dbref  player,
POWER  power,
int  fpowers,
int  reset 
)

Only players may set or clear this bit.

Definition at line 67 of file powers.c.

References Inherits, and ph_any().

00069 {
00070         if(!Inherits(player))
00071                 return 0;
00072         return (ph_any(target, player, power, fpowers, reset));
00073 }

int ph_wiz ( dbref  target,
dbref  player,
POWER  power,
int  fpowers,
int  reset 
)

Only WIZARDS (or GOD) may set or clear the bit

Definition at line 47 of file powers.c.

References God, ph_any(), and Wizard.

00048 {
00049         if(!Wizard(player) & !God(player))
00050                 return 0;
00051         return (ph_any(target, player, power, fpowers, reset));
00052 }

int ph_wizroy ( dbref  target,
dbref  player,
POWER  power,
int  fpowers,
int  reset 
)

Only WIZARDS, ROYALTY, (or GOD) may set or clear the bit

Definition at line 57 of file powers.c.

References God, ph_any(), and WizRoy.

00058 {
00059         if(!WizRoy(player) & !God(player))
00060                 return 0;
00061         return (ph_any(target, player, power, fpowers, reset));
00062 }

char* power_description ( dbref  player,
dbref  target 
)

Return an mbuf containing the type and powers on thing.

Definition at line 273 of file powers.c.

References alloc_mbuf, CA_GOD, CA_WIZARD, gen_powers, God, power_entry::listperm, POWER_EXT, power_entry::powername, power_entry::powerpower, Powers, Powers2, power_entry::powervalue, safe_mb_chr, safe_mb_str, Typeof, and Wizard.

Referenced by debug_examine(), and do_examine().

00274 {
00275         char *buff, *bp;
00276         POWERENT *fp;
00277         int otype;
00278         POWER fv;
00279 
00280         /*
00281          * Allocate the return buffer 
00282          */
00283 
00284         otype = Typeof(target);
00285         bp = buff = alloc_mbuf("power_description");
00286 
00287         /*
00288          * Store the header strings and object type 
00289          */
00290 
00291         safe_mb_str((char *) "Powers:", buff, &bp);
00292 
00293         for(fp = gen_powers; fp->powername; fp++) {
00294                 if(fp->powerpower & POWER_EXT)
00295                         fv = Powers2(target);
00296                 else
00297                         fv = Powers(target);
00298                 if(fv & fp->powervalue) {
00299                         if((fp->listperm & CA_WIZARD) && !Wizard(player))
00300                                 continue;
00301                         if((fp->listperm & CA_GOD) && !God(player))
00302                                 continue;
00303                         safe_mb_chr(' ', buff, &bp);
00304                         safe_mb_str((char *) fp->powername, buff, &bp);
00305                 }
00306         }
00307 
00308         /*
00309          * Terminate the string, and return the buffer to the caller 
00310          */
00311 
00312         *bp = '\0';
00313         return buff;
00314 }

void power_set ( dbref  target,
dbref  player,
char *  power,
int  key 
)

Definition at line 194 of file powers.c.

References find_power(), power_entry::handler, Name(), notify, notify_printf(), power_entry::powername, power_entry::powerpower, power_entry::powervalue, Quiet, and SET_QUIET.

Referenced by do_power().

00195 {
00196         POWERENT *fp;
00197         int negate, result;
00198 
00199         /*
00200          * Trim spaces, and handle the negation character 
00201          */
00202 
00203         negate = 0;
00204         while (*power && isspace(*power))
00205                 power++;
00206         if(*power == '!') {
00207                 negate = 1;
00208                 power++;
00209         }
00210         while (*power && isspace(*power))
00211                 power++;
00212 
00213         /*
00214          * Make sure a power name was specified 
00215          */
00216 
00217         if(*power == '\0') {
00218                 if(negate)
00219                         notify(player, "You must specify a power to clear.");
00220                 else
00221                         notify(player, "You must specify a power to set.");
00222                 return;
00223         }
00224         fp = find_power(target, power);
00225         if(fp == NULL) {
00226                 notify(player, "I don't understand that power.");
00227                 return;
00228         }
00229         /*
00230          * Invoke the power handler, and print feedback 
00231          */
00232 
00233         result =
00234                 fp->handler(target, player, fp->powervalue, fp->powerpower, negate);
00235         if(!result)
00236                 notify(player, "Permission denied.");
00237         else if(!(key & SET_QUIET) && !Quiet(player))
00238                 notify_printf(player, "%s - %s %s", Name(target), fp->powername,
00239                                           negate ? "removed." : "granted.");
00240         return;
00241 }


Variable Documentation

POWERENT gen_powers[]

Definition at line 75 of file powers.c.

Referenced by decompile_powers(), display_powertab(), init_powertab(), and power_description().


Generated on Mon May 28 04:25:47 2007 for BattletechMUX by  doxygen 1.4.7