@ -36,6 +36,12 @@ enum likeType
FOOD = 3
FOOD = 3
} ;
} ;
vector < DFHack : : t_matgloss > creaturestypes ;
matGlosses mat ;
vector < vector < DFHack : : t_itemType > > itemTypes ;
map < string , vector < string > > names ;
DFHack : : memory_info * mem ;
likeType printLike ( DFHack : : t_like like , const matGlosses & mat , const vector < vector < DFHack : : t_itemType > > & itemTypes )
likeType printLike ( DFHack : : t_like like , const matGlosses & mat , const vector < vector < DFHack : : t_itemType > > & itemTypes )
{ // 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,
{ // 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,
//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,
@ -141,85 +147,43 @@ likeType printLike(DFHack::t_like like, const matGlosses & mat,const vector< vec
}
}
int main ( void )
void printCreature ( DFHack : : API & DF , const DFHack : : t_creature & creature )
{
{
vector < DFHack : : t_matgloss > creaturestypes ;
if ( string ( creaturestypes [ creature . type ] . id ) = = " DWARF " )
DFHack : : API DF ( " Memory.xml " ) ;
if ( ! DF . Attach ( ) )
{
{
cerr < < " DF not found " < < endl ;
cout < < " address: " < < creature . origin < < " creature type: " < < creaturestypes [ creature . type ] . id < < " , position: " < < creature . x < < " x " < < creature . y < < " y " < < creature . z < < " z " < < endl ;
return 1 ;
}
vector < vector < DFHack : : t_itemType > > itemTypes ;
DF . ReadItemTypes ( itemTypes ) ;
matGlosses mat ;
DF . ReadPlantMatgloss ( mat . plantMat ) ;
DF . ReadWoodMatgloss ( mat . woodMat ) ;
DF . ReadStoneMatgloss ( mat . stoneMat ) ;
DF . ReadMetalMatgloss ( mat . metalMat ) ;
DF . ReadCreatureMatgloss ( mat . creatureMat ) ;
DFHack : : memory_info * mem = DF . getMemoryInfo ( ) ;
// get stone matgloss mapping
if ( ! DF . ReadCreatureMatgloss ( creaturestypes ) )
{
cerr < < " Can't get the creature types. " < < endl ;
return 1 ;
}
map < string , vector < string > > names ;
if ( ! DF . InitReadNameTables ( names ) )
{
cerr < < " Can't get name tables " < < endl ;
return 1 ;
}
uint32_t numCreatures ;
if ( ! DF . InitReadCreatures ( numCreatures ) )
{
cerr < < " Can't get creatures " < < endl ;
return 1 ;
}
for ( uint32_t i = 0 ; i < numCreatures ; i + + )
{
DFHack : : t_creature temp ;
DF . ReadCreature ( i , temp ) ;
if ( string ( creaturestypes [ temp . type ] . id ) = = " DWARF " )
{
cout < < " address: " < < temp . origin < < " creature type: " < < creaturestypes [ temp . type ] . id < < " , position: " < < temp . x < < " x " < < temp . y < < " y " < < temp . z < < " z " < < endl ;
bool addendl = false ;
bool addendl = false ;
if ( temp . first_name [ 0 ] )
if ( creature . first_name [ 0 ] )
{
{
cout < < " first name: " < < temp . first_name ;
cout < < " first name: " < < creature . first_name ;
addendl = true ;
addendl = true ;
}
}
if ( temp . nick_name [ 0 ] )
if ( creature . nick_name [ 0 ] )
{
{
cout < < " , nick name: " < < temp . nick_name ;
cout < < " , nick name: " < < creature . nick_name ;
addendl = true ;
addendl = true ;
}
}
string transName = DF . TranslateName ( temp . last_name , names , creaturestypes [ temp . type ] . id ) ;
string transName = DF . TranslateName ( creature . last_name , names , creaturestypes [ creature . type ] . id ) ;
if ( ! transName . empty ( ) )
if ( ! transName . empty ( ) )
{
{
cout < < " , trans name: " < < transName ;
cout < < " , trans name: " < < transName ;
addendl = true ;
addendl = true ;
}
}
//cout << ", generic name: " << DF.TranslateName( temp .last_name,names,"GENERIC");
//cout << ", generic name: " << DF.TranslateName(creature.last_name,names,"GENERIC");
/*
/*
if ( ! temp . trans_name . empty ( ) ) {
if ( ! creature . trans_name . empty ( ) ) {
cout < < " , trans name: " < < temp . trans_name ;
cout < < " , trans name: " < < creature . trans_name ;
addendl = true ;
addendl = true ;
}
}
if ( ! temp . generic_name . empty ( ) ) {
if ( ! creature . generic_name . empty ( ) ) {
cout < < " , generic name: " < < temp . generic_name ;
cout < < " , generic name: " < < creature . generic_name ;
addendl = true ;
addendl = true ;
}
}
*/
*/
cout < < " , likes: " ;
cout < < " , likes: " ;
for ( uint32_t i = 0 ; i < temp . numLikes ; i + + )
for ( uint32_t i = 0 ; i < creature . numLikes ; i + + )
{
{
if ( printLike ( temp . likes [ i ] , mat , itemTypes ) )
if ( printLike ( creature . likes [ i ] , mat , itemTypes ) )
{
{
cout < < " , " ;
cout < < " , " ;
}
}
@ -229,24 +193,24 @@ int main (void)
cout < < endl ;
cout < < endl ;
addendl = false ;
addendl = false ;
}
}
cout < < " profession: " < < mem - > getProfession ( temp . profession ) < < " ( " < < ( int ) temp . profession < < " ) " ;
cout < < " profession: " < < mem - > getProfession ( crea tur e. profession ) < < " ( " < < ( int ) crea tur e. profession < < " ) " ;
if ( temp . custom_profession [ 0 ] )
if ( crea tur e. custom_profession [ 0 ] )
{
{
cout < < " , custom profession: " < < temp . custom_profession ;
cout < < " , custom profession: " < < crea tur e. custom_profession ;
}
}
if ( temp . current_job . active )
if ( crea tur e. current_job . active )
{
{
cout < < " , current job: " < < mem - > getJob ( temp . current_job . jobId ) ;
cout < < " , current job: " < < mem - > getJob ( crea tur e. current_job . jobId ) ;
}
}
cout < < endl ;
cout < < endl ;
cout < < " happiness: " < < temp . happiness < < " , strength: " < < temp . strength < < " , agility: "
cout < < " happiness: " < < crea tur e. happiness < < " , strength: " < < crea tur e. strength < < " , agility: "
< < temp . agility < < " , toughness: " < < temp . toughness < < " , money: " < < temp . money < < " , id: " < < temp . id ;
< < crea tur e. agility < < " , toughness: " < < crea tur e. toughness < < " , money: " < < crea tur e. money < < " , id: " < < crea tur e. id ;
if ( temp . squad_leader_id ! = - 1 )
if ( crea tur e. squad_leader_id ! = - 1 )
{
{
cout < < " , squad_leader_id: " < < temp . squad_leader_id ;
cout < < " , squad_leader_id: " < < crea tur e. squad_leader_id ;
}
}
cout < < " , sex: " ;
cout < < " , sex: " ;
if ( temp . sex = = 0 )
if ( crea tur e. sex = = 0 )
{
{
cout < < " Female " ;
cout < < " Female " ;
}
}
@ -257,44 +221,44 @@ int main (void)
cout < < endl ;
cout < < endl ;
/*
/*
//skills
//skills
for ( unsigned int i = 0 ; i < temp . skills . size ( ) ; i + + ) {
for ( unsigned int i = 0 ; i < crea tur e. skills . size ( ) ; i + + ) {
if ( i > 0 ) {
if ( i > 0 ) {
cout < < " , " ;
cout < < " , " ;
}
}
cout < < temp . skills [ i ] . name < < " : " < < temp . skills [ i ] . rating ;
cout < < crea tur e. skills [ i ] . name < < " : " < < crea tur e. skills [ i ] . rating ;
}
}
*/
*/
/*
/*
* FLAGS 1
* FLAGS 1
*/
*/
cout < < " flags1: " ;
cout < < " flags1: " ;
print_bits ( temp . flags1 . whole , cout ) ;
print_bits ( crea tur e. flags1 . whole , cout ) ;
cout < < endl ;
cout < < endl ;
if ( temp . flags1 . bits . dead )
if ( crea tur e. flags1 . bits . dead )
{
{
cout < < " dead " ;
cout < < " dead " ;
}
}
if ( temp . flags1 . bits . on_ground )
if ( crea tur e. flags1 . bits . on_ground )
{
{
cout < < " on the ground, " ;
cout < < " on the ground, " ;
}
}
if ( temp . flags1 . bits . skeleton )
if ( crea tur e. flags1 . bits . skeleton )
{
{
cout < < " skeletal " ;
cout < < " skeletal " ;
}
}
if ( temp . flags1 . bits . zombie )
if ( crea tur e. flags1 . bits . zombie )
{
{
cout < < " zombie " ;
cout < < " zombie " ;
}
}
if ( temp . flags1 . bits . tame )
if ( crea tur e. flags1 . bits . tame )
{
{
cout < < " tame " ;
cout < < " tame " ;
}
}
if ( temp . flags1 . bits . royal_guard )
if ( crea tur e. flags1 . bits . royal_guard )
{
{
cout < < " royal_guard " ;
cout < < " royal_guard " ;
}
}
if ( temp . flags1 . bits . fortress_guard )
if ( crea tur e. flags1 . bits . fortress_guard )
{
{
cout < < " fortress_guard " ;
cout < < " fortress_guard " ;
}
}
@ -302,31 +266,85 @@ int main (void)
* FLAGS 2
* FLAGS 2
*/
*/
cout < < endl < < " flags2: " ;
cout < < endl < < " flags2: " ;
print_bits ( temp . flags2 . whole , cout ) ;
print_bits ( crea tur e. flags2 . whole , cout ) ;
cout < < endl ;
cout < < endl ;
if ( temp . flags2 . bits . killed )
if ( crea tur e. flags2 . bits . killed )
{
{
cout < < " killed by kill function, " ;
cout < < " killed by kill function, " ;
}
}
if ( temp . flags2 . bits . resident )
if ( crea tur e. flags2 . bits . resident )
{
{
cout < < " resident, " ;
cout < < " resident, " ;
}
}
if ( temp . flags2 . bits . gutted )
if ( crea tur e. flags2 . bits . gutted )
{
{
cout < < " gutted, " ;
cout < < " gutted, " ;
}
}
if ( temp . flags2 . bits . slaughter )
if ( crea tur e. flags2 . bits . slaughter )
{
{
cout < < " marked for slaughter, " ;
cout < < " marked for slaughter, " ;
}
}
if ( temp . flags2 . bits . underworld )
if ( crea tur e. flags2 . bits . underworld )
{
{
cout < < " from the underworld, " ;
cout < < " from the underworld, " ;
}
}
cout < < endl < < endl ;
cout < < endl < < endl ;
}
}
}
int main ( void )
{
DFHack : : API DF ( " Memory.xml " ) ;
if ( ! DF . Attach ( ) )
{
cerr < < " DF not found " < < endl ;
return 1 ;
}
DF . ReadItemTypes ( itemTypes ) ;
DF . ReadPlantMatgloss ( mat . plantMat ) ;
DF . ReadWoodMatgloss ( mat . woodMat ) ;
DF . ReadStoneMatgloss ( mat . stoneMat ) ;
DF . ReadMetalMatgloss ( mat . metalMat ) ;
DF . ReadCreatureMatgloss ( mat . creatureMat ) ;
mem = DF . getMemoryInfo ( ) ;
// get stone matgloss mapping
if ( ! DF . ReadCreatureMatgloss ( creaturestypes ) )
{
cerr < < " Can't get the creature types. " < < endl ;
return 1 ;
}
if ( ! DF . InitReadNameTables ( names ) )
{
cerr < < " Can't get name tables " < < endl ;
return 1 ;
}
uint32_t numCreatures ;
if ( ! DF . InitReadCreatures ( numCreatures ) )
{
cerr < < " Can't get creatures " < < endl ;
return 1 ;
}
}
DF . InitViewAndCursor ( ) ;
for ( uint32_t i = 0 ; i < numCreatures ; i + + )
{
DFHack : : t_creature temp ;
DF . ReadCreature ( i , temp ) ;
printCreature ( DF , temp ) ;
}
uint32_t currentIdx ;
DFHack : : t_creature currentCreature ;
DF . getCurrentCursorCreature ( currentIdx ) ;
cout < < " current creature " < < endl ;
DF . ReadCreature ( currentIdx , currentCreature ) ;
printCreature ( DF , currentCreature ) ;
DF . FinishReadCreatures ( ) ;
DF . FinishReadCreatures ( ) ;
DF . Detach ( ) ;
DF . Detach ( ) ;
# ifndef LINUX_BUILD
# ifndef LINUX_BUILD