From 5ea964b9cf15c970d09dd9b05bdd40e83b93b287 Mon Sep 17 00:00:00 2001 From: Japa Date: Sat, 25 Mar 2017 22:23:40 +0530 Subject: [PATCH 1/5] Send building items with buildings. --- plugins/proto/RemoteFortressReader.proto | 7 + plugins/remotefortressreader/CMakeLists.txt | 3 +- .../remotefortressreader/building_reader.cpp | 529 ++++++++++++++++++ .../remotefortressreader/building_reader.h | 9 + .../remotefortressreader.cpp | 527 +---------------- 5 files changed, 554 insertions(+), 521 deletions(-) create mode 100644 plugins/remotefortressreader/building_reader.cpp create mode 100644 plugins/remotefortressreader/building_reader.h diff --git a/plugins/proto/RemoteFortressReader.proto b/plugins/proto/RemoteFortressReader.proto index af25c9a4b..d8a0b0a61 100644 --- a/plugins/proto/RemoteFortressReader.proto +++ b/plugins/proto/RemoteFortressReader.proto @@ -150,6 +150,12 @@ message BuildingExtents repeated int32 extents = 5; } +message BuildingItem +{ + optional Item item = 1; + optional int32 mode = 2; +} + message BuildingInstance { required int32 index = 1; @@ -165,6 +171,7 @@ message BuildingInstance optional bool is_room = 11; optional BuildingExtents room = 12; optional BuildingDirection direction = 13; //Doesn't mean anything for most buildings + repeated BuildingItem items = 14; } message RiverEdge diff --git a/plugins/remotefortressreader/CMakeLists.txt b/plugins/remotefortressreader/CMakeLists.txt index 0b84d8905..b9f120059 100644 --- a/plugins/remotefortressreader/CMakeLists.txt +++ b/plugins/remotefortressreader/CMakeLists.txt @@ -2,10 +2,11 @@ PROJECT (remotefortressreader) # A list of source files SET(PROJECT_SRCS remotefortressreader.cpp + building_reader.cpp ) # A list of headers SET(PROJECT_HDRS - + building_reader.h ) #proto files to include. SET(PROJECT_PROTO diff --git a/plugins/remotefortressreader/building_reader.cpp b/plugins/remotefortressreader/building_reader.cpp new file mode 100644 index 000000000..1a49a7c02 --- /dev/null +++ b/plugins/remotefortressreader/building_reader.cpp @@ -0,0 +1,529 @@ +#include "building_reader.h" +#include "DataDefs.h" + +#include "df/building_axle_horizontalst.h" +#include "df/building_bridgest.h" +#include "df/building_def_furnacest.h" +#include "df/building_def_workshopst.h" +#include "df/building_rollersst.h" +#include "df/building_screw_pumpst.h" +#include "df/building_siegeenginest.h" +#include "df/building_water_wheelst.h" +#include "df/building_wellst.h" +#include "df/building_windmillst.h" +#include "df/world.h" + + +#include "modules/Buildings.h" + + +using namespace DFHack; +using namespace df::enums; +using namespace RemoteFortressReader; +using namespace std; + +DFHack::command_result GetBuildingDefList(DFHack::color_ostream &stream, const DFHack::EmptyMessage *in, RemoteFortressReader::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 < df::global::world->raws.buildings.furnaces.size(); i++) + { + auto cust = df::global::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 < df::global::world->raws.buildings.workshops.size(); i++) + { + auto cust = df::global::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; + } + } + return CR_OK; +} + + +void CopyBuilding(int buildingIndex, RemoteFortressReader::BuildingInstance * remote_build) +{ + df::building * local_build = df::global::world->buildings.all[buildingIndex]; + remote_build->set_index(buildingIndex); + int minZ = local_build->z; + if (local_build->getType() == df::enums::building_type::Well) + { + df::building_wellst * well_building = virtual_cast(local_build); + if (well_building) + minZ = well_building->bucket_z; + } + remote_build->set_pos_x_min(local_build->x1); + remote_build->set_pos_y_min(local_build->y1); + remote_build->set_pos_z_min(minZ); + + remote_build->set_pos_x_max(local_build->x2); + remote_build->set_pos_y_max(local_build->y2); + remote_build->set_pos_z_max(local_build->z); + + auto buildingType = remote_build->mutable_building_type(); + auto type = local_build->getType(); + buildingType->set_building_type(type); + buildingType->set_building_subtype(local_build->getSubtype()); + buildingType->set_building_custom(local_build->getCustomType()); + + auto material = remote_build->mutable_material(); + material->set_mat_type(local_build->mat_type); + material->set_mat_index(local_build->mat_index); + + remote_build->set_building_flags(local_build->flags.whole); + remote_build->set_is_room(local_build->is_room); + if (local_build->is_room || local_build->getType() == df::enums::building_type::Civzone || local_build->getType() == df::enums::building_type::Stockpile) + { + auto room = remote_build->mutable_room(); + room->set_pos_x(local_build->room.x); + room->set_pos_y(local_build->room.y); + room->set_width(local_build->room.width); + room->set_height(local_build->room.height); + for (int i = 0; i < (local_build->room.width * local_build->room.height); i++) + { + room->add_extents(local_build->room.extents[i]); + } + } + + + switch (type) + { + 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: + break; + case df::enums::building_type::TradeDepot: + break; + case df::enums::building_type::Shop: + 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: + 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: + { + auto actual = strict_virtual_cast(local_build); + if (actual) + { + auto direction = actual->direction; + switch (direction) + { + case df::building_bridgest::Retracting: + break; + case df::building_bridgest::Left: + remote_build->set_direction(WEST); + break; + case df::building_bridgest::Right: + remote_build->set_direction(EAST); + break; + case df::building_bridgest::Up: + remote_build->set_direction(NORTH); + break; + case df::building_bridgest::Down: + remote_build->set_direction(SOUTH); + break; + default: + break; + } + } + } + break; + case df::enums::building_type::RoadDirt: + break; + case df::enums::building_type::RoadPaved: + break; + case df::enums::building_type::SiegeEngine: + { + auto actual = strict_virtual_cast(local_build); + if (actual) + { + auto facing = actual->facing; + switch (facing) + { + case df::building_siegeenginest::Left: + remote_build->set_direction(WEST); + break; + case df::building_siegeenginest::Up: + remote_build->set_direction(NORTH); + break; + case df::building_siegeenginest::Right: + remote_build->set_direction(EAST); + break; + case df::building_siegeenginest::Down: + remote_build->set_direction(SOUTH); + break; + default: + break; + } + } + } + break; + case df::enums::building_type::Trap: + 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: + break; + case df::enums::building_type::Weapon: + break; + case df::enums::building_type::Wagon: + break; + case df::enums::building_type::ScrewPump: + { + auto actual = strict_virtual_cast(local_build); + if (actual) + { + auto direction = actual->direction; + switch (direction) + { + case df::enums::screw_pump_direction::FromNorth: + remote_build->set_direction(NORTH); + break; + case df::enums::screw_pump_direction::FromEast: + remote_build->set_direction(EAST); + break; + case df::enums::screw_pump_direction::FromSouth: + remote_build->set_direction(SOUTH); + break; + case df::enums::screw_pump_direction::FromWest: + remote_build->set_direction(WEST); + break; + default: + break; + } + } + } + break; + case df::enums::building_type::Construction: + 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: + { + auto actual = strict_virtual_cast(local_build); + if (actual) + { + if (actual->is_vertical) + remote_build->set_direction(NORTH); + else + remote_build->set_direction(EAST); + } + } + break; + case df::enums::building_type::AxleVertical: + break; + case df::enums::building_type::WaterWheel: + { + auto actual = strict_virtual_cast(local_build); + if (actual) + { + if (actual->is_vertical) + remote_build->set_direction(NORTH); + else + remote_build->set_direction(EAST); + } + } + break; + case df::enums::building_type::Windmill: + { + auto actual = strict_virtual_cast(local_build); + if (actual) + { + if (actual->orient_x < 0) + remote_build->set_direction(WEST); + else if (actual->orient_x > 0) + remote_build->set_direction(EAST); + else if (actual->orient_y < 0) + remote_build->set_direction(NORTH); + else if (actual->orient_y > 0) + remote_build->set_direction(SOUTH); + else + remote_build->set_direction(WEST); + } + } + 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: + { + auto actual = strict_virtual_cast(local_build); + if (actual) + { + auto direction = actual->direction; + switch (direction) + { + case df::enums::screw_pump_direction::FromNorth: + remote_build->set_direction(NORTH); + break; + case df::enums::screw_pump_direction::FromEast: + remote_build->set_direction(EAST); + break; + case df::enums::screw_pump_direction::FromSouth: + remote_build->set_direction(SOUTH); + break; + case df::enums::screw_pump_direction::FromWest: + remote_build->set_direction(WEST); + break; + default: + break; + } + } + } + break; + default: + break; + } +} + diff --git a/plugins/remotefortressreader/building_reader.h b/plugins/remotefortressreader/building_reader.h new file mode 100644 index 000000000..6b789359b --- /dev/null +++ b/plugins/remotefortressreader/building_reader.h @@ -0,0 +1,9 @@ +#ifndef BUILDING_READER_H +#define BUILDING_READER_H +#include "RemoteClient.h" +#include "RemoteFortressReader.pb.h" + +DFHack::command_result GetBuildingDefList(DFHack::color_ostream &stream, const DFHack::EmptyMessage *in, RemoteFortressReader::BuildingList *out); +void CopyBuilding(int buildingIndex, RemoteFortressReader::BuildingInstance * remote_build); + +#endif \ No newline at end of file diff --git a/plugins/remotefortressreader/remotefortressreader.cpp b/plugins/remotefortressreader/remotefortressreader.cpp index 1f23cf0e1..8274b7db5 100644 --- a/plugins/remotefortressreader/remotefortressreader.cpp +++ b/plugins/remotefortressreader/remotefortressreader.cpp @@ -17,7 +17,6 @@ #include "SDL_keyboard.h" #include "TileTypes.h" -#include "modules/Buildings.h" #include "modules/Gui.h" #include "modules/Items.h" #include "modules/MapCache.h" @@ -35,17 +34,9 @@ #include "df/body_part_layer_raw.h" #include "df/body_part_raw.h" #include "df/bp_appearance_modifier.h" -#include "df/building_axle_horizontalst.h" -#include "df/building_bridgest.h" -#include "df/building_def_furnacest.h" -#include "df/building_def_workshopst.h" -#include "df/building_rollersst.h" -#include "df/building_screw_pumpst.h" -#include "df/building_siegeenginest.h" -#include "df/building_water_wheelst.h" -#include "df/building_wellst.h" -#include "df/building_windmillst.h" #include "df/builtin_mats.h" +#include "df/building_wellst.h" + #include "df/caste_raw.h" #include "df/caste_raw.h" #include "df/color_modifier_raw.h" @@ -105,6 +96,8 @@ #include "df/plant_tree_tile.h" #endif +#include "building_reader.h" + using namespace DFHack; using namespace df::enums; using namespace RemoteFortressReader; @@ -135,7 +128,6 @@ 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); static command_result GetWorldMap(color_ostream &stream, const EmptyMessage *in, WorldMap *out); static command_result GetWorldMapNew(color_ostream &stream, const EmptyMessage *in, WorldMap *out); static command_result GetWorldMapCenter(color_ostream &stream, const EmptyMessage *in, WorldMap *out); @@ -312,296 +304,6 @@ void ConvertDFColorDescriptor(int16_t index, RemoteFortressReader::ColorDefiniti out->set_blue(color->blue * 255); } -void CopyBuilding(int buildingIndex, RemoteFortressReader::BuildingInstance * remote_build) -{ - df::building * local_build = df::global::world->buildings.all[buildingIndex]; - remote_build->set_index(buildingIndex); - int minZ = local_build->z; - if (local_build->getType() == df::enums::building_type::Well) - { - df::building_wellst * well_building = virtual_cast(local_build); - if (well_building) - minZ = well_building->bucket_z; - } - remote_build->set_pos_x_min(local_build->x1); - remote_build->set_pos_y_min(local_build->y1); - remote_build->set_pos_z_min(minZ); - - remote_build->set_pos_x_max(local_build->x2); - remote_build->set_pos_y_max(local_build->y2); - remote_build->set_pos_z_max(local_build->z); - - auto buildingType = remote_build->mutable_building_type(); - auto type = local_build->getType(); - buildingType->set_building_type(type); - buildingType->set_building_subtype(local_build->getSubtype()); - buildingType->set_building_custom(local_build->getCustomType()); - - auto material = remote_build->mutable_material(); - material->set_mat_type(local_build->mat_type); - material->set_mat_index(local_build->mat_index); - - remote_build->set_building_flags(local_build->flags.whole); - remote_build->set_is_room(local_build->is_room); - if (local_build->is_room || local_build->getType() == df::enums::building_type::Civzone || local_build->getType() == df::enums::building_type::Stockpile) - { - auto room = remote_build->mutable_room(); - room->set_pos_x(local_build->room.x); - room->set_pos_y(local_build->room.y); - room->set_width(local_build->room.width); - room->set_height(local_build->room.height); - for (int i = 0; i < (local_build->room.width * local_build->room.height); i++) - { - room->add_extents(local_build->room.extents[i]); - } - } - - - switch (type) - { - 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: - break; - case df::enums::building_type::TradeDepot: - break; - case df::enums::building_type::Shop: - 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: - 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: - { - auto actual = strict_virtual_cast(local_build); - if (actual) - { - auto direction = actual->direction; - switch (direction) - { - case df::building_bridgest::Retracting: - break; - case df::building_bridgest::Left: - remote_build->set_direction(WEST); - break; - case df::building_bridgest::Right: - remote_build->set_direction(EAST); - break; - case df::building_bridgest::Up: - remote_build->set_direction(NORTH); - break; - case df::building_bridgest::Down: - remote_build->set_direction(SOUTH); - break; - default: - break; - } - } - } - break; - case df::enums::building_type::RoadDirt: - break; - case df::enums::building_type::RoadPaved: - break; - case df::enums::building_type::SiegeEngine: - { - auto actual = strict_virtual_cast(local_build); - if (actual) - { - auto facing = actual->facing; - switch (facing) - { - case df::building_siegeenginest::Left: - remote_build->set_direction(WEST); - break; - case df::building_siegeenginest::Up: - remote_build->set_direction(NORTH); - break; - case df::building_siegeenginest::Right: - remote_build->set_direction(EAST); - break; - case df::building_siegeenginest::Down: - remote_build->set_direction(SOUTH); - break; - default: - break; - } - } - } - break; - case df::enums::building_type::Trap: - 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: - break; - case df::enums::building_type::Weapon: - break; - case df::enums::building_type::Wagon: - break; - case df::enums::building_type::ScrewPump: - { - auto actual = strict_virtual_cast(local_build); - if (actual) - { - auto direction = actual->direction; - switch (direction) - { - case df::enums::screw_pump_direction::FromNorth: - remote_build->set_direction(NORTH); - break; - case df::enums::screw_pump_direction::FromEast: - remote_build->set_direction(EAST); - break; - case df::enums::screw_pump_direction::FromSouth: - remote_build->set_direction(SOUTH); - break; - case df::enums::screw_pump_direction::FromWest: - remote_build->set_direction(WEST); - break; - default: - break; - } - } - } - break; - case df::enums::building_type::Construction: - 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: - { - auto actual = strict_virtual_cast(local_build); - if (actual) - { - if(actual->is_vertical) - remote_build->set_direction(NORTH); - else - remote_build->set_direction(EAST); - } - } - break; - case df::enums::building_type::AxleVertical: - break; - case df::enums::building_type::WaterWheel: - { - auto actual = strict_virtual_cast(local_build); - if (actual) - { - if (actual->is_vertical) - remote_build->set_direction(NORTH); - else - remote_build->set_direction(EAST); - } - } - break; - case df::enums::building_type::Windmill: - { - auto actual = strict_virtual_cast(local_build); - if (actual) - { - if (actual->orient_x < 0) - remote_build->set_direction(WEST); - else if (actual->orient_x > 0) - remote_build->set_direction(EAST); - else if (actual->orient_y < 0) - remote_build->set_direction(NORTH); - else if (actual->orient_y > 0) - remote_build->set_direction(SOUTH); - else - remote_build->set_direction(WEST); - } - } - 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: - { - auto actual = strict_virtual_cast(local_build); - if (actual) - { - auto direction = actual->direction; - switch (direction) - { - case df::enums::screw_pump_direction::FromNorth: - remote_build->set_direction(NORTH); - break; - case df::enums::screw_pump_direction::FromEast: - remote_build->set_direction(EAST); - break; - case df::enums::screw_pump_direction::FromSouth: - remote_build->set_direction(SOUTH); - break; - case df::enums::screw_pump_direction::FromWest: - remote_build->set_direction(WEST); - break; - default: - break; - } - } - } - break; - default: - break; - } -} - RemoteFortressReader::TiletypeMaterial TranslateMaterial(df::tiletype_material material) { switch (material) @@ -1469,10 +1171,9 @@ void CopyBuildings(df::map_block * DfBlock, RemoteFortressReader::MapBlock * Net { for (int i = 0; i < actualBuilding->contained_items.size(); i++) { - if (isItemChanged(actualBuilding->contained_items[i]->item->id)) - { - CopyItem(NetBlock->add_items(), actualBuilding->contained_items[i]->item); - } + auto buildingItem = out_bld->add_items(); + buildingItem->set_mode(actualBuilding->contained_items[i]->use_mode); + CopyItem(buildingItem->mutable_item(), actualBuilding->contained_items[i]->item); } } } @@ -1869,220 +1570,6 @@ static command_result GetMapInfo(color_ostream &stream, const EmptyMessage *in, 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; - } - } - return CR_OK; -} - DFCoord GetMapCenter() { DFCoord output; From c244901c165b038abbe6d650aa5ca86076a90ad5 Mon Sep 17 00:00:00 2001 From: Japa Date: Wed, 29 Mar 2017 20:22:09 +0530 Subject: [PATCH 2/5] Removed end of line space. (Sorry, travis) --- plugins/remotefortressreader/building_reader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/remotefortressreader/building_reader.cpp b/plugins/remotefortressreader/building_reader.cpp index 1a49a7c02..5d1ce6ffa 100644 --- a/plugins/remotefortressreader/building_reader.cpp +++ b/plugins/remotefortressreader/building_reader.cpp @@ -22,7 +22,7 @@ using namespace df::enums; using namespace RemoteFortressReader; using namespace std; -DFHack::command_result GetBuildingDefList(DFHack::color_ostream &stream, const DFHack::EmptyMessage *in, RemoteFortressReader::BuildingList *out) +DFHack::command_result GetBuildingDefList(DFHack::color_ostream &stream, const DFHack::EmptyMessage *in, RemoteFortressReader::BuildingList *out) { FOR_ENUM_ITEMS(building_type, bt) { From bbaf3210f159f213b59e9880f5659a714f4a9bd3 Mon Sep 17 00:00:00 2001 From: Japa Date: Wed, 29 Mar 2017 21:58:12 +0530 Subject: [PATCH 3/5] Send DF version info over remoteFortressReader --- plugins/proto/RemoteFortressReader.proto | 7 +++++ .../remotefortressreader.cpp | 31 +++++++++++++------ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/plugins/proto/RemoteFortressReader.proto b/plugins/proto/RemoteFortressReader.proto index d8a0b0a61..d9bb581b3 100644 --- a/plugins/proto/RemoteFortressReader.proto +++ b/plugins/proto/RemoteFortressReader.proto @@ -764,3 +764,10 @@ message SingleBool { optional bool Value = 1; } + +message VersionInfo +{ + optional string dwarf_fortress_version = 1; + optional string dfhack_version = 2; + optional string remote_fortress_reader_version = 3; +} \ No newline at end of file diff --git a/plugins/remotefortressreader/remotefortressreader.cpp b/plugins/remotefortressreader/remotefortressreader.cpp index 8274b7db5..b976ef644 100644 --- a/plugins/remotefortressreader/remotefortressreader.cpp +++ b/plugins/remotefortressreader/remotefortressreader.cpp @@ -1,4 +1,5 @@ -#define DF_VERSION 42004 +#define DF_VERSION_INT 42004 +#define RFR_VERSION "0.16.1" #include #include @@ -16,6 +17,7 @@ #include "SDL_events.h" #include "SDL_keyboard.h" #include "TileTypes.h" +#include "DFHackVersion.h" #include "modules/Gui.h" #include "modules/Items.h" @@ -89,7 +91,7 @@ #include "df/world_site_realization.h" #include "df/entity_position.h" -#if DF_VERSION > 40001 +#if DF_VERSION_INT > 40001 #include "df/plant_growth.h" #include "df/plant_growth_print.h" #include "df/plant_tree_info.h" @@ -140,6 +142,7 @@ static command_result PassKeyboardEvent(color_ostream &stream, const KeyboardEve static command_result SendDigCommand(color_ostream &stream, const DigCommand *in); static command_result SetPauseState(color_ostream & stream, const SingleBool * in); static command_result GetPauseState(color_ostream & stream, const EmptyMessage * in, SingleBool * out); +static command_result GetVersionInfo(color_ostream & stream, const EmptyMessage * in, RemoteFortressReader::VersionInfo * out); void CopyItem(RemoteFortressReader::Item * NetItem, df::item * DfItem); @@ -377,7 +380,7 @@ RemoteFortressReader::TiletypeMaterial TranslateMaterial(df::tiletype_material m case df::enums::tiletype_material::RIVER: return RemoteFortressReader::RIVER; break; -#if DF_VERSION > 40001 +#if DF_VERSION_INT > 40001 case df::enums::tiletype_material::ROOT: return RemoteFortressReader::ROOT; break; @@ -438,7 +441,7 @@ RemoteFortressReader::TiletypeSpecial TranslateSpecial(df::tiletype_special spec case df::enums::tiletype_special::TRACK: return RemoteFortressReader::TRACK; break; -#if DF_VERSION > 40001 +#if DF_VERSION_INT > 40001 case df::enums::tiletype_special::SMOOTH_DEAD: return RemoteFortressReader::SMOOTH_DEAD; break; @@ -496,17 +499,17 @@ RemoteFortressReader::TiletypeShape TranslateShape(df::tiletype_shape shape) case df::enums::tiletype_shape::BROOK_TOP: return RemoteFortressReader::BROOK_TOP; break; -#if DF_VERSION > 40001 +#if DF_VERSION_INT > 40001 case df::enums::tiletype_shape::BRANCH: return RemoteFortressReader::BRANCH; break; #endif -#if DF_VERSION < 40001 +#if DF_VERSION_INT < 40001 case df::enums::tiletype_shape::TREE: return RemoteFortressReader::TREE_SHAPE; break; #endif -#if DF_VERSION > 40001 +#if DF_VERSION_INT > 40001 case df::enums::tiletype_shape::TRUNK_BRANCH: return RemoteFortressReader::TRUNK_BRANCH; @@ -898,7 +901,7 @@ static command_result GetGrowthList(color_ostream &stream, const EmptyMessage *i basePlant->set_name(pp->name); basePlant->mutable_mat_pair()->set_mat_type(-1); basePlant->mutable_mat_pair()->set_mat_index(i); -#if DF_VERSION > 40001 +#if DF_VERSION_INT > 40001 for (int g = 0; g < pp->growths.size(); g++) { df::plant_growth* growth = pp->growths[g]; @@ -1423,7 +1426,7 @@ static command_result GetPlantList(color_ostream &stream, const BlockRequest *in int max_y = in->max_y() / 3; int max_z = in->max_z(); -#if DF_VERSION < 40001 +#if DF_VERSION_INT < 40001 //plants are gotten differently here #else for (int xx = min_x; xx < max_x; xx++) @@ -2564,4 +2567,12 @@ static command_result GetPauseState(color_ostream &stream, const EmptyMessage *i { out->set_value(World::ReadPauseState()); return CR_OK; -} \ No newline at end of file +} + +command_result GetVersionInfo(color_ostream & stream, const EmptyMessage * in, RemoteFortressReader::VersionInfo * out) +{ + out->set_dfhack_version(DFHACK_VERSION); + out->set_dwarf_fortress_version(DF_VERSION); + out->set_remote_fortress_reader_version(RFR_VERSION); + return command_result(); +} From 7c626ba3c25494d08c10f0c4af183cb32c9acae3 Mon Sep 17 00:00:00 2001 From: Japa Date: Wed, 29 Mar 2017 22:05:49 +0530 Subject: [PATCH 4/5] Actually add the versionInfo function to the RPC list. --- plugins/remotefortressreader/remotefortressreader.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/remotefortressreader/remotefortressreader.cpp b/plugins/remotefortressreader/remotefortressreader.cpp index b976ef644..866dd8d42 100644 --- a/plugins/remotefortressreader/remotefortressreader.cpp +++ b/plugins/remotefortressreader/remotefortressreader.cpp @@ -250,6 +250,7 @@ DFhackCExport RPCService *plugin_rpcconnect(color_ostream &) svc->addFunction("SendDigCommand", SendDigCommand); svc->addFunction("SetPauseState", SetPauseState); svc->addFunction("GetPauseState", GetPauseState); + svc->addFunction("GetVersionInfo", GetVersionInfo); return svc; } From 06225dd896562901ecc275493aae81bda2e3c751 Mon Sep 17 00:00:00 2001 From: Japa Illo Date: Thu, 30 Mar 2017 16:23:14 +0530 Subject: [PATCH 5/5] Send building items and items kept in buildings separately. --- .../remotefortressreader.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/plugins/remotefortressreader/remotefortressreader.cpp b/plugins/remotefortressreader/remotefortressreader.cpp index 866dd8d42..507bd5349 100644 --- a/plugins/remotefortressreader/remotefortressreader.cpp +++ b/plugins/remotefortressreader/remotefortressreader.cpp @@ -1170,14 +1170,22 @@ void CopyBuildings(df::map_block * DfBlock, RemoteFortressReader::MapBlock * Net continue; auto out_bld = NetBlock->add_buildings(); CopyBuilding(i, out_bld); - df::building_actual* actualBuilding = strict_virtual_cast(bld); + df::building_actual* actualBuilding = virtual_cast(bld); if (actualBuilding) { for (int i = 0; i < actualBuilding->contained_items.size(); i++) { - auto buildingItem = out_bld->add_items(); - buildingItem->set_mode(actualBuilding->contained_items[i]->use_mode); - CopyItem(buildingItem->mutable_item(), actualBuilding->contained_items[i]->item); + if (actualBuilding->contained_items[i]->use_mode == 0) + { + if (isItemChanged(actualBuilding->contained_items[i]->item->id)) + CopyItem(NetBlock->add_items(), actualBuilding->contained_items[i]->item); + } + else + { + auto buildingItem = out_bld->add_items(); + buildingItem->set_mode(actualBuilding->contained_items[i]->use_mode); + CopyItem(buildingItem->mutable_item(), actualBuilding->contained_items[i]->item); + } } } }