[snip] Hidden Doors

From: Joe Frohne (frohne@POST.ITS.MCW.EDU)
Date: 01/22/98


A few people have asked about hidden doors and I have gotten so much from
the listserve and circlemud community that I figured its time to give
a little back.

Enjoy
------------------------------------------------------------------
structs.h

in the exit information section define

#define EX_HIDDEN (1 << 4)  /* exit is hidden */

act.informative.c

This is how I have my exit prompt set up...
It will show all doors that are not hidden like this

[Exits: e ^n]

void do_auto_exits(struct char_data * ch)
{
  int door;

  *buf = '\0';

  for (door = 0; door < NUM_OF_DIRS; door++)
    if (EXIT(ch, door) && EXIT(ch, door)->to_room != NOWHERE)
      if (!IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED))
        sprintf(buf, "%s%c ", buf, LOWER(*dirs[door]));
      else
        if (!IS_SET(EXIT(ch, door)->exit_info, EX_HIDDEN))
          sprintf(buf, "%s^%c ", buf, LOWER(*dirs[door]));

  sprintf(buf2, "%s&B[ &gExits: &W%s&B]&n%s\r\n", CCCYN(ch, C_NRM),
          *buf ? buf : "None! ", CCNRM(ch, C_NRM));

  send_to_char(buf2, ch);
}

Add search command in act.informtive.c or wherever
My search command is a little raw, but functional.

ACMD(do_search)
{
  int door, chance = 1;

  *buf = '\0';

  if (IS_AFFECTED(ch, AFF_BLIND)) {
    send_to_char("Your blind, you can't see a damned thing!", ch);
    return;
  }

  send_to_char("\r\nYou begin to search the room...\r\n", ch);

  for (door = 0; door < NUM_OF_DIRS; door++) {
    if (EXIT(ch, door) && EXIT(ch, door)->to_room != NOWHERE) {
      if (IS_SET(EXIT(ch, door)->exit_info, EX_HIDDEN)) {
        if (GET_RACE(ch) == RACE_ELF)
          chance += 1;
        if (GET_INT(ch) >= 17)
          chance += 1;
        if (number(1,6) <= chance) {
          sprintf(buf, "\r\n&WYou have found a secret door %s.&n\r\n", dirs[door]);
          send_to_char(buf, ch);
          REMOVE_BIT(EXIT(ch, door)->exit_info, EX_HIDDEN);
        }
      }
    }
  }
  return;
}

act.movement.c

In perform_move add the check for EX_HIDDEN and show it same way as
no exit at all.

  else if (!EXIT(ch, dir) || EXIT(ch, dir)->to_room == NOWHERE)
    send_to_char("Alas, you cannot go that way...\r\n", ch);
  else if (IS_SET(EXIT(ch, dir)->exit_info, EX_HIDDEN) &&
           IS_SET(EXIT(ch, dir)->exit_info, EX_CLOSED))
    send_to_char("Alas, you cannot go that way...\r\n", ch);
  else if (IS_SET(EXIT(ch, dir)->exit_info, EX_CLOSED)) {
    if (EXIT(ch, dir)->keyword) {


In do_gen_door add a check if they try to open a hidden door that they can't

  if ((obj) || (door >= 0)) {
    keynum = DOOR_KEY(ch, obj, door);
    if (!(DOOR_IS_OPENABLE(ch, obj, door)))
      act("You can't $F that!", FALSE, ch, 0, cmd_door[subcmd], TO_CHAR);
    else if (!DOOR_IS_OPEN(ch, obj, door) &&
             IS_SET(flags_door[subcmd], NEED_OPEN))
      send_to_char("But it's already closed!\r\n", ch);
    else if (IS_SET(EXIT(ch, door)->exit_info, EX_HIDDEN))
      act("You can't $F that!", FALSE, ch, 0, cmd_door[subcmd], TO_CHAR);
    else if (!DOOR_IS_CLOSED(ch, obj, door) &&
             IS_SET(flags_door[subcmd], NEED_CLOSED))
      send_to_char("But it's currently open!\r\n", ch);

interpreter.c

add the search command

ACMD(do_search);

{ "search", do_search, 0, 0,},

db.c

In db.c set the doors state.  In reset_zone() add ex_hidden stuff to this
case command.

    case 'D':                   /* set state of door */
      if (ZCMD.arg2 < 0 || ZCMD.arg2 >= NUM_OF_DIRS ||
          (world[ZCMD.arg1].dir_option[ZCMD.arg2] == NULL)) {
        ZONE_ERROR("door does not exist");
      } else
        switch (ZCMD.arg3) {
        case 0:
          REMOVE_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                     EX_LOCKED);
          REMOVE_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                     EX_CLOSED);
          REMOVE_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                     EX_HIDDEN);
          break;
        case 1:
          SET_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_CLOSED);
          REMOVE_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                     EX_LOCKED);
          REMOVE_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                     EX_HIDDEN);
          break;
        case 2:
          SET_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_LOCKED);
          SET_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_CLOSED);
          REMOVE_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_HIDDEN);
          break;
        case 3:
          SET_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_CLOSED);
          SET_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_HIDDEN);
          REMOVE_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_LOCKED);
          break;
        case 4:
          SET_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_CLOSED);
          SET_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_LOCKED);
          SET_BIT(world[ZCMD.arg1].dir_option[ZCMD.arg2]->exit_info,
                  EX_HIDDEN);
          break;
        }
      last_cmd = 1;
      break;

In whatever olc you use, add the ability to set doors in zedit as
hidden/closed or hidden/locked.

I think this is it.  If I forgot anything, I will post it later


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/15/00 PST