From: Joe Frohne <frohne@POST.ITS.MCW.EDU>
Subject: Hidden Doors

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("You're 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) {


Also:
  find_door()
  add the check for EX_HIDDEN to 2 places here, one is the last for()
  loop.  expand the if (EXIT(ch, door) to if (EXIT(ch, door) && IS_SET(
  EXIT(ch, door)->exit_info, EX_HIDDEN))

  also add it to a similar if check earlier in find_door()

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.

