Added 'dirty' bit of a block to veinlook, API.

develop
Petr Mrázek 2010-02-20 12:58:52 +01:00
parent 88cb312a65
commit 26568fe5ea
4 changed files with 56 additions and 6 deletions

@ -13,6 +13,7 @@ using namespace std;
#include <DFHackAPI.h> #include <DFHackAPI.h>
#include <DFProcess.h> #include <DFProcess.h>
using namespace DFHack; using namespace DFHack;
#include <sstream>
#include <curses.h> #include <curses.h>
#include <stdlib.h> #include <stdlib.h>
#include <signal.h> #include <signal.h>
@ -200,9 +201,9 @@ void hexdump (DFHack::API& DF, uint32_t address, uint32_t length, int filenum)
char *buf = new char[reallength]; char *buf = new char[reallength];
ofstream myfile; ofstream myfile;
string name = "hexdump"; stringstream ss;
name += filenum; ss << "hexdump" << filenum << ".txt";
name+= ".txt"; string name = ss.str();
myfile.open (name.c_str()); myfile.open (name.c_str());
@ -328,14 +329,17 @@ main(int argc, char *argv[])
bool dig = false; bool dig = false;
bool dump = false; bool dump = false;
bool digbit = false;
int vein = 0; int vein = 0;
int filenum = 0; int filenum = 0;
uint32_t blockflags = 0;
uint32_t blockaddr = 0; uint32_t blockaddr = 0;
// walk the map! // walk the map!
for (;;) for (;;)
{ {
dig = false; dig = false;
dump = false; dump = false;
digbit = false;
DF.Resume(); DF.Resume();
int c = getch(); /* refresh, accept single keystroke of input */ int c = getch(); /* refresh, accept single keystroke of input */
clrscr(); clrscr();
@ -372,6 +376,9 @@ main(int argc, char *argv[])
case '-': case '-':
vein --; vein --;
break; break;
case 'z':
digbit = true;
break;
default: default:
break; break;
} }
@ -425,11 +432,25 @@ main(int argc, char *argv[])
blockaddr = DF.getBlockPtr(cursorX+i,cursorY+j,cursorZ); blockaddr = DF.getBlockPtr(cursorX+i,cursorY+j,cursorZ);
if(dump) if(dump)
{ {
hexdump(DF,blockaddr,0x1DB8,filenum); hexdump(DF,blockaddr,0x1E00/*0x1DB8*/,filenum);
filenum++; filenum++;
} }
if(dig) if(dig)
DF.WriteDesignations(cursorX+i,cursorY+j,cursorZ, (uint32_t *) designations); DF.WriteDesignations(cursorX+i,cursorY+j,cursorZ, (uint32_t *) designations);
DF.ReadBlockFlags(cursorX+i,cursorY+j,cursorZ,blockflags);
if(digbit)
{
// toggle dig bit
if(blockflags & 1)
{
blockflags &= 0xFFFFFFFE;
}
else
{
blockflags |= 1; // set first bit
}
DF.WriteBlockFlags(cursorX+i,cursorY+j,cursorZ,blockflags);
}
veinVector.clear(); veinVector.clear();
DF.ReadVeins(cursorX+i,cursorY+j,cursorZ,veinVector); DF.ReadVeins(cursorX+i,cursorY+j,cursorZ,veinVector);
} }
@ -494,7 +515,7 @@ main(int argc, char *argv[])
} }
} }
gotoxy (0,53); gotoxy (0,53);
cprintf("block address 0x%x",blockaddr); cprintf("block address 0x%x, block flags 0x%x",blockaddr,blockflags);
wrefresh(stdscr); wrefresh(stdscr);
} }
pDF = 0; pDF = 0;

@ -41,6 +41,7 @@ public:
uint32_t tile_type_offset; uint32_t tile_type_offset;
uint32_t designation_offset; uint32_t designation_offset;
uint32_t occupancy_offset; uint32_t occupancy_offset;
uint32_t block_flags_offset;
uint32_t biome_stuffs; uint32_t biome_stuffs;
uint32_t veinvector; uint32_t veinvector;
uint32_t veinsize; uint32_t veinsize;
@ -158,6 +159,7 @@ bool API::InitMap()
d->tile_type_offset = d->offset_descriptor->getOffset ("type"); d->tile_type_offset = d->offset_descriptor->getOffset ("type");
d->designation_offset = d->offset_descriptor->getOffset ("designation"); d->designation_offset = d->offset_descriptor->getOffset ("designation");
d->occupancy_offset = d->offset_descriptor->getOffset ("occupancy"); d->occupancy_offset = d->offset_descriptor->getOffset ("occupancy");
d->block_flags_offset = d->offset_descriptor->getOffset ("block_flags");
d->biome_stuffs = d->offset_descriptor->getOffset ("biome_stuffs"); d->biome_stuffs = d->offset_descriptor->getOffset ("biome_stuffs");
d->veinvector = d->offset_descriptor->getOffset ("v_vein"); d->veinvector = d->offset_descriptor->getOffset ("v_vein");
@ -245,6 +247,27 @@ bool API::ReadTileTypes (uint32_t x, uint32_t y, uint32_t z, uint16_t *buffer)
return false; return false;
} }
bool API::ReadBlockFlags(uint32_t x, uint32_t y, uint32_t z, uint32_t &flags)
{
uint32_t addr = d->block[x*d->y_block_count*d->z_block_count + y*d->z_block_count + z];
if (addr)
{
g_pProcess->read (addr + d->block_flags_offset, sizeof (uint32_t), (uint8_t *) &flags);
return true;
}
return false;
}
bool API::WriteBlockFlags(uint32_t x, uint32_t y, uint32_t z, uint32_t flags)
{
uint32_t addr = d->block[x*d->y_block_count*d->z_block_count + y*d->z_block_count + z];
if (addr)
{
g_pProcess->write (addr + d->block_flags_offset, sizeof (uint32_t), (uint8_t *) &flags);
return true;
}
return false;
}
// 256 * sizeof(uint32_t) // 256 * sizeof(uint32_t)
bool API::ReadDesignations (uint32_t x, uint32_t y, uint32_t z, uint32_t *buffer) bool API::ReadDesignations (uint32_t x, uint32_t y, uint32_t z, uint32_t *buffer)

@ -142,6 +142,9 @@ namespace DFHack
bool ReadOccupancy(uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t *buffer); // 256 * sizeof(uint32_t) bool ReadOccupancy(uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t *buffer); // 256 * sizeof(uint32_t)
bool WriteOccupancy(uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t *buffer); // 256 * sizeof(uint32_t) bool WriteOccupancy(uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t *buffer); // 256 * sizeof(uint32_t)
bool ReadBlockFlags(uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t &flags);
bool WriteBlockFlags(uint32_t blockx, uint32_t blocky, uint32_t blockz, uint32_t flags);
/// read region offsets of a block /// read region offsets of a block
bool ReadRegionOffsets(uint32_t blockx, uint32_t blocky, uint32_t blockz, uint8_t *buffer); // 16 * sizeof(uint8_t) bool ReadRegionOffsets(uint32_t blockx, uint32_t blocky, uint32_t blockz, uint8_t *buffer); // 16 * sizeof(uint8_t)

@ -562,6 +562,7 @@
<Offset name="designation">0x0264</Offset> <Offset name="designation">0x0264</Offset>
<Offset name="occupancy">0x0664</Offset> <Offset name="occupancy">0x0664</Offset>
<Offset name="biome_stuffs">0x1D64</Offset> <Offset name="biome_stuffs">0x1D64</Offset>
<Offset name="block_flags">0x1D78</Offset>
<!-- creature offsets --> <!-- creature offsets -->
<Offset name="creature_first_name">0x00</Offset> <Offset name="creature_first_name">0x00</Offset>
@ -765,8 +766,9 @@
<HexValue name="v_vein_size">0x2C</HexValue> <HexValue name="v_vein_size">0x2C</HexValue>
<Offset name="type">0x0082</Offset> <Offset name="type">0x0082</Offset>
<Offset name="designation">0x0284</Offset> <Offset name="designation">0x0284</Offset>
<Offset name="occupancy">0x0684</Offset> <Offset name="occupancy">0x0684</Offset>
<Offset name="biome_stuffs">0x1D84</Offset> <Offset name="biome_stuffs">0x1D84</Offset>
<Offset name="block_flags">0x1DF8</Offset>
<!-- the world and its offsets --> <!-- the world and its offsets -->
<Address name="world">0x015334F8</Address> <Address name="world">0x015334F8</Address>
@ -1501,6 +1503,7 @@
<Offset name="designation">0x0254</Offset> <Offset name="designation">0x0254</Offset>
<Offset name="occupancy">0x0654</Offset> <Offset name="occupancy">0x0654</Offset>
<Offset name="biome_stuffs">0x1D54</Offset> <Offset name="biome_stuffs">0x1D54</Offset>
<Offset name="block_flags">0x1D68</Offset>
<!-- the world and its offsets --> <!-- the world and its offsets -->
<Address name="world">0x093745EC</Address> <Address name="world">0x093745EC</Address>