Blueprint plugin basic structure
It should be able to load and make empty blueprint files.develop
							parent
							
								
									448404a465
								
							
						
					
					
						commit
						819327348b
					
				| @ -0,0 +1,172 @@ | |||||||
|  | //Blueprint
 | ||||||
|  | //By cdombroski
 | ||||||
|  | //Translates a region of tiles specified by the cursor and arguments/prompts into a series of blueprint files suitable for digfort/buildingplan/quickfort
 | ||||||
|  | 
 | ||||||
|  | #include <Console.h> | ||||||
|  | #include <PluginManager.h> | ||||||
|  | 
 | ||||||
|  | #include "modules/Gui.h" | ||||||
|  | #include "modules/MapCache.h" | ||||||
|  | 
 | ||||||
|  | using std::string; | ||||||
|  | using std::endl; | ||||||
|  | using std::vector; | ||||||
|  | using std::ofstream; | ||||||
|  | using namespace DFHack; | ||||||
|  | 
 | ||||||
|  | DFHACK_PLUGIN("blueprint"); | ||||||
|  | 
 | ||||||
|  | #define swap(x, y)\ | ||||||
|  |     x += y;\ | ||||||
|  |     y = x - y;\ | ||||||
|  |     x -= x | ||||||
|  | 
 | ||||||
|  | enum phase {DIG, BUILD, PLACE, QUERY}; | ||||||
|  | 
 | ||||||
|  | command_result blueprint(color_ostream &out, vector <string> ¶meters); | ||||||
|  | 
 | ||||||
|  | DFhackCExport command_result plugin_init(color_ostream &out, vector<PluginCommand> &commands) | ||||||
|  | { | ||||||
|  |     commands.push_back(PluginCommand("blueprint", "Convert map tiles into a blueprint", blueprint, false)); | ||||||
|  |     return CR_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | DFhackCExport command_result plugin_shutdown(color_ostream &out) | ||||||
|  | { | ||||||
|  |     return CR_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | command_result help(color_ostream &out) | ||||||
|  | { | ||||||
|  |     out << "blueprint width height depth name [dig [build [place [query]]]]" << endl | ||||||
|  |         << " width, height, depth: area to translate in tiles" << endl | ||||||
|  |         << " name: base name for blueprint files" << endl | ||||||
|  |         << " dig: generate blueprints for digging" << endl | ||||||
|  |         << " build: generate blueprints for building" << endl | ||||||
|  |         << " place: generate blueprints for stockpiles" << endl | ||||||
|  |         << " query: generate blueprints for querying (room designations)" << endl | ||||||
|  |         << " defaults to generating all blueprints" << endl | ||||||
|  |         << endl | ||||||
|  |         << "blueprint translates a portion of your fortress into blueprints suitable for" << endl | ||||||
|  |         << " digfort/fortplan/quickfort. Blueprints are created in the DF folder with names" << endl | ||||||
|  |         << " following a \"name-phase.csv\" pattern. Translation starts at the current" << endl | ||||||
|  |         << " cursor location and includes all tiles in the range specified." << endl; | ||||||
|  |     return CR_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | command_result do_transform(DFCoord start, DFCoord range, string name, phase last_phase) | ||||||
|  | { | ||||||
|  |     ofstream dig, build, place, query; | ||||||
|  |     switch (last_phase) | ||||||
|  |     { | ||||||
|  |     case QUERY: | ||||||
|  |         query = ofstream(name + "-query.csv", ofstream::trunc); | ||||||
|  |         query << "#query" << endl; | ||||||
|  |     case PLACE: | ||||||
|  |         place = ofstream(name + "-place.csv", ofstream::trunc); | ||||||
|  |         place << "#place" << endl; | ||||||
|  |     case BUILD: | ||||||
|  |         build = ofstream(name + "-build.csv", ofstream::trunc); | ||||||
|  |         build << "#build" << endl; | ||||||
|  |     case DIG: | ||||||
|  |         dig = ofstream(name + "-dig.csv", ofstream::trunc); | ||||||
|  |         dig << "#dig" << endl; | ||||||
|  |     } | ||||||
|  |     DFCoord end = start + range; | ||||||
|  |     if (start.x > end.x) | ||||||
|  |     { | ||||||
|  |         swap(start.x, end.x); | ||||||
|  |     } | ||||||
|  |     if (start.y > end.y) | ||||||
|  |     { | ||||||
|  |         swap(start.y, end.y); | ||||||
|  |     } | ||||||
|  |     if (start.z > end.z) | ||||||
|  |     { | ||||||
|  |         swap(start.z, end.z); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     MapExtras::MapCache mc; | ||||||
|  |     for (auto z = start.z; z < end.z; z++) | ||||||
|  |     { | ||||||
|  |         for (auto y = start.y; y < end.y; y++) | ||||||
|  |         { | ||||||
|  |             for (auto x = start.x; x < end.x; x++) | ||||||
|  |             { | ||||||
|  |                 switch (last_phase) { | ||||||
|  |                 case QUERY: | ||||||
|  |                 case PLACE: | ||||||
|  |                 case BUILD: | ||||||
|  |                 case DIG: | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             switch (last_phase) { | ||||||
|  |             case QUERY: | ||||||
|  |                 query << "#" << endl; | ||||||
|  |             case PLACE: | ||||||
|  |                 place << "#" << endl; | ||||||
|  |             case BUILD: | ||||||
|  |                 place << "#" << endl; | ||||||
|  |             case DIG: | ||||||
|  |                 dig << "#" << endl; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (z < end.z - 1) | ||||||
|  |             switch (last_phase) { | ||||||
|  |             case QUERY: | ||||||
|  |                 query << "#>" << endl; | ||||||
|  |             case PLACE: | ||||||
|  |                 place << "#>" << endl; | ||||||
|  |             case BUILD: | ||||||
|  |                 place << "#>" << endl; | ||||||
|  |             case DIG: | ||||||
|  |                 dig << "#>" << endl; | ||||||
|  |             } | ||||||
|  |     } | ||||||
|  |     switch (last_phase) { | ||||||
|  |     case QUERY: | ||||||
|  |         query.close(); | ||||||
|  |     case PLACE: | ||||||
|  |         place.close(); | ||||||
|  |     case BUILD: | ||||||
|  |         place.close(); | ||||||
|  |     case DIG: | ||||||
|  |         dig.close(); | ||||||
|  |     } | ||||||
|  |     return CR_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | command_result blueprint(color_ostream &out, vector <string> ¶meters) | ||||||
|  | { | ||||||
|  |     if (parameters.size() < 4 || parameters.size() > 8) | ||||||
|  |         return help(out); | ||||||
|  |     CoreSuspender suspend; | ||||||
|  |     if (!Maps::IsValid()) | ||||||
|  |     { | ||||||
|  |         out.printerr("Map is not available!\n"); | ||||||
|  |         return CR_FAILURE; | ||||||
|  |     } | ||||||
|  |     int32_t x, y, z; | ||||||
|  |     if (!Gui::getCursorCoords(x, y, z)) | ||||||
|  |     { | ||||||
|  |         out.printerr("Can't get cursor coords! Make sure you have an active cursor in DF.\n"); | ||||||
|  |         return CR_FAILURE; | ||||||
|  |     } | ||||||
|  |     DFCoord start (x, y, z); | ||||||
|  |     DFCoord range (stoi(parameters[0]), stoi(parameters[1]), stoi(parameters[2])); | ||||||
|  |     switch(parameters.size()) | ||||||
|  |     { | ||||||
|  |     case 4: | ||||||
|  |     case 8: | ||||||
|  |         return do_transform(start, range, parameters[3], QUERY); | ||||||
|  |     case 5: | ||||||
|  |         return do_transform(start, range, parameters[3], DIG); | ||||||
|  |     case 6: | ||||||
|  |         return do_transform(start, range, parameters[3], BUILD); | ||||||
|  |     case 7: | ||||||
|  |         return do_transform(start, range, parameters[3], PLACE); | ||||||
|  |     default: //wtf?
 | ||||||
|  |         return CR_FAILURE; | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue