And the tool source...
							parent
							
								
									64a578b204
								
							
						
					
					
						commit
						ce9aa514fb
					
				| @ -0,0 +1,124 @@ | |||||||
|  | // Adamantine tube filler. It fills the hollow ones.
 | ||||||
|  | 
 | ||||||
|  | #include <iostream> | ||||||
|  | #include <vector> | ||||||
|  | #include <map> | ||||||
|  | #include <stddef.h> | ||||||
|  | #include <assert.h> | ||||||
|  | #include <string.h> | ||||||
|  | using namespace std; | ||||||
|  | 
 | ||||||
|  | #include <DFHack.h> | ||||||
|  | #include <dfhack/DFTileTypes.h> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | int main (void) | ||||||
|  | { | ||||||
|  |     uint32_t x_max,y_max,z_max; | ||||||
|  |     DFHack::designations40d designations; | ||||||
|  |     DFHack::tiletypes40d tiles; | ||||||
|  | 
 | ||||||
|  |     int32_t oldT, newT; | ||||||
|  |     int16_t t; | ||||||
|  |     uint64_t count = 0; | ||||||
|  | 
 | ||||||
|  |     int dirty=0; | ||||||
|  | 
 | ||||||
|  |     DFHack::ContextManager DFMgr("Memory.xml"); | ||||||
|  |     DFHack::Context *DF = DFMgr.getSingleContext(); | ||||||
|  | 
 | ||||||
|  |     //Init
 | ||||||
|  |     try | ||||||
|  |     { | ||||||
|  |         DF->Attach(); | ||||||
|  |     } | ||||||
|  |     catch (exception& e) | ||||||
|  |     { | ||||||
|  |         cerr << e.what() << endl; | ||||||
|  |         #ifndef LINUX_BUILD | ||||||
|  |             cin.ignore(); | ||||||
|  |         #endif | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |     DFHack::Maps *Mapz = DF->getMaps(); | ||||||
|  | 
 | ||||||
|  |     // init the map
 | ||||||
|  |     if (!Mapz->Start()) | ||||||
|  |     { | ||||||
|  |         cerr << "Can't init map." << endl; | ||||||
|  |         #ifndef LINUX_BUILD | ||||||
|  |             cin.ignore(); | ||||||
|  |         #endif | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     Mapz->getSize(x_max,y_max,z_max); | ||||||
|  |     if(!Mapz->StartFeatures()) | ||||||
|  |     { | ||||||
|  |         cerr << "Can't get features." << endl; | ||||||
|  |         #ifndef LINUX_BUILD | ||||||
|  |         cin.ignore(); | ||||||
|  |         #endif | ||||||
|  |         return 1;  | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // walk the map
 | ||||||
|  |     for (uint32_t x = 0; x< x_max;x++) | ||||||
|  |     { | ||||||
|  |         for (uint32_t y = 0; y< y_max;y++) | ||||||
|  |         { | ||||||
|  |             for (uint32_t z = 0; z< z_max;z++) | ||||||
|  |             { | ||||||
|  |                 DFHack::t_feature * locf = 0; | ||||||
|  |                 DFHack::t_feature * glof = 0; | ||||||
|  |                 if (Mapz->ReadFeatures(x,y,z,&locf,&glof)) | ||||||
|  |                 { | ||||||
|  |                     cout << "bleep" << endl; | ||||||
|  |                     // we're looking for addy tubes
 | ||||||
|  |                     if(!locf) continue; | ||||||
|  |                     if(locf->type != DFHack::feature_Adamantine_Tube) continue; | ||||||
|  |                     dirty=0; | ||||||
|  |                     cout << "bloop" << endl; | ||||||
|  |                     Mapz->ReadDesignations(x,y,z, &designations); | ||||||
|  |                     Mapz->ReadTileTypes(x,y,z, &tiles); | ||||||
|  | 
 | ||||||
|  |                     for (uint32_t ty=0;ty<16;++ty) | ||||||
|  |                     { | ||||||
|  |                         for (uint32_t tx=0;tx<16;++tx) | ||||||
|  |                         { | ||||||
|  |                             if(!designations[tx][ty].bits.feature_local) continue; | ||||||
|  |                             oldT = tiles[tx][ty]; | ||||||
|  |                             DFHack::TileClass ttype = DFHack::tileTypeTable[oldT].c; | ||||||
|  |                             if ( ttype != DFHack::WALL ) | ||||||
|  |                             { | ||||||
|  |                                 //Current tile is not a wall.
 | ||||||
|  |                                 //Set current tile, as accurately as can be expected
 | ||||||
|  |                                 //newT = DFHack::findSimilarTileType(oldT,DFHack::WALL);
 | ||||||
|  |                                 newT = DFHack::findTileType( DFHack::WALL, DFHack::FEATSTONE, DFHack::tilevariant_invalid, DFHack::TILE_NORMAL, DFHack::TileDirection() ); | ||||||
|  | 
 | ||||||
|  |                                 //If no change, skip it (couldn't find a good tile type)
 | ||||||
|  |                                 if ( oldT == newT) continue; | ||||||
|  |                                 //Set new tile type, clear designation
 | ||||||
|  |                                 tiles[tx][ty] = newT; | ||||||
|  |                                 dirty=1; | ||||||
|  |                                 ++count; | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     //If anything was changed, write it all.
 | ||||||
|  |                     if (dirty) | ||||||
|  |                     { | ||||||
|  |                         Mapz->WriteTileTypes(x,y,z, &tiles); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     DF->Detach(); | ||||||
|  |     cout << "Found and changed " << count << " tiles." << endl; | ||||||
|  | #ifndef LINUX_BUILD | ||||||
|  |     cout << "Done. Press any key to continue" << endl; | ||||||
|  |     cin.ignore(); | ||||||
|  | #endif | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue