package RemoteFortressReader;

//Attempts to provide a complete framework for reading everything from a fortress needed for vizualization
option optimize_for = LITE_RUNTIME;

//We use shapes, etc, because the actual tiletypes may differ between DF versions.
enum TiletypeShape 
{
	NO_SHAPE = -1;
	EMPTY = 0;
	FLOOR = 1;
	BOULDER = 2;
	PEBBLES = 3;
	WALL = 4;
	FORTIFICATION = 5;
	STAIR_UP = 6;
	STAIR_DOWN = 7;
	STAIR_UPDOWN = 8;
	RAMP = 9;
	RAMP_TOP = 10;
	BROOK_BED = 11;
	BROOK_TOP = 12;
	TREE_SHAPE = 13;
	SAPLING = 14;
	SHRUB = 15;
	ENDLESS_PIT = 16;
	BRANCH = 17;
	TRUNK_BRANCH = 18;
	TWIG = 19;
}

enum TiletypeSpecial 
{
	NO_SPECIAL = -1;
	NORMAL = 0;
	RIVER_SOURCE = 1;
	WATERFALL = 2;
	SMOOTH = 3;
	FURROWED = 4;
	WET = 5;
	DEAD = 6;
	WORN_1 = 7;
	WORN_2 = 8;
	WORN_3 = 9;
	TRACK = 10;
	SMOOTH_DEAD = 11;
};
enum TiletypeMaterial 
{
	NO_MATERIAL = -1;
	AIR = 0;
	SOIL = 1;
	STONE = 2;
	FEATURE = 3;
	LAVA_STONE = 4;
	MINERAL = 5;
	FROZEN_LIQUID = 6;
	CONSTRUCTION = 7;
	GRASS_LIGHT = 8;
	GRASS_DARK = 9;
	GRASS_DRY = 10;
	GRASS_DEAD = 11;
	PLANT = 12;
	HFS = 13;
	CAMPFIRE = 14;
	FIRE = 15;
	ASHES = 16;
	MAGMA = 17;
	DRIFTWOOD = 18;
	POOL = 19;
	BROOK = 20;
	RIVER = 21;
	ROOT = 22;
	TREE_MATERIAL = 23;
	MUSHROOM = 24;
	UNDERWORLD_GATE = 25;
}
enum TiletypeVariant
{
	NO_VARIANT = -1;
	VAR_1 = 0;
	VAR_2 = 1;
	VAR_3 = 2;
	VAR_4 = 3;
};

message Tiletype
{
	required int32 id = 1;
	optional string name = 2;
	optional string caption = 3;
	optional TiletypeShape shape = 4;
	optional TiletypeSpecial special = 5;
	optional TiletypeMaterial material = 6;
	optional TiletypeVariant variant = 7;
	optional uint32 direction = 8;
};

message TiletypeList
{
	repeated Tiletype tiletype_list = 1;
}

message MapBlock
{
	required int32 map_x = 1;
	required int32 map_y = 2;
	required int32 map_z = 3;
	repeated int32 tiles = 4;
	repeated MatPair materials = 5;
}

message MatPair {
	required int32 mat_type = 1;
	required int32 mat_index = 2;
}

message ColorDefinition {
	required int32 red = 1;
	required int32 green = 2;
	required int32 blue = 3;
}

message MaterialDefinition{
	required MatPair mat_pair = 1;
	optional string id = 2;
	optional string name = 3;
	optional ColorDefinition state_color = 4; //Simplifying colors to assume room temperature.
}

message MaterialList{
	repeated MaterialDefinition material_list = 1;
}

message BlockRequest
{
	optional int32 blocks_needed = 1;
	optional int32 min_x = 2;
	optional int32 max_x = 3;
	optional int32 min_y = 4;
	optional int32 max_y = 5;
	optional int32 min_z = 6;
	optional int32 max_z = 7;
}

message BlockList
{
	repeated MapBlock map_blocks = 1;
	optional int32 map_x = 2;
	optional int32 map_y = 3;
}

message PlantDef
{
	required int32 pos_x = 1;
	required int32 pos_y = 2;
	required int32 pos_z = 3;
	required int32 index = 4;
}

message PlantList
{
	repeated PlantDef plant_list = 1;
}