Merge branch 'master' of git://github.com/belal/dfhack

develop
Petr Mrázek 2010-02-18 17:55:43 +01:00
commit 2e02efa8d2
7 changed files with 202 additions and 4 deletions

@ -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)

@ -0,0 +1,61 @@
// Hotkey and Note Dump
#include <iostream>
#include <climits>
#include <integers.h>
#include <vector>
using namespace std;
#include <DFTypes.h>
#include <DFHackAPI.h>
#include <DFMemInfo.h>
int main (void)
{
vector<DFHack::t_matgloss> creaturestypes;
DFHack::API DF("Memory.xml");
if(!DF.Attach())
{
cerr << "DF not found" << endl;
return 1;
}
DFHack::memory_info mem = DF.getMemoryInfo();
// get stone matgloss mapping
uint32_t numNotes;
if(!DF.InitReadNotes(numNotes))
{
cerr << "Can't get notes" << endl;
return 1;
}
if(!DF.InitReadHotkeys())
{
cerr << "Can't get hotkeys" << endl;
return 1;
}
cout << "Notes" << endl;
for(uint32_t i = 0; i < numNotes; i++)
{
DFHack::t_note temp;
DF.ReadNote(i,temp);
cout << "x: " << temp.x << "\ty: " << temp.y << "\tz: " << temp.z <<
"\tsymbol: " << temp.symbol << "\tfg: " << temp.foreground << "\tbg: " << temp.background <<
"\ttext: " << temp.name << endl;
}
cout << "Hotkeys" << endl;
DFHack::t_hotkey hotkeys[NUM_HOTKEYS];
DF.ReadHotkeys(hotkeys);
for(uint32_t i =0;i< NUM_HOTKEYS;i++)
{
cout << "x: " << hotkeys[i].x << "\ty: " << hotkeys[i].y << "\tz: " << hotkeys[i].z <<
"\ttext: " << hotkeys[i].name << endl;
}
DF.FinishReadNotes();
DF.Detach();
#ifndef LINUX_BUILD
cout << "Done. Press any key to continue" << endl;
cin.ignore();
#endif
return 0;
}

@ -83,6 +83,15 @@ 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 hotkey_start;
uint32_t hotkey_mode_offset;
uint32_t hotkey_xyz_offset;
uint32_t hotkey_size;
uint32_t dwarf_lang_table_offset;
ProcessEnumerator* pm;
@ -98,6 +107,8 @@ public:
bool cursorWindowInited;
bool viewSizeInited;
bool itemsInited;
bool notesInited;
bool hotkeyInited;
bool nameTablesInited;
@ -107,6 +118,7 @@ public:
DfVector *p_bld;
DfVector *p_veg;
DfVector *p_itm;
DfVector *p_notes;
};
API::API (const string path_to_xml)
@ -122,6 +134,8 @@ API::API (const string path_to_xml)
d->cursorWindowInited = false;
d->viewSizeInited = false;
d->itemsInited = false;
d->notesInited = false;
d->hotkeyInited = false;
d->pm = NULL;
}
@ -862,7 +876,79 @@ 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 *) &note.x);
return true;
}
bool API::InitReadHotkeys( )
{
memory_info * minfo = d->offset_descriptor;
d->hotkey_start = minfo->getAddress("hotkey_start");
d->hotkey_mode_offset = minfo->getOffset ("hotkey_mode");
d->hotkey_xyz_offset = minfo->getOffset("hotkey_xyz");
d->hotkey_size = minfo->getHexValue("hotkey_size");
if (d->hotkey_start && d->hotkey_mode_offset && d->hotkey_size)
{
d->hotkeyInited = true;
return true;
}
else
{
d->hotkeyInited = false;
return false;
}
}
bool API::ReadHotkeys(t_hotkey hotkeys[])
{
assert (d->hotkeyInited);
uint32_t currHotkey = d->hotkey_start;
for(uint32_t i = 0 ; i < NUM_HOTKEYS ;i++)
{
d->p->readSTLString(currHotkey,hotkeys[i].name,10);
hotkeys[i].mode = g_pProcess->readWord(currHotkey+d->hotkey_mode_offset);
g_pProcess->read (currHotkey + d->hotkey_xyz_offset, 3*sizeof (int32_t), (uint8_t *) &hotkeys[i].x);
currHotkey+=d->hotkey_size;
}
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,
@ -1096,6 +1182,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()
{

@ -175,6 +175,13 @@ 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 InitReadHotkeys( );
bool ReadHotkeys(t_hotkey hotkeys[]);
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);

@ -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();
}

@ -753,5 +753,26 @@ 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;
};
#define NUM_HOTKEYS 16
struct t_hotkey
{
char name[10];
int16_t mode;
int32_t x;
int32_t y;
int32_t z;
};
}// namespace DFHack
#endif // TYPES_H_INCLUDED

@ -1114,6 +1114,17 @@
<Address name="view_screen">0x014243C4</Address>
<Address name="current_cursor_creature">0x0178C994</Address>
<Address name="notes">0x014240A4</Address>
<Offset name="note_foreground">0x2</Offset>
<Offset name="note_background">0x4</Offset>
<Offset name="note_name">0x8</Offset>
<Offset name="note_xyz">0x24</Offset>
<Address name="hotkey_start">0x14240DC</Address><!-- 0x018F40DC -->
<Offset name="hotkey_mode">0x1C</Offset>
<Offset name="hotkey_xyz">0x20</Offset>
<HexValue name="hotkey_size">0x2C</HexValue>
<VTable name="viewscreen_vtable">
<class vtable="0x0092014C" name="viewscreen_conversation" />
<class vtable="0x0092752C" name="viewscreen_option" />