#include "map.h"
inherit "std/room";
int x,y,z;
int room_type;
int zipcode;
mixed zipcodes;
int cache_flow;
int height;
string name;
mixed *extra_data;
void reset()
{
if(!first_inventory()) destruct();
}
string get_map_dir_nr(int i)
{
switch(i)
{
case 0: return "north";
case 1: return "south";
case 2: return "east";
case 3: return "west";
case 4: return "up";
case 5: return "down";
}
}
int get_map_nr_dir(string i)
{
switch(i)
{
case "north": return 0;
case "south": return 1;
case "east": return 2;
case "west": return 3;
case "up": return 4;
case "down": return 5;
default: return -1;
}
}
int get_dx(int i)
{
switch(i)
{
case 2: return 1;
case 3: return -1;
}
}
int get_dy(int i)
{
switch(i)
{
case 0: return 1;
case 1: return -1;
}
}
int get_dz(int i)
{
switch(i)
{
case 4: return 1;
case 5: return -1;
}
}
string create(string s)
{
mixed *data,*zipdata;
::create(s);
unpack(s,x,y,z);
data=(mixed *)MAPBASE->get_koord_data(x,y,z);
zipcodes=data[ROOM_ZIPCODE];
if(intp(zipcodes)) zipcode=zipcodes; else zipcode=zipcodes[0];
zipcode=data[ROOM_ZIPCODE];
cache_flow=data[ROOM_CACHE_FLOW];
height=data[ROOM_LEVEL];
zipdata=(mixed *)MAPBASE->get_zip_data(zipcode);
if(zipdata)
{
room_type=zipdata[ZIP_TYPE];
name=zipdata[ZIP_NAME];
extra_data=zipdata[ZIP_DATA];
}else{
room_type=R_Dummy;
name="The void";
extra_data=0;
}
switch(room_type)
{
case R_Water: set_short("In water"); break;
case R_House: set_short("Inside"); break;
case R_Forest: set_short("In a forest"); break;
case R_Street: set_short("On a street"); break;
case R_Dummy: set_short("Nowhere"); break;
case R_Air: set_short("Open air"); break;
case R_Ground: set_short("Down under"); break;
case R_Field: set_short("Field"); break;
}
if(name) set_short(name);
}
string query_exit_desc(string dir)
{
switch(room_type)
{
case R_Water:
return "you see water";
case R_House:
return "there is house";
case R_Forest:
return "you see a forest";
case R_Street:
return "the street continues";
case R_Dummy:
return 0;
case R_Air:
return "there is open air";
case R_Ground:
return "you see a wall of dirt";
case R_Field:
return "there is a field";
}
}
string get_numbered_room_name(int i)
{
return file_name()+"#"+pack(x+get_dx(i),y+get_dy(i),z+get_dz(i));
}
string collect_environment_desc(int flag)
{
mapping t;
string q,dir;
int e;
t=([]);
for(e=0;e<4;e++)
{
dir=get_map_dir_nr(e);
q=get_numbered_room_name(e);
if(query_is_exit(dir) && q->query_is_exit(opposite_dir(dir)))
set_exit(dir,q);
q=(string)q->query_exit_desc(dir);
if(q)
{
if(t[q])
{
t[q]+=({get_map_dir_nr(e)});
}else{
t[q]=({get_map_dir_nr(e)});
}
}
}
if(!m_sizeof(t)) return 0;
return capitalize
(
implode_nicely
(
sum_arrays
(
lambda(string *v,string i)
{
return "to the "+implode_nicely(v)+" "+i;
},
m_values(t),
m_indices(t),
)
)
+"."
);
}
int query_is_exit(string dir)
{
switch(room_type)
{
case R_Water:
case R_House:
case R_Dummy:
case R_Air:
case R_Ground:
return 0;
case R_Forest:
case R_Street:
case R_Field:
return 1;
}
}
void build_desc()
{
string *t;
t=({});
switch(room_type)
{
case R_Water:
t+=({"You are standing in deep water."});
break;
case R_House:
if(name)
t+=({"You are inside a house called "+name+"."});
else
t+=({"You are inside."});
break;
case R_Forest:
if(name)
t+=({"You are in a the forest "+name+"."});
else
t+=({"You are in a forest."});
break;
case R_Street:
if(name)
t+=({"You are on "+name+"."});
else
t+=({"You are on a street."});
break;
case R_Dummy:
t+=({"You are in a big void, in fact you really shouldn't be here..."});
break;
case R_Air:
t+=({"You are floating around in open air, strange.."});
break;
case R_Ground:
t+=({"You're dead! (or at least buried)"});
break;
case R_Field:
t+=({"You're on a large field."});
break;
}
t+=({collect_environment_desc(0)});
set_long(implode(t," "));
}
void init()
{
if(!exits)
{
build_desc();
}
::init();
}
int query_room_type() { return room_type; }
int query_x_koor() { return x; }
int query_y_koor() { return y; }
int query_z_koor() { return z; }
int query_zipcode() { return zipcode; }
int query_cache_flow() { return cache_flow; }
int query_height() { return height; }
string query_name() { return name; }
mixed *query_extra_data() { return extra_data; }