2009-10-23 04:54:24 -06:00
// Creature dump
# include <iostream>
2009-10-23 10:50:36 -06:00
# include <climits>
2009-10-23 04:54:24 -06:00
# include <integers.h>
# include <vector>
using namespace std ;
2010-03-26 06:01:46 -06:00
# include <DFError.h>
2009-10-23 04:54:24 -06:00
# include <DFTypes.h>
# include <DFHackAPI.h>
2009-11-13 20:46:56 -07:00
# include <DFMemInfo.h>
2010-04-04 16:48:19 -06:00
# include <modules/Materials.h>
# include <modules/Creatures.h>
2009-10-23 04:54:24 -06:00
2009-10-23 10:50:36 -06:00
template < typename T >
void print_bits ( T val , std : : ostream & out )
{
T n_bits = sizeof ( val ) * CHAR_BIT ;
for ( unsigned i = 0 ; i < n_bits ; + + i ) {
out < < ! ! ( val & 1 ) < < " " ;
val > > = 1 ;
}
}
2009-12-31 19:14:41 -07:00
struct matGlosses
{
vector < DFHack : : t_matglossPlant > plantMat ;
vector < DFHack : : t_matgloss > woodMat ;
vector < DFHack : : t_matgloss > stoneMat ;
vector < DFHack : : t_matgloss > metalMat ;
vector < DFHack : : t_matgloss > creatureMat ;
} ;
enum likeType
{
FAIL = 0 ,
MATERIAL = 1 ,
ITEM = 2 ,
FOOD = 3
} ;
2010-03-12 07:21:45 -07:00
vector < DFHack : : t_matgloss > creaturestypes ;
matGlosses mat ;
vector < vector < DFHack : : t_itemType > > itemTypes ;
DFHack : : memory_info * mem ;
2010-03-13 07:09:14 -07:00
vector < vector < string > > englishWords ;
vector < vector < string > > foreignWords ;
2010-04-04 04:29:56 -06:00
/*
likeType printLike40d ( DFHack : : t_like like , const matGlosses & mat , const vector < vector < DFHack : : t_itemType > > & itemTypes )
2009-12-31 19:14:41 -07:00
{ // The function in DF which prints out the likes is a monster, it is a huge switch statement with tons of options and calls a ton of other functions as well,
//so I am not going to try and put all the possibilites here, only the low hanging fruit, with stones and metals, as well as items,
//you can easily find good canidates for military duty for instance
//The ideal thing to do would be to call the df function directly with the desired likes, the df function modifies a string, so it should be possible to do...
if ( like . active ) {
if ( like . type = = 0 ) {
switch ( like . material . type )
{
case 0 :
cout < < mat . woodMat [ like . material . index ] . name ;
return ( MATERIAL ) ;
case 1 :
cout < < mat . stoneMat [ like . material . index ] . name ;
return ( MATERIAL ) ;
case 2 :
cout < < mat . metalMat [ like . material . index ] . name ;
return ( MATERIAL ) ;
case 12 : // don't ask me why this has such a large jump, maybe this is not actually the matType for plants, but they all have this set to 12
cout < < mat . plantMat [ like . material . index ] . name ;
return ( MATERIAL ) ;
case 32 :
cout < < mat . plantMat [ like . material . index ] . name ;
return ( MATERIAL ) ;
case 121 :
cout < < mat . creatureMat [ like . material . index ] . name ;
return ( MATERIAL ) ;
default :
return ( FAIL ) ;
}
}
else if ( like . type = = 4 & & like . itemIndex ! = - 1 ) {
switch ( like . itemClass )
{
case 24 :
cout < < itemTypes [ 0 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
case 25 :
cout < < itemTypes [ 4 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
case 26 :
cout < < itemTypes [ 8 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
case 27 :
cout < < itemTypes [ 9 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
case 28 :
cout < < itemTypes [ 10 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
case 29 :
cout < < itemTypes [ 7 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
case 38 :
cout < < itemTypes [ 5 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
case 63 :
cout < < itemTypes [ 11 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
case 68 :
case 69 :
cout < < itemTypes [ 6 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
case 70 :
cout < < itemTypes [ 1 ] [ like . itemIndex ] . name ;
return ( ITEM ) ;
default :
// cout << like.itemClass << ":" << like.itemIndex;
return ( FAIL ) ;
}
}
else if ( like . material . type ! = - 1 ) { // && like.material.index == -1){
if ( like . type = = 2 ) {
switch ( like . itemClass )
{
case 52 :
case 53 :
case 58 :
cout < < mat . plantMat [ like . material . type ] . name ;
return ( FOOD ) ;
case 72 :
if ( like . material . type = ! 10 ) { // 10 is for milk stuff, which I don't know how to do
cout < < mat . plantMat [ like . material . index ] . extract_name ;
return ( FOOD ) ;
}
return ( FAIL ) ;
case 74 :
cout < < mat . plantMat [ like . material . index ] . drink_name ;
return ( FOOD ) ;
case 75 :
cout < < mat . plantMat [ like . material . index ] . food_name ;
return ( FOOD ) ;
case 47 :
case 48 :
cout < < mat . creatureMat [ like . material . type ] . name ;
return ( FOOD ) ;
default :
return ( FAIL ) ;
}
}
}
}
return ( FAIL ) ;
}
2010-04-04 04:29:56 -06:00
*/
2009-10-23 10:50:36 -06:00
2010-03-12 07:21:45 -07:00
void printCreature ( DFHack : : API & DF , const DFHack : : t_creature & creature )
{
2010-03-26 06:01:46 -06:00
cout < < " address: " < < hex < < creature . origin < < dec < < " creature type: " < < creaturestypes [ creature . type ] . id < < " , position: " < < creature . x < < " x " < < creature . y < < " y " < < creature . z < < " z " < < endl ;
2010-03-12 07:21:45 -07:00
bool addendl = false ;
2010-03-13 07:09:14 -07:00
if ( creature . name . first_name [ 0 ] )
2010-03-12 07:21:45 -07:00
{
2010-03-13 07:09:14 -07:00
cout < < " first name: " < < creature . name . first_name ;
2010-03-12 07:21:45 -07:00
addendl = true ;
}
2010-03-13 07:09:14 -07:00
if ( creature . name . nickname [ 0 ] )
2010-03-12 07:21:45 -07:00
{
2010-03-13 07:09:14 -07:00
cout < < " , nick name: " < < creature . name . nickname ;
2010-03-12 07:21:45 -07:00
addendl = true ;
}
2010-04-04 04:29:56 -06:00
/*
2010-03-13 07:09:14 -07:00
string transName = DF . TranslateName ( creature . name , englishWords , foreignWords , false ) ;
2010-03-12 07:21:45 -07:00
if ( ! transName . empty ( ) )
{
cout < < " , trans name: " < < transName ;
addendl = true ;
}
2010-04-04 04:29:56 -06:00
*/
/*
2010-03-12 07:21:45 -07:00
cout < < " , likes: " ;
for ( uint32_t i = 0 ; i < creature . numLikes ; i + + )
{
if ( printLike ( creature . likes [ i ] , mat , itemTypes ) )
{
cout < < " , " ;
}
2010-04-04 04:29:56 -06:00
}
*/
2010-03-12 07:21:45 -07:00
if ( addendl )
{
cout < < endl ;
addendl = false ;
}
2010-04-04 04:43:11 -06:00
cout < < " profession: " < < mem - > getProfession ( creature . profession ) < < " ( " < < ( int ) creature . profession < < " ) " ;
2010-04-04 04:29:56 -06:00
/*
2010-03-12 07:21:45 -07:00
if ( creature . custom_profession [ 0 ] )
{
cout < < " , custom profession: " < < creature . custom_profession ;
}
if ( creature . current_job . active )
{
cout < < " , current job: " < < mem - > getJob ( creature . current_job . jobId ) ;
}
2010-04-04 04:29:56 -06:00
*/
2010-03-12 07:21:45 -07:00
cout < < endl ;
2010-04-04 04:29:56 -06:00
cout < < " happiness: " < < creature . happiness /*<< ", strength: " << creature.strength << ", agility: "
< < creature . agility < < " , toughness: " < < creature . toughness < < " , money: " < < creature . money */ < < " , id: " < < creature . id ;
/*
2010-03-12 07:21:45 -07:00
if ( creature . squad_leader_id ! = - 1 )
{
cout < < " , squad_leader_id: " < < creature . squad_leader_id ;
}
2010-03-14 11:21:26 -06:00
if ( creature . mood ! = - 1 ) {
cout < < " , mood: " < < creature . mood < < " " ;
2010-04-04 04:29:56 -06:00
} */
2010-03-12 07:21:45 -07:00
cout < < " , sex: " ;
if ( creature . sex = = 0 )
{
cout < < " Female " ;
}
else
{
cout < < " Male " ;
}
cout < < endl ;
2010-04-04 04:29:56 -06:00
/*
2010-03-26 06:01:46 -06:00
if ( creature . pregnancy_timer > 0 )
cout < < " gives birth in " < < creature . pregnancy_timer / 1200 < < " days. " ;
cout < < " Blood: " < < creature . blood_current < < " / " < < creature . blood_max < < " bleeding: " < < creature . bleed_rate ;
2010-04-04 04:29:56 -06:00
*/
2010-03-26 06:01:46 -06:00
cout < < endl ;
2010-03-21 14:47:24 -06:00
2010-03-12 07:21:45 -07:00
/*
//skills
for ( unsigned int i = 0 ; i < creature . skills . size ( ) ; i + + ) {
if ( i > 0 ) {
cout < < " , " ;
}
cout < < creature . skills [ i ] . name < < " : " < < creature . skills [ i ] . rating ;
}
*/
/*
* FLAGS 1
*/
cout < < " flags1: " ;
print_bits ( creature . flags1 . whole , cout ) ;
cout < < endl ;
if ( creature . flags1 . bits . dead )
{
cout < < " dead " ;
}
if ( creature . flags1 . bits . on_ground )
{
cout < < " on the ground, " ;
}
if ( creature . flags1 . bits . skeleton )
{
cout < < " skeletal " ;
}
if ( creature . flags1 . bits . zombie )
{
cout < < " zombie " ;
}
if ( creature . flags1 . bits . tame )
{
cout < < " tame " ;
}
if ( creature . flags1 . bits . royal_guard )
{
cout < < " royal_guard " ;
}
if ( creature . flags1 . bits . fortress_guard )
{
cout < < " fortress_guard " ;
}
/*
* FLAGS 2
*/
cout < < endl < < " flags2: " ;
print_bits ( creature . flags2 . whole , cout ) ;
cout < < endl ;
if ( creature . flags2 . bits . killed )
{
cout < < " killed by kill function, " ;
}
if ( creature . flags2 . bits . resident )
{
cout < < " resident, " ;
}
if ( creature . flags2 . bits . gutted )
{
cout < < " gutted, " ;
}
if ( creature . flags2 . bits . slaughter )
{
cout < < " marked for slaughter, " ;
}
if ( creature . flags2 . bits . underworld )
{
cout < < " from the underworld, " ;
}
2010-03-14 11:21:26 -06:00
cout < < endl ;
2010-04-04 04:29:56 -06:00
/*
if ( creature . flags1 . bits . had_mood & & ( creature . mood = = - 1 | | creature . mood = = 8 ) )
{
2010-03-14 11:21:26 -06:00
string artifact_name = DF . TranslateName ( creature . artifact_name , englishWords , foreignWords , false ) ;
cout < < " artifact: " < < artifact_name < < endl ;
2010-04-04 04:29:56 -06:00
} */
2010-03-14 11:21:26 -06:00
cout < < endl ;
2010-03-12 07:21:45 -07:00
}
2009-10-23 04:54:24 -06:00
int main ( void )
{
2009-11-10 20:37:28 -07:00
DFHack : : API DF ( " Memory.xml " ) ;
2010-03-26 06:01:46 -06:00
try
{
DF . Attach ( ) ;
}
catch ( exception & e )
2009-10-23 04:54:24 -06:00
{
2010-03-26 06:01:46 -06:00
cerr < < e . what ( ) < < endl ;
# ifndef LINUX_BUILD
cin . ignore ( ) ;
# endif
2009-10-23 04:54:24 -06:00
return 1 ;
}
2010-02-11 14:08:39 -07:00
2010-04-04 16:48:19 -06:00
DFHack : : Creatures * Creatures = DF . getCreatures ( ) ;
DFHack : : Materials * Materials = DF . getMaterials ( ) ;
2010-03-26 06:38:49 -06:00
uint32_t numCreatures ;
2010-04-04 16:48:19 -06:00
if ( ! Creatures - > Start ( numCreatures ) )
2010-03-26 06:38:49 -06:00
{
cerr < < " Can't get creatures " < < endl ;
# ifndef LINUX_BUILD
cin . ignore ( ) ;
# endif
return 1 ;
}
if ( ! numCreatures )
{
cerr < < " No creatures to print " < < endl ;
# ifndef LINUX_BUILD
cin . ignore ( ) ;
# endif
return 1 ;
}
2010-04-04 04:29:56 -06:00
/*
2009-12-31 19:14:41 -07:00
DF . ReadItemTypes ( itemTypes ) ;
DF . ReadPlantMatgloss ( mat . plantMat ) ;
DF . ReadWoodMatgloss ( mat . woodMat ) ;
DF . ReadStoneMatgloss ( mat . stoneMat ) ;
DF . ReadMetalMatgloss ( mat . metalMat ) ;
DF . ReadCreatureMatgloss ( mat . creatureMat ) ;
2010-04-04 04:29:56 -06:00
*/
2010-03-12 07:21:45 -07:00
mem = DF . getMemoryInfo ( ) ;
2009-10-23 04:54:24 -06:00
// get stone matgloss mapping
2010-04-04 16:48:19 -06:00
if ( ! Materials - > ReadCreatureTypes ( creaturestypes ) )
2009-10-23 04:54:24 -06:00
{
cerr < < " Can't get the creature types. " < < endl ;
return 1 ;
}
2010-04-04 04:29:56 -06:00
/*
2010-03-07 19:01:30 -07:00
if ( ! DF . InitReadNameTables ( englishWords , foreignWords ) )
2010-02-11 14:08:39 -07:00
{
cerr < < " Can't get name tables " < < endl ;
return 1 ;
}
2010-04-04 04:29:56 -06:00
*/
//DF.InitViewAndCursor();
2009-10-23 04:54:24 -06:00
for ( uint32_t i = 0 ; i < numCreatures ; i + + )
{
2009-12-12 17:47:58 -07:00
DFHack : : t_creature temp ;
2010-04-04 16:48:19 -06:00
Creatures - > ReadCreature ( i , temp ) ;
2010-04-02 07:47:08 -06:00
//if(string(creaturestypes[temp.type].id) == "DWARF")
2010-03-29 18:26:52 -06:00
{
cout < < " index " < < i < < " " ;
printCreature ( DF , temp ) ;
}
2009-12-31 19:30:35 -07:00
}
2010-04-04 04:29:56 -06:00
/*
2010-03-12 07:21:45 -07:00
uint32_t currentIdx ;
DFHack : : t_creature currentCreature ;
DF . getCurrentCursorCreature ( currentIdx ) ;
2010-03-14 11:21:26 -06:00
cout < < " current creature at index " < < currentIdx < < endl ;
2010-03-12 07:21:45 -07:00
DF . ReadCreature ( currentIdx , currentCreature ) ;
printCreature ( DF , currentCreature ) ;
2010-04-04 04:29:56 -06:00
*/
2010-04-04 16:48:19 -06:00
Creatures - > Finish ( ) ;
2009-10-31 12:09:13 -06:00
DF . Detach ( ) ;
2009-11-05 18:04:17 -07:00
# ifndef LINUX_BUILD
2009-10-30 03:01:14 -06:00
cout < < " Done. Press any key to continue " < < endl ;
cin . ignore ( ) ;
2009-11-05 18:04:17 -07:00
# endif
2009-10-23 04:54:24 -06:00
return 0 ;
2009-12-13 14:03:19 -07:00
}