int main(int argc, char *argv[]) { bool temporary_terminal = TemporaryTerminal(); uint32_t x_max = 0, y_max = 0, z_max = 0; DFHack::ContextManager manager("Memory.xml"); DFHack::Context *context = manager.getSingleContext(); if (!context->Attach()) { std::cerr << "Unable to attach to DF!" << std::endl; if(temporary_terminal) std::cin.ignore(); return 1; } DFHack::Maps *maps = context->getMaps(); if (!maps->Start()) { std::cerr << "Cannot get map info!" << std::endl; context->Detach(); if(temporary_terminal) std::cin.ignore(); return 1; } maps->getSize(x_max, y_max, z_max); MapExtras::MapCache map(maps); for(uint32_t z = 0; z < z_max; z++) { for(uint32_t b_y = 0; b_y < y_max; b_y++) { for(uint32_t b_x = 0; b_x < x_max; b_x++) { // Get the map block DFHack::DFCoord blockCoord(b_x, b_y); MapExtras::Block *b = map.BlockAt(DFHack::DFCoord(b_x, b_y, z)); if (!b || !b->valid) { continue; } DFHack::t_blockflags flags = b->BlockFlags(); flags.whole = flags.whole ^ 0xFFFFFFFF; b->setBlockFlags(flags); b->Write(); } // block x } // block y } // z maps->Finish(); context->Detach(); return 0; }
int main(int argc, char** argv) { if(argc < 2) { ::std::cout << "gimme a file!" << ::std::endl; return 1; } ::std::ifstream map_in(argv[1]); ::std::vector< ::std::string > dig_map; while (map_in.good() && !map_in.eof() && !map_in.bad()) { ::std::string line; map_in >> line; dig_map.push_back(line); } dig_map.resize(dig_map.size() - 1); DFHack::ContextManager DFMgr("Memory.xml"); DFHack::Context * DF = DFMgr.getSingleContext(); try { DF->Attach(); } catch (::std::exception& e) { ::std::cerr << e.what() << ::std::endl; #ifndef LINUX_BUILD ::std::cin.ignore(); #endif return 1; } DFHack::Maps *layers = DF->getMaps(); if (layers && layers->Start()) { dig(layers, DF->getGui(), dig_map, true); ::std::cout << "Finished digging" << ::std::endl; layers->Finish(); if (!DF->Detach()) { ::std::cerr << "Unable to detach DF process" << ::std::endl; } } else { ::std::cerr << "Unable to init map" << ::std::endl; } #ifndef LINUX_BUILD ::std::cout << "Done. Press any key to continue" << ::std::endl; ::std::cin.ignore(); #endif return 0; }
command_result df_tiles (Core * c, vector <string> & parameters) { int32_t x,y,z; uint32_t x_max,y_max,z_max; DFHack::Maps * Maps; DFHack::Gui * Position; Brush * brush = new RectangleBrush(1,1); Maps = c->getMaps(); Maps->Start(); Maps->getSize(x_max,y_max,z_max); Position = c->getGui(); string command = ""; if(command=="help" || command == "?") { c->con.print ( "Usage: This command sets the properties of the tile painter brush\n" " It is best used from the console, or as an alias bound to a hotkey\n" " After setting the brush\n" "\n" "Modes:\n" "none - nothing, the default" "magma [0-7] - magma, accepts depth\n" "water [0-7] - water\n" "obsidian - obsidian wall\n" "obsfloor - obsidian floors\n" "obsramp - obsidian ramp (forces 1 z-level brush)\n" "riversource - an endless source of water (floor tile)\n" "type ### - plain tiletype painter. For a list of tile types see:\n" " http://df.magmawiki.com/index.php/DF2010:Tile_types_in_DF_memory\n" "\n" "Set-Modes (only for magma/water):\n" "add - set liquid level everywhere\n" "keep - set liquid level only where liquids are already present\n" "\n" "Brush:\n" "point - single tile [p]\n" "#x#[x#] - block with cursor at bottom north-west [r]\n" " (any place, any size)\n" " Example:" " 3x3x2 = rectangle 3x3 x2 z-levels\n" " The z-level part is optional - ommiting it is\n" " the same as setting it to 1.\n" "h#x#[x#] - Same as previous, only the rectangle is 'hollow'.\n" "block - DF map block with cursor in it\n" " (regular spaced 16x16x1 blocks)\n" "column - Column from cursor, up through free space\n" "line - A line between two points.\n" "circle [#] - A filled circle, optional # specifies radius in tiles.\n" "hcircle [#,#] - A hollow circle (ring). First # specifies radius\n" " second # ring thickness in tiles.\n" "\n" "Other:\n" "help or ? - print this list of commands\n" "paint - same effect as if you also the 'paint' command at the same time.\n" "\n" ); } else if(command == "m") { mode = "magma"; } else if(command == "o") { mode = "obsidian"; } else if(command == "of") { mode = "obsidian_floor"; } else if(command == "w") { mode = "water"; } else if(command == "f") { mode = "flowbits"; } else if(command == "rs") { mode = "riversource"; } else if(command == "point" || command == "p") { delete brush; brushname = "point"; brush = new RectangleBrush(1,1); } else if(command == "range" || command == "r") { cout << " :set range width<" << width << "># "; getline(cin, command); width = command == "" ? width : atoi (command.c_str()); if(width < 1) width = 1; cout << " :set range height<" << height << "># "; getline(cin, command); height = command == "" ? height : atoi (command.c_str()); if(height < 1) height = 1; cout << " :set range z-levels<" << z_levels << "># "; getline(cin, command); z_levels = command == "" ? z_levels : atoi (command.c_str()); if(z_levels < 1) z_levels = 1; delete brush; if(width == 1 && height == 1 && z_levels == 1) { brushname="point"; } else { brushname = "range"; } brush = new RectangleBrush(width,height,z_levels,0,0,0); } else if(command == "block") { delete brush; brushname = "block"; brush = new BlockBrush(); } else if(command == "column") { delete brush; brushname = "column"; brush = new ColumnBrush(); } else if(command == "q") { end = true; } else if(command == "f+") { flowmode = "f+"; } else if(command == "f-") { flowmode = "f-"; } else if(command == "f.") { flowmode = "f."; } else if(command == "s+") { setmode = "s+"; } else if(command == "s-") { setmode = "s-"; } else if(command == "s.") { setmode = "s."; } // blah blah, bad code, bite me. else if(command == "0") amount = 0; else if(command == "1") amount = 1; else if(command == "2") amount = 2; else if(command == "3") amount = 3; else if(command == "4") amount = 4; else if(command == "5") amount = 5; else if(command == "6") amount = 6; else if(command == "7") amount = 7; else if(command.empty()) { DF->Suspend(); do { if(!Maps->Start()) { cout << "Can't see any DF map loaded." << endl; break; } if(!Position->getCursorCoords(x,y,z)) { cout << "Can't get cursor coords! Make sure you have a cursor active in DF." << endl; break; } cout << "cursor coords: " << x << "/" << y << "/" << z << endl; MapCache mcache(Maps); DFHack::DFCoord cursor(x,y,z); coord_vec all_tiles = brush->points(mcache,cursor); cout << "working..." << endl; if(mode == "obsidian") { coord_vec::iterator iter = all_tiles.begin(); while (iter != all_tiles.end()) { mcache.setTiletypeAt(*iter, 331); mcache.setTemp1At(*iter,10015); mcache.setTemp2At(*iter,10015); DFHack::t_designation des = mcache.designationAt(*iter); des.bits.flow_size = 0; mcache.setDesignationAt(*iter, des); iter ++; } } if(mode == "obsidian_floor") { coord_vec::iterator iter = all_tiles.begin(); while (iter != all_tiles.end()) { mcache.setTiletypeAt(*iter, 340); iter ++; } } else if(mode == "riversource") { set <Block *> seen_blocks; coord_vec::iterator iter = all_tiles.begin(); while (iter != all_tiles.end()) { mcache.setTiletypeAt(*iter, 90); DFHack::t_designation a = mcache.designationAt(*iter); a.bits.liquid_type = DFHack::liquid_water; a.bits.liquid_static = false; a.bits.flow_size = 7; mcache.setTemp1At(*iter,10015); mcache.setTemp2At(*iter,10015); mcache.setDesignationAt(*iter,a); Block * b = mcache.BlockAt((*iter)/16); DFHack::t_blockflags bf = b->BlockFlags(); bf.bits.liquid_1 = true; bf.bits.liquid_2 = true; b->setBlockFlags(bf); iter++; } } else if(mode== "magma" || mode== "water" || mode == "flowbits") { set <Block *> seen_blocks; coord_vec::iterator iter = all_tiles.begin(); while (iter != all_tiles.end()) { DFHack::DFCoord current = *iter; DFHack::t_designation des = mcache.designationAt(current); uint16_t tt = mcache.tiletypeAt(current); DFHack::naked_designation & flow = des.bits; // don't put liquids into places where they don't belong... if(!DFHack::FlowPassable(tt)) { iter++; continue; } if(mode != "flowbits") { if(setmode == "s.") { flow.flow_size = amount; } else if(setmode == "s+") { if(flow.flow_size < amount) flow.flow_size = amount; } else if(setmode == "s-") { if (flow.flow_size > amount) flow.flow_size = amount; } if(amount != 0 && mode == "magma") { flow.liquid_type = DFHack::liquid_magma; mcache.setTemp1At(current,12000); mcache.setTemp2At(current,12000); } else if(amount != 0 && mode == "water") { flow.liquid_type = DFHack::liquid_water; mcache.setTemp1At(current,10015); mcache.setTemp2At(current,10015); } else if(amount == 0 && (mode == "water" || mode == "magma")) { // reset temperature to sane default mcache.setTemp1At(current,10015); mcache.setTemp2At(current,10015); } mcache.setDesignationAt(current,des); } seen_blocks.insert(mcache.BlockAt((*iter) / 16)); iter++; } set <Block *>::iterator biter = seen_blocks.begin(); while (biter != seen_blocks.end()) { DFHack::t_blockflags bflags = (*biter)->BlockFlags(); if(flowmode == "f+") { bflags.bits.liquid_1 = true; bflags.bits.liquid_2 = true; (*biter)->setBlockFlags(bflags); } else if(flowmode == "f-") { bflags.bits.liquid_1 = false; bflags.bits.liquid_2 = false; (*biter)->setBlockFlags(bflags); } else { cout << "flow bit 1 = " << bflags.bits.liquid_1 << endl; cout << "flow bit 2 = " << bflags.bits.liquid_2 << endl; } biter ++; } } if(mcache.WriteAll()) cout << "OK" << endl; else cout << "Something failed horribly! RUN!" << endl; Maps->Finish(); } while (0); } else { cout << command << " : unknown command." << endl; } return CR_OK; }
DFhackCExport command_result df_liquids (Core * c, vector <string> & parameters) { int32_t x,y,z; uint32_t x_max,y_max,z_max; DFHack::Maps * Maps; DFHack::Gui * Position; for(int i = 0; i < parameters.size();i++) { if(parameters[i] == "help" || parameters[i] == "?") { c->con.print("This tool allows placing magma, water and other similar things.\n" "It is interactive and further help is available when you run it.\n" ); return CR_OK; } } Brush * brush = new RectangleBrush(1,1); string brushname = "point"; bool end = false; c->con << "Welcome to the liquid spawner.\nType 'help' or '?' for a list of available commands, 'q' to quit.\nPress return after a command to confirm." << std::endl; string mode="magma"; string flowmode="f+"; string setmode ="s."; unsigned int amount = 7; int width = 1, height = 1, z_levels = 1; while(!end) { string command = ""; std::stringstream str; str <<"[" << mode << ":" << brushname << ":" << amount << ":" << flowmode << ":" << setmode << "]#"; if(c->con.lineedit(str.str(),command,liquids_hist) == -1) return CR_FAILURE; if(command=="help" || command == "?") { c->con << "Modes:" << endl << "m - switch to magma" << endl << "w - switch to water" << endl << "o - make obsidian wall instead" << endl << "of - make obsidian floors" << endl << "rs - make a river source" << endl << "f - flow bits only" << endl << "Set-Modes (only for magma/water):" << endl << "s+ - only add" << endl << "s. - set" << endl << "s- - only remove" << endl << "Properties (only for magma/water):" << endl << "f+ - make the spawned liquid flow" << endl << "f. - don't change flow state (read state in flow mode)" << endl << "f- - make the spawned liquid static" << endl << "0-7 - set liquid amount" << endl << "Brush:" << endl << "point - single tile [p]" << endl << "range - block with cursor at bottom north-west [r]" << endl << " (any place, any size)" << endl << "block - DF map block with cursor in it" << endl << " (regular spaced 16x16x1 blocks)" << endl << "column - Column from cursor, up through free space" << endl << "Other:" << endl << "q - quit" << endl << "help or ? - print this list of commands" << endl << "empty line - put liquid" << endl << endl << "Usage: point the DF cursor at a tile you want to modify" << endl << "and use the commands available :)" << endl; } else if(command == "m") { mode = "magma"; } else if(command == "o") { mode = "obsidian"; } else if(command == "of") { mode = "obsidian_floor"; } else if(command == "w") { mode = "water"; } else if(command == "f") { mode = "flowbits"; } else if(command == "rs") { mode = "riversource"; } else if(command == "point" || command == "p") { delete brush; brushname = "point"; brush = new RectangleBrush(1,1); } else if(command == "range" || command == "r") { std::stringstream str; CommandHistory range_hist; str << " :set range width<" << width << "># "; c->con.lineedit(str.str(),command,range_hist); range_hist.add(command); width = command == "" ? width : atoi (command.c_str()); if(width < 1) width = 1; str.str(""); str << " :set range height<" << height << "># "; c->con.lineedit(str.str(),command,range_hist); range_hist.add(command); height = command == "" ? height : atoi (command.c_str()); if(height < 1) height = 1; str.str(""); str << " :set range z-levels<" << z_levels << "># "; c->con.lineedit(str.str(),command,range_hist); range_hist.add(command); z_levels = command == "" ? z_levels : atoi (command.c_str()); if(z_levels < 1) z_levels = 1; delete brush; if(width == 1 && height == 1 && z_levels == 1) { brushname="point"; } else { brushname = "range"; } brush = new RectangleBrush(width,height,z_levels,0,0,0); } else if(command == "block") { delete brush; brushname = "block"; brush = new BlockBrush(); } else if(command == "column") { delete brush; brushname = "column"; brush = new ColumnBrush(); } else if(command == "q") { end = true; } else if(command == "f+") { flowmode = "f+"; } else if(command == "f-") { flowmode = "f-"; } else if(command == "f.") { flowmode = "f."; } else if(command == "s+") { setmode = "s+"; } else if(command == "s-") { setmode = "s-"; } else if(command == "s.") { setmode = "s."; } // blah blah, bad code, bite me. else if(command == "0") amount = 0; else if(command == "1") amount = 1; else if(command == "2") amount = 2; else if(command == "3") amount = 3; else if(command == "4") amount = 4; else if(command == "5") amount = 5; else if(command == "6") amount = 6; else if(command == "7") amount = 7; else if(command.empty()) { c->Suspend(); Maps = c->getMaps(); Maps->Start(); Maps->getSize(x_max,y_max,z_max); Position = c->getGui(); do { if(!Maps->Start()) { c->con << "Can't see any DF map loaded." << endl; break; } if(!Position->getCursorCoords(x,y,z)) { c->con << "Can't get cursor coords! Make sure you have a cursor active in DF." << endl; break; } c->con << "cursor coords: " << x << "/" << y << "/" << z << endl; MapCache mcache(Maps); DFHack::DFCoord cursor(x,y,z); coord_vec all_tiles = brush->points(mcache,cursor); c->con << "working..." << endl; if(mode == "obsidian") { coord_vec::iterator iter = all_tiles.begin(); while (iter != all_tiles.end()) { mcache.setTiletypeAt(*iter, 331); mcache.setTemp1At(*iter,10015); mcache.setTemp2At(*iter,10015); DFHack::t_designation des = mcache.designationAt(*iter); des.bits.flow_size = 0; mcache.setDesignationAt(*iter, des); iter ++; } } if(mode == "obsidian_floor") { coord_vec::iterator iter = all_tiles.begin(); while (iter != all_tiles.end()) { mcache.setTiletypeAt(*iter, 340); iter ++; } } else if(mode == "riversource") { set <Block *> seen_blocks; coord_vec::iterator iter = all_tiles.begin(); while (iter != all_tiles.end()) { mcache.setTiletypeAt(*iter, 90); DFHack::t_designation a = mcache.designationAt(*iter); a.bits.liquid_type = DFHack::liquid_water; a.bits.liquid_static = false; a.bits.flow_size = 7; mcache.setTemp1At(*iter,10015); mcache.setTemp2At(*iter,10015); mcache.setDesignationAt(*iter,a); Block * b = mcache.BlockAt((*iter)/16); DFHack::t_blockflags bf = b->BlockFlags(); bf.bits.liquid_1 = true; bf.bits.liquid_2 = true; b->setBlockFlags(bf); iter++; } } else if(mode== "magma" || mode== "water" || mode == "flowbits") { set <Block *> seen_blocks; coord_vec::iterator iter = all_tiles.begin(); while (iter != all_tiles.end()) { DFHack::DFCoord current = *iter; DFHack::t_designation des = mcache.designationAt(current); uint16_t tt = mcache.tiletypeAt(current); DFHack::naked_designation & flow = des.bits; // don't put liquids into places where they don't belong... if(!DFHack::FlowPassable(tt)) { iter++; continue; } if(mode != "flowbits") { if(setmode == "s.") { flow.flow_size = amount; } else if(setmode == "s+") { if(flow.flow_size < amount) flow.flow_size = amount; } else if(setmode == "s-") { if (flow.flow_size > amount) flow.flow_size = amount; } if(amount != 0 && mode == "magma") { flow.liquid_type = DFHack::liquid_magma; mcache.setTemp1At(current,12000); mcache.setTemp2At(current,12000); } else if(amount != 0 && mode == "water") { flow.liquid_type = DFHack::liquid_water; mcache.setTemp1At(current,10015); mcache.setTemp2At(current,10015); } else if(amount == 0 && (mode == "water" || mode == "magma")) { // reset temperature to sane default mcache.setTemp1At(current,10015); mcache.setTemp2At(current,10015); } mcache.setDesignationAt(current,des); } seen_blocks.insert(mcache.BlockAt((*iter) / 16)); iter++; } set <Block *>::iterator biter = seen_blocks.begin(); while (biter != seen_blocks.end()) { DFHack::t_blockflags bflags = (*biter)->BlockFlags(); if(flowmode == "f+") { bflags.bits.liquid_1 = true; bflags.bits.liquid_2 = true; (*biter)->setBlockFlags(bflags); } else if(flowmode == "f-") { bflags.bits.liquid_1 = false; bflags.bits.liquid_2 = false; (*biter)->setBlockFlags(bflags); } else { c->con << "flow bit 1 = " << bflags.bits.liquid_1 << endl; c->con << "flow bit 2 = " << bflags.bits.liquid_2 << endl; } biter ++; } } if(mcache.WriteAll()) c->con << "OK" << endl; else c->con << "Something failed horribly! RUN!" << endl; Maps->Finish(); } while (0); c->Resume(); } else { c->con << command << " : unknown command." << endl; } } return CR_OK; }
int main (void) { int32_t x,y,z,tx,ty; //DFHack::designations40d designations; DFHack::tiletypes40d tiles; //DFHack::t_temperatures temp1,temp2; uint32_t x_max,y_max,z_max; int32_t oldT, newT; int count, dirty; //Brush defaults DFHack::TileShape BrushClass = DFHack::WALL; DFHack::TileMaterial BrushMat = DFHack::tilematerial_invalid; int BrushType = -1; DFHack::ContextManager DFMgr("Memory.xml"); DFHack::Context *DF; DFHack::Maps * Maps; DFHack::Gui * Gui; try { DF=DFMgr.getSingleContext(); DF->Attach(); Maps = DF->getMaps(); Maps->Start(); Maps->getSize(x_max,y_max,z_max); Gui = DF->getGui(); } catch (exception& e) { cerr << e.what() << endl; #ifndef LINUX_BUILD cin.ignore(); #endif return 1; } bool end = false; cout << "Welcome to the Tile Drawing tool.\nType 'help' or ? for a list of available commands, 'q' to quit" << endl; string mode = "wall"; string command = ""; while(!end) { DF->Resume(); cout << endl << ":"; getline(cin, command); int ch = command[0]; if(command.length()<=0) ch=0; if( ((int)command.find("help")) >=0 ) ch='?'; //under windows, find was casting unsigned! switch(ch) { case '?': cout << "Modes:" << endl << "O - draw Open Space" << endl << "M - draw material only (shape unchanged)" << endl << "m number - use Material value entered" << endl << "r - use Rock/stone material" << endl << "l - use Soil material" << endl << "v - use Vein material" << endl << "H - draw tile shape only (material unchanged)" << endl << "h number - draw Tile Shape value entered" << endl << "w - draw Wall tiles" << endl << "f - draw Floor tiles" << endl << "t number - draw exact tile type entered" << endl << "Commands:" << endl << "p - print tile shapes and materials, and current brush" << endl << "P - print all tile types" << endl << "q - quit" << endl << "help OR ? - print this list of commands" << endl << "d - being drawing" << endl << endl << "Usage:\nChoose a mode (default is walls), then enter 'd' to being drawing.\nMove the cursor in DF wherever you want to draw.\nPress any key to pause drawing." << endl; break; case 'p': //Classes printf("\nTile Type Classes:\n"); for(int i=0;i<DFHack::tileshape_count;++i) { printf("%4i ; %s\n", i, DFHack::TileShapeString[i] ,0 ); } //Materials printf("\nTile Type Materials:\n"); for(int i=0;i<DFHack::tilematerial_count;++i) { printf("%4i ; %s\n", i, DFHack::TileMaterialString[i] ,0 ); } //fall through... case 10: case 13: case 0: //Print current cursor & brush settings. cout << "\nCurrent Brush:\n"; cout << "tile = "; if(BrushClass<0) cout<<"(not drawing)"; else cout<<DFHack::TileShapeString[BrushClass]; cout << endl; cout << "mat = "; if(BrushMat<0) cout<<"(not drawing)"; else cout<<DFHack::TileMaterialString[BrushMat]; cout << endl; cout << "type = "; if(BrushType<0){ cout<<"(not drawing)"; }else{ printtiletype(BrushType); } break; case 'P': cout << "\nAll Valid Tile Types:\n"; for(int i=0;i<TILE_TYPE_ARRAY_LENGTH;++i) { if( DFHack::tileTypeTable[i].name ) printtiletype(i); } case 'w': BrushType=-1; BrushClass = DFHack::WALL; cout << "Tile brush shape set to Wall." << endl; break; case 'f': BrushType=-1; BrushClass = DFHack::FLOOR; cout << "Tile brush shape set to Floor." << endl; break; case 'h': BrushType=-1; BrushClass = (DFHack::TileShape)atol( command.c_str()+1 ); cout << "Tile brush shape set to " << BrushClass << endl; break; case 'M': BrushClass = DFHack::tileshape_invalid; cout << "Tile brush will not draw tile shape." << endl; break; case 'r': BrushType=-1; BrushMat = DFHack::STONE; cout << "Tile brush material set to Rock." << endl; break; case 'l': BrushType=-1; BrushMat = DFHack::SOIL; cout << "Tile brush material set to Soil." << endl; break; case 'v': BrushType=-1; BrushMat = DFHack::VEIN; cout << "Tile brush material set to Vein." << endl; break; case 'm': BrushType=-1; BrushMat = (DFHack::TileMaterial)atol( command.c_str()+1 ); cout << "Tile brush material set to " << BrushMat << endl; break; case 'H': BrushMat = DFHack::tilematerial_invalid; cout << "Tile brush will not draw material." << endl; break; case 'O': BrushType=-1; BrushClass = DFHack::EMPTY; BrushMat = DFHack::AIR; cout << "Tile brush will draw Open Space." << endl; break; case 't': BrushClass = DFHack::tileshape_invalid ; BrushMat = DFHack::tilematerial_invalid; BrushType = atol( command.c_str()+1 ); cout << "Tile brush type set to:" << endl; printtiletype(BrushType); break; case 'q': end = true; cout << "Bye!" << endl; break; case 'd': { count=0; cout << "Beginning to draw at cursor." << endl << "Press any key to stop drawing." << endl; //DF->Suspend(); kbhit(); //throw away, just to be sure. for(;;) { if(!Maps->Start()) { cout << "Can't see any DF map loaded." << endl; break; } if(!Gui->getCursorCoords(x,y,z)) { cout << "Can't get cursor coords! Make sure you have a cursor active in DF." << endl; break; } //cout << "cursor coords: " << x << "/" << y << "/" << z << endl; tx=x%16; ty=y%16; if(!Maps->isValidBlock(x/16,y/16,z)) { cout << "Invalid block." << endl; break; } //Read the tiles. dirty=0; Maps->ReadTileTypes((x/16),(y/16),z, &tiles); oldT = tiles[tx][ty]; newT = -1; if( 0<BrushType ){ //Explicit tile type set. Trust the user. newT = BrushType; }else if( 0==BrushMat && 0==BrushClass ){ //Special case, Empty Air. newT = 32; }else if( BrushMat>=0 && BrushClass>=0 && ( BrushClass != DFHack::tileTypeTable[oldT].shape || BrushMat != DFHack::tileTypeTable[oldT].material) ){ //Set tile material and class newT = DFHack::findTileType(BrushClass,BrushMat, DFHack::tileTypeTable[oldT].variant , DFHack::tileTypeTable[oldT].special , DFHack::tileTypeTable[oldT].direction ); if(newT<0) newT = DFHack::findTileType(BrushClass,BrushMat, DFHack::tilevariant_invalid, DFHack::tileTypeTable[oldT].special , DFHack::tileTypeTable[oldT].direction ); if(newT<0) newT = DFHack::findTileType(BrushClass,BrushMat, DFHack::tilevariant_invalid , DFHack::tileTypeTable[oldT].special , (uint32_t)0 ); }else if( BrushMat<0 && BrushClass>=0 && BrushClass != DFHack::tileTypeTable[oldT].shape ){ //Set current tile class only, as accurately as can be expected newT = DFHack::findSimilarTileType(oldT,BrushClass); }else if( BrushClass<0 && BrushMat>=0 && BrushMat != DFHack::tileTypeTable[oldT].material ){ //Set current tile material only newT = DFHack::findTileType(DFHack::tileTypeTable[oldT].shape,BrushMat, DFHack::tileTypeTable[oldT].variant , DFHack::tileTypeTable[oldT].special , DFHack::tileTypeTable[oldT].direction ); if(newT<0) newT = DFHack::findTileType(DFHack::tileTypeTable[oldT].shape,BrushMat, DFHack::tilevariant_invalid , DFHack::tileTypeTable[oldT].special , DFHack::tileTypeTable[oldT].direction ); if(newT<0) newT = DFHack::findTileType(DFHack::tileTypeTable[oldT].shape,BrushMat, DFHack::tilevariant_invalid , DFHack::tileTypeTable[oldT].special , (uint32_t)0 ); } //If no change, skip it (couldn't find a good tile type, or already what we want) if ( newT > 0 && oldT != newT ){ //Set new tile type tiles[tx][ty] = newT; dirty=-1; } //If anything was changed, write it all. if (dirty) { //Maps->WriteDesignations(x/16,y/16,z/16, &designations); Maps->WriteTileTypes(x/16,y/16,z, &tiles); printf("(%4d,%4d,%4d)",x,y,z); ++count; } Maps->Finish(); Sleep(10); if( kbhit() ) break; } cin.clear(); cout << endl << count << " tiles were drawn." << endl << "Drawing halted. Entering command mode." << endl; } continue; break; default: cout << "Unknown command: " << command << endl; } } DF->Detach(); #ifndef LINUX_BUILD cout << "Done. Press any key to continue" << endl; cin.ignore(); #endif return 0; }
/** * Book of Immolations, chapter 1, verse 35: * Armok emerged from the hellish depths and beheld the sunny realms for the first time. * And he cursed the plants and trees for their bloodless wood, turning them into ash and smoldering ruin. * Armok was pleased and great temples were built by the dwarves, for they shared his hatred for trees and plants. */ static command_result immolations (Core * c, do_what what, bool shrubs, bool trees, bool help) { static const char * what1 = "destroys"; static const char * what2 = "burns"; if(help) { c->con.print("Without any options, this command %s a plant under the cursor.\n" "Options:\n" "shrubs - affect all shrubs\n" "trees - affect all trees\n" "all - affect all plants\n", what == do_immolate? what2 : what1 ); return CR_OK; } c->Suspend(); DFHack::Maps *maps = c->getMaps(); if (!maps->Start()) { c->con.printerr( "Cannot get map info!\n"); c->Resume(); return CR_FAILURE; } DFHack::Gui * Gui = c->getGui(); uint32_t x_max, y_max, z_max; maps->getSize(x_max, y_max, z_max); MapExtras::MapCache map(maps); DFHack::Vegetation *veg = c->getVegetation(); if (!veg->all_plants) { std::cerr << "Unable to read vegetation!" << std::endl; return CR_FAILURE; } if(shrubs || trees) { int destroyed = 0; for(size_t i = 0 ; i < veg->all_plants->size(); i++) { DFHack::df_plant *p = veg->all_plants->at(i); if(shrubs && p->is_shrub || trees && !p->is_shrub) { if (what == do_immolate) p->is_burning = true; p->hitpoints = 0; destroyed ++; } } c->con.print("Praise Armok!\n"); } else { int32_t x,y,z; if(Gui->getCursorCoords(x,y,z)) { vector<DFHack::df_plant *> * alltrees; if(maps->ReadVegetation(x/16,y/16,z,alltrees)) { bool didit = false; for(size_t i = 0 ; i < alltrees->size(); i++) { DFHack::df_plant * tree = alltrees->at(i); if(tree->x == x && tree->y == y && tree->z == z) { if(what == do_immolate) tree->is_burning = true; tree->hitpoints = 0; didit = true; break; } } /* if(!didit) { cout << "----==== There's NOTHING there! ====----" << endl; } */ } } else { c->con.printerr("No mass destruction and no cursor...\n" ); } } // Cleanup veg->Finish(); maps->Finish(); c->Resume(); return CR_OK; }
DFhackCExport command_result df_grow (Core * c, vector <string> & parameters) { for(int i = 0; i < parameters.size();i++) { if(parameters[i] == "help" || parameters[i] == "?") { c->con.print("This command turns all living saplings into full-grown trees.\n"); return CR_OK; } } c->Suspend(); DFHack::Maps *maps = c->getMaps(); Console & con = c->con; if (!maps->Start()) { con.printerr("Cannot get map info!\n"); c->Resume(); return CR_FAILURE; } //maps->getSize(x_max, y_max, z_max); MapExtras::MapCache map(maps); DFHack::Vegetation *veg = c->getVegetation(); if (!veg->all_plants) { con.printerr("Unable to read vegetation!\n"); c->Resume(); return CR_FAILURE; } DFHack::Gui *Gui = c->getGui(); int32_t x,y,z; if(Gui->getCursorCoords(x,y,z)) { vector<DFHack::df_plant *> * alltrees; if(maps->ReadVegetation(x/16,y/16,z,alltrees)) { for(size_t i = 0 ; i < alltrees->size(); i++) { DFHack::df_plant * tree = alltrees->at(i); if(tree->x == x && tree->y == y && tree->z == z) { if(DFHack::tileShape(map.tiletypeAt(DFHack::DFCoord(x,y,z))) == DFHack::SAPLING_OK) { tree->grow_counter = DFHack::sapling_to_tree_threshold; } break; } } } } else { int grown = 0; for(size_t i = 0 ; i < veg->all_plants->size(); i++) { DFHack::df_plant *p = veg->all_plants->at(i); uint16_t ttype = map.tiletypeAt(DFHack::DFCoord(p->x,p->y,p->z)); if(!p->is_shrub && DFHack::tileShape(ttype) == DFHack::SAPLING_OK) { p->grow_counter = DFHack::sapling_to_tree_threshold; } } } // Cleanup veg->Finish(); maps->Finish(); c->Resume(); return CR_OK; }