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;
};

enum WorldPoles
{
    NO_POLES = 0;
    NORTH_POLE = 1;
    SOUTH_POLE = 2;
    BOTH_POLES = 3;
}

enum BuildingDirection
{
    NORTH = 0;
    EAST = 1;
    SOUTH = 2;
    WEST = 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 string direction = 8;
};

message TiletypeList
{
    repeated Tiletype tiletype_list = 1;
}

message BuildingExtents
{
    required int32 pos_x = 1;
    required int32 pos_y = 2;
    required int32 width = 3;
    required int32 height = 4;
    repeated int32 extents = 5;
}

message BuildingInstance
{
    required int32 index = 1;
    optional int32 pos_x_min = 2;
    optional int32 pos_y_min = 3;
    optional int32 pos_z_min = 4;
    optional int32 pos_x_max = 5;
    optional int32 pos_y_max = 6;
    optional int32 pos_z_max = 7;
    optional BuildingType building_type = 8;
    optional MatPair material = 9;
    optional uint32 building_flags = 10;
    optional bool is_room = 11;
    optional BuildingExtents room = 12;
    optional BuildingDirection direction = 13; //Doesn't mean anything for most buildings
}

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;
    repeated MatPair layer_materials = 6;
    repeated MatPair vein_materials = 7;
    repeated MatPair base_materials = 8;
    repeated int32 magma = 9;
    repeated int32 water = 10;
    repeated bool hidden = 11;
    repeated bool light = 12;
    repeated bool subterranean = 13;
    repeated bool outside = 14;
    repeated bool aquifer = 15;
    repeated bool water_stagnant = 16;
    repeated bool water_salt = 17;
    repeated MatPair construction_items = 18;
    repeated BuildingInstance buildings = 19;
    repeated int32 tree_percent = 20;
    repeated int32 tree_x = 21;
    repeated int32 tree_y = 22;
    repeated int32 tree_z = 23;
}

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 BuildingType
{
    required int32 building_type = 1;
    required int32 building_subtype = 2;
    required int32 building_custom = 3;
}

message BuildingDefinition {
    required BuildingType building_type = 1;
    optional string id = 2;
    optional string name = 3;
}

message BuildingList {
    repeated BuildingDefinition building_list = 1;
}

message MaterialList{
    repeated MaterialDefinition material_list = 1;
}

message BodySizeInfo
{
    optional int32 size_cur = 1;
    optional int32 size_base = 2;
    optional int32 area_cur = 3; /*!< size_cur^0.666 */
    optional int32 area_base = 4; /*!< size_base^0.666 */
    optional int32 length_cur = 5; /*!< (size_cur*10000)^0.333 */
    optional int32 length_base = 6; /*!< (size_base*10000)^0.333 */
}

message UnitDefinition
{
    required int32 id = 1;
    optional bool isValid = 2;
    optional int32 pos_x = 3;
    optional int32 pos_y = 4;
    optional int32 pos_z = 5;
    optional MatPair race = 6;
    optional ColorDefinition profession_color = 7;
    optional uint32 flags1 = 8;
    optional uint32 flags2 = 9;
    optional uint32 flags3 = 10;
    optional bool is_soldier = 11;
    optional BodySizeInfo size_info = 12;
    optional string name = 13;
    optional int32 blood_max = 14;
    optional int32 blood_count = 15;
}

message UnitList
{
    repeated UnitDefinition creature_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;
}

message ViewInfo
{
    optional int32 view_pos_x = 1;
    optional int32 view_pos_y = 2;
    optional int32 view_pos_z = 3;
    optional int32 view_size_x = 4;
    optional int32 view_size_y = 5;
    optional int32 cursor_pos_x = 6;
    optional int32 cursor_pos_y = 7;
    optional int32 cursor_pos_z = 8;
}

message MapInfo
{
    optional int32 block_size_x = 1;
    optional int32 block_size_y = 2;
    optional int32 block_size_z = 3;
    optional int32 block_pos_x = 4;
    optional int32 block_pos_y = 5;
    optional int32 block_pos_z = 6;
    optional string world_name = 7;
    optional string world_name_english = 8;
    optional string save_name = 9;
}

enum FrontType
{
    FRONT_NONE = 0;
    FRONT_WARM = 1;
    FRONT_COLD = 2;
    FRONT_OCCLUDED = 3;
}
enum CumulusType
{
    CUMULUS_NONE = 0;
    CUMULUS_MEDIUM = 1;
    CUMULUS_MULTI = 2;
    CUMULUS_NIMBUS = 3;
}
enum StratusType
{
    STRATUS_NONE = 0;
    STRATUS_ALTO = 1;
    STRATUS_PROPER = 2;
    STRATUS_NIMBUS = 3;
}
enum FogType
{
    FOG_NONE = 0;
    FOG_MIST = 1;
    FOG_NORMAL = 2;
    F0G_THICK = 3;
}

message Cloud
{
    optional FrontType front = 1;
    optional CumulusType cumulus = 2;
    optional bool cirrus = 3;
    optional StratusType stratus = 4;
    optional FogType fog = 5;
}

message WorldMap
{
    required int32 world_width = 1;
    required int32 world_height = 2;
    optional string name = 3;
    optional string name_english = 4;
    repeated int32 elevation = 5;
    repeated int32 rainfall = 6;
    repeated int32 vegetation = 7;
    repeated int32 temperature = 8;
    repeated int32 evilness = 9;
    repeated int32 drainage = 10;
    repeated int32 volcanism = 11;
    repeated int32 savagery = 12;
    repeated Cloud clouds = 13;
    repeated int32 salinity = 14;
    optional int32 map_x = 15;
    optional int32 map_y = 16;
    optional int32 center_x = 17;
    optional int32 center_y = 18;
    optional int32 center_z = 19;
    optional int32 cur_year = 20;
    optional int32 cur_year_tick = 21;
    optional WorldPoles world_poles = 22;
}

message RegionMaps
{
    repeated WorldMap world_maps = 1;
}

message CasteRaw
{
    optional int32 index = 1;
    optional string caste_id = 2;
    repeated string caste_name = 3;
    repeated string baby_name = 4;
    repeated string child_name = 5;
    optional int32 gender = 6;
}

message CreatureRaw
{
    optional int32 index = 1;
    optional string creature_id = 2;
    repeated string name = 3;
    repeated string general_baby_name = 4;
    repeated string general_child_name = 5;
    optional int32 creature_tile = 6;
    optional int32 creature_soldier_tile = 7;
    optional ColorDefinition color = 8;
    optional int32 adultsize = 9;
    repeated CasteRaw caste = 10;
}

message CreatureRawList
{
    repeated CreatureRaw creature_raws = 1;
}

message Army
{
    optional int32 id = 1;
    optional int32 pos_x = 2;
    optional int32 pos_y = 3;
    optional int32 pos_z = 4;
    optional UnitDefinition leader = 5;
    repeated UnitDefinition members = 6;
    optional uint32 flags = 7;
}

message ArmyList
{
    repeated Army armies = 1;
}

message GrowthPrint
{
    optional int32 priority = 1;
    optional int32 color = 2;
    optional int32 timing_start = 3;
    optional int32 timing_end = 4;
    optional int32 tile = 5;
}

message TreeGrowth
{
    optional int32 index = 1;
    optional string id = 2;
    optional string name = 3;
    optional MatPair mat = 4;
    repeated GrowthPrint prints = 5;
    optional int32 timing_start = 6;
    optional int32 timing_end = 7;
    optional bool twigs = 8;
    optional bool light_branches = 9;
    optional bool heavy_branches = 10;
    optional bool trunk = 11;
    optional bool roots = 12;
    optional bool cap = 13;
    optional bool sapling = 14;
    optional int32 trunk_height_start = 15;
    optional int32 trunk_height_end = 16;
}

message PlantRaw
{
    optional int32 index = 1;
    optional string id = 2;
    optional string name = 3;
    repeated TreeGrowth growths = 4;
    optional int32 tile = 5;
}

message PlantRawList
{
    repeated PlantRaw plant_raws = 1;
}