Skip to content

Commit

Permalink
Monster lore: display additional monster details
Browse files Browse the repository at this point in the history
  • Loading branch information
dseguin committed Apr 8, 2022
1 parent f3532d5 commit 60a14f6
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 3 deletions.
7 changes: 4 additions & 3 deletions src/faction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -891,11 +891,12 @@ void faction_manager::display() const
for( size_t i = top_of_page; i < active_vec_size && i < top_of_page + entries_per_page; i++ ) {
const int y = i - top_of_page + 3;
trim_and_print( w_missions, point( 1, y ), 28, selection == i ? hilite( col ) : col,
creatures[i]->nname() );
string_format( "%s %s", colorize( creatures[i]->sym,
selection == i ? hilite( creatures[i]->color ) : creatures[i]->color ),
creatures[i]->nname() ) );
}
if( !cur_creature.is_null() ) {
int y = 2;
fold_and_print( w_missions, point( 31, ++y ), w, c_light_gray, cur_creature->get_description() );
cur_creature->faction_display( w_missions, point( 31, 3 ), w );
} else {
fold_and_print( w_missions, point( 31, 4 ), w, c_light_red, no_creatures );
}
Expand Down
96 changes: 96 additions & 0 deletions src/mtype.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
#include "field_type.h"
#include "item.h"
#include "itype.h"
#include "mod_manager.h"
#include "mondeath.h"
#include "monstergenerator.h"
#include "output.h"
#include "translations.h"
#include "units.h"
#include "weakpoint.h"
Expand Down Expand Up @@ -279,3 +281,97 @@ const behavior::node_t *mtype::get_goals() const
{
return &goals;
}

void mtype::faction_display( catacurses::window &w, const point &top_left, const int width ) const
{
int y = 0;
// Name & symbol
trim_and_print( w, top_left + point( 2, y ), width, c_white, string_format( "%s %s", colorize( sym,
color ), nname() ) );
y++;
// Difficulty
std::string diff_str;
if( difficulty < 3 ) {
diff_str = _( "<color_light_gray>Minimal threat.</color>" );
} else if( difficulty < 10 ) {
diff_str = _( "<color_light_gray>Mildly dangerous.</color>" );
} else if( difficulty < 20 ) {
diff_str = _( "<color_light_red>Dangerous.</color>" );
} else if( difficulty < 30 ) {
diff_str = _( "<color_red>Very dangerous.</color>" );
} else if( difficulty < 50 ) {
diff_str = _( "<color_red>Extremely dangerous.</color>" );
} else {
diff_str = _( "<color_red>Fatally dangerous!</color>" );
}
trim_and_print( w, top_left + point( 0, ++y ), width, c_light_gray,
string_format( "%s: %s", colorize( _( "Difficulty" ), c_white ), diff_str ) );
// Origin
std::vector<std::string> origin_list =
foldstring( string_format( "%s: %s", colorize( _( "Origin" ), c_white ),
enumerate_as_string( src.begin(), src.end(),
[]( const std::pair<mtype_id, mod_id> &source ) {
return string_format( "'%s'", source.second->name() );
}, enumeration_conjunction::arrow ) ), width );
for( const std::string &org : origin_list ) {
trim_and_print( w, top_left + point( 0, ++y ), width, c_light_gray, org );
}
// Size
const std::map<creature_size, std::string> size_map = {
{creature_size::tiny, translate_marker( "Tiny" )},
{creature_size::small, translate_marker( "Small" )},
{creature_size::medium, translate_marker( "Medium" )},
{creature_size::large, translate_marker( "Large" )},
{creature_size::huge, translate_marker( "Huge" )}
};
auto size_iter = size_map.find( size );
trim_and_print( w, top_left + point( 0, ++y ), width, c_light_gray,
string_format( "%s: %s", colorize( _( "Size" ), c_white ),
size_iter == size_map.end() ? _( "Unknown" ) : _( size_iter->second ) ) );
// Species
std::vector<std::string> species_list =
foldstring( string_format( "%s: %s", colorize( _( "Species" ), c_white ),
enumerate_as_string( species_descriptions(), []( const std::string & sp ) {
return colorize( sp, c_yellow );
} ) ), width );
for( const std::string &sp : species_list ) {
trim_and_print( w, top_left + point( 0, ++y ), width, c_light_gray, sp );
}
// Senses
std::vector<std::string> senses_str;
if( has_flag( MF_HEARS ) ) {
senses_str.emplace_back( colorize( _( "hearing" ), c_yellow ) );
}
if( has_flag( MF_SEES ) ) {
senses_str.emplace_back( colorize( _( "sight" ), c_yellow ) );
}
if( has_flag( MF_SMELLS ) ) {
senses_str.emplace_back( colorize( _( "smell" ), c_yellow ) );
}
trim_and_print( w, top_left + point( 0, ++y ), width, c_light_gray,
string_format( "%s: %s", colorize( _( "Senses" ), c_white ), enumerate_as_string( senses_str ) ) );
// Abilities
if( has_flag( MF_SWIMS ) ) {
trim_and_print( w, top_left + point( 0, ++y ), width, c_white, _( "It can swim." ) );
}
if( has_flag( MF_FLIES ) ) {
trim_and_print( w, top_left + point( 0, ++y ), width, c_white, _( "It can fly." ) );
}
if( has_flag( MF_DIGS ) ) {
trim_and_print( w, top_left + point( 0, ++y ), width, c_white, _( "It can burrow underground." ) );
}
if( has_flag( MF_CLIMBS ) ) {
trim_and_print( w, top_left + point( 0, ++y ), width, c_white, _( "It can climb." ) );
}
if( has_flag( MF_GRABS ) ) {
trim_and_print( w, top_left + point( 0, ++y ), width, c_white, _( "It can grab." ) );
}
if( has_flag( MF_VENOM ) ) {
trim_and_print( w, top_left + point( 0, ++y ), width, c_white, _( "It can inflict poison." ) );
}
if( has_flag( MF_PARALYZE ) ) {
trim_and_print( w, top_left + point( 0, ++y ), width, c_white, _( "It can inflict paralysis." ) );
}
// Description
fold_and_print( w, top_left + point( 0, y + 2 ), width, c_light_gray, get_description() );
}
1 change: 1 addition & 0 deletions src/mtype.h
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,7 @@ struct mtype {
void set_strategy();
void add_goal( const std::string &goal_id );
const behavior::node_t *get_goals() const;
void faction_display( catacurses::window &w, const point &top_left, const int width ) const;

// Historically located in monstergenerator.cpp
void load( const JsonObject &jo, const std::string &src );
Expand Down

0 comments on commit 60a14f6

Please sign in to comment.