-WriteVein(), and some convenience functions for the vein bitmaps.

develop
zilpin 2011-07-18 15:55:41 -04:00
parent de24b01a69
commit 4eb13800cd
3 changed files with 270 additions and 2 deletions

@ -120,6 +120,7 @@ namespace DFHack
uint32_t origin;
};
/**
* mineral vein object - bitmap with a material type
* \ingroup grp_maps
@ -135,6 +136,26 @@ namespace DFHack
uint32_t flags;
/// this is NOT part of the DF vein, but an address of the vein as seen by DFhack.
uint32_t address_of;
//zilpin: Functions to more conveniently check the assignment flags of the vein.
//Coordinates are given in tile within the block.
//Important to make these inline.
inline int getassignment( DFCoord xy ){
return getassignment(xy.x,xy.y);
}
inline int getassignment( int x, int y ){
return (assignment[y] & (1 << x));
}
inline void setassignment( DFCoord xy, int bit ){
return setassignment(xy.x,xy.y, bit);
}
inline void setassignment( int x, int y, int bit ){
if(bit)
assignment[y] |= (1 << x);
else
assignment[y] &= 0xFFFF ^ (1 << x);
}
};
/**
@ -652,6 +673,9 @@ namespace DFHack
std::vector<t_grassvein>* grass = 0,
std::vector<t_worldconstruction>* constructions = 0
);
/// write a single vein back to the address it was retreived from
bool Maps::WriteVein(t_vein *vein);
/// read all plants in this block
bool ReadVegetation(uint32_t x, uint32_t y, uint32_t z, std::vector<dfh_plant>* plants);
private:

@ -1043,6 +1043,26 @@ bool Maps::ReadVeins(uint32_t x, uint32_t y, uint32_t z, vector <t_vein>* veins,
return true;
}
/*
Write the vein retreived using ReadVeins back to the address it was taken from.
*/
bool Maps::WriteVein(t_vein *vein)
{
if(!vein) return false;
Process* p = d->owner;
//Write each part individually.
p->writeDWord(vein->address_of + 4 , vein->type );
p->write( vein->address_of + 8 , 32 , (uint8_t *)vein->assignment );
p->writeDWord(vein->address_of + 40 , vein->flags );
return true;
}
#include<stdio.h>
/*
__int16 __userpurge GetGeologicalRegion<ax>(__int16 block_X<cx>, int X<ebx>, __int16 block_Y<di>, int block_addr<esi>, int Y)
{

@ -1,5 +1,229 @@
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <map>
#include <cstdlib>
#include <limits>
using namespace std;
int main (int numargs, const char ** args)
#include <conio.h>
#include <DFHack.h>
#include <dfhack/DFTileTypes.h>
#include <dfhack/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;
}