circlemud_squared_0.5.153/cnf/
circlemud_squared_0.5.153/etc/
circlemud_squared_0.5.153/etc/etc/
circlemud_squared_0.5.153/etc/house/
circlemud_squared_0.5.153/etc/misc/
circlemud_squared_0.5.153/etc/plralias/A-E/
circlemud_squared_0.5.153/etc/plralias/F-J/
circlemud_squared_0.5.153/etc/plralias/K-O/
circlemud_squared_0.5.153/etc/plralias/P-T/
circlemud_squared_0.5.153/etc/plralias/U-Z/
circlemud_squared_0.5.153/etc/plralias/ZZZ/
circlemud_squared_0.5.153/etc/plrobjs/
circlemud_squared_0.5.153/etc/plrobjs/A-E/
circlemud_squared_0.5.153/etc/plrobjs/F-J/
circlemud_squared_0.5.153/etc/plrobjs/K-O/
circlemud_squared_0.5.153/etc/plrobjs/P-T/
circlemud_squared_0.5.153/etc/plrobjs/U-Z/
circlemud_squared_0.5.153/etc/plrobjs/ZZZ/
circlemud_squared_0.5.153/etc/text/
circlemud_squared_0.5.153/etc/text/help/
circlemud_squared_0.5.153/src/util/
circlemud_squared_0.5.153/src/util/worldconv/
/**
 * @file room.c
 * @ingroup zone
 *
 * Room based code
 *
 * @author Geoff Davis <geoff@circlemudsquared.org>
 * @author Greg Buxton <greg@circlemudsquared.org>
 *
 * @par Copyright:
 *   Copyright (C) 2006 Geoff Davis <geoff@circlemudsquared.org><br>
 *                      Greg Buxton <greg@circlemudsquared.org>
 *
 * @par
 *   Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University<br>
 *   CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.
 *
 * @par
 *   All rights reserved.  See license.doc for complete information.
 *
 * @package cs
 * @version 1.0
 */

#define __ROOM_C__

#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "dao.h"
#include "db.h"
#include "interpreter.h"
#include "main.h"
#include "extraDesc.h"
#include "room.h"
#include "zone.h"

/*
 * Included here
 */

/* cardinal directions */
const char *dirs[] = {
  /* 0 */ "north",
  /* 1 */ "east",
  /* 2 */ "south",
  /* 3 */ "west",
  /* 4 */ "up",
  /* 5 */ "down",
          "\n"
};

/* SECT_ */
const char *sector_types[] = {
 /* 00 */ "Inside",
 /* 01 */ "City",
 /* 02 */ "Field",
 /* 03 */ "Forest",
 /* 04 */ "Hills",
 /* 05 */ "Mountains",
 /* 06 */ "WaterSwimmable",
 /* 07 */ "WaterNotSwimmable",
 /* 08 */ "InFlight",
 /* 09 */ "Underwater",
          "\n"
};

int zoneNum_forVnum(int vnum);

/**
 * Convert a room exit to its DAO representation.
 * @param parentDao the container DAO to contain the exit's DAO
 * @param exit the room exit to be converted
 * @return none
 */
void exitData_toDao(daoData_t *parentDao, int dir, struct room_direction_data *exit) {
  if (parentDao == NULL) {
    log("exitData_toDao(): invalid 'parentDao' daoData_t.");
  } else if (dir < 0 || dir >= NUM_OF_DIRS) {
    log("exitData_toDao(): invalid 'dir' value %d.", dir);
  } else if (exit == NULL) {
    log("exitData_toDao(): invalid 'exit' struct room_direction_data.");
  } else {
    /* Declare some working DAO pointers. */
    daoData_t *exitDao = NULL, *subContainerDao = NULL;

    /* Create a container for the room exit. */
    exitDao = dao_newChild(parentDao, dirs[dir]);

    if (exit->general_description && *(exit->general_description) != '\0') {
      /* Create the description scalar DAO. */
      dao_newScalar(exitDao, "description", "%s", exit->general_description);
    }
    if (exit->to_room != NOWHERE) {
      /* Create the destination room scalar DAO. */
      dao_newScalar(exitDao, "destinationRoom", "%s:%d", zone_table[(world[exit->to_room].zone)].keyword, world[exit->to_room].number);
    }
    if (exit->exit_info != 0) {
      /* Create the exit flags scalar DAO. */
      subContainerDao = dao_newChild(exitDao, "flags");
      dao_newScalar(subContainerDao, "closed", "%s", YESNO(EXIT_FLAGGED(exit, EX_CLOSED)));
      dao_newScalar(subContainerDao, "door", "%s", YESNO(EXIT_FLAGGED(exit, EX_ISDOOR)));
      dao_newScalar(subContainerDao, "locked", "%s", YESNO(EXIT_FLAGGED(exit, EX_LOCKED)));
      dao_newScalar(subContainerDao, "pickproof", "%s", YESNO(EXIT_FLAGGED(exit, EX_PICKPROOF)));
    }
    if (exit->key != NOTHING) {
      /* Create the key scalar DAO. */
      dao_newScalar(exitDao, "key", "%s:%d", zone_table[zoneNum_forVnum(exit->key)].keyword, exit->key);
    }
    if (exit->keyword && *(exit->keyword) != '\0') {
      /* Create the exit keywords scalar DAO. */
      dao_newScalar(exitDao, "keywords", "%s", exit->keyword);
    }
  }
}

/**
 * Convert a room to its DAO representation.
 * @param parentDao the container DAO to contain the room's DAO
 * @param room the room to be converted
 * @return none
 */
void roomData_toDao(daoData_t *parentDao, struct room_data *room) {
  if (parentDao == NULL) {
    log("roomData_toDao(): invalid 'parentDao' daoData_t.");
  } else if (room == NULL) {
    log("roomData_toDao(): invalid 'room' struct room_data.");
  } else {
    char temp[MAX_INPUT_LENGTH];

    /* Declare an iterator variable. */
    register int n = 0;

    /* Declare some working DAO pointers. */
    daoData_t *roomDao = NULL, *subContainerDao = NULL;

    roomDao = dao_newChild(parentDao, "%d", room->number);
    dao_newScalar(roomDao, "name", "%s", room->name);
    dao_newScalar(roomDao, "description", "%s", room->description);
    sprinttype(room->sector_type, sector_types, temp, sizeof(temp));
    dao_newScalar(roomDao, "sectorType", "%s", temp);

    if (room->room_flags != 0UL) {
      subContainerDao = dao_newChild(roomDao, "flags");
      dao_newScalar(subContainerDao, "dark", "%s", YESNO(IS_SET(room->room_flags, ROOM_DARK)));
      dao_newScalar(subContainerDao, "death", "%s", YESNO(IS_SET(room->room_flags, ROOM_DEATH)));
      dao_newScalar(subContainerDao, "noMob", "%s", YESNO(IS_SET(room->room_flags, ROOM_NOMOB)));
      dao_newScalar(subContainerDao, "indoors", "%s", YESNO(IS_SET(room->room_flags, ROOM_INDOORS)));
      dao_newScalar(subContainerDao, "peaceful", "%s", YESNO(IS_SET(room->room_flags, ROOM_PEACEFUL)));
      dao_newScalar(subContainerDao, "soundproof", "%s", YESNO(IS_SET(room->room_flags, ROOM_SOUNDPROOF)));
      dao_newScalar(subContainerDao, "noTrack", "%s", YESNO(IS_SET(room->room_flags, ROOM_NOTRACK)));
      dao_newScalar(subContainerDao, "noMagic", "%s", YESNO(IS_SET(room->room_flags, ROOM_NOMAGIC)));
      dao_newScalar(subContainerDao, "tunnel", "%s", YESNO(IS_SET(room->room_flags, ROOM_TUNNEL)));
      dao_newScalar(subContainerDao, "private", "%s", YESNO(IS_SET(room->room_flags, ROOM_PRIVATE)));
      dao_newScalar(subContainerDao, "wizRoom", "%s", YESNO(IS_SET(room->room_flags, ROOM_GODROOM)));
      dao_newScalar(subContainerDao, "house", "%s", YESNO(IS_SET(room->room_flags, ROOM_HOUSE)));
      dao_newScalar(subContainerDao, "houseCrash", "%s", YESNO(IS_SET(room->room_flags, ROOM_HOUSE_CRASH)));
      dao_newScalar(subContainerDao, "atrium", "%s", YESNO(IS_SET(room->room_flags, ROOM_ATRIUM)));
      dao_newScalar(subContainerDao, "olc", "%s", YESNO(IS_SET(room->room_flags, ROOM_OLC)));
    }

    /* Save the extraDescriptions if there are any */
    if (room->ex_description != NULL) {
      extraDescData_listToDao(roomDao, room->ex_description);
    }

    /* Reset the subcontainer DAO to NULL. */
    subContainerDao = NULL;

    /* Iterate over the exit array. */
    for (n = 0; n < NUM_OF_DIRS; n++) {
      /* Skip directions for which there is no option. */
      if (room->dir_option[n] == NULL) {
        continue;
      }
      if (subContainerDao == NULL) {
        /* Allocate the 'exitList' container DAO, if necessary. */
        subContainerDao = dao_newChild(roomDao, "exits");
      }
      /* Convert each exit to its DAO representation. */
      exitData_toDao(subContainerDao, n, room->dir_option[n]);
    }
  }
}