/* 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());
}