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