From a071f5bf6c777856834d41387920ab297f9f2b49 Mon Sep 17 00:00:00 2001 From: Japa Date: Mon, 22 Jun 2015 00:40:17 +0530 Subject: [PATCH] Added preliminary building list to remotefortressreader. Untested. --- plugins/proto/RemoteFortressReader.proto | 17 ++ plugins/remotefortressreader.cpp | 218 +++++++++++++++++++++++ 2 files changed, 235 insertions(+) diff --git a/plugins/proto/RemoteFortressReader.proto b/plugins/proto/RemoteFortressReader.proto index 86f7fc50e..41736d737 100644 --- a/plugins/proto/RemoteFortressReader.proto +++ b/plugins/proto/RemoteFortressReader.proto @@ -141,6 +141,23 @@ message MaterialDefinition{ 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; } diff --git a/plugins/remotefortressreader.cpp b/plugins/remotefortressreader.cpp index 9a8c0a81e..225d3dacd 100644 --- a/plugins/remotefortressreader.cpp +++ b/plugins/remotefortressreader.cpp @@ -30,6 +30,8 @@ #include "df/plant_tree_info.h" #include "df/plant_growth.h" #include "df/itemdef.h" +#include "df/building_def_workshopst.h" +#include "df/building_def_furnacest.h" #include "df/descriptor_color.h" #include "df/descriptor_pattern.h" @@ -48,6 +50,7 @@ #include "modules/Gui.h" #include "modules/Translation.h" #include "modules/Items.h" +#include "modules/Buildings.h" #include "TileTypes.h" #include "MiscUtils.h" @@ -80,6 +83,7 @@ static command_result GetViewInfo(color_ostream &stream, const EmptyMessage *in, static command_result GetMapInfo(color_ostream &stream, const EmptyMessage *in, MapInfo *out); 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); void CopyBlock(df::map_block * DfBlock, RemoteFortressReader::MapBlock * NetBlock, MapExtras::MapCache * MC, DFCoord pos); @@ -127,6 +131,7 @@ DFhackCExport RPCService *plugin_rpcconnect(color_ostream &) svc->addFunction("GetMapInfo", GetMapInfo); svc->addFunction("ResetMapHashes", ResetMapHashes); svc->addFunction("GetItemList", GetItemList); + svc->addFunction("GetBuildingDefList", GetBuildingDefList); return svc; } @@ -932,3 +937,216 @@ static command_result GetMapInfo(color_ostream &stream, const EmptyMessage *in, out->set_save_name(df::global::world->cur_savegame.save_dir); return CR_OK; } + +static command_result GetBuildingDefList(color_ostream &stream, const EmptyMessage *in, BuildingList *out) +{ + FOR_ENUM_ITEMS(building_type, bt) + { + BuildingDefinition * bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(-1); + bld->mutable_building_type()->set_building_custom(-1); + bld->set_id(ENUM_KEY_STR(building_type, bt)); + + switch (bt) + { + case df::enums::building_type::NONE: + break; + case df::enums::building_type::Chair: + break; + case df::enums::building_type::Bed: + break; + case df::enums::building_type::Table: + break; + case df::enums::building_type::Coffin: + break; + case df::enums::building_type::FarmPlot: + break; + case df::enums::building_type::Furnace: + FOR_ENUM_ITEMS(furnace_type, st) + { + bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(st); + bld->mutable_building_type()->set_building_custom(-1); + bld->set_id(ENUM_KEY_STR(building_type, bt) + "_" + ENUM_KEY_STR(furnace_type, st)); + + if (st == furnace_type::Custom) + { + for (int i = 0; i < world->raws.buildings.furnaces.size(); i++) + { + auto cust = world->raws.buildings.furnaces[i]; + + bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(st); + bld->mutable_building_type()->set_building_custom(cust->id); + bld->set_id(cust->code); + bld->set_name(cust->name); + } + } + } + break; + case df::enums::building_type::TradeDepot: + break; + case df::enums::building_type::Shop: + FOR_ENUM_ITEMS(shop_type, st) + { + bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(st); + bld->mutable_building_type()->set_building_custom(-1); + bld->set_id(ENUM_KEY_STR(building_type, bt) + "_" + ENUM_KEY_STR(shop_type, st)); + + } + break; + case df::enums::building_type::Door: + break; + case df::enums::building_type::Floodgate: + break; + case df::enums::building_type::Box: + break; + case df::enums::building_type::Weaponrack: + break; + case df::enums::building_type::Armorstand: + break; + case df::enums::building_type::Workshop: + FOR_ENUM_ITEMS(workshop_type, st) + { + bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(st); + bld->mutable_building_type()->set_building_custom(-1); + bld->set_id(ENUM_KEY_STR(building_type, bt) + "_" + ENUM_KEY_STR(workshop_type, st)); + + if (st == workshop_type::Custom) + { + for (int i = 0; i < world->raws.buildings.workshops.size(); i++) + { + auto cust = world->raws.buildings.workshops[i]; + + bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(st); + bld->mutable_building_type()->set_building_custom(cust->id); + bld->set_id(cust->code); + bld->set_name(cust->name); + } + } + } + break; + case df::enums::building_type::Cabinet: + break; + case df::enums::building_type::Statue: + break; + case df::enums::building_type::WindowGlass: + break; + case df::enums::building_type::WindowGem: + break; + case df::enums::building_type::Well: + break; + case df::enums::building_type::Bridge: + break; + case df::enums::building_type::RoadDirt: + break; + case df::enums::building_type::RoadPaved: + break; + case df::enums::building_type::SiegeEngine: + FOR_ENUM_ITEMS(siegeengine_type, st) + { + bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(st); + bld->mutable_building_type()->set_building_custom(-1); + bld->set_id(ENUM_KEY_STR(building_type, bt) + "_" + ENUM_KEY_STR(siegeengine_type, st)); + + } + break; + case df::enums::building_type::Trap: + FOR_ENUM_ITEMS(trap_type, st) + { + bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(st); + bld->mutable_building_type()->set_building_custom(-1); + bld->set_id(ENUM_KEY_STR(building_type, bt) + "_" + ENUM_KEY_STR(trap_type, st)); + + } + break; + case df::enums::building_type::AnimalTrap: + break; + case df::enums::building_type::Support: + break; + case df::enums::building_type::ArcheryTarget: + break; + case df::enums::building_type::Chain: + break; + case df::enums::building_type::Cage: + break; + case df::enums::building_type::Stockpile: + break; + case df::enums::building_type::Civzone: + FOR_ENUM_ITEMS(civzone_type, st) + { + bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(st); + bld->mutable_building_type()->set_building_custom(-1); + bld->set_id(ENUM_KEY_STR(building_type, bt) + "_" + ENUM_KEY_STR(civzone_type, st)); + + } + break; + case df::enums::building_type::Weapon: + break; + case df::enums::building_type::Wagon: + break; + case df::enums::building_type::ScrewPump: + break; + case df::enums::building_type::Construction: + FOR_ENUM_ITEMS(construction_type, st) + { + bld = out->add_building_list(); + bld->mutable_building_type()->set_building_type(bt); + bld->mutable_building_type()->set_building_subtype(st); + bld->mutable_building_type()->set_building_custom(-1); + bld->set_id(ENUM_KEY_STR(building_type, bt) + "_" + ENUM_KEY_STR(construction_type, st)); + + } + break; + case df::enums::building_type::Hatch: + break; + case df::enums::building_type::GrateWall: + break; + case df::enums::building_type::GrateFloor: + break; + case df::enums::building_type::BarsVertical: + break; + case df::enums::building_type::BarsFloor: + break; + case df::enums::building_type::GearAssembly: + break; + case df::enums::building_type::AxleHorizontal: + break; + case df::enums::building_type::AxleVertical: + break; + case df::enums::building_type::WaterWheel: + break; + case df::enums::building_type::Windmill: + break; + case df::enums::building_type::TractionBench: + break; + case df::enums::building_type::Slab: + break; + case df::enums::building_type::Nest: + break; + case df::enums::building_type::NestBox: + break; + case df::enums::building_type::Hive: + break; + case df::enums::building_type::Rollers: + break; + default: + break; + } + } +} \ No newline at end of file