@ -55,6 +55,9 @@ using namespace std;
# include "df/historical_entity.h"
# include "df/historical_figure.h"
# include "df/historical_figure_info.h"
# include "df/entity_position.h"
# include "df/entity_position_assignment.h"
# include "df/histfig_entity_link_positionst.h"
# include "df/assumed_identity.h"
# include "df/burrow.h"
# include "df/creature_raw.h"
@ -762,14 +765,85 @@ double DFHack::Units::getAge(df::unit *unit, bool true_age)
return cur_time - birth_time ;
}
std : : string DFHack : : Units : : getProfessionName ( df : : unit * unit , bool plural )
static bool noble_pos_compare ( const Units : : NoblePosition & a , const Units : : NoblePosition & b )
{
if ( a . position - > precedence < b . position - > precedence )
return true ;
if ( a . position - > precedence > b . position - > precedence )
return false ;
return a . position - > id < b . position - > id ;
}
bool DFHack : : Units : : getNoblePositions ( std : : vector < NoblePosition > * pvec , df : : unit * unit )
{
CHECK_NULL_POINTER ( unit ) ;
pvec - > clear ( ) ;
auto histfig = df : : historical_figure : : find ( unit - > hist_figure_id ) ;
if ( ! histfig )
return false ;
for ( size_t i = 0 ; i < histfig - > entity_links . size ( ) ; i + + )
{
auto link = histfig - > entity_links [ i ] ;
auto epos = strict_virtual_cast < df : : histfig_entity_link_positionst > ( link ) ;
if ( ! epos )
continue ;
NoblePosition pos ;
pos . entity = df : : historical_entity : : find ( epos - > entity_id ) ;
if ( ! pos . entity )
continue ;
pos . assignment = binsearch_in_vector ( pos . entity - > positions . assignments , epos - > assignment_id ) ;
if ( ! pos . assignment )
continue ;
pos . position = binsearch_in_vector ( pos . entity - > positions . own , pos . assignment - > position_id ) ;
if ( ! pos . position )
continue ;
pvec - > push_back ( pos ) ;
}
if ( pvec - > empty ( ) )
return false ;
std : : sort ( pvec - > begin ( ) , pvec - > end ( ) , noble_pos_compare ) ;
return true ;
}
std : : string DFHack : : Units : : getProfessionName ( df : : unit * unit , bool ignore_noble , bool plural )
{
std : : string prof = unit - > custom_profession ;
if ( ! prof . empty ( ) )
return prof ;
if ( prof . empty ( ) )
prof = getCasteProfessionName ( unit - > race , unit - > caste , unit - > profession , plural ) ;
std : : vector < NoblePosition > np ;
if ( ! ignore_noble & & getNoblePositions ( & np , unit ) )
{
switch ( unit - > sex )
{
case 0 :
prof = np [ 0 ] . position - > name_female [ plural ? 1 : 0 ] ;
break ;
case 1 :
prof = np [ 0 ] . position - > name_male [ plural ? 1 : 0 ] ;
break ;
default :
break ;
}
if ( prof . empty ( ) )
prof = np [ 0 ] . position - > name [ plural ? 1 : 0 ] ;
if ( ! prof . empty ( ) )
return prof ;
}
return prof ;
return getCasteProfessionName ( unit - > race , unit - > caste , unit - > prof ession, plural ) ;
}
std : : string DFHack : : Units : : getCasteProfessionName ( int race , int casteid , df : : profession pid , bool plural )