Engravings module.
parent
68b13d6bf0
commit
4cfc12b52b
@ -0,0 +1,72 @@
|
||||
#ifndef CL_MOD_ENGRAVINGS
|
||||
#define CL_MOD_ENGRAVINGS
|
||||
/*
|
||||
* DF engravings
|
||||
*/
|
||||
#include "dfhack/DFExport.h"
|
||||
#include "dfhack/DFModule.h"
|
||||
|
||||
/**
|
||||
* \defgroup grp_engraving Engraving module parts
|
||||
* @ingroup grp_modules
|
||||
*/
|
||||
namespace DFHack
|
||||
{
|
||||
/**
|
||||
* type the engraving is made of
|
||||
* \ingroup grp_engraving
|
||||
*/
|
||||
struct t_engraving
|
||||
{
|
||||
//0
|
||||
int32_t artistIdx; /*!< Index of the artist in some global vector */
|
||||
// 4
|
||||
int32_t unknownIdx;
|
||||
// 8
|
||||
uint32_t quality; // from 0 to 5
|
||||
// C
|
||||
uint16_t x; /*!< X coordinate */
|
||||
uint16_t y; /*!< Y coordinate */
|
||||
// 10
|
||||
uint16_t z; /*!< Z coordinate */
|
||||
uint16_t padding; /*!< Could be used for hiding values. */
|
||||
// 14
|
||||
uint32_t flags; // 0x20 = hide symbol
|
||||
// 18
|
||||
uint32_t display_character; // really? 4 bytes for that?
|
||||
// 1C
|
||||
uint32_t type; // possibly an enum, decides what vectors to use for imagery
|
||||
// 20
|
||||
uint32_t subtype_idx; // index in a vector kind of deal related to previous value
|
||||
};
|
||||
/**
|
||||
* structure for holding a DF engraving
|
||||
* \ingroup grp_engraving
|
||||
*/
|
||||
struct dfh_engraving
|
||||
{
|
||||
t_engraving s;
|
||||
uint32_t origin;
|
||||
};
|
||||
class DFContextShared;
|
||||
/**
|
||||
* The Engravings module - allows reading engravings :D
|
||||
* \ingroup grp_modules
|
||||
* \ingroup grp_engraving
|
||||
*/
|
||||
class DFHACK_EXPORT Engravings : public Module
|
||||
{
|
||||
public:
|
||||
Engravings(DFContextShared * d);
|
||||
~Engravings();
|
||||
bool Start(uint32_t & numEngravings);
|
||||
bool Read (const uint32_t index, dfh_engraving & engr);
|
||||
bool Write (const dfh_engraving & engr);
|
||||
bool Finish();
|
||||
|
||||
private:
|
||||
struct Private;
|
||||
Private *d;
|
||||
};
|
||||
}
|
||||
#endif
|
@ -0,0 +1,115 @@
|
||||
/*
|
||||
www.sourceforge.net/projects/dfhack
|
||||
Copyright (c) 2009 Petr Mrázek (peterix), Kenneth Ferland (Impaler[WrG]), dorf
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any
|
||||
damages arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any
|
||||
purpose, including commercial applications, and to alter it and
|
||||
redistribute it freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product documentation
|
||||
would be appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and
|
||||
must not be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
|
||||
#include "Internal.h"
|
||||
#include "ContextShared.h"
|
||||
|
||||
#include "dfhack/VersionInfo.h"
|
||||
#include "dfhack/DFProcess.h"
|
||||
#include "dfhack/DFVector.h"
|
||||
#include "dfhack/DFTypes.h"
|
||||
#include "dfhack/modules/Engravings.h"
|
||||
#include "ModuleFactory.h"
|
||||
|
||||
using namespace DFHack;
|
||||
|
||||
struct Engravings::Private
|
||||
{
|
||||
uint32_t engraving_vector;
|
||||
// translation
|
||||
DfVector <uint32_t> * p_engr;
|
||||
|
||||
DFContextShared *d;
|
||||
Process * owner;
|
||||
bool Inited;
|
||||
bool Started;
|
||||
};
|
||||
|
||||
Module* DFHack::createEngravings(DFContextShared * d)
|
||||
{
|
||||
return new Engravings(d);
|
||||
}
|
||||
|
||||
Engravings::Engravings(DFContextShared * d_)
|
||||
{
|
||||
d = new Private;
|
||||
d->d = d_;
|
||||
d->owner = d_->p;
|
||||
d->p_engr = 0;
|
||||
d->Inited = d->Started = false;
|
||||
VersionInfo * mem = d->d->offset_descriptor;
|
||||
d->engraving_vector = mem->getGroup("Engravings")->getAddress ("vector");
|
||||
d->Inited = true;
|
||||
}
|
||||
|
||||
Engravings::~Engravings()
|
||||
{
|
||||
if(d->Started)
|
||||
Finish();
|
||||
delete d;
|
||||
}
|
||||
|
||||
bool Engravings::Start(uint32_t & numengravings)
|
||||
{
|
||||
d->p_engr = new DfVector <uint32_t> (d->owner, d->engraving_vector);
|
||||
numengravings = d->p_engr->size();
|
||||
d->Started = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Engravings::Read (const uint32_t index, dfh_engraving & engraving)
|
||||
{
|
||||
if(!d->Started) return false;
|
||||
|
||||
// read pointer from vector at position
|
||||
uint32_t temp = d->p_engr->at (index);
|
||||
|
||||
//read construction from memory
|
||||
d->owner->read (temp, sizeof (t_engraving), (uint8_t *) &(engraving.s));
|
||||
|
||||
// transform
|
||||
engraving.origin = temp;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Engravings::Write (const dfh_engraving & engraving)
|
||||
{
|
||||
if(!d->Started) return false;
|
||||
//write engraving to memory
|
||||
d->owner->write (engraving.origin, sizeof (t_engraving), (uint8_t *) &(engraving.s));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Engravings::Finish()
|
||||
{
|
||||
if(d->p_engr)
|
||||
{
|
||||
delete d->p_engr;
|
||||
d->p_engr = NULL;
|
||||
}
|
||||
d->Started = false;
|
||||
return true;
|
||||
}
|
||||
|
@ -0,0 +1,78 @@
|
||||
// Just show some position data
|
||||
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <climits>
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
#include <ctime>
|
||||
#include <cstdio>
|
||||
#include <stdio.h>
|
||||
|
||||
#define DFHACK_WANT_MISCUTILS
|
||||
#include <DFHack.h>
|
||||
using namespace DFHack;
|
||||
|
||||
int main (int numargs, const char ** args)
|
||||
{
|
||||
DFHack::ContextManager DFMgr("Memory.xml");
|
||||
DFHack::Context* DF;
|
||||
try
|
||||
{
|
||||
DF = DFMgr.getSingleContext();
|
||||
DF->Attach();
|
||||
}
|
||||
catch (std::exception& e)
|
||||
{
|
||||
std::cerr << e.what() << std::endl;
|
||||
#ifndef LINUX_BUILD
|
||||
cin.ignore();
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
DFHack::Gui *Gui = DF->getGui();
|
||||
|
||||
DFHack::Engravings *Cons = DF->getEngravings();
|
||||
uint32_t numEngr;
|
||||
Cons->Start(numEngr);
|
||||
|
||||
int32_t cx, cy, cz;
|
||||
Gui->getCursorCoords(cx,cy,cz);
|
||||
if(cx != -30000)
|
||||
{
|
||||
dfh_engraving engraved;
|
||||
t_engraving &data = engraved.s;
|
||||
for(uint32_t i = 0; i < numEngr; i++)
|
||||
{
|
||||
Cons->Read(i,engraved);
|
||||
if(cx == data.x && cy == data.y && cz == data.z)
|
||||
{
|
||||
printf("Engraving %d/%d/%d @ 0x%x\n", data.x, data.y, data.z, engraved.origin);
|
||||
// inorganic stuff - we can recognize that
|
||||
printf("type %d, index %d, character %c\n",data.type, data.subtype_idx, data.display_character);
|
||||
hexdump(DF,engraved.origin,2);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dfh_engraving engraved;
|
||||
t_engraving &data = engraved.s;
|
||||
for(uint32_t i = 0; i < numEngr; i++)
|
||||
{
|
||||
Cons->Read(i,engraved);
|
||||
{
|
||||
printf("Engraving %d/%d/%d @ 0x%x\n", data.x, data.y, data.z, engraved.origin);
|
||||
// inorganic stuff - we can recognize that
|
||||
printf("type %d, index %d, character %c\n",data.type, data.subtype_idx, data.display_character);
|
||||
hexdump(DF,engraved.origin,2);
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifndef LINUX_BUILD
|
||||
cout << "Done. Press any key to continue" << endl;
|
||||
cin.ignore();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue