diff --git a/plugins/proto/RemoteFortressReader.proto b/plugins/proto/RemoteFortressReader.proto index 5597e7fdb..b8056cb7d 100644 --- a/plugins/proto/RemoteFortressReader.proto +++ b/plugins/proto/RemoteFortressReader.proto @@ -84,6 +84,14 @@ enum TiletypeVariant VAR_4 = 3; }; +enum WorldPoles +{ + NO_POLES = 0; + NORTH_POLE = 1; + SOUTH_POLE = 2; + BOTH_POLES = 3; +} + message Tiletype { required int32 id = 1; @@ -231,3 +239,59 @@ message MapInfo 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; +} diff --git a/plugins/remotefortressreader.cpp b/plugins/remotefortressreader.cpp index 2522836f6..47ad5e251 100644 --- a/plugins/remotefortressreader.cpp +++ b/plugins/remotefortressreader.cpp @@ -38,7 +38,9 @@ #include "df/physical_attribute_type.h" #include "df/mental_attribute_type.h" -#include +#include "df/color_modifier_raw.h" + +#include "df/region_map_entry.h" #include "df/unit.h" @@ -87,6 +89,7 @@ static command_result GetMapInfo(color_ostream &stream, const EmptyMessage *in, static command_result ResetMapHashes(color_ostream &stream, const EmptyMessage *in); static command_result GetItemList(color_ostream &stream, const EmptyMessage *in, MaterialList *out); static command_result GetBuildingDefList(color_ostream &stream, const EmptyMessage *in, BuildingList *out); +static command_result GetWorldMap(color_ostream &stream, const EmptyMessage *in, WorldMap *out); void CopyBlock(df::map_block * DfBlock, RemoteFortressReader::MapBlock * NetBlock, MapExtras::MapCache * MC, DFCoord pos); @@ -135,6 +138,7 @@ DFhackCExport RPCService *plugin_rpcconnect(color_ostream &) svc->addFunction("ResetMapHashes", ResetMapHashes); svc->addFunction("GetItemList", GetItemList); svc->addFunction("GetBuildingDefList", GetBuildingDefList); + svc->addFunction("GetWorldMap", GetWorldMap); return svc; } @@ -1180,3 +1184,41 @@ static command_result GetBuildingDefList(color_ostream &stream, const EmptyMessa } return CR_OK; } + +static command_result GetWorldMap(color_ostream &stream, const EmptyMessage *in, WorldMap *out) +{ + if (!df::global::world->world_data) + { + out->set_world_width(0); + out->set_world_height(0); + return CR_FAILURE; + } + df::world_data * data = df::global::world->world_data; + int width = data->world_width; + int height = data->world_height; + out->set_world_width(width); + out->set_world_height(height); + out->set_name(Translation::TranslateName(&(data->name), false)); + out->set_name_english(Translation::TranslateName(&(data->name), true)); + for (int yy = 0; yy < height; yy++) + for (int xx = 0; xx < width; xx ++) + { + df::region_map_entry * map_entry = &data->region_map[xx][yy]; + out->add_elevation(map_entry->elevation); + out->add_rainfall(map_entry->rainfall); + out->add_vegetation(map_entry->vegetation); + out->add_temperature(map_entry->temperature); + out->add_evilness(map_entry->evilness); + out->add_drainage(map_entry->drainage); + out->add_volcanism(map_entry->volcanism); + out->add_savagery(map_entry->savagery); + out->add_salinity(map_entry->salinity); + auto clouds = out->add_clouds(); + clouds->set_cirrus(map_entry->clouds.bits.cirrus); + clouds->set_cumulus((RemoteFortressReader::CumulusType)map_entry->clouds.bits.cumulus); + clouds->set_fog((RemoteFortressReader::FogType)map_entry->clouds.bits.fog); + clouds->set_front((RemoteFortressReader::FrontType)map_entry->clouds.bits.front); + clouds->set_stratus((RemoteFortressReader::StratusType)map_entry->clouds.bits.stratus); + } + return CR_OK; +} \ No newline at end of file