[CODE] Keyfind

From: Melissa Jadwinski (meersan@earthlink.net)
Date: 08/26/01


The keyfind command is a small utility which locates containers and room
directions which correspond to a specified key vnum.  If you've ever been
frustrated by trying to determine what a particular key opens, this command
is for you.  I didn't bother to page_string() the output, so if you feel
the need for that you'll have to add it yourself.

I am running bpl 17 with corresponding global buffers.  No warranty express
or implied; if you don't know how to add a command to your mud, don't try
to use this.  Thanks.

Bugs/comments to meersan@earthlink.net


/* in addition to arg/argument/buf, */
/* keyfind uses the following global vars: */
extern struct room_data *world;
extern room_rnum top_of_world;
extern struct obj_data *obj_proto;
extern obj_rnum top_of_objt;
extern const char *dirs[];


ACMD(do_keyfind) {
  obj_vnum key_vnum = 0;
  obj_rnum key_rnum = 0;
  int i = 0, j = 0, found = 0;

  one_argument(argument, arg);

  if ((!*arg) || !isdigit(*arg)) {
    send_to_char("Usage: keyfind <keyvnum>\r\n", ch);
    return;
  }

  if ((key_vnum = atoi(arg)) < 0) {
    send_to_char("A NEGATIVE number??\r\n", ch);
    return;
  }

  if ((key_rnum = real_object(key_vnum)) < 0) {
    send_to_char("There is no object with that number.\r\n", ch);
    return;
  }

  if (GET_OBJ_TYPE(&obj_proto[key_rnum]) != ITEM_KEY) {
    send_to_char("That's not even a key!\r\n", ch);
    return;
  }

  /* we now have a valid object vnum of type ITEM_KEY to search for */

  /* rooms first... */
  sprintf(buf, "Key %d opens the following doors:\r\n", key_vnum);
  send_to_char(buf, ch);

  /* for all rooms in the world, */
  for (found = 0, i = 0; i < top_of_world; i++) {

    /* for all directions in this room */
    for (j = 0; j < NUM_OF_DIRS; j++) {

      /* if the direction does not exist, skip it */
      if (!world[i].dir_option[j]) {
        continue;

      /* otherwise check if the key matches */
      } else if (world[i].dir_option[j]->key == key_vnum) {
        found = 1;
        sprintf(buf, "%5d - %-9.9s - %s&+0\r\n",
                world[i].number, dirs[j], world[i].name);
        send_to_char(buf, ch);
      }
    }
  }

  if (!found) {
    send_to_char("  None.\r\n\r\n", ch);
  } else {
    send_to_char("\r\n", ch);
  }

  /* now find any container objects our keyvnum opens */
  sprintf(buf, "Key %d opens the following containers:\r\n", key_vnum);
  send_to_char(buf, ch);

  for (found = 0, i = 0; i < top_of_objt; i++)  {
    if ((GET_OBJ_TYPE(&obj_proto[i]) == ITEM_CONTAINER) &&
        (GET_OBJ_VAL(&obj_proto[i], 2) == key_vnum)) {
      found = 1;
      sprintf(buf, "%5d - %s&+0\r\n", GET_OBJ_VNUM(&obj_proto[i]),
              obj_proto[i].short_description ?
              obj_proto[i].short_description : "Unnamed");
      send_to_char(buf, ch);
    }
  }

  if (!found) {
    send_to_char("  None.\r\n", ch);
  }

}

--
   +---------------------------------------------------------------+
   | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
   | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
   +---------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/06/01 PST