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); 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; 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(); diff --git a/examples/veccheck.cpp b/examples/veccheck.cpp index b4f5242b2..d3f55d5cf 100644 --- a/examples/veccheck.cpp +++ b/examples/veccheck.cpp @@ -159,16 +159,16 @@ int main (int numargs, const char ** args) int32_t idx = p->readDWord(block.origin + block_feature1); if(idx != -1) { - uint64_t region_x_local = cursorX / 48 + regionX; + uint64_t bigblock_x = cursorX / 48 + regionX; // blah, dumb disassembly. too tired to think - uint16_t v12 = ((region_x_local % 16) + region_x_local) / 16; + uint16_t v12 = ((bigblock_x % 16) + bigblock_x) / 16; uint64_t region_y_local = (cursorY / 48 + regionY) / 16; // deref pointer to the humongo-structure uint32_t base = p->readDWord(feature1_start_ptr); // this is just a few pointers to arrays of 16B (4 DWORD) structs uint32_t array_elem = p->readDWord(base + (v12 / 16) * 4); // second element of the struct is a pointer - uint32_t wtf = p->readDWord(array_elem + (16*(region_y_local/16)) + 4); + uint32_t wtf = p->readDWord(array_elem + (16*(region_y_local/16)) + 4); // rounding! if(wtf) { uint32_t feat_vector = wtf + 24 * (region_y_local % 16); 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 .-"""-.