From 22b703e085b1004e0e41fb39c55f37b7cc4f14ac Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 20 Apr 2010 18:13:00 +0200 Subject: [PATCH 1/4] readFloat support (to be checked for SHM builds !) --- dfhack/DFProcess-linux-SHM.cpp | 21 ++++++++++++++++++++- dfhack/DFProcess-linux-wine.cpp | 13 ++++++++++++- dfhack/DFProcess-linux.cpp | 13 ++++++++++++- dfhack/DFProcess-windows-SHM.cpp | 22 +++++++++++++++++++++- dfhack/DFProcess-windows.cpp | 16 +++++++++++++++- dfhack/include/DFProcess.h | 8 ++++++++ 6 files changed, 88 insertions(+), 5 deletions(-) diff --git a/dfhack/DFProcess-linux-SHM.cpp b/dfhack/DFProcess-linux-SHM.cpp index 204b6ac1a..b7b8045a3 100644 --- a/dfhack/DFProcess-linux-SHM.cpp +++ b/dfhack/DFProcess-linux-SHM.cpp @@ -704,6 +704,25 @@ void SHMProcess::readDWord (const uint32_t offset, uint32_t &val) val = D_SHMHDR->value; } +float SHMProcess::readFloat (const uint32_t offset) +{ + if(!d->locked) throw Error::MemoryAccessDenied(); + + D_SHMHDR->address = offset; + gcc_barrier + d->SetAndWait(CORE_READ_DWORD); + return D_SHMHDR->value; +} +void SHMProcess::readFloat (const uint32_t offset, float &val) +{ + if(!d->locked) throw Error::MemoryAccessDenied(); + + D_SHMHDR->address = offset; + gcc_barrier + d->SetAndWait(CORE_READ_DWORD); + val = D_SHMHDR->value; +} + /* * WRITING */ @@ -890,4 +909,4 @@ bool SHMProcess::Private::Aux_Core_Attach(bool & versionOK, pid_t & PID) if(useYield) cerr << "Using Yield!" << endl; #endif return true; -} \ No newline at end of file +} diff --git a/dfhack/DFProcess-linux-wine.cpp b/dfhack/DFProcess-linux-wine.cpp index ceaa37299..8bbe7dc51 100644 --- a/dfhack/DFProcess-linux-wine.cpp +++ b/dfhack/DFProcess-linux-wine.cpp @@ -430,6 +430,17 @@ void WineProcess::readDWord (const uint32_t offset, uint32_t &val) read(offset, 4, (uint8_t *) &val); } +float WineProcess::readFloat (const uint32_t offset) +{ + float val; + read(offset, 4, (uint8_t *) &val); + return val; +} +void WineProcess::readFloat (const uint32_t offset, float &val) +{ + read(offset, 4, (uint8_t *) &val); +} + /* * WRITING */ @@ -588,4 +599,4 @@ string WineProcess::readClassName (uint32_t vptr) string raw = readCString(typeinfo + 0xC); // skips the .?AV raw.resize(raw.length() - 2);// trim @@ from end return raw; -} \ No newline at end of file +} diff --git a/dfhack/DFProcess-linux.cpp b/dfhack/DFProcess-linux.cpp index 5ae965e11..48d3b1342 100644 --- a/dfhack/DFProcess-linux.cpp +++ b/dfhack/DFProcess-linux.cpp @@ -417,6 +417,17 @@ void NormalProcess::readDWord (const uint32_t offset, uint32_t &val) read(offset, 4, (uint8_t *) &val); } +float NormalProcess::readFloat (const uint32_t offset) +{ + float val; + read(offset, 4, (uint8_t *) &val); + return val; +} +void NormalProcess::readFloat (const uint32_t offset, float &val) +{ + read(offset, 4, (uint8_t *) &val); +} + /* * WRITING */ @@ -540,4 +551,4 @@ string NormalProcess::readClassName (uint32_t vptr) size_t start = raw.find_first_of("abcdefghijklmnopqrstuvwxyz");// trim numbers size_t end = raw.length(); return raw.substr(start,end-start); -} \ No newline at end of file +} diff --git a/dfhack/DFProcess-windows-SHM.cpp b/dfhack/DFProcess-windows-SHM.cpp index 35c81dbaf..f849741f7 100644 --- a/dfhack/DFProcess-windows-SHM.cpp +++ b/dfhack/DFProcess-windows-SHM.cpp @@ -762,6 +762,26 @@ void SHMProcess::readDWord (const uint32_t offset, uint32_t &val) val = D_SHMHDR->value; } +float SHMProcess::readFloat (const uint32_t offset) +{ + if(!d->locked) throw Error::MemoryAccessDenied(); + + D_SHMHDR->address = offset; + full_barrier + d->SetAndWait(CORE_READ_DWORD); + return D_SHMHDR->value; +} +void SHMProcess::readFloat (const uint32_t offset, float &val) +{ + if(!d->locked) throw Error::MemoryAccessDenied(); + + D_SHMHDR->address = offset; + full_barrier + d->SetAndWait(CORE_READ_DWORD); + val = D_SHMHDR->value; +} + + /* * WRITING */ @@ -944,4 +964,4 @@ bool SHMProcess::Private::Aux_Core_Attach(bool & versionOK, uint32_t & PID) if(useYield) cerr << "Using Yield!" << endl; #endif return true; -} \ No newline at end of file +} diff --git a/dfhack/DFProcess-windows.cpp b/dfhack/DFProcess-windows.cpp index 867b32169..7c1a8612b 100644 --- a/dfhack/DFProcess-windows.cpp +++ b/dfhack/DFProcess-windows.cpp @@ -365,6 +365,20 @@ void NormalProcess::readDWord (const uint32_t offset, uint32_t &result) throw Error::MemoryAccessDenied(); } +float NormalProcess::readFloat (const uint32_t offset) +{ + float result; + if(!ReadProcessMemory(d->my_handle, (int*) offset, &result, sizeof(float), NULL)) + throw Error::MemoryAccessDenied(); + return result; +} + +void NormalProcess::readFloat (const uint32_t offset, float &result) +{ + if(!ReadProcessMemory(d->my_handle, (int*) offset, &result, sizeof(float), NULL)) + throw Error::MemoryAccessDenied(); +} + void NormalProcess::read (const uint32_t offset, uint32_t size, uint8_t *target) { if(!ReadProcessMemory(d->my_handle, (int*) offset, target, size, NULL)) @@ -489,4 +503,4 @@ string NormalProcess::readClassName (uint32_t vptr) string raw = readCString(typeinfo + 0xC); // skips the .?AV raw.resize(raw.length() - 2);// trim @@ from end return raw; -} \ No newline at end of file +} diff --git a/dfhack/include/DFProcess.h b/dfhack/include/DFProcess.h index 15a75bef3..951ebfac9 100644 --- a/dfhack/include/DFProcess.h +++ b/dfhack/include/DFProcess.h @@ -81,7 +81,9 @@ namespace DFHack virtual bool forceresume() = 0; virtual uint32_t readDWord(const uint32_t address) = 0; + virtual float readFloat(const uint32_t address) = 0; virtual void readDWord(const uint32_t address, uint32_t & value) = 0; + virtual void readFloat(const uint32_t address, float & value) = 0; virtual uint16_t readWord(const uint32_t address) = 0; virtual void readWord(const uint32_t address, uint16_t & value) = 0; virtual uint8_t readByte(const uint32_t address) = 0; @@ -150,7 +152,9 @@ namespace DFHack bool forceresume(); uint32_t readDWord(const uint32_t address); + float readFloat(const uint32_t address); void readDWord(const uint32_t address, uint32_t & value); + void readFloat(const uint32_t address, float & value); uint16_t readWord(const uint32_t address); void readWord(const uint32_t address, uint16_t & value); uint8_t readByte(const uint32_t address); @@ -213,7 +217,9 @@ namespace DFHack bool forceresume(); uint32_t readDWord(const uint32_t address); + float readFloat(const uint32_t address); void readDWord(const uint32_t address, uint32_t & value); + void readFloat(const uint32_t address, float & value); uint16_t readWord(const uint32_t address); void readWord(const uint32_t address, uint16_t & value); uint8_t readByte(const uint32_t address); @@ -275,7 +281,9 @@ namespace DFHack bool forceresume(); uint32_t readDWord(const uint32_t address); + float readFloat(const uint32_t address); void readDWord(const uint32_t address, uint32_t & value); + void readFloat(const uint32_t address, float & value); uint16_t readWord(const uint32_t address); void readWord(const uint32_t address, uint16_t & value); uint8_t readByte(const uint32_t address); From 0b782333ca9fbf7b7a25dc159aaa7dc2c4ff0844 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 20 Apr 2010 18:25:15 +0200 Subject: [PATCH 2/4] offsets for RGB color descriptors, and shapes --- output/Memory.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/output/Memory.xml b/output/Memory.xml index 9924e696e..8be57eb89 100644 --- a/output/Memory.xml +++ b/output/Memory.xml @@ -1457,7 +1457,17 @@ map_data_1b60_offset 0x1B9c WORLD + 0x5D610
0x16B97E0
0x4 - 0x20 + 0x20 + + Descriptor colors + ================= +
0x16B9780
+ 0x0 + 0x4C +
0x16B9768
+ 0x6C floats ! + 0x70 + 0x74 .-"""-. From 10ff8d73d108a506db9b6310ae2ea714163f1854 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 20 Apr 2010 18:25:39 +0200 Subject: [PATCH 3/4] Update for color descriptors --- examples/materialtest.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/examples/materialtest.cpp b/examples/materialtest.cpp index b73e4ec20..487cd9a12 100644 --- a/examples/materialtest.cpp +++ b/examples/materialtest.cpp @@ -87,6 +87,17 @@ int main (int numargs, const char ** args) } cout << endl; } + cout << endl << "----==== Color descriptors ====----" << endl; + vector colors; + Materials->ReadDescriptorColors(colors); + for(uint32_t i = 0; i < colors.size();i++) + { + cout << i << ": " << colors[i].id << " - " << colors[i].name << "[" + << (unsigned int) (colors[i].r*255) << ":" + << (unsigned int) (colors[i].v*255) << ":" + << (unsigned int) (colors[i].b*255) << ":" + << "]" << endl; + } #ifndef LINUX_BUILD cout << "Done. Press any key to continue" << endl; cin.ignore(); From 72376d1d3586a2b79a3e22e9f1bb94f9fe8fcb73 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 20 Apr 2010 18:25:52 +0200 Subject: [PATCH 4/4] Color descriptors handling --- dfhack/include/modules/Materials.h | 11 +++++++++++ dfhack/modules/Materials.cpp | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/dfhack/include/modules/Materials.h b/dfhack/include/modules/Materials.h index f190e8737..f4073c1ca 100644 --- a/dfhack/include/modules/Materials.h +++ b/dfhack/include/modules/Materials.h @@ -17,6 +17,15 @@ namespace DFHack char name[128]; //this is the name displayed ingame }; + struct t_descriptor_color + { + char id[128]; // id in the raws + float r; + float v; + float b; + char name[128]; //displayed name + }; + struct t_matglossPlant { char id[128]; //the id in the raws @@ -67,6 +76,8 @@ namespace DFHack // TODO: maybe move to creatures? bool ReadCreatureTypes (std::vector & output); bool ReadCreatureTypesEx (vector & creatures); + + bool ReadDescriptorColors(std::vector & output); private: class Private; Private* d; diff --git a/dfhack/modules/Materials.cpp b/dfhack/modules/Materials.cpp index 1505a6796..e0e8da8a7 100644 --- a/dfhack/modules/Materials.cpp +++ b/dfhack/modules/Materials.cpp @@ -223,6 +223,26 @@ bool Materials::ReadCreatureTypes (vector & creatures) return true; } +bool Materials::ReadDescriptorColors (vector & color) +{ + Process * p = d->owner; + DfVector p_colors (p, p->getDescriptor()->getAddress ("descriptor_colors_vector")); + uint32_t size = p_colors.size(); + + color.clear(); + color.reserve(size); + for (uint32_t i = 0; i < size;i++) + { + t_descriptor_color col; + p->readSTLString (p_colors[i] + p->getDescriptor()->getOffset ("descriptor_rawname"), col.id, 128); + p->readSTLString (p_colors[i] + p->getDescriptor()->getOffset ("descriptor_name"), col.name, 128); + col.r = p->readFloat( p_colors[i] + p->getDescriptor()->getOffset ("descriptor_color_r") ); + col.v = p->readFloat( p_colors[i] + p->getDescriptor()->getOffset ("descriptor_color_v") ); + col.b = p->readFloat( p_colors[i] + p->getDescriptor()->getOffset ("descriptor_color_b") ); + color.push_back(col); + } +} + bool Materials::ReadCreatureTypesEx (vector & creatures) { Process *p = d->owner;