From 3c7c197f7a7df309cc0e033d5a221e257dc8f2e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 20 Feb 2010 16:33:30 +0100 Subject: [PATCH] Removed bogus block flags, added actual dirty bit :) --- examples/veinlook.cpp | 24 +++++++++++------------- library/DFHackAPI.cpp | 17 +++++++++++------ library/DFHackAPI.h | 6 +++--- output/Memory.xml | 3 --- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/examples/veinlook.cpp b/examples/veinlook.cpp index 3d13f4d36..5f94bc9dc 100644 --- a/examples/veinlook.cpp +++ b/examples/veinlook.cpp @@ -12,6 +12,7 @@ using namespace std; #include #include #include +#include using namespace DFHack; #include #include @@ -298,6 +299,7 @@ main(int argc, char *argv[]) error = "Can't find a map to look at."; pDF = 0; finish(0); +#include } DF.getSize(x_max_a,y_max_a,z_max_a); @@ -332,7 +334,7 @@ main(int argc, char *argv[]) bool digbit = false; int vein = 0; int filenum = 0; - uint32_t blockflags = 0; + bool dirtybit = false; uint32_t blockaddr = 0; // walk the map! for (;;) @@ -437,19 +439,11 @@ main(int argc, char *argv[]) } if(dig) DF.WriteDesignations(cursorX+i,cursorY+j,cursorZ, (uint32_t *) designations); - DF.ReadBlockFlags(cursorX+i,cursorY+j,cursorZ,blockflags); + DF.ReadDirtyBit(cursorX+i,cursorY+j,cursorZ,dirtybit); if(digbit) { - // toggle dig bit - if(blockflags & 1) - { - blockflags &= 0xFFFFFFFE; - } - else - { - blockflags |= 1; // set first bit - } - DF.WriteBlockFlags(cursorX+i,cursorY+j,cursorZ,blockflags); + dirtybit = !dirtybit; + DF.WriteDirtyBit(cursorX+i,cursorY+j,cursorZ,dirtybit); } veinVector.clear(); DF.ReadVeins(cursorX+i,cursorY+j,cursorZ,veinVector); @@ -514,8 +508,12 @@ main(int argc, char *argv[]) cprintf("%s, address 0x%x",className.c_str(),veinVector[vein].address_of); } } + uint32_t sptr = blockaddr + p->getDescriptor()->getOffset("block_flags"); + gotoxy (0,53); - cprintf("block address 0x%x, block flags 0x%x",blockaddr,blockflags); + cprintf("block address 0x%x",blockaddr); + gotoxy (0,54); + cprintf("dirty bit: %d",dirtybit); wrefresh(stdscr); } pDF = 0; diff --git a/library/DFHackAPI.cpp b/library/DFHackAPI.cpp index afcad6534..e08b84f22 100644 --- a/library/DFHackAPI.cpp +++ b/library/DFHackAPI.cpp @@ -159,7 +159,6 @@ bool API::InitMap() d->tile_type_offset = d->offset_descriptor->getOffset ("type"); d->designation_offset = d->offset_descriptor->getOffset ("designation"); 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->veinvector = d->offset_descriptor->getOffset ("v_vein"); @@ -247,22 +246,28 @@ bool API::ReadTileTypes (uint32_t x, uint32_t y, uint32_t z, uint16_t *buffer) return false; } -bool API::ReadBlockFlags(uint32_t x, uint32_t y, uint32_t z, uint32_t &flags) +bool API::ReadDirtyBit(uint32_t x, uint32_t y, uint32_t z, bool &dirtybit) { uint32_t addr = d->block[x*d->y_block_count*d->z_block_count + y*d->z_block_count + z]; - if (addr) + if(addr) { - g_pProcess->read (addr + d->block_flags_offset, sizeof (uint32_t), (uint8_t *) &flags); + uint32_t addr_of_struct = g_pProcess->readDWord(addr); + dirtybit = g_pProcess->readDWord(addr_of_struct) & 1; return true; } return false; } -bool API::WriteBlockFlags(uint32_t x, uint32_t y, uint32_t z, uint32_t flags) + +bool API::WriteDirtyBit(uint32_t x, uint32_t y, uint32_t z, bool dirtybit) { 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); + uint32_t addr_of_struct = g_pProcess->readDWord(addr); + uint32_t dirtydword = g_pProcess->readDWord(addr_of_struct); + dirtydword &= 0xFFFFFFF0; + dirtydword |= dirtybit; + g_pProcess->writeDWord (addr_of_struct, dirtydword); return true; } return false; diff --git a/library/DFHackAPI.h b/library/DFHackAPI.h index 63af7059d..cdb24c882 100644 --- a/library/DFHackAPI.h +++ b/library/DFHackAPI.h @@ -141,9 +141,9 @@ namespace DFHack 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 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); + + bool ReadDirtyBit(uint32_t blockx, uint32_t blocky, uint32_t blockz, bool &dirtybit); + bool WriteDirtyBit(uint32_t blockx, uint32_t blocky, uint32_t blockz, bool dirtybit); /// read region offsets of a block bool ReadRegionOffsets(uint32_t blockx, uint32_t blocky, uint32_t blockz, uint8_t *buffer); // 16 * sizeof(uint8_t) diff --git a/output/Memory.xml b/output/Memory.xml index 6b864cbc6..7a951240b 100644 --- a/output/Memory.xml +++ b/output/Memory.xml @@ -562,7 +562,6 @@ 0x0264 0x0664 0x1D64 - 0x1D78 0x00 @@ -768,7 +767,6 @@ 0x0284 0x0684 0x1D84 - 0x1DF8
0x015334F8
@@ -1503,7 +1501,6 @@ 0x0254 0x0654 0x1D54 - 0x1D68
0x093745EC