summaryrefslogtreecommitdiff
path: root/needs_porting/veinswap.cpp
diff options
context:
space:
mode:
authorPetr Mrázek2012-03-01 00:01:24 +0100
committerPetr Mrázek2012-03-01 00:01:24 +0100
commit07b4044336176e8277f3adaa2e03c406e77b6b76 (patch)
tree9019b2ea3ff92b8c77dc464c46d8026d63bbd7ac /needs_porting/veinswap.cpp
parent1f2782d5b86ee62d821ec0c7e33833048fc06b20 (diff)
downloaddfhack-07b4044336176e8277f3adaa2e03c406e77b6b76.tar.gz
dfhack-07b4044336176e8277f3adaa2e03c406e77b6b76.tar.bz2
dfhack-07b4044336176e8277f3adaa2e03c406e77b6b76.tar.xz
Nuke more!
Diffstat (limited to 'needs_porting/veinswap.cpp')
-rw-r--r--needs_porting/veinswap.cpp229
1 files changed, 229 insertions, 0 deletions
diff --git a/needs_porting/veinswap.cpp b/needs_porting/veinswap.cpp
new file mode 100644
index 00000000..66838610
--- /dev/null
+++ b/needs_porting/veinswap.cpp
@@ -0,0 +1,229 @@
+#include <stdlib.h>
+#include <iostream>
+#include <vector>
+#include <map>
+#include <cstdlib>
+#include <limits>
+using namespace std;
+
+#include <conio.h>
+
+#include <DFHack.h>
+#include <DFTileTypes.h>
+#include <extra/MapExtras.h>
+
+
+//Globals
+DFHack::Context *DF;
+DFHack::Maps *maps;
+DFHack::Gui *gui;
+DFHack::Materials *mats;
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+int main (void)
+{
+ int32_t
+ cx,cy,z, //cursor coords
+ tx,ty, //tile coords within block
+ bx,by; //block coords
+ //DFHack::designations40d designations;
+ //DFHack::tiletypes40d tiles;
+ //DFHack::t_temperatures temp1,temp2;
+ uint32_t x_max,y_max,z_max;
+
+ DFHack::ContextManager DFMgr("Memory.xml");
+ try
+ {
+
+ DF=DFMgr.getSingleContext();
+ DF->Attach();
+ maps = DF->getMaps();
+ maps->Start();
+ maps->getSize(x_max,y_max,z_max);
+ gui = DF->getGui();
+ mats = DF->getMaterials();
+ mats->ReadAllMaterials();
+ if(!mats->ReadInorganicMaterials())
+ {
+ printf("Error: Could not load materials!\n");
+ #ifndef LINUX_BUILD
+ cin.ignore();
+ #endif
+ return 1;
+ }
+ }
+ catch (exception& e)
+ {
+ cerr << e.what() << endl;
+ #ifndef LINUX_BUILD
+ cin.ignore();
+ #endif
+ return 1;
+ }
+
+
+
+ bool end = false;
+ cout << "Welcome to the Vein Swap tool.\nType 'help' or ? for a list of available commands, 'q' to quit" << endl;
+ string mode = "";
+ 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!
+
+ //Process user command.
+ switch(ch)
+ {
+ case 'h':
+ case '?':
+ cout << "" << endl
+ << "Commands:" << endl
+ << "p - print vein at cursor" << endl
+ << "m - print all inorganic material types" << endl
+ << "r MatTo - replace the vein at cursor with MatTo" << endl
+ << "R Percent MatFrom MatTo - replace Percent of MatFrom veins with MatTo veins" << endl
+ << "help OR ? - print this list of commands" << endl
+ << "q - quit" << endl
+ << endl
+ << "Usage:\n\t" << endl;
+ break;
+ case 'p':
+ case 10:
+ case 13:
+ case 0:
+ {
+ //Print current cursor
+ mats->ReadAllMaterials();
+
+ if(!maps->Start())
+ {
+ cout << "Can't see any DF map loaded." << endl;
+ break;
+ }
+ if(!gui->getCursorCoords(cx,cy,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=cx%16; ty=cy%16;
+ bx=cx/16; by=cy/16;
+ DFHack::DFCoord xyz(cx,cy,z);
+
+ printf("Cursor[%d,%d,%d] Block(%d,%d) Tile(%d,%d)\n", cx,cy,z, bx,by, tx,ty );
+
+ if(!maps->isValidBlock(bx,by,z))
+ {
+ cout << "Invalid block." << endl;
+ break;
+ }
+
+ vector<DFHack::t_vein> veinVector;
+ int found=0;
+ maps->ReadVeins(bx,by,z,&veinVector);
+ printf("Veins in block (%d):\n",veinVector.size());
+ for(unsigned long i=0;i<veinVector.size();++i){
+ found = veinVector[i].getassignment(tx,ty);
+ printf("\t%c %4d %s\n",
+ (found ? '*' : ' '),
+ veinVector[i].type,
+ mats->inorganic[veinVector[i].type].id
+ );
+ }
+ printf("Cursor is%s in vein.\n", (found?"":" not") );
+
+ maps->Finish();
+ DF->Resume();
+ }
+ break;
+ case 'v':
+ break;
+ case 'm':
+ break;
+ case 'R':
+ break;
+ case 'q':
+ end = true;
+ cout << "Bye!" << endl;
+ break;
+ case 'r':
+ DF->Suspend();
+ do{
+ //Process parameters
+ long matto = atol( command.c_str()+1 );
+ if( matto < 0 || matto >= (long)mats->inorganic.size() ){
+ cout << "Invalid material: " << matto << endl;
+ break;
+ }
+
+ if(!maps->Start())
+ {
+ cout << "Can't see any DF map loaded." << endl;
+ break;
+ }
+ if(!gui->getCursorCoords(cx,cy,z))
+ {
+ cout << "Can't get cursor coords! Make sure you have a cursor active in DF." << endl;
+ break;
+ }
+ tx=cx%16; ty=cy%16;
+ bx=cx/16; by=cy/16;
+ printf("Cursor[%d,%d,%d] Block(%d,%d) Tile(%d,%d)\n", cx,cy,z, bx,by, tx,ty );
+
+ if(!maps->isValidBlock(bx,by,z))
+ {
+ cout << "Invalid block." << endl;
+ break;
+ }
+
+ //MapExtras::MapCache MC(maps);
+ //MapExtras::Block B(maps,DFHack::DFCoord(bx,by,z));
+
+ vector<DFHack::t_vein> veinVector;
+ int v=-1; //the vector pointed to by the cursor
+
+ mats->ReadAllMaterials();
+
+ maps->ReadVeins(bx,by,z,&veinVector);
+ for(unsigned long i=0 ; v<0 && i<veinVector.size() ; ++i){
+ if( veinVector[i].getassignment(tx,ty) )
+ v=i;
+ }
+ printf("Replacing %d %s with %d %s...\n", veinVector[v].type, mats->inorganic[veinVector[v].type].id, matto, mats->inorganic[matto].id );
+printf("%X\n",veinVector[v].vtable);
+ vector<DFHack::t_vein> veinTable;
+
+ veinVector[v].type = matto;
+ maps->WriteVein( &veinVector[v] );
+
+
+ maps->Finish();
+
+ cout << endl << "Finished." << endl;
+ }while(0);
+ DF->Resume();
+ break;
+ default:
+ cout << "Unknown command: " << command << endl;
+ }//end switch
+
+ }//end while
+
+ DF->Detach();
+ //#ifndef LINUX_BUILD
+ //cout << "Done. Press any key to continue" << endl;
+ //cin.ignore();
+ //#endif
+ return 0;
+}