lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

/*
** grid_server.c -- a virtual server for grid-type rooms
**
** Format for the object is:
**
**	/serverfname/x/y
**
** The data for the server is pulled from the data file provided at
** create() time.  It is an array of description-id values (in the
** first N non-comment lines).  Comments are lines beginning with #.
** After the description array are lists of rooms for the boundaries
** of the grid.  They are in north, east, south, west order; one line
** per grid spot.
**
** Deathblade, 960101: created
*/

#include <security.h>

inherit M_ACCESS;

nosave private string * descriptions;
nosave private string * grid_desc_id;
nosave private string * edge_rooms;
nosave private string	brief_desc;

#define GRID_HEIGHT	sizeof(grid_desc_id)
#define GRID_WIDTH	sizeof(grid_desc_id[0])
#define GRID_ROOM(x,y)	(file_name() + "/" + (x) + "/" + (y))

#define ROOM_DESC(x,y)	descriptions[grid_desc_id[y][x] - '0']

#define NORTH_EDGE(x)	edge_rooms[x]
#define EAST_EDGE(y)	edge_rooms[(y)+GRID_WIDTH]
#define SOUTH_EDGE(x)	edge_rooms[(x)+GRID_WIDTH+GRID_HEIGHT]
#define WEST_EDGE(y)	edge_rooms[(y)+2*GRID_WIDTH+GRID_HEIGHT]

void create() {
    set_privilege(1);
}

void set_descriptions(string * new_desc)
{
    descriptions = new_desc;
}

string query_brief()
{
    return brief_desc;
}

void set_brief(string new_brief)
{
    brief_desc = new_brief;
}

void use_data_file(string fname)
{
    string * lines;
    int i;

    lines = map(explode(read_file(fname), "\n"), (: trim_spaces :));
    lines = filter(lines - ({ "" }), (: $1[0] != '#' :));

    /* find the extent of the grid descriptions */
    for ( i = 0; lines[i][0..4] == "desc:" ; ++i )
	;
    grid_desc_id = map(lines[0..i-1], (: $1[5..] :));

    edge_rooms = lines[i..];
}

void setup()
{
}

object virtual_create(string arg)
{
    int idx = member_array('/', arg);
    int x;
    int y;
    string exit_n;
    string exit_e;
    string exit_s;
    string exit_w;
    object room;
   setup();

    if ( idx == -1 )
	return 0;

    x = to_int(arg[0..idx-1]);
    y = to_int(arg[idx+1..]);

    if ( y == 0 )
	exit_n = NORTH_EDGE(x);
    else if ( y == GRID_HEIGHT - 1 )
	exit_s = SOUTH_EDGE(x);

    if ( !exit_n )
	exit_n = GRID_ROOM(x,y-1);
    if ( !exit_s )
	exit_s = GRID_ROOM(x,y+1);

    if ( x == 0 )
	exit_w = WEST_EDGE(y);
    else if ( x == GRID_WIDTH - 1 )
	exit_e = EAST_EDGE(y);

    if ( !exit_w )
	exit_w = GRID_ROOM(x-1,y);
    if ( !exit_e )
	exit_e = GRID_ROOM(x+1,y);

    room = new(ROOM);
    room->set_brief(brief_desc);
    room->set_long(ROOM_DESC(x, y));
    room->add_exit("north", exit_n);
    room->add_exit("east", exit_e);
    room->add_exit("south", exit_s);
    room->add_exit("west", exit_w);


    return room;
}

// Disappear if no longer needed
protected void clean_up() {
    destruct(this_object());
}