diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index e5e133580..9aa1cec5f 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -42,6 +42,11 @@ TARGET_LINK_LIBRARIES(dfitemdump dfhack) ADD_EXECUTABLE(dfdigger digger.cpp) TARGET_LINK_LIBRARIES(dfdigger dfhack) +# hotkeynotedump - dumps the hotkeys and notes for the loaded map +# Author: belal +ADD_EXECUTABLE(dfhotkeynotedump hotkeynotedump.cpp) +TARGET_LINK_LIBRARIES(dfhotkeynotedump dfhack) + IF(UNIX) # veinlook - look at the map... sort of ADD_EXECUTABLE(dfveinlook veinlook.cpp) diff --git a/library/DFHackAPI.cpp b/library/DFHackAPI.cpp index ecab52de3..8540dc879 100644 --- a/library/DFHackAPI.cpp +++ b/library/DFHackAPI.cpp @@ -83,6 +83,11 @@ public: uint32_t item_material_offset; + uint32_t note_foreground_offset; + uint32_t note_background_offset; + uint32_t note_name_offset; + uint32_t note_xyz_offset; + uint32_t dwarf_lang_table_offset; ProcessEnumerator* pm; @@ -98,6 +103,7 @@ public: bool cursorWindowInited; bool viewSizeInited; bool itemsInited; + bool notesInited; bool nameTablesInited; @@ -107,6 +113,7 @@ public: DfVector *p_bld; DfVector *p_veg; DfVector *p_itm; + DfVector *p_notes; }; API::API (const string path_to_xml) @@ -122,6 +129,7 @@ API::API (const string path_to_xml) d->cursorWindowInited = false; d->viewSizeInited = false; d->itemsInited = false; + d->notesInited = false; d->pm = NULL; } @@ -853,7 +861,47 @@ bool API::InitReadCreatures( uint32_t &numcreatures ) return false; } } - +bool API::InitReadNotes( uint32_t &numnotes ) +{ + memory_info * minfo = d->offset_descriptor; + int notes = d->offset_descriptor->getAddress ("notes"); + d->note_foreground_offset = minfo->getOffset ("note_foreground"); + d->note_background_offset = minfo->getOffset ("note_background"); + d->note_name_offset = minfo->getOffset ("note_name"); + d->note_xyz_offset = minfo->getOffset ("note_xyz"); + + if (notes + && d->note_foreground_offset + && d->note_background_offset + && d->note_name_offset + && d->note_xyz_offset + ) + { + d->p_notes = new DfVector (d->p->readVector (notes, 4)); + //InitReadNameTables(); + d->notesInited = true; + numnotes = d->p_notes->getSize(); + return true; + } + else + { + d->notesInited = false; + numnotes = 0; + return false; + } +} +bool API::ReadNote (const int32_t &index, t_note & note) +{ + assert (d->notesInited); + // read pointer from vector at position + uint32_t temp = * (uint32_t *) d->p_notes->at (index); + note.symbol = g_pProcess->readByte(temp); + note.foreground = g_pProcess->readWord(temp + d->note_foreground_offset); + note.background = g_pProcess->readWord(temp + d->note_background_offset); + d->p->readSTLString (temp + d->note_name_offset, note.name, 128); + g_pProcess->read (temp + d->note_xyz_offset, 3*sizeof (uint16_t), (uint8_t *) ¬e.x); + return true; +} // returns index of creature actually read or -1 if no creature can be found int32_t API::ReadCreatureInBox (int32_t index, t_creature & furball, const uint16_t &x1, const uint16_t &y1, const uint16_t &z1, @@ -1087,6 +1135,13 @@ void API::FinishReadCreatures() d->creaturesInited = false; //FinishReadNameTables(); } +void API::FinishReadNotes() +{ + delete d->p_notes; + d->p_notes = NULL; + d->notesInited = false; + //FinishReadNameTables(); +} bool API::Attach() { diff --git a/library/DFHackAPI.h b/library/DFHackAPI.h index 21e3999cc..5f3dce912 100644 --- a/library/DFHackAPI.h +++ b/library/DFHackAPI.h @@ -171,6 +171,10 @@ namespace DFHack void WriteRaw (const uint32_t &offset, const uint32_t &size, uint8_t *source); bool InitViewAndCursor(); + + bool InitReadNotes( uint32_t & numnotes ); + bool ReadNote(const int32_t &index, t_note & note); + void FinishReadNotes(); bool getViewCoords (int32_t &x, int32_t &y, int32_t &z); bool setViewCoords (const int32_t &x, const int32_t &y, const int32_t &z); diff --git a/library/DFProcessEnumerator-windows.cpp b/library/DFProcessEnumerator-windows.cpp index ac11d2ea2..19491c279 100644 --- a/library/DFProcessEnumerator-windows.cpp +++ b/library/DFProcessEnumerator-windows.cpp @@ -77,7 +77,7 @@ bool ProcessEnumerator::findProcessess() } else { - delete p; +//FIXME delete p; p = 0; } } @@ -102,7 +102,7 @@ bool ProcessEnumerator::findProcessess() } else { - delete q; + //FIXME delete q; q = 0; } } @@ -134,7 +134,7 @@ void ProcessEnumerator::purge() { for(uint32_t i = 0;i < d->processes.size();i++) { - delete d->processes[i]; + //FIXME delete d->processes[i]; } d->processes.clear(); } diff --git a/library/DFTypes.h b/library/DFTypes.h index 08d49d624..61a05720b 100644 --- a/library/DFTypes.h +++ b/library/DFTypes.h @@ -753,5 +753,16 @@ struct t_viewscreen //There is more info in these objects, but I don't know what it is yet }; +struct t_note +{ + char symbol; + uint16_t foreground; + uint16_t background; + char name[128]; + uint16_t x; + uint16_t y; + uint16_t z; +}; + }// namespace DFHack #endif // TYPES_H_INCLUDED diff --git a/output/Memory.xml b/output/Memory.xml index f9bfd9c11..188c1501a 100644 --- a/output/Memory.xml +++ b/output/Memory.xml @@ -1114,6 +1114,12 @@
0x014243C4
0x0178C994
+
0x014240A4
+ 0x2 + 0x4 + 0x8 + 0x24 +