/* look.c */ #include "copyright.h" /* commands which look at things */ #include <string.h> #include "config.h" #include "db.h" #include "interface.h" #include "match.h" #include "externs.h" static void look_exits(player, loc, exit_name) dbref player; dbref loc; const char *exit_name; { dbref thing; char tbuf1[BUFFER_LEN]; char *e = tbuf1; /* make sure location is a room */ if ((Typeof(loc) != TYPE_ROOM) || (db[loc].flags & DARK)) return; for (thing = db[loc].exits; (thing != NOTHING) && (db[thing].flags & DARK); thing = db[thing].next) ; if (thing == NOTHING) return; notify(player, exit_name); for (thing = db[loc].exits; thing != NOTHING; thing = db[thing].next) if (!(db[thing].flags & DARK)) /* chop off first exit alias to display */ { char *s; if (db[thing].name && ((e - tbuf1) < BUFFER_LEN)) { for (s = (char *) db[thing].name; *s && (*s != ';') && (e - tbuf1 < BUFFER_LEN); *e++ = *s++) ; *e++ = ' '; *e++ = ' '; } } *e++ = 0; notify(player, tbuf1); } static void look_contents(player, loc, contents_name) dbref player; dbref loc; const char *contents_name; { dbref thing; dbref can_see_loc; /* check to see if he can see the location */ /* * patched so that player can't see in dark rooms even if owned by that * player. (he must use examine command) */ can_see_loc = !Dark(loc); /* check to see if there is anything there */ DOLIST(thing, db[loc].contents) { if (can_see(player, thing, can_see_loc)) { /* something exists! show him everything */ notify(player, contents_name); DOLIST(thing, db[loc].contents) { if (can_see(player, thing, can_see_loc)) { notify(player, unparse_object(player, thing)); } } break; /* we're done */ } } } void look_atrs(player, thing) dbref player; dbref thing; { ALIST *list = db[thing].list; while (list) { if (!AL_BAD(list) && !(AL_FLAGS(list) & AF_DARK) && string_compare(AL_NAME(list), "DESCRIBE") && (controls(player, thing) || Visual(thing) || #ifdef ROYALTY_FLAG Royalty(player) || #endif (db[AL_CREATOR(list)].owner == db[player].owner))) { char *r = safe_uncompress(AL_STR(list)); notify(player, tprintf("%s [#%d]: %s", AL_NAME(list), db[AL_CREATOR(list)].owner, r)); free(r); } list = AL_NEXT(list); } } static void look_simple(player, thing) dbref player; dbref thing; { Access(thing); if (controls(player, thing) || (db[thing].flags & VISUAL)) notify(player, unparse_object(player, thing)); did_it(player, thing, "DESCRIBE", "You see nothing special.", "ODESCRIBE", NULL, "ADESCRIBE", NOTHING); if((Typeof(thing) == TYPE_EXIT) && (db[thing].flags & EXIT_TRANSPARENT)) { if (db[thing].location == HOME) look_room(player, db[player].exits, 1); else look_room(player, db[thing].location, 1); } } void look_room(player, loc, remote) dbref player; dbref loc; int remote; { ATTR *s; if(loc == NOTHING) return; /* tell him the name, and the number if he can link to it */ if(!remote) notify(player, unparse_object(player, loc)); if (Typeof(loc) != TYPE_ROOM) { if (!(db[player].flags & TERSE)) { if ((s = atr_get(loc, "IDESCRIBE")) || (s = atr_get(loc, "DESCRIBE"))) { char *r = safe_uncompress(s->value); notify(player, r); free(r); } } } /* tell him the description */ else { if(!remote) { if (!(db[player].flags & TERSE)) did_it(player, loc, "DESCRIBE", NULL, "ODESCRIBE", NULL, "ADESCRIBE", NOTHING); else did_it(player, loc, NULL, NULL, "ODESCRIBE", NULL, "ADESCRIBE", NOTHING); } else did_it(player, loc, "DESCRIBE", NULL, NULL, NULL, NULL, NOTHING); } /* tell him the appropriate messages if he has the key */ if (Typeof(loc) == TYPE_ROOM && !remote) { if (db[player].flags & TERSE) { if (could_doit(player, loc)) did_it(player, loc, NULL, NULL, "OSUCCESS", NULL, "ASUCCESS", NOTHING); else did_it(player, loc, NULL, NULL, "OFAILURE", NULL, "AFAILURE", NOTHING); } else if (could_doit(player, loc)) did_it(player, loc, "SUCCESS", NULL, "OSUCCESS", NULL, "ASUCCESS", NOTHING); else did_it(player, loc, "FAILURE", NULL, "OFAILURE", NULL, "AFAILURE", NOTHING); } /* tell him the contents */ look_contents(player, loc, "Contents:"); if(!remote) look_exits(player, loc, "Obvious exits:"); } void do_look_around(player) dbref player; { dbref loc; if ((loc = getloc(player)) == NOTHING) return; look_room(player, loc, 0); } void do_look_at(player, name) dbref player; const char *name; { dbref thing; if (*name == '\0') { if ((thing = getloc(player)) != NOTHING) { look_room(player, thing, 0); } } else { if(((thing = is_possess(player,name)) == NOTHING) || (thing == AMBIGUOUS) || ((db[db[thing].location].flags & OPAQUE) && !controls(player,db[thing].location))) { /* look at a thing here */ init_match(player, name, NOTYPE); match_neighbor(); match_possession(); if (Hasprivs(player)) { match_absolute(); match_player(); } match_here(); match_me(); if ((thing = match_result()) == NOTHING) match_exit(); if ((thing = noisy_match_result()) != NOTHING) { switch (Typeof(thing)) { case TYPE_ROOM: look_room(player, thing, 0); /* look_atrs(player, thing); */ break; case TYPE_THING: case TYPE_PLAYER: look_simple(player, thing); /* look_atrs(player,thing); */ if (controls(player, thing) || (!(db[thing].flags & OPAQUE) || Hasprivs(player))) { look_contents(player, thing, "Carrying:"); } break; default: look_simple(player, thing); /* look_atrs(player,thing); */ break; } } } else { look_simple(player,thing); /* look_atrs(player,thing); */ } } } #ifdef FLAGS_ON_EXAMINE static const char *flag_description(thing) dbref thing; { static char buf[BUFFER_LEN]; strcpy(buf, "Type: "); switch (Typeof(thing)) { case TYPE_ROOM: strcat(buf, "Room"); break; case TYPE_EXIT: strcat(buf, "Exit"); break; case TYPE_THING: strcat(buf, "Thing"); break; case TYPE_PLAYER: strcat(buf, "Player"); break; default: strcat(buf, "***UNKNOWN TYPE***"); break; } if (db[thing].flags & ~TYPE_MASK) { /* print flags */ strcat(buf, " Flags:"); switch (Typeof(thing)) { case TYPE_EXIT: if (db[thing].flags & EXIT_KEY) strcat(buf, " KEY"); if (db[thing].flags & EXIT_TRANSPARENT) strcat(buf, " TRANSPARENT"); break; case TYPE_PLAYER: if (db[thing].flags & PLAYER_DARK) strcat(buf, " UNFIND"); if (db[thing].flags & PLAYER_SUSPECT) strcat(buf, " SUSPECT"); if (db[thing].flags & PLAYER_CONNECT) strcat(buf, " CONNECTED"); #ifdef RESTRICTED_BUILDING if (db[thing].flags & PLAYER_BUILD) strcat(buf, " BUILDER"); #endif /* RESTRICTED_BUILDING */ break; case TYPE_THING: if (db[thing].flags & THING_PUPPET) strcat(buf, " PUPPET"); if (db[thing].flags & THING_KEY) strcat(buf, " KEY"); if (db[thing].flags & THING_SAFE) strcat(buf, " SAFE"); if (db[thing].flags & THING_VERBOSE) strcat(buf, " VERBOSE"); if (db[thing].flags & THING_IMMORTAL) strcat(buf, " IMMORTAL"); #ifdef DESTROY if (db[thing].flags & THING_DEST_OK) strcat(buf, " DESTROY_OK"); #endif DESTROY break; case TYPE_ROOM: if (db[thing].flags & LINK_OK) strcat(buf, " LINK_OK"); if (db[thing].flags & ROOM_TEMPLE) strcat(buf, " TEMPLE"); if (db[thing].flags & ROOM_ABODE) strcat(buf, " ABODE"); if (db[thing].flags & ROOM_JUMP_OK) strcat(buf, " JUMP_OK"); if (db[thing].flags & ROOM_FLOATING) strcat(buf, " FLOAT"); if (db[thing].flags & ROOM_NO_TEL) strcat(buf, " NO_TEL"); break; } if (db[thing].flags & WIZARD) strcat(buf, " WIZARD"); if (db[thing].flags & DARK) strcat(buf, " DARK"); if (db[thing].flags & STICKY) strcat(buf, " STICKY"); if (db[thing].flags & HAVEN) strcat(buf, " HAVEN"); if (db[thing].flags & HALT) strcat(buf, " HALT"); if (db[thing].flags & QUIET) strcat(buf," QUIET"); if (db[thing].flags & TERSE) strcat(buf, " TERSE"); #ifdef DESTROY if (db[thing].flags & GOING) strcat(buf, " GOING"); #endif /* DESTROY */ if (db[thing].flags & CHOWN_OK) strcat(buf, " CHOWN_OK"); if (db[thing].flags & ENTER_OK) strcat(buf, " ENTER_OK"); if (db[thing].flags & VISUAL) strcat(buf, " VISUAL"); if (db[thing].flags & OPAQUE) strcat(buf, " OPAQUE"); if (db[thing].flags & NOSPOOF) strcat(buf, " NOSPOOF"); #ifdef INHERIT_FLAG if (db[thing].flags & INHERIT) strcat(buf, " INHERIT"); #endif #ifdef ROYALTY_FLAG if (db[thing].flags & ROYALTY) strcat(buf, " ROYALTY"); #endif } return buf; } #endif /* FLAGS_ON_EXAMINE */ void do_examine(player, name, brief) dbref player; const char *name; int brief; { dbref thing; ATTR *a; dbref content; dbref exit; char *real_name = NULL, *attrib_name = NULL; if (*name == '\0') { if ((thing = getloc(player)) == NOTHING) return; attrib_name = NULL; } else { if((attrib_name = index(name,'/')) != NULL) { *attrib_name = '\0'; attrib_name++; } real_name = (char *)name; /* look it up */ init_match(player, real_name, NOTYPE); match_exit(); match_neighbor(); match_possession(); match_absolute(); /* only Wizards and Immortals can examine other players */ if (Hasprivs(player)) match_player(); match_here(); match_me(); /* changed to be consistent with other matches */ /* if ((thing = match_result()) == NOTHING) */ /* match_exit(); */ /* get result */ if ((thing = noisy_match_result()) == NOTHING) return; } /* only look at some of the attributes */ if(attrib_name && *attrib_name) { ALIST *ptr; notify(player, tprintf("The following attributes on %s match %s:", db[thing].name, attrib_name)); for(ptr = db[thing].list; ptr; ptr = AL_NEXT(ptr)) { if(!AL_BAD(ptr)) { if(AL_FLAGS(ptr) & AF_DARK) continue; if(wild_match(attrib_name, AL_NAME(ptr)) && (controls(player, thing) || Visual(thing) || #ifdef ROYALTY_FLAG Royalty(player) || #endif (db[AL_CREATOR(ptr)].owner == db[player].owner))) { char *r = safe_uncompress(AL_STR(ptr)); notify(player, tprintf("%s [#%d]: %s", AL_NAME(ptr), db[AL_CREATOR(ptr)].owner, r)); free(r); } } } notify(player, "Done."); return; } /* can't examine destructed objects */ if (db[thing].flags & GOING) { notify(player, "Garbage is garbage."); return; } /* "short" examine for mortals */ if (!(db[thing].flags & VISUAL) #ifdef ROYALTY_FLAG && !Royalty(player) #endif ) { if (!can_link(player, thing)) { static char th[BUFFER_LEN], own[BUFFER_LEN]; strcpy(th, unparse_object(player, thing)); strcpy(own, unparse_object(player, db[thing].owner)); notify(player, tprintf("%s is owned by %s", th, own)); look_atrs(player, thing); /* check to see if there is anything there */ /* as long as he owns what is there */ DOLIST(content, db[thing].contents) { if (can_link(player, content)) { notify(player, "Contents:"); DOLIST(content, db[thing].contents) { if (can_link(player, content)) { notify(player, unparse_object(player, content)); } } break; /* we're done */ } } return; } } /* Full examine */ notify(player, unparse_object(player, thing)); #ifdef FLAGS_ON_EXAMINE notify(player, flag_description(thing)); #endif if (!brief) { a = atr_get(thing, "DESCRIBE"); if (a) { char *r = safe_uncompress(a->value); notify(player, r); free(r); } } notify(player, tprintf("Owner: %s Key: %s %s: %d", db[db[thing].owner].name, unparse_boolexp(player, db[thing].key, 0), MONIES, Pennies(thing))); notify(player, tprintf("Zone: %s", unparse_object(player, db[thing].zone))); if (Typeof(thing) == TYPE_PLAYER) notify(player, tprintf("Page Key: %s", unparse_boolexp(player, db[thing].usekey, 0))); else notify(player, tprintf("Use Key: %s", unparse_boolexp(player, db[thing].usekey, 0))); notify(player, tprintf("Enter Key: %s", unparse_boolexp(player, db[thing].enterkey, 0))); if (!brief) look_atrs(player, thing); /* show him the contents */ if (db[thing].contents != NOTHING) { notify(player, "Contents:"); DOLIST(content, db[thing].contents) { notify(player, unparse_object(player, content)); } } switch (Typeof(thing)) { case TYPE_ROOM: /* tell him about exits */ if (db[thing].exits != NOTHING) { notify(player, "Exits:"); DOLIST(exit, db[thing].exits) { notify(player, unparse_object(player, exit)); } } else { notify(player, "No exits."); } /* print dropto if present */ if (db[thing].location != NOTHING) { notify(player, tprintf("Dropped objects go to: %s", unparse_object(player, db[thing].location))); } break; case TYPE_THING: case TYPE_PLAYER: /* print home */ notify(player, tprintf("Home: %s", unparse_object(player, db[thing].exits))); /* home */ /* print location if player can link to it */ if (db[thing].location != NOTHING && (Royalty(player) || controls(player, db[thing].location) || controls(player, thing) || can_link_to(player, db[thing].location))) { notify(player, tprintf("Location: %s", unparse_object(player, db[thing].location))); } break; case TYPE_EXIT: /* print source */ switch (db[thing].exits) { case NOTHING: fprintf(stderr, "*** BLEAH *** Weird exit %s(#%d) in #%d with source NOTHING.\n", db[thing].name, thing, db[thing].location); break; case HOME: fprintf(stderr, "*** BLEAH *** Weird exit %s(#%d) in #%d with source HOME.\n", db[thing].name, thing, db[thing].location); break; default: notify(player, tprintf("Source: %s", unparse_object(player, db[thing].exits))); break; } /* print destination */ switch (db[thing].location) { case NOTHING: notify(player, "Destination: *UNLINKED*"); break; case HOME: notify(player, "Destination: *HOME*"); break; default: notify(player, tprintf("Destination: %s", unparse_object(player, db[thing].location))); break; } break; default: /* do nothing */ break; } } void do_score(player) dbref player; { notify(player, tprintf("You have %d %s.", Pennies(player), Pennies(player) == 1 ? MONEY : MONIES)); } void do_inventory(player) dbref player; { dbref thing; if ((thing = db[player].contents) == NOTHING) { notify(player, "You aren't carrying anything."); } else { notify(player, "You are carrying:"); DOLIST(thing, thing) { notify(player, unparse_object(player, thing)); } } do_score(player); } void do_find(player, name) dbref player; const char *name; { dbref i; if (!payfor(player, FIND_COST)) { notify(player, tprintf("Finds cost %d %s.", FIND_COST, ((FIND_COST == 1) ? MONEY : MONIES))); } else { for (i = 0; i < db_top; i++) { if (Typeof(i) != TYPE_EXIT && controls(player, i) && (!*name || string_match(db[i].name, name))) { notify(player, unparse_object(player, i)); } } notify(player, "***End of List***"); } } /* check the current location for bugs */ void do_sweep(player, arg1) dbref player; const char *arg1; { dbref here = db[player].location; int connect_flag = 0; if (here == NOTHING) return; if(arg1 && *arg1) connect_flag = !(string_compare(arg1, "connected")); notify(player, "Listening in ROOM:"); if(connect_flag) { /* only worry about puppet and players who's owner's are connected */ if((Typeof(here) == TYPE_PLAYER && (db[here].flags & PLAYER_CONNECT)) || ((Typeof(here) == TYPE_THING && (db[here].flags & THING_PUPPET)) && (Typeof(db[here].owner) == TYPE_PLAYER && (db[db[here].owner].flags) & PLAYER_CONNECT))) { if(Typeof(here) == TYPE_PLAYER) { notify(player, tprintf("%s is listening", db[here].name)); } else { notify(player , tprintf("%s [owner: %s] is listening.", db[here].name, db[db[here].owner].name)); } } } else { if (Hearer(here) || Listener(here)) { if(Typeof(here) == TYPE_PLAYER && (db[here].flags & PLAYER_CONNECT)) notify(player, tprintf("%s (this room) [speech]. (connected)", db[here].name)); else notify(player, tprintf("%s (this room) [speech].", db[here].name)); } if (Commer(here)) notify(player, tprintf("%s (this room) [commands].", db[here].name)); } for (here = db[here].contents; here != NOTHING; here = db[here].next) { if(connect_flag) { /* only worry about puppet and players who's owner's are connected */ if((Typeof(here) == TYPE_PLAYER && (db[here].flags & PLAYER_CONNECT)) || ((Typeof(here) == TYPE_THING && (db[here].flags & THING_PUPPET)) && (Typeof(db[here].owner) == TYPE_PLAYER && (db[db[here].owner].flags) & PLAYER_CONNECT))) { if(Typeof(here) == TYPE_PLAYER) { notify(player, tprintf("%s is listening", db[here].name)); } else { notify(player , tprintf("%s [owner: %s] is listening.", db[here].name, db[db[here].owner].name)); } } } else { if (Hearer(here) || Listener(here)) { if(Typeof(here) == TYPE_PLAYER && (db[here].flags & PLAYER_CONNECT)) notify(player, tprintf("%s [speech]. (connected)", db[here].name)); else notify(player, tprintf("%s [speech].", db[here].name)); } if(Commer(here)) notify(player, tprintf("%s [commands].", db[here].name)); } } notify(player, "Listening in your INVENTORY:"); for (here = db[player].contents; here != NOTHING; here = db[here].next) { if(connect_flag) { /* only worry about puppet and players who's owner's are connected */ if((Typeof(here) == TYPE_PLAYER && (db[here].flags & PLAYER_CONNECT)) || ((Typeof(here) == TYPE_THING && (db[here].flags & THING_PUPPET)) && (Typeof(db[here].owner) == TYPE_PLAYER && (db[db[here].owner].flags) & PLAYER_CONNECT))) { if(Typeof(here) == TYPE_PLAYER) { notify(player, tprintf("%s is listening", db[here].name)); } else { notify(player , tprintf("%s [owner: %s] is listening.", db[here].name, db[db[here].owner].name)); } } } else { if (Hearer(here) || Listener(here)) { if(Typeof(here) == TYPE_PLAYER && (db[here].flags & PLAYER_CONNECT)) notify(player, tprintf("%s [speech]. (connected)", db[here].name)); else notify(player, tprintf("%s [speech].", db[here].name)); } if(Commer(here)) notify(player, tprintf("%s [commands].", db[here].name)); } } } #ifdef PLAYER_LOCATE void do_whereis(player, name) dbref player; const char *name; { dbref thing; if (*name == '\0') { notify(player, "You must specify a valid player name."); return; } if ((thing = lookup_player(name)) == NOTHING) { notify(player, "That player does not seem to exist."); return; } /* * init_match(player, name, TYPE_PLAYER); match_player(); match_exit(); * match_neighbor(); match_possession(); match_absolute(); match_me(); */ if (!Hasprivs(player) && (Typeof(thing) == TYPE_PLAYER) && (db[thing].flags & PLAYER_DARK)) { notify(player, "That player wishes to have some privacy."); notify(thing, tprintf("%s tried to locate you and failed.", db[player].name)); return; } notify(player, tprintf("%s is at: %s.", db[thing].name, unparse_object(player, db[thing].location))); notify(thing, tprintf("%s has just located your position.", db[player].name)); return; } #endif /* PLAYER_LOCATE */ void do_entrances(player, where) dbref player; const char *where; { dbref place; dbref counter; if(!payfor(player, FIND_COST)) { notify(player, tprintf("You don't have enough %d %s to do that.", FIND_COST, ((FIND_COST == 1) ? MONEY : MONIES))); return; } if(!where || !*where) { if((place = db[player].location) == NOTHING) return; } else { init_match(player, where, NOTYPE); match_everything(); if((place = noisy_match_result()) == NOTHING) return; } for(counter = 0; counter < db_top; counter++) { if (controls(player, place) || controls(player, counter)) { switch(Typeof(counter)) { case TYPE_EXIT: if(db[counter].location == place) { notify(player, tprintf("%s [from: %s]", db[counter].name, db[db[counter].exits].name)); } break; case TYPE_ROOM: if(db[counter].location == place) { notify(player, tprintf("%s [dropto]", db[counter].name)); } break; case TYPE_THING: case TYPE_PLAYER: if(db[counter].exits == place) { notify(player, tprintf("%s [home]", db[counter].name)); } break; } } } } void decompile_atrs (player, thing, name) dbref player; dbref thing; const char *name; { int a = 0; int reg = 0; ALIST *list = db[thing].list; while (list) { if (!AL_BAD(list) && !(AL_FLAGS(list) & AF_DARK)) { char *r = safe_uncompress(AL_STR(list)); a = 0; while (!reg && attr[a].name) { if (string_prefix(attr[a].name, AL_NAME(list))) reg = 1; /* matched a regular pre-defined attribute */ a++; } if (reg) notify(player, tprintf("@%s %s = %s", AL_NAME(list), name, r)); else notify(player, tprintf("&%s %s = %s", AL_NAME(list), name, r)); free(r); } reg = 0; list = AL_NEXT(list); } } void decompile_flags (player, thing, name) dbref player; dbref thing; const char *name; { if (db[thing].flags & THING_PUPPET) notify(player, tprintf("@set %s=PUPPET", name)); if (db[thing].flags & THING_KEY) notify(player, tprintf("@set %s=KEY", name)); if (db[thing].flags & THING_DEST_OK) notify(player, tprintf("@set %s=DESTROY_OK", name)); if (db[thing].flags & THING_SAFE) notify(player, tprintf("@set %s=SAFE", name)); if (db[thing].flags & THING_VERBOSE) notify(player, tprintf("@set %s=VERBOSE", name)); if (db[thing].flags & THING_IMMORTAL) notify(player, tprintf("@set %s=IMMORTAL", name)); if (db[thing].flags & LINK_OK) notify(player, tprintf("@set %s=LINK_OK", name)); if (db[thing].flags & WIZARD) notify(player, tprintf("@set %s=WIZARD", name)); if (db[thing].flags & DARK) notify(player, tprintf("@set %s=DARK", name)); if (db[thing].flags & STICKY) notify(player, tprintf("@set %s=STICKY", name)); if (db[thing].flags & HAVEN) notify(player, tprintf("@set %s=HAVEN", name)); if (db[thing].flags & HALT) notify(player, tprintf("@set %s=HALT", name)); if (db[thing].flags & QUIET) notify(player, tprintf("@set %s=QUIET", name)); if (db[thing].flags & CHOWN_OK) notify(player, tprintf("@set %s=CHOWN_OK", name)); if (db[thing].flags & ENTER_OK) notify(player, tprintf("@set %s=ENTER_OK", name)); if (db[thing].flags & VISUAL) notify(player, tprintf("@set %s=VISUAL", name)); if (db[thing].flags & OPAQUE) notify(player, tprintf("@set %s=OPAQUE", name)); if (db[thing].flags & NOSPOOF) notify(player, tprintf("@set %s=NOSPOOF", name)); if (db[thing].flags & TERSE) notify(player, tprintf("@set %s=TERSE", name)); #ifdef INHERIT_FLAG if (db[thing].flags & INHERIT) notify(player, tprintf("@set %s=INHERIT", name)); #endif #ifdef ROYALTY_FLAG if (db[thing].flags & ROYALTY) notify(player, tprintf("@set %s=ROYALTY", name)); #endif } void do_decompile(player, name) dbref player; const char *name; { dbref thing; const char *object; char tbuf[BUFFER_LEN]; /* @decompile must always have an argument */ if (*name == '\0') { notify(player, "What do you want to @decompile?"); return; } /* find object */ init_match(player, name, TYPE_THING); match_neighbor(); match_possession(); match_absolute(); /* Don't need to do match_me, here, player, exit, because @decompile */ /* is only valid for things */ if ((thing = noisy_match_result()) == NOTHING) return; /* check to make sure the decompile is valid */ if (Typeof(thing) != TYPE_THING) { notify(player, "Only objects may be @decompiled."); return; } if (!controls(player, thing) && !(db[thing].flags & VISUAL) #ifdef ROYALTY_FLAG && !Royalty(player) #endif ) { notify(player, "Permission denied."); return; } if (db[thing].flags & GOING) { notify(player, "Garbage is garbage."); return; } /* do actual decompile */ object = db[thing].name; notify(player, tprintf("@create %s", object)); notify(player, tprintf("@link %s = #%d", object, db[thing].exits)); sprintf(tbuf, "%s", unparse_boolexp(player, db[thing].key, 1)); if (string_compare(tbuf, "*UNLOCKED*")) notify(player, tprintf("@lock %s = %s", object, tbuf)); sprintf(tbuf, "%s", unparse_boolexp(player, db[thing].enterkey, 1)); if (string_compare(tbuf, "*UNLOCKED*")) notify(player, tprintf("@elock %s = %s", object, tbuf)); decompile_flags(player, thing, object); decompile_atrs(player, thing, object); }