#include "defs.h" #include "prims.h" #define FOO(name,test) \ PRIM(name) { struct inst *v; int rv; NARGS(1); v = TOS(0); \ rv = (test); POP(1); MPUSH(PROG_INTEGER,rv); } FOO(addressp,v->type==PROG_ADD) FOO(stringp,v->type==PROG_STRING) FOO(dbrefp,v->type==PROG_OBJECT) FOO(intp,v->type==PROG_INTEGER) FOO(varp,v->type==PROG_VAR) FOO(pltp,v->type==PROG_PLT) FOO(floatp,v->type==PROG_FLOAT) FOO(arrayp,v->type==PROG_ARRAY) FOO(ptrp,v->type==PROG_PTR) FOO(regexpp,v->type==PROG_RE) FOO(quadp,v->type==PROG_QUAD) FOO(ofilep,v->type==PROG_OFILE) FOO(numberp,(v->type==PROG_STRING)&&v->data.string&&number(v->data.string)) FOO(playerp,valid_object(v)&&(Typeof(v->data.objref)==TYPE_PLAYER)) FOO(thingp,valid_object(v)&&(Typeof(v->data.objref)==TYPE_THING)) FOO(roomp,valid_object(v)&&(Typeof(v->data.objref)==TYPE_ROOM)) FOO(programp,valid_object(v)&&(Typeof(v->data.objref)==TYPE_PROGRAM)) FOO(daemonp,valid_object(v)&&(Typeof(v->data.objref)==TYPE_DAEMON)) FOO(exitp,valid_object(v)&&(Typeof(v->data.objref)==TYPE_EXIT)) FOO(okp,valid_object(v)) FOO(awakep,(valid_object(v)&&(Typeof(v->data.objref)==TYPE_PLAYER)) ?awake_count(v->data.objref):0) FOO(royaltyp,valid_object(v)&&Royalty(v->data.objref)) FOO(true_royaltyp,valid_object(v)&&TrueRoyalty(v->data.objref)) FOO(wizardp,valid_object(v)&&Wizard(v->data.objref)) FOO(true_wizardp,valid_object(v)&&TrueWizard(v->data.objref)) FOO(godp,valid_object(v)&&God(v->data.objref)) FOO(builderp,valid_object(v)&&Builder(v->data.objref)) FOO(muckerp,valid_object(v)&&Mucker(v->data.objref)) #undef FOO PRIM(flagp) { struct inst *vobj; struct inst *vflag; char *flagname; object_flag_type f; int i; NARGS(2); vflag = TOS(0); vobj = TOS(1); if (vflag->type != PROG_STRING) ABORT_INTERP("Non-string argument. (2)"); flagname = vflag->data.string; if (! flagname) ABORT_INTERP("Empty string argument (2)"); if (! valid_object(vobj)) ABORT_INTERP("Non-object argument. (1)"); f = lookup_flag_by_name(flagname,vobj->data.objref); if (! f) ABORT_INTERP("Invalid flag name"); i = !!(FLAGS(vobj->data.objref) & f); POP(2); MPUSH(PROG_INTEGER,i); } PRIM(set) { struct inst *vobj; struct inst *vflag; char *flagname; object_flag_type f; dbref obj; int neg; NARGS(2); vflag = TOS(0); vobj = TOS(1); if (vflag->type != PROG_STRING) ABORT_INTERP("Non-string argument. (2)"); flagname = vflag->data.string; if (! flagname) ABORT_INTERP("No flag name in argument (2)"); if (! valid_object(vobj)) ABORT_INTERP("Non-object argument. (1)"); obj = vobj->data.objref; if (flagname[0] == '!') { neg = 1; flagname ++; if (! *flagname) ABORT_INTERP("No flag name in argument (2)"); } else { neg = 0; } f = lookup_flag_by_name(flagname,obj); if (! f) ABORT_INTERP("Invalid flag name"); if (!PWIZARD && !permissions(UID,obj)) ABORT_INTERP("Permission denied."); if ( (f & (ROYALTY|WIZARD|GOD)) || ((f & IFLAG) && (Typeof(obj) != TYPE_ROOM)) || ( !PWIZARD && ( (f & (UFLAG|QFLAG|VFLAG|CFLAG| BFLAG|KFLAG|XFLAG|YFLAG|ZFLAG)) || ((f & TFLAG) && (Typeof(obj) != TYPE_PROGRAM)) || ((f & DFLAG) && (Typeof(obj) != TYPE_ROOM) && (Typeof(obj) != TYPE_PROGRAM)) || ((f & FFLAG) && (Typeof(obj) != TYPE_PROGRAM) && (Typeof(obj) != TYPE_EXIT)) || ((f & (EFLAG|PFLAG)) && (Typeof(obj) != TYPE_EXIT)) || ((f & HFLAG) && (Typeof(obj) != TYPE_EXIT)) || ((f & MFLAG) && (Typeof(obj) == TYPE_PLAYER)) ) ) ) ABORT_INTERP("Permission denied."); if (neg) { FLAGS(obj) &= ~f; DBDIRTY(obj); } else { FLAGS(obj) |= f; DBDIRTY(obj); } POP(2); } PRIM(getflags) { struct inst *v; dbref obj; NARGS(1); v = TOS(0); if (! valid_object(v)) ABORT_INTERP("Invalid object."); obj = v->data.objref; if (!PWIZARD && (UID != OWNER(obj))) ABORT_INTERP("Permission denied."); POP(1); MPUSH(PROG_INTEGER,FLAGS(obj)); } PRIM(flagbit) { struct inst *v; char *flagname; object_flag_type f; NARGS(1); v = TOS(0); if (v->type != PROG_STRING) ABORT_INTERP("Non-string argument."); flagname = v->data.string; if (! flagname) ABORT_INTERP("No flag name in argument"); f = lookup_flag_by_name(flagname,NOTHING); if (! f) ABORT_INTERP("Invalid flag name"); POP(1); MPUSH(PROG_INTEGER,f); } PRIM(locked) { struct inst *v; int rv; NARGS(1); v = TOS(0); if (!valid_object(v) && !is_home(v)) ABORT_INTERP("Invalid argument."); rv = !is_home(v) && (DBFETCH(v->data.objref)->key != TRUE_BOOLEXP); POP(1); MPUSH(PROG_INTEGER,rv); } PRIM(passlockp) { struct inst *vthing; struct inst *vpasser; dbref thing; dbref passer; int rv; NARGS(2); vthing = TOS(0); vpasser = TOS(1); if (!valid_object(vthing)) ABORT_INTERP("Non-object argument. (2)"); if (!valid_object(vpasser)) ABORT_INTERP("Non-object argument. (1)"); thing = vthing->data.objref; passer = vpasser->data.objref; POP(2); add_proglock(program,player,PROGLOCK_READ); rv = eval_boolexp(player,passer,DBFETCH(thing)->key,thing); if (interp_errored()) return; remove_proglock(program,player); MPUSH(PROG_INTEGER,rv); } PRIM(passwordchk) { struct inst *vwho; struct inst *vpass; dbref who; int rv; NARGS(2); vpass = TOS(0); vwho = TOS(1); if (vpass->type != PROG_STRING) ABORT_INTERP("Non-string argument. (2)"); if (!valid_object(vwho)) ABORT_INTERP("Non-object argument. (1)"); who = vwho->data.objref; if (Typeof(who) != TYPE_PLAYER) ABORT_INTERP("Non-player object"); if (!PWIZARD && (UID != who)) ABORT_INTERP("Permission denied."); rv = !check_password(DoNullInd(vpass->data.string),who); /* failures cost non-wiz programs the rest of their quantum */ if (!rv && !PWIZARD) fr->timeslice += QUANTUM; POP(2); MPUSH(PROG_INTEGER,rv); }