From c0916d6dce06042fc01ccf36055b55274fb1e63a Mon Sep 17 00:00:00 2001 From: bananaedmonkey Date: Wed, 5 Jun 2019 18:19:57 -0400 Subject: [PATCH 1/6] Updates the morale menu --- src/morale.cpp | 124 ++++++++++++++++++++++++++++++++++++++++++++++--- src/morale.h | 18 ++++++- 2 files changed, 134 insertions(+), 8 deletions(-) diff --git a/src/morale.cpp b/src/morale.cpp index 5f91d84e7514e..437589eee7878 100644 --- a/src/morale.cpp +++ b/src/morale.cpp @@ -185,6 +185,16 @@ time_duration player_morale::morale_point::pick_time( const time_duration curren return ( remaining_time <= new_time && same_sign ) ? new_time : remaining_time; } +void player_morale::morale_point::set_percent_contribution( double contribution ) +{ + percent_contribution = contribution; +} + + +double player_morale::morale_point::get_percent_contribution() +{ + return percent_contribution; +} void player_morale::morale_point::decay( const time_duration ticks ) { if( ticks < 0_turns ) { @@ -346,6 +356,63 @@ morale_mult player_morale::get_temper_mult() const return mult; } +void player_morale::calculate_percentage() +{ + const morale_mult mult = get_temper_mult(); + + int sum_of_positive_squares = 0; + int sum_of_negative_squares = 0; + + for (auto &m : points) { + const int bonus = m.get_net_bonus(mult); + if (bonus > 0) { + sum_of_positive_squares += pow(bonus, 2); + } + else { + sum_of_negative_squares += pow(bonus, 2); + } + } + + for (auto &m : points) { + const int bonus = m.get_net_bonus(mult); + if (bonus > 0) { + m.set_percent_contribution((pow(bonus, 2) / sum_of_positive_squares) * 100 ); + } + else { + m.set_percent_contribution((pow(bonus, 2) / sum_of_negative_squares) * 100 ); + } + } +} + +int player_morale::get_total_negative_value() const +{ + const morale_mult mult = get_temper_mult(); + int sum = 0; + for (auto &m : points) { + const int bonus = m.get_net_bonus( mult ); + if (bonus < 0) { + sum += pow( bonus, 2 ); + } + } + return sqrt( sum ); +} + +int player_morale::get_total_positive_value() const +{ + const morale_mult mult = get_temper_mult(); + int sum = 0; + for (auto &m : points) { + const int bonus = m.get_net_bonus( mult ); + if (bonus > 0) { + sum += pow( bonus, 2 ); + } + + } + return sqrt( sum ); +} + + + int player_morale::get_level() const { if( !level_is_valid ) { @@ -392,11 +459,16 @@ void player_morale::decay( const time_duration ticks ) void player_morale::display( double focus_gain ) { + /*calculates the percent contributions of the morale points, + * must be done before anything else in this method + */ + calculate_percentage(); + const char *morale_gain_caption = _( "Total morale gain" ); const char *focus_gain_caption = _( "Focus gain per minute" ); const char *points_is_empty = _( "Nothing affects your morale" ); - int w_extra = 8; + int w_extra = 16; // Figure out how wide the source column needs to be. int source_column_width = std::max( utf8_width( morale_gain_caption ), @@ -415,14 +487,30 @@ void player_morale::display( double focus_gain ) const int win_y = ( TERMY - win_h ) / 2; catacurses::window w = catacurses::newwin( win_h, win_w, win_y, win_x ); - - const auto print_line = [ w ]( int y, const char *label, double value ) -> int { + //lambda function used to print almost everything to the window + const auto print_line = [ w ]( int y, const char *label, double value, bool isPercentage = false, + nc_color color_override = c_unset ) -> int { nc_color color; if( value != 0.0 ) { const int decimals = ( value - static_cast( value ) != 0.0 ) ? 2 : 0; - color = ( value > 0.0 ) ? c_green : c_red; - mvwprintz( w, y, getmaxx( w ) - 8, color, "%+6.*f", decimals, value ); + if (color_override == c_unset ) + { + color = ( value > 0.0 ) ? c_green : c_light_red; + } + else + { + color = color_override; + } + if ( isPercentage ) + { + mvwprintz( w, y, getmaxx( w ) - 8, color, "%6.*f%%", decimals, value ); + } + else + { + mvwprintz( w, y, getmaxx( w ) - 8, color, "%+6.*f", decimals, value ); + } + } else { color = c_dark_gray; @@ -454,6 +542,8 @@ void player_morale::display( double focus_gain ) if( !points.empty() ) { const char *source_column = _( "Source" ); const char *value_column = _( "Value" ); + const char *total_positve_label = _( "Total positive morale" ); + const char *total_negitive_label = _( "Total negative morale" ); mvwprintz( w, 3, 2, c_light_gray, source_column ); mvwprintz( w, 3, win_w - utf8_width( value_column ) - 2, c_light_gray, value_column ); @@ -461,15 +551,35 @@ void player_morale::display( double focus_gain ) const morale_mult mult = get_temper_mult(); int line = 0; + line += print_line( 4 + line, total_positve_label, get_total_positive_value(), false, c_light_green ); + //prints out all the positive morale effects for( size_t i = offset; i < static_cast( rows_total ); ++i ) { const std::string name = points[i].get_name(); const int bonus = points[i].get_net_bonus( mult ); - - line += print_line( 4 + line, name.c_str(), bonus ); + if ( bonus > 0 ) + { + line += print_line( 4 + line, name.c_str(), points[i].get_percent_contribution(), true ); + } + if( line >= rows_visible ) { break; // This prevents overflowing (unlikely, but just in case) } } + line++; //adds a space in the GUI + //prints out all the negitve morale effects + line += print_line( 4 + line, total_negitive_label, -1 * get_total_negative_value(), false, c_red ); + + for (size_t i = offset; i < static_cast( rows_total ); ++i) { + const std::string name = points[i].get_name(); + const int bonus = points[i].get_net_bonus( mult ); + if (bonus < 0) + { + line += print_line(4 + line, name.c_str(), points[i].get_percent_contribution(), true, c_light_red); + } + if ( line >= rows_visible ) { + break; // This prevents overflowing (unlikely, but just in case) + } + } } else { fold_and_print_from( w, 3, 2, win_w - 4, 0, c_dark_gray, points_is_empty ); } diff --git a/src/morale.h b/src/morale.h index b3dcef27f337e..bb0d53af70418 100644 --- a/src/morale.h +++ b/src/morale.h @@ -53,6 +53,13 @@ class player_morale * Only permanent morale is checked */ bool consistent_with( const player_morale &morale ) const; + /**calculates the percentage contribution for each morale point*/ + void calculate_percentage(); + + int get_total_positive_value() const; + int get_total_negative_value() const; + + void on_mutation_gain( const trait_id &mid ); void on_mutation_loss( const trait_id &mid ); void on_stat_change( const std::string &stat, int value ); @@ -66,6 +73,7 @@ class player_morale void load( JsonObject &jsin ); private: + class morale_point { public: @@ -99,7 +107,11 @@ class player_morale void add( int new_bonus, int new_max_bonus, time_duration new_duration, time_duration new_decay_start, bool new_cap ); void decay( time_duration ticks = 1_turns ); - + /* + *contribution should be bettween [0,100] (inclusive) + */ + void set_percent_contribution( double contribution ); + double get_percent_contribution(); private: morale_type type; const itype *item_type; @@ -108,6 +120,10 @@ class player_morale time_duration duration; // Zero duration == infinity time_duration decay_start; time_duration age; + /** + *this point's percent contribution to the total positive or total negative morale effect + */ + double percent_contribution; /** * Returns either new_time or remaining time (which one is greater). From 7864df0b8560cfb8894dbc8381e77284cd6943a4 Mon Sep 17 00:00:00 2001 From: AJ Date: Thu, 6 Jun 2019 08:15:02 -0400 Subject: [PATCH 2/6] Update morale.cpp --- src/morale.cpp | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/morale.cpp b/src/morale.cpp index 286eb1ca70416..082386c1c13d1 100644 --- a/src/morale.cpp +++ b/src/morale.cpp @@ -360,30 +360,32 @@ morale_mult player_morale::get_temper_mult() const void player_morale::calculate_percentage() { - const morale_mult mult = get_temper_mult(); + const morale_mult mult = get_temper_mult(); - int sum_of_positive_squares = 0; - int sum_of_negative_squares = 0; + int sum_of_positive_squares = 0; + int sum_of_negative_squares = 0; - for (auto &m : points) { - const int bonus = m.get_net_bonus(mult); - if (bonus > 0) { - sum_of_positive_squares += pow(bonus, 2); - } - else { - sum_of_negative_squares += pow(bonus, 2); - } + for (auto &m : points) { + const int bonus = m.get_net_bonus(mult); + if (bonus > 0) { + sum_of_positive_squares += pow(bonus, 2); + } + else + { + sum_of_negative_squares += pow(bonus, 2); } + } - for (auto &m : points) { - const int bonus = m.get_net_bonus(mult); - if (bonus > 0) { - m.set_percent_contribution((pow(bonus, 2) / sum_of_positive_squares) * 100 ); - } - else { - m.set_percent_contribution((pow(bonus, 2) / sum_of_negative_squares) * 100 ); - } + for (auto &m : points) { + const int bonus = m.get_net_bonus(mult); + if (bonus > 0) { + m.set_percent_contribution((pow(bonus, 2) / sum_of_positive_squares) * 100 ); + } + else + { + m.set_percent_contribution((pow(bonus, 2) / sum_of_negative_squares) * 100 ); } + } } int player_morale::get_total_negative_value() const @@ -466,7 +468,7 @@ void player_morale::display( double focus_gain ) */ calculate_percentage(); - const char *morale_gain_caption = _( "Total morale gain" ); + const char *morale_gain_caption = _( "Total morale change" ); const char *focus_gain_caption = _( "Focus gain per minute" ); const char *points_is_empty = _( "Nothing affects your morale" ); From 5c9076e909fa2eda75cc097695d6cc95d6651d62 Mon Sep 17 00:00:00 2001 From: AJ Date: Thu, 6 Jun 2019 12:27:09 -0400 Subject: [PATCH 3/6] Update morale.cpp --- src/morale.cpp | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/src/morale.cpp b/src/morale.cpp index 082386c1c13d1..579c265401f47 100644 --- a/src/morale.cpp +++ b/src/morale.cpp @@ -369,9 +369,7 @@ void player_morale::calculate_percentage() const int bonus = m.get_net_bonus(mult); if (bonus > 0) { sum_of_positive_squares += pow(bonus, 2); - } - else - { + } else { sum_of_negative_squares += pow(bonus, 2); } } @@ -380,9 +378,7 @@ void player_morale::calculate_percentage() const int bonus = m.get_net_bonus(mult); if (bonus > 0) { m.set_percent_contribution((pow(bonus, 2) / sum_of_positive_squares) * 100 ); - } - else - { + } else { m.set_percent_contribution((pow(bonus, 2) / sum_of_negative_squares) * 100 ); } } @@ -493,30 +489,22 @@ void player_morale::display( double focus_gain ) catacurses::window w = catacurses::newwin( win_h, win_w, win_y, win_x ); //lambda function used to print almost everything to the window const auto print_line = [ w ]( int y, const char *label, double value, bool isPercentage = false, - nc_color color_override = c_unset ) -> int { + nc_color color_override = c_unset ) -> int { nc_color color; - if( value != 0.0 ) - { + if( value != 0.0 ) { const int decimals = ( value - static_cast( value ) != 0.0 ) ? 2 : 0; - if (color_override == c_unset ) - { + if (color_override == c_unset ) { color = ( value > 0.0 ) ? c_green : c_light_red; - } - else - { + } else { color = color_override; } - if ( isPercentage ) - { + if ( isPercentage ) { mvwprintz( w, y, getmaxx( w ) - 8, color, "%6.*f%%", decimals, value ); - } - else - { + } else { mvwprintz( w, y, getmaxx( w ) - 8, color, "%+6.*f", decimals, value ); } - } else - { + } else { color = c_dark_gray; mvwprintz( w, y, getmaxx( w ) - 3, color, "-" ); } @@ -560,8 +548,7 @@ void player_morale::display( double focus_gain ) for( size_t i = offset; i < static_cast( rows_total ); ++i ) { const std::string name = points[i].get_name(); const int bonus = points[i].get_net_bonus( mult ); - if ( bonus > 0 ) - { + if ( bonus > 0 ) { line += print_line( 4 + line, name.c_str(), points[i].get_percent_contribution(), true ); } @@ -576,8 +563,7 @@ void player_morale::display( double focus_gain ) for (size_t i = offset; i < static_cast( rows_total ); ++i) { const std::string name = points[i].get_name(); const int bonus = points[i].get_net_bonus( mult ); - if (bonus < 0) - { + if (bonus < 0) { line += print_line(4 + line, name.c_str(), points[i].get_percent_contribution(), true, c_light_red); } if ( line >= rows_visible ) { From a63e162ae112c8bd7164b0b76fd8fab2069baaf9 Mon Sep 17 00:00:00 2001 From: AJ Date: Thu, 6 Jun 2019 12:55:25 -0400 Subject: [PATCH 4/6] Update morale.cpp --- src/morale.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/morale.cpp b/src/morale.cpp index 579c265401f47..bd79adcaf34cf 100644 --- a/src/morale.cpp +++ b/src/morale.cpp @@ -365,21 +365,21 @@ void player_morale::calculate_percentage() int sum_of_positive_squares = 0; int sum_of_negative_squares = 0; - for (auto &m : points) { - const int bonus = m.get_net_bonus(mult); - if (bonus > 0) { - sum_of_positive_squares += pow(bonus, 2); + for( auto &m : points ) { + const int bonus = m.get_net_bonus( mult ); + if( bonus > 0 ) { + sum_of_positive_squares += pow( bonus, 2 ); } else { - sum_of_negative_squares += pow(bonus, 2); + sum_of_negative_squares += pow( bonus, 2 ); } } - for (auto &m : points) { + for( auto &m : points ) { const int bonus = m.get_net_bonus(mult); - if (bonus > 0) { - m.set_percent_contribution((pow(bonus, 2) / sum_of_positive_squares) * 100 ); + if( bonus > 0 ) { + m.set_percent_contribution( ( pow( bonus, 2 ) / sum_of_positive_squares ) * 100 ); } else { - m.set_percent_contribution((pow(bonus, 2) / sum_of_negative_squares) * 100 ); + m.set_percent_contribution( ( pow( bonus, 2 ) / sum_of_negative_squares) * 100 ); } } } @@ -388,9 +388,9 @@ int player_morale::get_total_negative_value() const { const morale_mult mult = get_temper_mult(); int sum = 0; - for (auto &m : points) { + for( auto &m : points ) { const int bonus = m.get_net_bonus( mult ); - if (bonus < 0) { + if( bonus < 0 ) { sum += pow( bonus, 2 ); } } @@ -401,9 +401,9 @@ int player_morale::get_total_positive_value() const { const morale_mult mult = get_temper_mult(); int sum = 0; - for (auto &m : points) { + for( auto &m : points ) { const int bonus = m.get_net_bonus( mult ); - if (bonus > 0) { + if( bonus > 0 ) { sum += pow( bonus, 2 ); } From be2fcd812f8c8c8cbfd41d51ffeb434ad1d22b2d Mon Sep 17 00:00:00 2001 From: bananaedmonkey Date: Thu, 6 Jun 2019 23:12:14 -0400 Subject: [PATCH 5/6] astyling --- src/morale.cpp | 36 ++++++++++++++++++++---------------- src/morale.h | 4 ++-- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/morale.cpp b/src/morale.cpp index bd79adcaf34cf..2954266bd82cc 100644 --- a/src/morale.cpp +++ b/src/morale.cpp @@ -375,11 +375,11 @@ void player_morale::calculate_percentage() } for( auto &m : points ) { - const int bonus = m.get_net_bonus(mult); + const int bonus = m.get_net_bonus( mult ); if( bonus > 0 ) { m.set_percent_contribution( ( pow( bonus, 2 ) / sum_of_positive_squares ) * 100 ); } else { - m.set_percent_contribution( ( pow( bonus, 2 ) / sum_of_negative_squares) * 100 ); + m.set_percent_contribution( ( pow( bonus, 2 ) / sum_of_negative_squares ) * 100 ); } } } @@ -489,22 +489,24 @@ void player_morale::display( double focus_gain ) catacurses::window w = catacurses::newwin( win_h, win_w, win_y, win_x ); //lambda function used to print almost everything to the window const auto print_line = [ w ]( int y, const char *label, double value, bool isPercentage = false, - nc_color color_override = c_unset ) -> int { + nc_color color_override = c_unset ) -> int { nc_color color; - if( value != 0.0 ) { + if( value != 0.0 ) + { const int decimals = ( value - static_cast( value ) != 0.0 ) ? 2 : 0; - if (color_override == c_unset ) { + if( color_override == c_unset ) { color = ( value > 0.0 ) ? c_green : c_light_red; } else { color = color_override; } - if ( isPercentage ) { + if( isPercentage ) { mvwprintz( w, y, getmaxx( w ) - 8, color, "%6.*f%%", decimals, value ); } else { mvwprintz( w, y, getmaxx( w ) - 8, color, "%+6.*f", decimals, value ); } - - } else { + + } else + { color = c_dark_gray; mvwprintz( w, y, getmaxx( w ) - 3, color, "-" ); } @@ -543,15 +545,16 @@ void player_morale::display( double focus_gain ) const morale_mult mult = get_temper_mult(); int line = 0; - line += print_line( 4 + line, total_positve_label, get_total_positive_value(), false, c_light_green ); + line += print_line( 4 + line, total_positve_label, get_total_positive_value(), false, + c_light_green ); //prints out all the positive morale effects for( size_t i = offset; i < static_cast( rows_total ); ++i ) { const std::string name = points[i].get_name(); const int bonus = points[i].get_net_bonus( mult ); - if ( bonus > 0 ) { + if( bonus > 0 ) { line += print_line( 4 + line, name.c_str(), points[i].get_percent_contribution(), true ); } - + if( line >= rows_visible ) { break; // This prevents overflowing (unlikely, but just in case) } @@ -559,14 +562,15 @@ void player_morale::display( double focus_gain ) line++; //adds a space in the GUI //prints out all the negitve morale effects line += print_line( 4 + line, total_negitive_label, -1 * get_total_negative_value(), false, c_red ); - - for (size_t i = offset; i < static_cast( rows_total ); ++i) { + + for( size_t i = offset; i < static_cast( rows_total ); ++i ) { const std::string name = points[i].get_name(); const int bonus = points[i].get_net_bonus( mult ); - if (bonus < 0) { - line += print_line(4 + line, name.c_str(), points[i].get_percent_contribution(), true, c_light_red); + if( bonus < 0 ) { + line += print_line( 4 + line, name.c_str(), points[i].get_percent_contribution(), true, + c_light_red ); } - if ( line >= rows_visible ) { + if( line >= rows_visible ) { break; // This prevents overflowing (unlikely, but just in case) } } diff --git a/src/morale.h b/src/morale.h index bb0d53af70418..a7f9b8a780410 100644 --- a/src/morale.h +++ b/src/morale.h @@ -58,7 +58,7 @@ class player_morale int get_total_positive_value() const; int get_total_negative_value() const; - + void on_mutation_gain( const trait_id &mid ); void on_mutation_loss( const trait_id &mid ); @@ -123,7 +123,7 @@ class player_morale /** *this point's percent contribution to the total positive or total negative morale effect */ - double percent_contribution; + double percent_contribution; /** * Returns either new_time or remaining time (which one is greater). From 85d6195fba25aee27a3f770cc3f7cefad63b378d Mon Sep 17 00:00:00 2001 From: bananaedmonkey Date: Sun, 9 Jun 2019 18:51:56 -0400 Subject: [PATCH 6/6] fix jenkins check --- src/morale.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/morale.cpp b/src/morale.cpp index 2954266bd82cc..3aa7250b6ec43 100644 --- a/src/morale.cpp +++ b/src/morale.cpp @@ -519,6 +519,7 @@ void player_morale::display( double focus_gain ) for( ;; ) { + //creates the window werase( w ); draw_border( w );