From 7b654a4515a03ce4349506dcf77645d04f25afcd Mon Sep 17 00:00:00 2001 From: David Seguin Date: Wed, 17 Nov 2021 20:38:05 -0500 Subject: [PATCH 01/20] Read "difficulty_impact" from traits/professions/scenarios --- src/difficulty_impact.cpp | 54 +++++++++++++++++++++++++++++++++++++++ src/difficulty_impact.h | 31 ++++++++++++++++++++++ src/mutation.h | 3 +++ src/mutation_data.cpp | 3 +++ src/profession.cpp | 3 +++ src/profession.h | 2 ++ src/scenario.cpp | 3 +++ src/scenario.h | 2 ++ 8 files changed, 101 insertions(+) create mode 100644 src/difficulty_impact.cpp create mode 100644 src/difficulty_impact.h diff --git a/src/difficulty_impact.cpp b/src/difficulty_impact.cpp new file mode 100644 index 0000000000000..02ffc7acde772 --- /dev/null +++ b/src/difficulty_impact.cpp @@ -0,0 +1,54 @@ +#include +#include + +#include "difficulty_impact.h" +#include "generic_factory.h" + +const std::string difficulty_impact::get_diff_desc( const difficulty_option &diff ) const +{ + static const std::map diff_map { + //~ Describes game difficulty + { DIFF_VERY_EASY, _( "Very Easy" ) }, + //~ Describes game difficulty + { DIFF_EASY, _( "Easy" ) }, + //~ Describes game difficulty + { DIFF_MEDIUM, _( "Medium" ) }, + //~ Describes game difficulty + { DIFF_HARD, _( "Hard" ) }, + //~ Describes game difficulty + { DIFF_VERY_HARD, _( "Very Hard" ) } + }; + auto d = diff_map.find( diff ); + return d == diff_map.end() ? _( "None" ) : d->second; +} + +difficulty_impact::difficulty_option difficulty_impact::get_opt_from_str( const std::string &diff_str ) const +{ + static const std::map diff_map { + { "very_easy", DIFF_VERY_EASY }, + { "easy", DIFF_EASY }, + { "medium", DIFF_MEDIUM }, + { "hard", DIFF_HARD }, + { "very_hard", DIFF_VERY_HARD } + }; + auto d = diff_map.find( diff_str ); + return d == diff_map.end() ? DIFF_NONE : d->second; +} + +void difficulty_impact::load( const JsonObject &jo ) +{ + std::string readr_intl; + std::string readr_us; + optional( jo, false, "offence", readr_intl, std::string() ); + optional( jo, false, "offense", readr_us, readr_intl ); + offence = get_opt_from_str( readr_us ); + optional( jo, false, "defence", readr_intl, std::string() ); + optional( jo, false, "defense", readr_us, readr_intl ); + defence = get_opt_from_str( readr_us ); + optional( jo, false, "crafting", readr_intl, std::string() ); + crafting = get_opt_from_str( readr_intl ); + optional( jo, false, "wilderness", readr_intl, std::string() ); + wilderness = get_opt_from_str( readr_intl ); + optional( jo, false, "social", readr_intl, std::string() ); + social = get_opt_from_str( readr_intl ); +} \ No newline at end of file diff --git a/src/difficulty_impact.h b/src/difficulty_impact.h new file mode 100644 index 0000000000000..49712ab7d57ef --- /dev/null +++ b/src/difficulty_impact.h @@ -0,0 +1,31 @@ +#pragma once +#ifndef CATA_SRC_DIFFICULTY_IMPACT_H +#define CATA_SRC_DIFFICULTY_IMPACT_H + +#include + +#include "json.h" + +struct difficulty_impact { + enum difficulty_option { + DIFF_NONE, + DIFF_VERY_EASY, + DIFF_EASY, + DIFF_MEDIUM, + DIFF_HARD, + DIFF_VERY_HARD + }; + + difficulty_option offence = DIFF_NONE; + difficulty_option defence = DIFF_NONE; + difficulty_option crafting = DIFF_NONE; + difficulty_option wilderness = DIFF_NONE; + difficulty_option social = DIFF_NONE; + + const std::string get_diff_desc( const difficulty_option &diff ) const; + difficulty_option get_opt_from_str( const std::string &diff_str ) const; + + void load( const JsonObject &jo ); +}; + +#endif // CATA_SRC_DIFFICULTY_IMPACT_H diff --git a/src/mutation.h b/src/mutation.h index b66a56885b4e5..32d361a7e154f 100644 --- a/src/mutation.h +++ b/src/mutation.h @@ -15,6 +15,7 @@ #include "calendar.h" #include "character.h" #include "damage.h" +#include "difficulty_impact.h" #include "hash_utils.h" #include "memory_fast.h" #include "optional.h" @@ -143,6 +144,8 @@ struct mutation_branch { int visibility = 0; int ugliness = 0; int cost = 0; + // How does the mutation affect the game's difficulty? + difficulty_impact impact_on_difficulty; // costs are consumed every cooldown turns, int cooldown = 0; // bodytemp elements: diff --git a/src/mutation_data.cpp b/src/mutation_data.cpp index 8c2b6cc0bfd72..9b3c986a866e1 100644 --- a/src/mutation_data.cpp +++ b/src/mutation_data.cpp @@ -323,6 +323,9 @@ void mutation_branch::load( const JsonObject &jo, const std::string & ) mandatory( jo, was_loaded, "name", raw_name ); mandatory( jo, was_loaded, "description", raw_desc ); mandatory( jo, was_loaded, "points", points ); + if( jo.has_object( "difficulty_impact" ) ) { + impact_on_difficulty.load( jo.get_object( "difficulty_impact" ) ); + } optional( jo, was_loaded, "visibility", visibility, 0 ); optional( jo, was_loaded, "ugliness", ugliness, 0 ); diff --git a/src/profession.cpp b/src/profession.cpp index a68a0eb19a9a2..1d387e1dae657 100644 --- a/src/profession.cpp +++ b/src/profession.cpp @@ -193,6 +193,9 @@ void profession::load( const JsonObject &jo, const std::string & ) } mandatory( jo, was_loaded, "points", _point_cost ); + if( jo.has_object( "difficulty_impact" ) ) { + _difficulty_impact.load( jo.get_object( "difficulty_impact" ) ); + } if( !was_loaded || jo.has_member( "items" ) ) { std::string c = "items for profession " + id.str(); diff --git a/src/profession.h b/src/profession.h index a7d2df21b2b47..09ee3dc83d64e 100644 --- a/src/profession.h +++ b/src/profession.h @@ -10,6 +10,7 @@ #include #include +#include "difficulty_impact.h" #include "pldata.h" #include "translations.h" #include "type_id.h" @@ -50,6 +51,7 @@ class profession translation _description_male; translation _description_female; signed int _point_cost = 0; + difficulty_impact _difficulty_impact; // TODO: In professions.json, replace lists of itypes (legacy) with item groups itypedecvec legacy_starting_items; diff --git a/src/scenario.cpp b/src/scenario.cpp index 7bcb58c9e5db1..49ed31d9fe941 100644 --- a/src/scenario.cpp +++ b/src/scenario.cpp @@ -77,6 +77,9 @@ void scenario::load( const JsonObject &jo, const std::string & ) } mandatory( jo, was_loaded, "points", _point_cost ); + if( jo.has_object( "difficulty_impact" ) ) { + _difficulty_impact.load( jo.get_object( "difficulty_impact" ) ); + } optional( jo, was_loaded, "blacklist_professions", blacklist ); optional( jo, was_loaded, "add_professions", extra_professions ); diff --git a/src/scenario.h b/src/scenario.h index 3589ff38c3adc..282c79dcc8f4e 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -8,6 +8,7 @@ #include #include "calendar.h" +#include "difficulty_impact.h" #include "effect_on_condition.h" #include "translations.h" #include "type_id.h" @@ -45,6 +46,7 @@ class scenario std::set _forbidden_traits; std::vector _allowed_locs; int _point_cost = 0; + difficulty_impact _difficulty_impact; std::set flags; // flags for some special properties of the scenario std::string _map_extra; std::vector _missions; From 2c3949c5fd1a10c2557baefb370f6b6066da3b1f Mon Sep 17 00:00:00 2001 From: David Seguin Date: Wed, 17 Nov 2021 22:55:51 -0500 Subject: [PATCH 02/20] Add difficulty info to character creation screen --- src/difficulty_impact.cpp | 2 +- src/difficulty_impact.h | 14 +-- src/newcharacter.cpp | 237 +++++++++++++++++++++++++------------- src/profession.cpp | 5 + src/profession.h | 1 + src/scenario.cpp | 5 + src/scenario.h | 1 + 7 files changed, 179 insertions(+), 86 deletions(-) diff --git a/src/difficulty_impact.cpp b/src/difficulty_impact.cpp index 02ffc7acde772..411f3ea13c1bf 100644 --- a/src/difficulty_impact.cpp +++ b/src/difficulty_impact.cpp @@ -4,7 +4,7 @@ #include "difficulty_impact.h" #include "generic_factory.h" -const std::string difficulty_impact::get_diff_desc( const difficulty_option &diff ) const +const std::string difficulty_impact::get_diff_desc( const difficulty_option &diff ) { static const std::map diff_map { //~ Describes game difficulty diff --git a/src/difficulty_impact.h b/src/difficulty_impact.h index 49712ab7d57ef..449819f4aaab6 100644 --- a/src/difficulty_impact.h +++ b/src/difficulty_impact.h @@ -8,12 +8,12 @@ struct difficulty_impact { enum difficulty_option { - DIFF_NONE, - DIFF_VERY_EASY, - DIFF_EASY, - DIFF_MEDIUM, - DIFF_HARD, - DIFF_VERY_HARD + DIFF_NONE = 0, + DIFF_VERY_EASY = 1, + DIFF_EASY = 2, + DIFF_MEDIUM = 3, + DIFF_HARD = 4, + DIFF_VERY_HARD = 5 }; difficulty_option offence = DIFF_NONE; @@ -22,7 +22,7 @@ struct difficulty_impact { difficulty_option wilderness = DIFF_NONE; difficulty_option social = DIFF_NONE; - const std::string get_diff_desc( const difficulty_option &diff ) const; + static const std::string get_diff_desc( const difficulty_option &diff ); difficulty_option get_opt_from_str( const std::string &diff_str ) const; void load( const JsonObject &jo ); diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index e9ef9126a4647..18b7018f9c9f7 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -302,6 +302,81 @@ static std::string pools_to_string( const avatar &u, pool_type pool ) return "If you see this, this is a bug"; } +static std::string difficulty_to_string( const avatar &u ) +{ + float off_diff = 3.0f; + float def_diff = 3.0f; + float cft_diff = 3.0f; + float wld_diff = 3.0f; + float scl_diff = 3.0f; + int off_cnt = 0; + int def_cnt = 0; + int cft_cnt = 0; + int wld_cnt = 0; + int scl_cnt = 0; + + auto mod_diff = [&]( const difficulty_impact &diff ) { + if( diff.offence != difficulty_impact::DIFF_NONE ) { + off_diff += static_cast( diff.offence ); + off_cnt++; + } else if( diff.defence != difficulty_impact::DIFF_NONE ) { + def_diff += static_cast( diff.defence ); + def_cnt++; + } else if( diff.crafting != difficulty_impact::DIFF_NONE ) { + cft_diff += static_cast( diff.crafting ); + cft_cnt++; + } else if( diff.wilderness != difficulty_impact::DIFF_NONE ) { + wld_diff += static_cast( diff.wilderness ); + wld_cnt++; + } else if( diff.social != difficulty_impact::DIFF_NONE ) { + scl_diff += static_cast( diff.social ); + scl_cnt++; + } + }; + + if( u.prof != nullptr ) { + mod_diff( u.prof->difficulty() ); + } + if( get_scenario() != nullptr ) { + mod_diff( get_scenario()->difficulty() ); + } + for( const profession *prof : u.hobbies ) { + if( prof != nullptr ) { + mod_diff( prof->difficulty() ); + } + } + for( const trait_id &tr : u.my_traits ) { + mod_diff( tr->impact_on_difficulty ); + } + + int off = std::round( off_diff / ( off_cnt > 0 ? off_cnt : 1 ) ); + int def = std::round( def_diff / ( def_cnt > 0 ? def_cnt : 1 ) ); + int cft = std::round( cft_diff / ( cft_cnt > 0 ? cft_cnt : 1 ) ); + int wld = std::round( wld_diff / ( wld_cnt > 0 ? wld_cnt : 1 ) ); + int scl = std::round( scl_diff / ( scl_cnt > 0 ? scl_cnt : 1 ) ); + + auto diff_colr = []( int diff ) { + switch( diff ) { + case 1: return "light_green"; + case 2: return "light_cyan"; + case 4: return "brown"; + case 5: return "light_red"; + default: return "yellow"; + } + }; + + auto diff_desc = []( int diff ) { + return difficulty_impact::get_diff_desc( static_cast( diff > 0 ? diff : 3 ) ); + }; + + return string_format( "%s | %s: %s %s: %s %s: %s %s: %s %s: %s", _( "Difficulty" ), + _( "Offense" ), diff_colr( off ), diff_desc( off ), + _( "Defense" ), diff_colr( def ), diff_desc( def ), + _( "Crafting" ), diff_colr( cft ), diff_desc( cft ), + _( "Wilderness" ), diff_colr( wld ), diff_desc( wld ), + _( "Social" ), diff_colr( scl ), diff_desc( scl ) ); +} + static tab_direction set_points( avatar &u, pool_type & ); static tab_direction set_stats( avatar &u, pool_type ); static tab_direction set_traits( avatar &u, pool_type ); @@ -867,10 +942,10 @@ static void draw_character_tabs( const catacurses::window &w, const std::string draw_border_below_tabs( w ); for( int i = 1; i < TERMX - 1; i++ ) { - mvwputch( w, point( i, 4 ), BORDER_COLOR, LINE_OXOX ); + mvwputch( w, point( i, 5 ), BORDER_COLOR, LINE_OXOX ); } - mvwputch( w, point( 0, 4 ), BORDER_COLOR, LINE_XXXO ); // |- - mvwputch( w, point( TERMX - 1, 4 ), BORDER_COLOR, LINE_XOXX ); // -| + mvwputch( w, point( 0, 5 ), BORDER_COLOR, LINE_XXXO ); // |- + mvwputch( w, point( TERMX - 1, 5 ), BORDER_COLOR, LINE_XOXX ); // -| } static void draw_points( const catacurses::window &w, pool_type pool, const avatar &u, @@ -878,6 +953,7 @@ static void draw_points( const catacurses::window &w, pool_type pool, const avat { // Clear line (except borders) mvwprintz( w, point( 2, 3 ), c_black, std::string( getmaxx( w ) - 3, ' ' ) ); + mvwprintz( w, point( 2, 4 ), c_black, std::string( getmaxx( w ) - 3, ' ' ) ); std::string points_msg = pools_to_string( u, pool ); int pMsg_length = utf8_width( remove_color_tags( points_msg ), true ); nc_color color = c_light_gray; @@ -887,6 +963,7 @@ static void draw_points( const catacurses::window &w, pool_type pool, const avat } else if( netPointCost < 0 ) { mvwprintz( w, point( pMsg_length + 2, 3 ), c_green, " (+%d)", std::abs( netPointCost ) ); } + print_colored_text( w, point( 2, 4 ), color, c_light_gray, difficulty_to_string( u ) ); } template @@ -910,7 +987,7 @@ tab_direction set_points( avatar &u, pool_type &pool ) catacurses::window w_description; const auto init_windows = [&]( ui_adaptor & ui ) { w = catacurses::newwin( TERMY, TERMX, point_zero ); - w_description = catacurses::newwin( TERMY - 10, TERMX - 35, point( 31, 5 ) ); + w_description = catacurses::newwin( TERMY - 11, TERMX - 35, point( 31, 6 ) ); ui.position_from_window( w ); }; init_windows( ui ); @@ -969,7 +1046,7 @@ tab_direction set_points( avatar &u, pool_type &pool ) if( highlighted == i ) { color = hilite( color ); } - mvwprintz( w, point( 2, 5 + i ), color, std::get<1>( opts[i] ) ); + mvwprintz( w, point( 2, 6 + i ), color, std::get<1>( opts[i] ) ); } fold_and_print( w_description, point_zero, getmaxx( w_description ), @@ -1042,7 +1119,7 @@ tab_direction set_stats( avatar &u, pool_type pool ) const auto init_windows = [&]( ui_adaptor & ui ) { w = catacurses::newwin( TERMY, TERMX, point_zero ); w_description = catacurses::newwin( 8, TERMX - iSecondColumn - 1, - point( iSecondColumn, 5 ) ); + point( iSecondColumn, 6 ) ); ui.position_from_window( w ); }; init_windows( ui ); @@ -1068,26 +1145,27 @@ tab_direction set_stats( avatar &u, pool_type pool ) // This is description line, meaning its length excludes first column and border const std::string clear_line( getmaxx( w ) - iSecondColumn - 1, ' ' ); mvwprintz( w, point( iSecondColumn, 3 ), c_black, clear_line ); - for( int i = 6; i < 13; i++ ) { + mvwprintz( w, point( iSecondColumn, 4 ), c_black, clear_line ); + for( int i = 7; i < 14; i++ ) { mvwprintz( w, point( iSecondColumn, i ), c_black, clear_line ); } draw_points( w, pool, u ); - mvwprintz( w, point( 2, 5 ), c_light_gray, _( "Strength:" ) ); - mvwprintz( w, point( 16, 5 ), c_light_gray, "%2d", u.str_max ); - mvwprintz( w, point( 2, 6 ), c_light_gray, _( "Dexterity:" ) ); - mvwprintz( w, point( 16, 6 ), c_light_gray, "%2d", u.dex_max ); - mvwprintz( w, point( 2, 7 ), c_light_gray, _( "Intelligence:" ) ); - mvwprintz( w, point( 16, 7 ), c_light_gray, "%2d", u.int_max ); - mvwprintz( w, point( 2, 8 ), c_light_gray, _( "Perception:" ) ); - mvwprintz( w, point( 16, 8 ), c_light_gray, "%2d", u.per_max ); + mvwprintz( w, point( 2, 6 ), c_light_gray, _( "Strength:" ) ); + mvwprintz( w, point( 16, 6 ), c_light_gray, "%2d", u.str_max ); + mvwprintz( w, point( 2, 7 ), c_light_gray, _( "Dexterity:" ) ); + mvwprintz( w, point( 16, 7 ), c_light_gray, "%2d", u.dex_max ); + mvwprintz( w, point( 2, 8 ), c_light_gray, _( "Intelligence:" ) ); + mvwprintz( w, point( 16, 8 ), c_light_gray, "%2d", u.int_max ); + mvwprintz( w, point( 2, 9 ), c_light_gray, _( "Perception:" ) ); + mvwprintz( w, point( 16, 9 ), c_light_gray, "%2d", u.per_max ); werase( w_description ); switch( sel ) { case 1: - mvwprintz( w, point( 2, 5 ), COL_SELECT, _( "Strength:" ) ); - mvwprintz( w, point( 16, 5 ), c_light_gray, "%2d", u.str_max ); + mvwprintz( w, point( 2, 6 ), COL_SELECT, _( "Strength:" ) ); + mvwprintz( w, point( 16, 6 ), c_light_gray, "%2d", u.str_max ); if( u.str_max >= HIGH_STAT ) { mvwprintz( w, point( iSecondColumn, 3 ), c_light_red, _( "Increasing Str further costs 2 points" ) ); @@ -1105,8 +1183,8 @@ tab_direction set_stats( avatar &u, pool_type pool ) break; case 2: - mvwprintz( w, point( 2, 6 ), COL_SELECT, _( "Dexterity:" ) ); - mvwprintz( w, point( 16, 6 ), c_light_gray, "%2d", u.dex_max ); + mvwprintz( w, point( 2, 7 ), COL_SELECT, _( "Dexterity:" ) ); + mvwprintz( w, point( 16, 7 ), c_light_gray, "%2d", u.dex_max ); if( u.dex_max >= HIGH_STAT ) { mvwprintz( w, point( iSecondColumn, 3 ), c_light_red, _( "Increasing Dex further costs 2 points" ) ); @@ -1126,8 +1204,8 @@ tab_direction set_stats( avatar &u, pool_type pool ) break; case 3: { - mvwprintz( w, point( 2, 7 ), COL_SELECT, _( "Intelligence:" ) ); - mvwprintz( w, point( 16, 7 ), c_light_gray, "%2d", u.int_max ); + mvwprintz( w, point( 2, 8 ), COL_SELECT, _( "Intelligence:" ) ); + mvwprintz( w, point( 16, 8 ), c_light_gray, "%2d", u.int_max ); if( u.int_max >= HIGH_STAT ) { mvwprintz( w, point( iSecondColumn, 3 ), c_light_red, _( "Increasing Int further costs 2 points" ) ); @@ -1145,8 +1223,8 @@ tab_direction set_stats( avatar &u, pool_type pool ) break; case 4: - mvwprintz( w, point( 2, 8 ), COL_SELECT, _( "Perception:" ) ); - mvwprintz( w, point( 16, 8 ), c_light_gray, "%2d", u.per_max ); + mvwprintz( w, point( 2, 9 ), COL_SELECT, _( "Perception:" ) ); + mvwprintz( w, point( 16, 9 ), c_light_gray, "%2d", u.per_max ); if( u.per_max >= HIGH_STAT ) { mvwprintz( w, point( iSecondColumn, 3 ), c_light_red, _( "Increasing Per further costs 2 points" ) ); @@ -1339,7 +1417,7 @@ tab_direction set_traits( avatar &u, pool_type pool ) w_description = catacurses::newwin( 3, TERMX - 2, point( 1, TERMY - 4 ) ); ui.position_from_window( w ); page_width = std::min( ( TERMX - 4 ) / used_pages, 38 ); - iContentHeight = TERMY - 9; + iContentHeight = TERMY - 10; pos_calc(); }; @@ -1471,14 +1549,14 @@ tab_direction set_traits( avatar &u, pool_type pool ) cLine = c_light_gray; } - int cur_line_y = 5 + i - start; + int cur_line_y = 6 + i - start; int cur_line_x = 2 + iCurrentPage * page_width; mvwprintz( w, point( cur_line_x, cur_line_y ), cLine, utf8_truncate( mdata.name(), page_width - 2 ) ); } draw_scrollbar( w, iCurrentLine[iCurrentPage], iContentHeight, traits_size[iCurrentPage], - point( page_width * iCurrentPage, 5 ) ); + point( page_width * iCurrentPage, 6 ) ); } wnoutrefresh( w ); @@ -1710,11 +1788,11 @@ tab_direction set_profession( avatar &u, pool_type pool ) catacurses::window w_genderswap; catacurses::window w_items; const auto init_windows = [&]( ui_adaptor & ui ) { - iContentHeight = TERMY - 10; + iContentHeight = TERMY - 11; w = catacurses::newwin( TERMY, TERMX, point_zero ); w_description = catacurses::newwin( 4, TERMX - 2, point( 1, TERMY - 5 ) ); - w_sorting = catacurses::newwin( 1, 55, point( TERMX / 2, 5 ) ); - w_genderswap = catacurses::newwin( 1, 55, point( TERMX / 2, 6 ) ); + w_sorting = catacurses::newwin( 1, 55, point( TERMX / 2, 6 ) ); + w_genderswap = catacurses::newwin( 1, 55, point( TERMX / 2, 7 ) ); w_items = catacurses::newwin( iContentHeight - 3, 55, point( TERMX / 2, 8 ) ); ui.position_from_window( w ); }; @@ -1764,6 +1842,7 @@ tab_direction set_profession( avatar &u, pool_type pool ) // Clear the bottom of the screen and header. mvwprintz( w, point( 1, 3 ), c_light_gray, clear_line ); + mvwprintz( w, point( 1, 4 ), c_light_gray, clear_line ); int pointsForProf = sorted_profs[cur_id]->point_cost(); bool negativeProf = pointsForProf < 0; @@ -1800,7 +1879,7 @@ tab_direction set_profession( avatar &u, pool_type pool ) profs_length : iContentHeight ); int i; for( i = iStartPos; i < end_pos; i++ ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + mvwprintz( w, point( 2, 6 + i - iStartPos ), c_light_gray, " " ); // Clear the line nc_color col; if( u.prof != &sorted_profs[i].obj() ) { @@ -1809,12 +1888,12 @@ tab_direction set_profession( avatar &u, pool_type pool ) col = ( cur_id_is_valid && sorted_profs[i] == sorted_profs[cur_id] ? hilite( COL_SKILL_USED ) : COL_SKILL_USED ); } - mvwprintz( w, point( 2, 5 + i - iStartPos ), col, + mvwprintz( w, point( 2, 6 + i - iStartPos ), col, sorted_profs[i]->gender_appropriate_name( u.male ) ); } //Clear rest of space in case stuff got filtered out for( ; i < iStartPos + iContentHeight; ++i ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + mvwprintz( w, point( 2, 6 + i - iStartPos ), c_light_gray, " " ); // Clear the line } @@ -1969,7 +2048,7 @@ tab_direction set_profession( avatar &u, pool_type pool ) sorted_profs[cur_id]->gender_appropriate_name( !u.male ) ); } - draw_scrollbar( w, cur_id, iContentHeight, profs_length, point( 0, 5 ) ); + draw_scrollbar( w, cur_id, iContentHeight, profs_length, point( 0, 6 ) ); wnoutrefresh( w ); wnoutrefresh( w_description ); @@ -2129,12 +2208,12 @@ tab_direction set_hobbies( avatar &u, pool_type pool ) catacurses::window w_genderswap; catacurses::window w_items; const auto init_windows = [&]( ui_adaptor & ui ) { - iContentHeight = TERMY - 10; + iContentHeight = TERMY - 11; w = catacurses::newwin( TERMY, TERMX, point_zero ); w_description = catacurses::newwin( 4, TERMX - 2, point( 1, TERMY - 5 ) ); - w_sorting = catacurses::newwin( 1, 55, point( TERMX / 2, 5 ) ); - w_genderswap = catacurses::newwin( 1, 55, point( TERMX / 2, 6 ) ); - w_items = catacurses::newwin( iContentHeight - 3, 55, point( TERMX / 2, 8 ) ); + w_sorting = catacurses::newwin( 1, 55, point( TERMX / 2, 6 ) ); + w_genderswap = catacurses::newwin( 1, 55, point( TERMX / 2, 7 ) ); + w_items = catacurses::newwin( iContentHeight - 3, 55, point( TERMX / 2, 9 ) ); ui.position_from_window( w ); }; init_windows( ui ); @@ -2182,6 +2261,7 @@ tab_direction set_hobbies( avatar &u, pool_type pool ) // Clear the bottom of the screen and header. mvwprintz( w, point( 1, 3 ), c_light_gray, clear_line ); + mvwprintz( w, point( 1, 4 ), c_light_gray, clear_line ); int pointsForProf = sorted_profs[cur_id]->point_cost(); bool negativeProf = pointsForProf < 0; @@ -2218,7 +2298,7 @@ tab_direction set_hobbies( avatar &u, pool_type pool ) profs_length : iContentHeight ); int i; for( i = iStartPos; i < end_pos; i++ ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + mvwprintz( w, point( 2, 6 + i - iStartPos ), c_light_gray, " " ); // Clear the line nc_color col; @@ -2229,12 +2309,12 @@ tab_direction set_hobbies( avatar &u, pool_type pool ) col = ( cur_id_is_valid && sorted_profs[i] == sorted_profs[cur_id] ? COL_SELECT : c_light_gray ); } - mvwprintz( w, point( 2, 5 + i - iStartPos ), col, + mvwprintz( w, point( 2, 6 + i - iStartPos ), col, sorted_profs[i]->gender_appropriate_name( u.male ) ); } //Clear rest of space in case stuff got filtered out for( ; i < iStartPos + iContentHeight; ++i ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + mvwprintz( w, point( 2, 6 + i - iStartPos ), c_light_gray, " " ); // Clear the line } @@ -2333,7 +2413,7 @@ tab_direction set_hobbies( avatar &u, pool_type pool ) sorted_profs[cur_id]->gender_appropriate_name( !u.male ) ); } - draw_scrollbar( w, cur_id, iContentHeight, profs_length, point( 0, 5 ) ); + draw_scrollbar( w, cur_id, iContentHeight, profs_length, point( 0, 6 ) ); wnoutrefresh( w ); wnoutrefresh( w_description ); @@ -2513,9 +2593,9 @@ tab_direction set_skills( avatar &u, pool_type pool ) catacurses::window w_description; int iContentHeight = 0; const auto init_windows = [&]( ui_adaptor & ui ) { - iContentHeight = TERMY - 6; + iContentHeight = TERMY - 7; w = catacurses::newwin( TERMY, TERMX, point_zero ); - w_description = catacurses::newwin( iContentHeight - 5, TERMX - 35, point( 31, 5 ) ); + w_description = catacurses::newwin( iContentHeight - 5, TERMX - 35, point( 31, 6 ) ); ui.position_from_window( w ); }; init_windows( ui ); @@ -2654,11 +2734,11 @@ tab_direction set_skills( avatar &u, pool_type pool ) selected, COL_SKILL_USED, rec_disp ); draw_scrollbar( w, selected, iContentHeight, iLines, - point( getmaxx( w ) - 1, 5 ), BORDER_COLOR, true ); + point( getmaxx( w ) - 1, 6 ), BORDER_COLOR, true ); calcStartPos( cur_offset, cur_pos, iContentHeight, num_skills ); for( int i = cur_offset; i < num_skills && i - cur_offset < iContentHeight; ++i ) { - const int y = 5 + i - cur_offset; + const int y = 6 + i - cur_offset; const Skill *thisSkill = sorted_skills[i]; // Clear the line mvwprintz( w, point( 2, y ), c_light_gray, std::string( getmaxx( w ) - 3, ' ' ) ); @@ -2690,7 +2770,7 @@ tab_direction set_skills( avatar &u, pool_type pool ) } - draw_scrollbar( w, cur_pos, iContentHeight, num_skills, point( 0, 5 ) ); + draw_scrollbar( w, cur_pos, iContentHeight, num_skills, point( 0, 6 ) ); wnoutrefresh( w ); wnoutrefresh( w_description ); @@ -2805,11 +2885,11 @@ tab_direction set_scenario( avatar &u, pool_type pool ) catacurses::window w_initial_date; catacurses::window w_flags; const auto init_windows = [&]( ui_adaptor & ui ) { - iContentHeight = TERMY - 10; + iContentHeight = TERMY - 11; w = catacurses::newwin( TERMY, TERMX, point_zero ); w_description = catacurses::newwin( 4, TERMX - 2, point( 1, TERMY - 5 ) ); const int second_column_w = TERMX / 2 - 1; - point origin = point( second_column_w + 1, 5 ); + point origin = point( second_column_w + 1, 6 ); const int w_sorting_h = 2; const int w_profession_h = 4; const int w_location_h = 3; @@ -2884,6 +2964,7 @@ tab_direction set_scenario( avatar &u, pool_type pool ) // Clear the bottom of the screen and header. mvwprintz( w, point( 1, 3 ), c_light_gray, clear_line ); + mvwprintz( w, point( 1, 4 ), c_light_gray, clear_line ); int pointsForScen = sorted_scens[cur_id]->point_cost(); bool negativeScen = pointsForScen < 0; @@ -2941,7 +3022,7 @@ tab_direction set_scenario( avatar &u, pool_type pool ) scens_length : iContentHeight ); int i; for( i = iStartPos; i < end_pos; i++ ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + mvwprintz( w, point( 2, 6 + i - iStartPos ), c_light_gray, " " ); nc_color col; if( get_scenario() != sorted_scens[i] ) { @@ -2958,13 +3039,13 @@ tab_direction set_scenario( avatar &u, pool_type pool ) col = ( cur_id_is_valid && sorted_scens[i] == sorted_scens[cur_id] ? hilite( COL_SKILL_USED ) : COL_SKILL_USED ); } - mvwprintz( w, point( 2, 5 + i - iStartPos ), col, + mvwprintz( w, point( 2, 6 + i - iStartPos ), col, sorted_scens[i]->gender_appropriate_name( u.male ) ); } //Clear rest of space in case stuff got filtered out for( ; i < iStartPos + iContentHeight; ++i ) { - mvwprintz( w, point( 2, 5 + i - iStartPos ), c_light_gray, + mvwprintz( w, point( 2, 6 + i - iStartPos ), c_light_gray, " " ); // Clear the line } @@ -3058,7 +3139,7 @@ tab_direction set_scenario( avatar &u, pool_type pool ) } } - draw_scrollbar( w, cur_id, iContentHeight, scens_length, point( 0, 5 ) ); + draw_scrollbar( w, cur_id, iContentHeight, scens_length, point( 0, 6 ) ); wnoutrefresh( w ); wnoutrefresh( w_description ); wnoutrefresh( w_sorting ); @@ -3288,37 +3369,37 @@ tab_direction set_description( avatar &you, const bool allow_reroll, const int begin_sncol = TERMX / 2; if( isWide ) { w = catacurses::newwin( TERMY, TERMX, point_zero ); - w_name = catacurses::newwin( 2, ncol2 + 2, point( 2, 5 ) ); - w_gender = catacurses::newwin( 1, ncol2 + 2, point( 2, 7 ) ); - w_location = catacurses::newwin( 1, ncol3, point( beginx3, 5 ) ); - w_vehicle = catacurses::newwin( 1, ncol3, point( beginx3, 6 ) ); - w_addictions = catacurses::newwin( 1, ncol3, point( beginx3, 7 ) ); - w_stats = catacurses::newwin( 6, 20, point( 2, 9 ) ); - w_traits = catacurses::newwin( TERMY - 10, ncol2, point( beginx2, 9 ) ); - w_bionics = catacurses::newwin( TERMY - 10, ncol3, point( beginx3, 9 ) ); - w_proficiencies = catacurses::newwin( TERMY - 20, 19, point( 2, 15 ) ); - w_hobbies = catacurses::newwin( TERMY - 10, ncol4, point( beginx4, 9 ) ); + w_name = catacurses::newwin( 2, ncol2 + 2, point( 2, 6 ) ); + w_gender = catacurses::newwin( 1, ncol2 + 2, point( 2, 8 ) ); + w_location = catacurses::newwin( 1, ncol3, point( beginx3, 6 ) ); + w_vehicle = catacurses::newwin( 1, ncol3, point( beginx3, 7 ) ); + w_addictions = catacurses::newwin( 1, ncol3, point( beginx3, 8 ) ); + w_stats = catacurses::newwin( 6, 20, point( 2, 10 ) ); + w_traits = catacurses::newwin( TERMY - 11, ncol2, point( beginx2, 10 ) ); + w_bionics = catacurses::newwin( TERMY - 11, ncol3, point( beginx3, 10 ) ); + w_proficiencies = catacurses::newwin( TERMY - 21, 19, point( 2, 16 ) ); + w_hobbies = catacurses::newwin( TERMY - 11, ncol4, point( beginx4, 10 ) ); w_scenario = catacurses::newwin( 1, ncol2, point( beginx2, 3 ) ); w_profession = catacurses::newwin( 1, ncol3, point( beginx3, 3 ) ); - w_skills = catacurses::newwin( TERMY - 10, 23, point( 22, 9 ) ); + w_skills = catacurses::newwin( TERMY - 11, 23, point( 22, 10 ) ); w_guide = catacurses::newwin( 9, TERMX - 3, point( 2, TERMY - 10 ) ); - w_height = catacurses::newwin( 1, ncol2, point( beginx2, 5 ) ); - w_age = catacurses::newwin( 1, ncol2, point( beginx2, 6 ) ); - w_blood = catacurses::newwin( 1, ncol2, point( beginx2, 7 ) ); + w_height = catacurses::newwin( 1, ncol2, point( beginx2, 6 ) ); + w_age = catacurses::newwin( 1, ncol2, point( beginx2, 7 ) ); + w_blood = catacurses::newwin( 1, ncol2, point( beginx2, 8 ) ); ui.position_from_window( w ); } else { w = catacurses::newwin( TERMY, TERMX, point_zero ); - w_name = catacurses::newwin( 1, ncol_small, point( 2, 5 ) ); - w_gender = catacurses::newwin( 1, ncol_small, point( 2, 6 ) ); - w_height = catacurses::newwin( 1, ncol_small, point( 2, 7 ) ); - w_age = catacurses::newwin( 1, ncol_small, point( begin_sncol, 5 ) ); - w_blood = catacurses::newwin( 1, ncol_small, point( begin_sncol, 6 ) ); - w_location = catacurses::newwin( 1, ncol_small, point( begin_sncol, 7 ) ); - w_stats = catacurses::newwin( 6, ncol_small, point( 2, 9 ) ); - w_scenario = catacurses::newwin( 1, ncol_small, point( begin_sncol, 9 ) ); - w_profession = catacurses::newwin( 1, ncol_small, point( begin_sncol, 10 ) ); - w_vehicle = catacurses::newwin( 2, ncol_small, point( begin_sncol, 12 ) ); - w_addictions = catacurses::newwin( 2, ncol_small, point( begin_sncol, 14 ) ); + w_name = catacurses::newwin( 1, ncol_small, point( 2, 6 ) ); + w_gender = catacurses::newwin( 1, ncol_small, point( 2, 7 ) ); + w_height = catacurses::newwin( 1, ncol_small, point( 2, 8 ) ); + w_age = catacurses::newwin( 1, ncol_small, point( begin_sncol, 6 ) ); + w_blood = catacurses::newwin( 1, ncol_small, point( begin_sncol, 7 ) ); + w_location = catacurses::newwin( 1, ncol_small, point( begin_sncol, 8 ) ); + w_stats = catacurses::newwin( 6, ncol_small, point( 2, 10 ) ); + w_scenario = catacurses::newwin( 1, ncol_small, point( begin_sncol, 10 ) ); + w_profession = catacurses::newwin( 1, ncol_small, point( begin_sncol, 11 ) ); + w_vehicle = catacurses::newwin( 2, ncol_small, point( begin_sncol, 13 ) ); + w_addictions = catacurses::newwin( 2, ncol_small, point( begin_sncol, 15 ) ); w_guide = catacurses::newwin( 2, TERMX - 3, point( 2, TERMY - 3 ) ); ui.position_from_window( w ); } @@ -3395,7 +3476,7 @@ tab_direction set_description( avatar &you, const bool allow_reroll, //Draw the line between editable and non-editable stuff. for( int i = 0; i < getmaxx( w ); ++i ) { if( i == 0 ) { - mvwputch( w, point( i, 8 ), BORDER_COLOR, LINE_XXXO ); + mvwputch( w, point( i, 9 ), BORDER_COLOR, LINE_XXXO ); } else if( i == getmaxx( w ) - 1 ) { wputch( w, BORDER_COLOR, LINE_XOXX ); } else { diff --git a/src/profession.cpp b/src/profession.cpp index 1d387e1dae657..838243ce61233 100644 --- a/src/profession.cpp +++ b/src/profession.cpp @@ -526,6 +526,11 @@ profession::StartingSkillList profession::skills() const return _starting_skills; } +const difficulty_impact &profession::difficulty() const +{ + return _difficulty_impact; +} + bool profession::has_flag( const std::string &flag ) const { return flags.count( flag ) != 0; diff --git a/src/profession.h b/src/profession.h index 09ee3dc83d64e..f8891ee860370 100644 --- a/src/profession.h +++ b/src/profession.h @@ -111,6 +111,7 @@ class profession std::vector CBMs() const; std::vector proficiencies() const; StartingSkillList skills() const; + const difficulty_impact &difficulty() const; std::map spells() const; void learn_spells( avatar &you ) const; diff --git a/src/scenario.cpp b/src/scenario.cpp index 49ed31d9fe941..80697d34df324 100644 --- a/src/scenario.cpp +++ b/src/scenario.cpp @@ -461,6 +461,11 @@ int scenario::start_location_targets_count() const return cnt; } +const difficulty_impact &scenario::difficulty() const +{ + return _difficulty_impact; +} + bool scenario::custom_start_date() const { return _custom_start_date; diff --git a/src/scenario.h b/src/scenario.h index 282c79dcc8f4e..ad006b84dc412 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -91,6 +91,7 @@ class scenario std::string start_name() const; int start_location_count() const; int start_location_targets_count() const; + const difficulty_impact &difficulty() const; bool custom_start_date() const; bool is_random_hour() const; From 506555cf27cb9483580743fb8a0ed1b84cc7193a Mon Sep 17 00:00:00 2001 From: David Seguin Date: Wed, 17 Nov 2021 23:47:45 -0500 Subject: [PATCH 03/20] Add difficulty details to scenarios --- data/json/scenarios.json | 36 +++++++++++++++++++ src/difficulty_impact.cpp | 9 ++--- src/newcharacter.cpp | 73 ++++++++++++++++++++++++--------------- 3 files changed, 86 insertions(+), 32 deletions(-) diff --git a/data/json/scenarios.json b/data/json/scenarios.json index c50d6de38a77b..e8b21668550cf 100644 --- a/data/json/scenarios.json +++ b/data/json/scenarios.json @@ -4,6 +4,7 @@ "id": "evacuee", "name": "Evacuee", "points": 0, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "easy", "social": "normal" }, "description": "You have survived the initial wave of panic, and have achieved (relative) safety in one of the many government evac shelters.", "allowed_locs": [ "sloc_shelter_a", "sloc_shelter_b", "sloc_shelter_c" ], "start_name": "Evac Shelter", @@ -14,6 +15,7 @@ "id": "squatter", "name": "Squatter", "points": -1, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, "description": "You have survived the initial wave of panic, and have achieved (relative) safety in an abandoned building. Unfortunately, while you're the only one here now, you are definitely not the first person to be here, and in its current state this building no longer seems nearly as secure as one might have hoped.", "allowed_locs": [ "sloc_shelter_vandalized_a", "sloc_shelter_vandalized_b", "sloc_shelter_vandalized_c" ], "start_name": "Evac Shelter", @@ -24,6 +26,7 @@ "id": "missed", "name": "Missed", "points": 0, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "Whether due to stubbornness, ignorance, or just plain bad luck, you missed the evacuation, and are stuck in a city full of the risen dead.", "allowed_locs": [ "sloc_house", @@ -48,6 +51,7 @@ "id": "largebuilding", "name": "Large Building", "points": -2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "Whether due to stubbornness, ignorance, or just plain bad luck, you missed the evacuation, and are stuck in a large building full of the risen dead.", "allowed_locs": [ "sloc_mall_loading_area", @@ -66,6 +70,7 @@ "id": "surrounded", "name": "Surrounded", "points": -2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "You've attracted the attention of living dead in some way, now they're all around and you'll likely have to fight thorough them if you want to escape.", "allowed_locs": [ "sloc_house", @@ -94,6 +99,7 @@ "id": "isolationist", "name": "Safe Place", "points": 1, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "easy", "social": "normal" }, "description": "You've found some distant safe place, devoid of the living dead. Looks like you're on your own…", "allowed_locs": [ "sloc_refugee_center", @@ -118,6 +124,7 @@ "flags": [ "CITY_START" ], "id": "infected", "points": -4, + "difficulty_impact": { "offence": "hard", "defence": "hard", "crafting": "normal", "environment": "hard", "social": "normal" }, "start_name": "In Town", "allowed_locs": [ "sloc_house", @@ -142,6 +149,7 @@ "id": "hunted_start", "name": "Challenge - Hunted", "points": -2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, "forced_traits": [ "HAS_NEMESIS" ], "description": "Since the start of the Cataclysm, something has been hunting you relentlessly. You can outrun it, but it always seems to find you eventually. The only escape is for one of you to die.", "allowed_locs": [ @@ -176,6 +184,7 @@ "id": "fungal_start", "name": "Challenge - Fungal Infection", "points": -8, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "You feel spores crawling beneath your skin. It's only a matter of time.", "start_name": "In Town", "allowed_locs": [ @@ -204,6 +213,7 @@ "flags": [ "FIRE_START", "CITY_START" ], "id": "fire", "points": -2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "start_name": "In Town", "allowed_locs": [ "sloc_house", @@ -227,6 +237,7 @@ "id": "bad_day", "name": "Challenge - Really Bad Day", "points": -8, + "difficulty_impact": { "offence": "very_hard", "defence": "very_hard", "crafting": "normal", "environment": "very_hard", "social": "normal" }, "description": "You start drunk to the point of incapacitation, depressed, infected, surrounded by fire, and sick with the flu. This day went downhill really fast.", "start_name": "In Town", "allowed_locs": [ @@ -258,6 +269,7 @@ "id": "medieval", "name": "Challenge - Medieval Peasant", "points": -8, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "very_hard", "environment": "normal", "social": "hard" }, "description": "Som nigromancie hath brought yow hidder! Ye have only the hoose on youre legges and the knyf at youre syde and youre prayeres to Marie moder of God.", "start_name": "Wilderness", "allowed_locs": [ "sloc_forest", "sloc_field" ], @@ -271,6 +283,7 @@ "id": "lab_chal", "name": "Challenge - Lab Patient", "points": -8, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "very_hard", "social": "normal" }, "description": "The scientists stopped their experiments on you abruptly, leaving you behind while they evacuated before lockdown. Find a way to escape or starve to death.", "start_name": "Locked Lab", "professions": [ "unemployed", "mutant_patient", "mutant_volunteer" ], @@ -324,6 +337,7 @@ "id": "lab_staff", "name": "Challenge - Lab Staff", "points": -8, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "very_hard", "social": "normal" }, "description": "You were deemed non-essential and made to stay behind during the lab evacuation. Find a way to escape or starve to death.", "start_name": "Locked Lab", "professions": [ "labtech", "security", "medic" ], @@ -335,6 +349,7 @@ "id": "lab_cargo_staff_1", "name": "Challenge - Trans-Coast Logistics Concourse", "points": -6, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "You were deemed an essential employee and required to stay behind during the facility's evacuation. You better find your misplaced lanyard with your badge before the automated defenses notice that you don't have one.", "start_name": "Locked Lab", "professions": [ "security" ], @@ -347,6 +362,7 @@ "id": "bordered", "name": "Challenge - Bordered", "points": -2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "You have survived the initial wave of panic, and have achieved (relative) safety in one of the many government evac shelters. The only thing that really bothers you is a mysterious sky-high wall seen in the distance.", "allowed_locs": [ "sloc_shelter_a", "sloc_shelter_b", "sloc_shelter_c" ], "start_name": "Evac Shelter", @@ -357,6 +373,7 @@ "id": "ambushed", "name": "Ambush", "points": -3, + "difficulty_impact": { "offence": "hard", "defence": "hard", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "It is the winter after zero hour. As you were scavenging for food and a warm place to stay at, you heard the sound of lots of movement nearby.", "allowed_locs": [ "sloc_field", @@ -380,6 +397,7 @@ "id": "summer_advanced_start", "name": "The Next Summer", "points": 0, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, "description": "A little over a year has passed since the apocalypse started, and you're about to face your second summer in Hell.", "allowed_locs": [ "sloc_field", @@ -404,6 +422,7 @@ "id": "alone", "name": "Sheltered", "points": -3, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "easy", "social": "normal" }, "description": "When the apocalypse broke out, you were funneled into a nearby shelter. Here you have lived, never leaving, lest the unknowns of the outside world hurt you. Supplies are running low, and for the first time since the Cataclysm, you will be forced to face the outside world.", "allowed_locs": [ "sloc_lmoe_empty", "sloc_shelter_a", "sloc_shelter_b", "sloc_shelter_c" ], "start_name": "Enclosed Shelter", @@ -416,6 +435,7 @@ "id": "patient", "name": "Challenge - Abandoned", "points": -8, + "difficulty_impact": { "offence": "hard", "defence": "very_hard", "crafting": "normal", "environment": "very_hard", "social": "normal" }, "description": "Sickly and frail, you have spent most of your life in the patient's ward of the hospital. When yours was evacuated, you were left behind because you were a lost cause. You awaken to the sound of movement around the hospital.", "allowed_locs": [ "sloc_hospital" ], "start_name": "Hospital", @@ -429,6 +449,7 @@ "id": "prisonbreak", "name": "Prison", "points": -4, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "When the Cataclysm happened, you were convicted or working in a prison. Now the prisoners have turned into mindless horrors and the security bots are shooting on sight… you might need to expedite your escape plans.", "allowed_locs": [ "sloc_prison" ], "start_name": "Prison", @@ -449,6 +470,7 @@ "id": "alcatraz", "name": "Challenge - Island Prison", "points": -6, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "very_hard", "social": "normal" }, "description": "You were in a high-security prison right before the Cataclysm. Unfortunately, you're still in it, so you need to figure out how to escape. It's located on a remote island to boot; you'll eventually need to escape that also.", "allowed_locs": [ "sloc_prison_alcatraz", "sloc_prison_island" ], "start_name": "Island prison", @@ -469,6 +491,7 @@ "id": "migo_prisoner", "name": "Challenge - Mi-Go Camp", "points": -8, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "very_hard", "social": "normal" }, "description": "You find yourself in the most alien place you've ever seen. The hot humid air and the organic aspect of the structure makes you feel like you're trapped inside a giant creature. Whatever it is, you need to get out of here before They find you.", "allowed_locs": [ "sloc_mi-go_camp" ], "start_name": "Mi-Go Camp", @@ -481,6 +504,7 @@ "id": "mutant", "name": "Experiment", "points": 2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, "description": "Since birth, your sole purpose in life has been the advancement of genetic science, willingly or not. Once the Cataclysm struck, you left the lab, and wandered aimlessly, ending up in a forest.", "start_name": "Wilderness", "allowed_locs": [ "sloc_forest", "sloc_field" ], @@ -532,6 +556,7 @@ "id": "foodplace", "name": "The Mascot Rises", "points": 0, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, "description": "You just finished your shift and got back in the break room when you heard the alarms and the security door shutting down behind you. There's a lot of customers out there and you're not sure Foodplace's delicious food™ is going to be enough for them.", "allowed_locs": [ "sloc_restaraunt_foodplace_break_room" ], "professions": [ "true_foodperson", "unemployed" ], @@ -543,6 +568,7 @@ "id": "last_delivery", "name": "The Last Delivery", "points": 2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, "description": "While the world was falling apart someone called to order some of Foodplace's delicious food™ and they sent you to do the delivery. You're not sure about much, but one thing is certain: that delicious food™ is going to get delivered even if that's the last thing you do!", "vehicle": "food_truck_delivery_mission", "professions": [ "true_foodperson", "unemployed" ], @@ -556,6 +582,7 @@ "id": "last_flight", "name": "Last Flight", "points": 2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "easy", "social": "normal" }, "description": "Once it became clear that the world was ending you took to the skies, hoping that your flying skills could lead you to safety. You found no standing safe zones, and when your fuel ran out, were forced to land over an empty bridge.", "start_name": "Emergency Landing Site", "allowed_locs": [ "sloc_bridge" ], @@ -569,6 +596,7 @@ "id": "wilderness", "name": "Wilderness", "points": 0, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, "description": "You find yourself amongst trees. The screaming and the moaning is fainter this far from civilization, but you'd better know what you're doing out here.", "start_name": "Wilderness", "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_campsite", "sloc_campground", "sloc_desert_island", "sloc_river" ], @@ -579,6 +607,7 @@ "id": "heli_crash", "name": "Helicopter Crash", "points": -5, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, "description": "While being transported to a different military base, the pilot lost control of the helicopter and crashed in the middle of nowhere. Hopefully some of the soldiers that were with you also survived the accident.", "start_name": "Crash site", "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island" ], @@ -604,6 +633,7 @@ "id": "Mine_bottom", "name": "Bottom of a Mine", "points": 1, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "You were participating in a mining operation when you found… something. You're not sure what, but it sure is dark down here.", "start_name": "Bottom of a mine", "allowed_locs": [ "sloc_mine_finale" ], @@ -615,6 +645,7 @@ "id": "overrun", "name": "Overrun", "points": 3, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "Despite all the soldiers, guns and minefields, the base you were on got overrun by the dead. Everyone was ordered to fall back to the armory, but during all the chaos you got lost and you are now stuck in the warehouse all alone. You are not sure if anyone made it to the armory, or if you are the last man alive.", "start_name": "Military Base Warehouse", "allowed_locs": [ "sloc_military_base_warehouse" ], @@ -641,6 +672,7 @@ "id": "presort", "name": "Crazy Party", "points": -2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "You thought things couldn't get any worse when the cops came over to bust your wild party, even though you booked it at a private resort. When the guests started fighting with the police you tried to get them to calm down, only to find out they hungered for more.", "start_name": "Private resort", "allowed_locs": [ "sloc_private_resort" ], @@ -652,6 +684,7 @@ "id": "car_crash", "name": "Car Crash", "points": -2, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, "description": "You decided the open road would be a better prospect than the zombie-filled cities. While en route to your destination, you were involved in a wreck. Injured and alone, death seems inevitable.", "allowed_locs": [ "sloc_road" ], "start_name": "Crash Site", @@ -663,6 +696,7 @@ "id": "strong_portal_storm", "name": "Outside In Strong Portal Storm", "points": -3, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "A powerful portal storm is happening and you need to find shelter.", "flags": [ "CHALLENGE", "LONE_START" ], "start_name": "Field", @@ -674,6 +708,7 @@ "id": "strong_portal_storm_base", "name": "Stronger Portal Storms", "points": -4, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "You've managed to get to a shelter, but reality has grown weaker than normal and portal storms will be quite strong.", "flags": [ "CHALLENGE", "LONE_START" ], "start_name": "Evac Shelter", @@ -709,6 +744,7 @@ "id": "Mansion", "name": "Mansion Escape", "points": -1, + "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, "description": "You were living the high life when the world ended, surrounded by riches and extravagant food every day, but now you find yourself awakening from an induced paralysis and carried to the basement of the mansion in which you used to live, heavy footsteps resound around you, are you ready to survive in this new world?", "allowed_locs": [ "sloc_mansion_basement" ], "start_name": "Mansion", diff --git a/src/difficulty_impact.cpp b/src/difficulty_impact.cpp index 411f3ea13c1bf..caac9f78e11d1 100644 --- a/src/difficulty_impact.cpp +++ b/src/difficulty_impact.cpp @@ -12,7 +12,7 @@ const std::string difficulty_impact::get_diff_desc( const difficulty_option &dif //~ Describes game difficulty { DIFF_EASY, _( "Easy" ) }, //~ Describes game difficulty - { DIFF_MEDIUM, _( "Medium" ) }, + { DIFF_MEDIUM, _( "Normal" ) }, //~ Describes game difficulty { DIFF_HARD, _( "Hard" ) }, //~ Describes game difficulty @@ -22,12 +22,13 @@ const std::string difficulty_impact::get_diff_desc( const difficulty_option &dif return d == diff_map.end() ? _( "None" ) : d->second; } -difficulty_impact::difficulty_option difficulty_impact::get_opt_from_str( const std::string &diff_str ) const +difficulty_impact::difficulty_option difficulty_impact::get_opt_from_str( + const std::string &diff_str ) const { static const std::map diff_map { { "very_easy", DIFF_VERY_EASY }, { "easy", DIFF_EASY }, - { "medium", DIFF_MEDIUM }, + { "normal", DIFF_MEDIUM }, { "hard", DIFF_HARD }, { "very_hard", DIFF_VERY_HARD } }; @@ -47,7 +48,7 @@ void difficulty_impact::load( const JsonObject &jo ) defence = get_opt_from_str( readr_us ); optional( jo, false, "crafting", readr_intl, std::string() ); crafting = get_opt_from_str( readr_intl ); - optional( jo, false, "wilderness", readr_intl, std::string() ); + optional( jo, false, "environment", readr_intl, std::string() ); wilderness = get_opt_from_str( readr_intl ); optional( jo, false, "social", readr_intl, std::string() ); social = get_opt_from_str( readr_intl ); diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 18b7018f9c9f7..8a2acc697bfad 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -304,49 +304,59 @@ static std::string pools_to_string( const avatar &u, pool_type pool ) static std::string difficulty_to_string( const avatar &u ) { - float off_diff = 3.0f; - float def_diff = 3.0f; - float cft_diff = 3.0f; - float wld_diff = 3.0f; - float scl_diff = 3.0f; + float off_diff = 0.0f; + float def_diff = 0.0f; + float cft_diff = 0.0f; + float wld_diff = 0.0f; + float scl_diff = 0.0f; int off_cnt = 0; int def_cnt = 0; int cft_cnt = 0; int wld_cnt = 0; int scl_cnt = 0; - auto mod_diff = [&]( const difficulty_impact &diff ) { + auto mod_diff = [&]( const difficulty_impact & diff, float mod ) { if( diff.offence != difficulty_impact::DIFF_NONE ) { - off_diff += static_cast( diff.offence ); + off_diff += static_cast( diff.offence ) * mod; off_cnt++; - } else if( diff.defence != difficulty_impact::DIFF_NONE ) { - def_diff += static_cast( diff.defence ); + } + if( diff.defence != difficulty_impact::DIFF_NONE ) { + def_diff += static_cast( diff.defence ) * mod; def_cnt++; - } else if( diff.crafting != difficulty_impact::DIFF_NONE ) { - cft_diff += static_cast( diff.crafting ); + } + if( diff.crafting != difficulty_impact::DIFF_NONE ) { + cft_diff += static_cast( diff.crafting ) * mod; cft_cnt++; - } else if( diff.wilderness != difficulty_impact::DIFF_NONE ) { - wld_diff += static_cast( diff.wilderness ); + } + if( diff.wilderness != difficulty_impact::DIFF_NONE ) { + wld_diff += static_cast( diff.wilderness ) * mod; wld_cnt++; - } else if( diff.social != difficulty_impact::DIFF_NONE ) { - scl_diff += static_cast( diff.social ); + } + if( diff.social != difficulty_impact::DIFF_NONE ) { + scl_diff += static_cast( diff.social ) * mod; scl_cnt++; } }; - if( u.prof != nullptr ) { - mod_diff( u.prof->difficulty() ); - } if( get_scenario() != nullptr ) { - mod_diff( get_scenario()->difficulty() ); + mod_diff( get_scenario()->difficulty(), 1.0f ); + off_diff = off_diff < 1.f ? 3.f : off_diff; + def_diff = def_diff < 1.f ? 3.f : def_diff; + cft_diff = cft_diff < 1.f ? 3.f : cft_diff; + wld_diff = wld_diff < 1.f ? 3.f : wld_diff; + scl_diff = scl_diff < 1.f ? 3.f : scl_diff; + } + if( u.prof != nullptr ) { + mod_diff( u.prof->difficulty(), 1.0f ); } for( const profession *prof : u.hobbies ) { if( prof != nullptr ) { - mod_diff( prof->difficulty() ); + // Hobbies have less effect on difficulty + mod_diff( prof->difficulty(), 0.5f ); } } for( const trait_id &tr : u.my_traits ) { - mod_diff( tr->impact_on_difficulty ); + mod_diff( tr->impact_on_difficulty, 0.8f ); } int off = std::round( off_diff / ( off_cnt > 0 ? off_cnt : 1 ) ); @@ -357,19 +367,26 @@ static std::string difficulty_to_string( const avatar &u ) auto diff_colr = []( int diff ) { switch( diff ) { - case 1: return "light_green"; - case 2: return "light_cyan"; - case 4: return "brown"; - case 5: return "light_red"; - default: return "yellow"; + case 1: + return "light_green"; + case 2: + return "light_cyan"; + case 4: + return "brown"; + case 5: + return "light_red"; + default: + return "yellow"; } }; auto diff_desc = []( int diff ) { - return difficulty_impact::get_diff_desc( static_cast( diff > 0 ? diff : 3 ) ); + return difficulty_impact::get_diff_desc( static_cast + ( diff > 0 ? diff : 3 ) ); }; - return string_format( "%s | %s: %s %s: %s %s: %s %s: %s %s: %s", _( "Difficulty" ), + return string_format( "%s | %s: %s %s: %s %s: %s %s: %s %s: %s", + _( "Difficulty" ), _( "Offense" ), diff_colr( off ), diff_desc( off ), _( "Defense" ), diff_colr( def ), diff_desc( def ), _( "Crafting" ), diff_colr( cft ), diff_desc( cft ), From 74b19e5bc3ac69482046b74f08e05881a4ded88b Mon Sep 17 00:00:00 2001 From: David Seguin Date: Thu, 18 Nov 2021 00:51:19 -0500 Subject: [PATCH 04/20] Use translation markers in static map --- src/difficulty_impact.cpp | 14 +++++++------- src/difficulty_impact.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/difficulty_impact.cpp b/src/difficulty_impact.cpp index caac9f78e11d1..fe98cef125cdd 100644 --- a/src/difficulty_impact.cpp +++ b/src/difficulty_impact.cpp @@ -4,22 +4,22 @@ #include "difficulty_impact.h" #include "generic_factory.h" -const std::string difficulty_impact::get_diff_desc( const difficulty_option &diff ) +std::string difficulty_impact::get_diff_desc( const difficulty_option &diff ) { static const std::map diff_map { //~ Describes game difficulty - { DIFF_VERY_EASY, _( "Very Easy" ) }, + { DIFF_VERY_EASY, translate_marker( "Very Easy" ) }, //~ Describes game difficulty - { DIFF_EASY, _( "Easy" ) }, + { DIFF_EASY, translate_marker( "Easy" ) }, //~ Describes game difficulty - { DIFF_MEDIUM, _( "Normal" ) }, + { DIFF_MEDIUM, translate_marker( "Normal" ) }, //~ Describes game difficulty - { DIFF_HARD, _( "Hard" ) }, + { DIFF_HARD, translate_marker( "Hard" ) }, //~ Describes game difficulty - { DIFF_VERY_HARD, _( "Very Hard" ) } + { DIFF_VERY_HARD, translate_marker( "Very Hard" ) } }; auto d = diff_map.find( diff ); - return d == diff_map.end() ? _( "None" ) : d->second; + return d == diff_map.end() ? _( "None" ) : _( d->second ); } difficulty_impact::difficulty_option difficulty_impact::get_opt_from_str( diff --git a/src/difficulty_impact.h b/src/difficulty_impact.h index 449819f4aaab6..31e1678ef3694 100644 --- a/src/difficulty_impact.h +++ b/src/difficulty_impact.h @@ -22,7 +22,7 @@ struct difficulty_impact { difficulty_option wilderness = DIFF_NONE; difficulty_option social = DIFF_NONE; - static const std::string get_diff_desc( const difficulty_option &diff ); + static std::string get_diff_desc( const difficulty_option &diff ); difficulty_option get_opt_from_str( const std::string &diff_str ) const; void load( const JsonObject &jo ); From 6fd79db007cf927b84e30c1b614886212a7600d6 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Thu, 18 Nov 2021 20:25:42 -0500 Subject: [PATCH 05/20] Define difficulty impact and rating types in JSON --- data/json/difficulty.json | 67 +++++++++ data/json/scenarios.json | 288 ++++++++++++++++++++++++++++++++----- src/difficulty_impact.cpp | 167 ++++++++++++++------- src/difficulty_impact.h | 74 +++++++--- src/init.cpp | 5 + src/mutation.h | 2 +- src/mutation_data.cpp | 20 ++- src/newcharacter.cpp | 127 ++++++---------- src/profession.cpp | 24 +++- src/profession.h | 4 +- src/scenario.cpp | 23 ++- src/scenario.h | 4 +- src/string_id_null_ids.cpp | 2 + src/type_id.h | 6 + 14 files changed, 616 insertions(+), 197 deletions(-) create mode 100644 data/json/difficulty.json diff --git a/data/json/difficulty.json b/data/json/difficulty.json new file mode 100644 index 0000000000000..0683b92e16ca8 --- /dev/null +++ b/data/json/difficulty.json @@ -0,0 +1,67 @@ +[ + { + "type": "difficulty_opt", + "id": "very_easy", + "value": 1, + "name": "Very Easy", + "color": "light_green" + }, + { + "type": "difficulty_opt", + "id": "easy", + "value": 2, + "name": "Easy", + "color": "light_cyan" + }, + { + "type": "difficulty_opt", + "id": "normal", + "value": 3, + "name": "Normal", + "color": "yellow" + }, + { + "type": "difficulty_opt", + "id": "hard", + "value": 4, + "name": "Hard", + "color": "brown" + }, + { + "type": "difficulty_opt", + "id": "very_hard", + "value": 5, + "name": "Very Hard", + "color": "light_red" + }, + { + "type": "difficulty_impact", + "//": "Difficulty impacting melee and ranged combat", + "id": "combat", + "name": "Combat" + }, + { + "type": "difficulty_impact", + "//": "Difficulty impacting speed and dexterity", + "id": "mobility", + "name": "Mobility" + }, + { + "type": "difficulty_impact", + "//": "Difficulty impacting learning and applying skills", + "id": "crafting", + "name": "Crafting" + }, + { + "type": "difficulty_impact", + "//": "Difficulty impacting how safe the environment is", + "id": "environment", + "name": "Environment" + }, + { + "type": "difficulty_impact", + "//": "Difficulty impacting interaction with NPCs", + "id": "social", + "name": "Social" + } +] diff --git a/data/json/scenarios.json b/data/json/scenarios.json index e8b21668550cf..12db38198efba 100644 --- a/data/json/scenarios.json +++ b/data/json/scenarios.json @@ -4,7 +4,13 @@ "id": "evacuee", "name": "Evacuee", "points": 0, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "easy", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "description": "You have survived the initial wave of panic, and have achieved (relative) safety in one of the many government evac shelters.", "allowed_locs": [ "sloc_shelter_a", "sloc_shelter_b", "sloc_shelter_c" ], "start_name": "Evac Shelter", @@ -15,7 +21,13 @@ "id": "squatter", "name": "Squatter", "points": -1, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "description": "You have survived the initial wave of panic, and have achieved (relative) safety in an abandoned building. Unfortunately, while you're the only one here now, you are definitely not the first person to be here, and in its current state this building no longer seems nearly as secure as one might have hoped.", "allowed_locs": [ "sloc_shelter_vandalized_a", "sloc_shelter_vandalized_b", "sloc_shelter_vandalized_c" ], "start_name": "Evac Shelter", @@ -26,7 +38,13 @@ "id": "missed", "name": "Missed", "points": 0, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "Whether due to stubbornness, ignorance, or just plain bad luck, you missed the evacuation, and are stuck in a city full of the risen dead.", "allowed_locs": [ "sloc_house", @@ -51,7 +69,13 @@ "id": "largebuilding", "name": "Large Building", "points": -2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "Whether due to stubbornness, ignorance, or just plain bad luck, you missed the evacuation, and are stuck in a large building full of the risen dead.", "allowed_locs": [ "sloc_mall_loading_area", @@ -70,7 +94,13 @@ "id": "surrounded", "name": "Surrounded", "points": -2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "You've attracted the attention of living dead in some way, now they're all around and you'll likely have to fight thorough them if you want to escape.", "allowed_locs": [ "sloc_house", @@ -99,7 +129,13 @@ "id": "isolationist", "name": "Safe Place", "points": 1, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "easy", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "description": "You've found some distant safe place, devoid of the living dead. Looks like you're on your own…", "allowed_locs": [ "sloc_refugee_center", @@ -124,7 +160,13 @@ "flags": [ "CITY_START" ], "id": "infected", "points": -4, - "difficulty_impact": { "offence": "hard", "defence": "hard", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "start_name": "In Town", "allowed_locs": [ "sloc_house", @@ -149,7 +191,13 @@ "id": "hunted_start", "name": "Challenge - Hunted", "points": -2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "forced_traits": [ "HAS_NEMESIS" ], "description": "Since the start of the Cataclysm, something has been hunting you relentlessly. You can outrun it, but it always seems to find you eventually. The only escape is for one of you to die.", "allowed_locs": [ @@ -184,7 +232,13 @@ "id": "fungal_start", "name": "Challenge - Fungal Infection", "points": -8, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "You feel spores crawling beneath your skin. It's only a matter of time.", "start_name": "In Town", "allowed_locs": [ @@ -213,7 +267,13 @@ "flags": [ "FIRE_START", "CITY_START" ], "id": "fire", "points": -2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "start_name": "In Town", "allowed_locs": [ "sloc_house", @@ -237,7 +297,13 @@ "id": "bad_day", "name": "Challenge - Really Bad Day", "points": -8, - "difficulty_impact": { "offence": "very_hard", "defence": "very_hard", "crafting": "normal", "environment": "very_hard", "social": "normal" }, + "difficulty": [ + [ "combat", "very_hard" ], + [ "mobility", "very_hard" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ], "description": "You start drunk to the point of incapacitation, depressed, infected, surrounded by fire, and sick with the flu. This day went downhill really fast.", "start_name": "In Town", "allowed_locs": [ @@ -269,7 +335,13 @@ "id": "medieval", "name": "Challenge - Medieval Peasant", "points": -8, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "very_hard", "environment": "normal", "social": "hard" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_hard" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ], "description": "Som nigromancie hath brought yow hidder! Ye have only the hoose on youre legges and the knyf at youre syde and youre prayeres to Marie moder of God.", "start_name": "Wilderness", "allowed_locs": [ "sloc_forest", "sloc_field" ], @@ -283,7 +355,13 @@ "id": "lab_chal", "name": "Challenge - Lab Patient", "points": -8, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "very_hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ], "description": "The scientists stopped their experiments on you abruptly, leaving you behind while they evacuated before lockdown. Find a way to escape or starve to death.", "start_name": "Locked Lab", "professions": [ "unemployed", "mutant_patient", "mutant_volunteer" ], @@ -337,7 +415,13 @@ "id": "lab_staff", "name": "Challenge - Lab Staff", "points": -8, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "very_hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ], "description": "You were deemed non-essential and made to stay behind during the lab evacuation. Find a way to escape or starve to death.", "start_name": "Locked Lab", "professions": [ "labtech", "security", "medic" ], @@ -349,7 +433,13 @@ "id": "lab_cargo_staff_1", "name": "Challenge - Trans-Coast Logistics Concourse", "points": -6, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "You were deemed an essential employee and required to stay behind during the facility's evacuation. You better find your misplaced lanyard with your badge before the automated defenses notice that you don't have one.", "start_name": "Locked Lab", "professions": [ "security" ], @@ -362,7 +452,13 @@ "id": "bordered", "name": "Challenge - Bordered", "points": -2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "You have survived the initial wave of panic, and have achieved (relative) safety in one of the many government evac shelters. The only thing that really bothers you is a mysterious sky-high wall seen in the distance.", "allowed_locs": [ "sloc_shelter_a", "sloc_shelter_b", "sloc_shelter_c" ], "start_name": "Evac Shelter", @@ -373,7 +469,13 @@ "id": "ambushed", "name": "Ambush", "points": -3, - "difficulty_impact": { "offence": "hard", "defence": "hard", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "It is the winter after zero hour. As you were scavenging for food and a warm place to stay at, you heard the sound of lots of movement nearby.", "allowed_locs": [ "sloc_field", @@ -397,7 +499,13 @@ "id": "summer_advanced_start", "name": "The Next Summer", "points": 0, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "A little over a year has passed since the apocalypse started, and you're about to face your second summer in Hell.", "allowed_locs": [ "sloc_field", @@ -422,7 +530,13 @@ "id": "alone", "name": "Sheltered", "points": -3, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "easy", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "description": "When the apocalypse broke out, you were funneled into a nearby shelter. Here you have lived, never leaving, lest the unknowns of the outside world hurt you. Supplies are running low, and for the first time since the Cataclysm, you will be forced to face the outside world.", "allowed_locs": [ "sloc_lmoe_empty", "sloc_shelter_a", "sloc_shelter_b", "sloc_shelter_c" ], "start_name": "Enclosed Shelter", @@ -435,7 +549,13 @@ "id": "patient", "name": "Challenge - Abandoned", "points": -8, - "difficulty_impact": { "offence": "hard", "defence": "very_hard", "crafting": "normal", "environment": "very_hard", "social": "normal" }, + "difficulty": [ + [ "combat", "very_hard" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ], "description": "Sickly and frail, you have spent most of your life in the patient's ward of the hospital. When yours was evacuated, you were left behind because you were a lost cause. You awaken to the sound of movement around the hospital.", "allowed_locs": [ "sloc_hospital" ], "start_name": "Hospital", @@ -449,7 +569,13 @@ "id": "prisonbreak", "name": "Prison", "points": -4, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "When the Cataclysm happened, you were convicted or working in a prison. Now the prisoners have turned into mindless horrors and the security bots are shooting on sight… you might need to expedite your escape plans.", "allowed_locs": [ "sloc_prison" ], "start_name": "Prison", @@ -470,7 +596,13 @@ "id": "alcatraz", "name": "Challenge - Island Prison", "points": -6, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "very_hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ], "description": "You were in a high-security prison right before the Cataclysm. Unfortunately, you're still in it, so you need to figure out how to escape. It's located on a remote island to boot; you'll eventually need to escape that also.", "allowed_locs": [ "sloc_prison_alcatraz", "sloc_prison_island" ], "start_name": "Island prison", @@ -491,7 +623,13 @@ "id": "migo_prisoner", "name": "Challenge - Mi-Go Camp", "points": -8, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "very_hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ], "description": "You find yourself in the most alien place you've ever seen. The hot humid air and the organic aspect of the structure makes you feel like you're trapped inside a giant creature. Whatever it is, you need to get out of here before They find you.", "allowed_locs": [ "sloc_mi-go_camp" ], "start_name": "Mi-Go Camp", @@ -504,7 +642,13 @@ "id": "mutant", "name": "Experiment", "points": 2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "description": "Since birth, your sole purpose in life has been the advancement of genetic science, willingly or not. Once the Cataclysm struck, you left the lab, and wandered aimlessly, ending up in a forest.", "start_name": "Wilderness", "allowed_locs": [ "sloc_forest", "sloc_field" ], @@ -556,7 +700,13 @@ "id": "foodplace", "name": "The Mascot Rises", "points": 0, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "description": "You just finished your shift and got back in the break room when you heard the alarms and the security door shutting down behind you. There's a lot of customers out there and you're not sure Foodplace's delicious food™ is going to be enough for them.", "allowed_locs": [ "sloc_restaraunt_foodplace_break_room" ], "professions": [ "true_foodperson", "unemployed" ], @@ -568,7 +718,13 @@ "id": "last_delivery", "name": "The Last Delivery", "points": 2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "description": "While the world was falling apart someone called to order some of Foodplace's delicious food™ and they sent you to do the delivery. You're not sure about much, but one thing is certain: that delicious food™ is going to get delivered even if that's the last thing you do!", "vehicle": "food_truck_delivery_mission", "professions": [ "true_foodperson", "unemployed" ], @@ -582,7 +738,13 @@ "id": "last_flight", "name": "Last Flight", "points": 2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "easy", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "description": "Once it became clear that the world was ending you took to the skies, hoping that your flying skills could lead you to safety. You found no standing safe zones, and when your fuel ran out, were forced to land over an empty bridge.", "start_name": "Emergency Landing Site", "allowed_locs": [ "sloc_bridge" ], @@ -596,7 +758,13 @@ "id": "wilderness", "name": "Wilderness", "points": 0, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "description": "You find yourself amongst trees. The screaming and the moaning is fainter this far from civilization, but you'd better know what you're doing out here.", "start_name": "Wilderness", "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_campsite", "sloc_campground", "sloc_desert_island", "sloc_river" ], @@ -607,7 +775,13 @@ "id": "heli_crash", "name": "Helicopter Crash", "points": -5, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "description": "While being transported to a different military base, the pilot lost control of the helicopter and crashed in the middle of nowhere. Hopefully some of the soldiers that were with you also survived the accident.", "start_name": "Crash site", "allowed_locs": [ "sloc_field", "sloc_forest", "sloc_desert_island" ], @@ -633,7 +807,13 @@ "id": "Mine_bottom", "name": "Bottom of a Mine", "points": 1, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "You were participating in a mining operation when you found… something. You're not sure what, but it sure is dark down here.", "start_name": "Bottom of a mine", "allowed_locs": [ "sloc_mine_finale" ], @@ -645,7 +825,13 @@ "id": "overrun", "name": "Overrun", "points": 3, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "Despite all the soldiers, guns and minefields, the base you were on got overrun by the dead. Everyone was ordered to fall back to the armory, but during all the chaos you got lost and you are now stuck in the warehouse all alone. You are not sure if anyone made it to the armory, or if you are the last man alive.", "start_name": "Military Base Warehouse", "allowed_locs": [ "sloc_military_base_warehouse" ], @@ -672,7 +858,13 @@ "id": "presort", "name": "Crazy Party", "points": -2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "You thought things couldn't get any worse when the cops came over to bust your wild party, even though you booked it at a private resort. When the guests started fighting with the police you tried to get them to calm down, only to find out they hungered for more.", "start_name": "Private resort", "allowed_locs": [ "sloc_private_resort" ], @@ -684,7 +876,13 @@ "id": "car_crash", "name": "Car Crash", "points": -2, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "normal", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "description": "You decided the open road would be a better prospect than the zombie-filled cities. While en route to your destination, you were involved in a wreck. Injured and alone, death seems inevitable.", "allowed_locs": [ "sloc_road" ], "start_name": "Crash Site", @@ -696,7 +894,13 @@ "id": "strong_portal_storm", "name": "Outside In Strong Portal Storm", "points": -3, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "A powerful portal storm is happening and you need to find shelter.", "flags": [ "CHALLENGE", "LONE_START" ], "start_name": "Field", @@ -708,7 +912,13 @@ "id": "strong_portal_storm_base", "name": "Stronger Portal Storms", "points": -4, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "You've managed to get to a shelter, but reality has grown weaker than normal and portal storms will be quite strong.", "flags": [ "CHALLENGE", "LONE_START" ], "start_name": "Evac Shelter", @@ -744,7 +954,13 @@ "id": "Mansion", "name": "Mansion Escape", "points": -1, - "difficulty_impact": { "offence": "normal", "defence": "normal", "crafting": "normal", "environment": "hard", "social": "normal" }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "description": "You were living the high life when the world ended, surrounded by riches and extravagant food every day, but now you find yourself awakening from an induced paralysis and carried to the basement of the mansion in which you used to live, heavy footsteps resound around you, are you ready to survive in this new world?", "allowed_locs": [ "sloc_mansion_basement" ], "start_name": "Mansion", diff --git a/src/difficulty_impact.cpp b/src/difficulty_impact.cpp index fe98cef125cdd..7d503f21d4d0b 100644 --- a/src/difficulty_impact.cpp +++ b/src/difficulty_impact.cpp @@ -4,52 +4,123 @@ #include "difficulty_impact.h" #include "generic_factory.h" -std::string difficulty_impact::get_diff_desc( const difficulty_option &diff ) -{ - static const std::map diff_map { - //~ Describes game difficulty - { DIFF_VERY_EASY, translate_marker( "Very Easy" ) }, - //~ Describes game difficulty - { DIFF_EASY, translate_marker( "Easy" ) }, - //~ Describes game difficulty - { DIFF_MEDIUM, translate_marker( "Normal" ) }, - //~ Describes game difficulty - { DIFF_HARD, translate_marker( "Hard" ) }, - //~ Describes game difficulty - { DIFF_VERY_HARD, translate_marker( "Very Hard" ) } - }; - auto d = diff_map.find( diff ); - return d == diff_map.end() ? _( "None" ) : _( d->second ); -} - -difficulty_impact::difficulty_option difficulty_impact::get_opt_from_str( - const std::string &diff_str ) const -{ - static const std::map diff_map { - { "very_easy", DIFF_VERY_EASY }, - { "easy", DIFF_EASY }, - { "normal", DIFF_MEDIUM }, - { "hard", DIFF_HARD }, - { "very_hard", DIFF_VERY_HARD } - }; - auto d = diff_map.find( diff_str ); - return d == diff_map.end() ? DIFF_NONE : d->second; -} - -void difficulty_impact::load( const JsonObject &jo ) -{ - std::string readr_intl; - std::string readr_us; - optional( jo, false, "offence", readr_intl, std::string() ); - optional( jo, false, "offense", readr_us, readr_intl ); - offence = get_opt_from_str( readr_us ); - optional( jo, false, "defence", readr_intl, std::string() ); - optional( jo, false, "defense", readr_us, readr_intl ); - defence = get_opt_from_str( readr_us ); - optional( jo, false, "crafting", readr_intl, std::string() ); - crafting = get_opt_from_str( readr_intl ); - optional( jo, false, "environment", readr_intl, std::string() ); - wilderness = get_opt_from_str( readr_intl ); - optional( jo, false, "social", readr_intl, std::string() ); - social = get_opt_from_str( readr_intl ); +namespace +{ +generic_factory difficulty_opt_factory( "difficulty option" ); +generic_factory difficulty_impact_factory( "difficulty impact" ); +} // namespace + +/***************************************************************************** + * Difficulty options + *****************************************************************************/ + +template<> +const difficulty_opt &difficulty_opt_id::obj() const +{ + return difficulty_opt_factory.obj( *this ); +} + +/** @relates string_id */ +template<> +bool difficulty_opt_id::is_valid() const +{ + return difficulty_opt_factory.is_valid( *this ); +} + +void difficulty_opt::load_difficulty_opts( const JsonObject &jo, const std::string &src ) +{ + difficulty_opt_factory.load( jo, src ); +} + +void difficulty_opt::reset() +{ + difficulty_opt_factory.reset(); +} + +const std::vector &difficulty_opt::get_all() +{ + return difficulty_opt_factory.get_all(); +} + +void difficulty_opt::load( const JsonObject &jo, const std::string & ) +{ + mandatory( jo, was_loaded, "name", name_ ); + mandatory( jo, was_loaded, "value", value_ ); + optional( jo, was_loaded, "color", color_, "light_gray" ); +} + +int difficulty_opt::avg_value_ = 0; + +void difficulty_opt::finalize() +{ + int val_total = 0; + int val_count = 0; + for( const difficulty_opt &opt : get_all() ) { + val_total += opt.value(); + val_count++; + } + val_count = val_count > 0 ? val_count : 1; + difficulty_opt::avg_value_ = std::round( val_total / static_cast( val_count ) ); +} + +int difficulty_opt::avg_value() +{ + return difficulty_opt::avg_value_; +} + +int difficulty_opt::value( const difficulty_opt_id &id ) +{ + for( const difficulty_opt &opt : get_all() ) { + if( opt.getId() == id ) { + return opt.value(); + } + } + return 0; +} + +difficulty_opt_id difficulty_opt::getId( int value ) +{ + for( const difficulty_opt &opt : get_all() ) { + if( opt.value() == value ) { + return opt.getId(); + } + } + return difficulty_opt_id::NULL_ID(); +} + +/***************************************************************************** + * Difficulty impacts + *****************************************************************************/ + +template<> +const difficulty_impact &difficulty_impact_id::obj() const +{ + return difficulty_impact_factory.obj( *this ); +} + +/** @relates string_id */ +template<> +bool difficulty_impact_id::is_valid() const +{ + return difficulty_impact_factory.is_valid( *this ); +} + +void difficulty_impact::load_difficulty_impacts( const JsonObject &jo, const std::string &src ) +{ + difficulty_impact_factory.load( jo, src ); +} + +void difficulty_impact::reset() +{ + difficulty_impact_factory.reset(); +} + +const std::vector &difficulty_impact::get_all() +{ + return difficulty_impact_factory.get_all(); +} + +void difficulty_impact::load( const JsonObject &jo, const std::string & ) +{ + mandatory( jo, was_loaded, "name", name_ ); } \ No newline at end of file diff --git a/src/difficulty_impact.h b/src/difficulty_impact.h index 31e1678ef3694..73b3214e10cf9 100644 --- a/src/difficulty_impact.h +++ b/src/difficulty_impact.h @@ -5,27 +5,67 @@ #include #include "json.h" +#include "translations.h" +#include "type_id.h" -struct difficulty_impact { - enum difficulty_option { - DIFF_NONE = 0, - DIFF_VERY_EASY = 1, - DIFF_EASY = 2, - DIFF_MEDIUM = 3, - DIFF_HARD = 4, - DIFF_VERY_HARD = 5 - }; +/** + * A value that represents difficulty rating (i.e.: easy, hard, etc.) + * Values are intended to be set from very easy (1) to very hard (5) +*/ +struct difficulty_opt { + public: + void load( const JsonObject &jo, const std::string &src ); + static const std::vector &get_all(); + static void load_difficulty_opts( const JsonObject &jo, const std::string &src ); + static void reset(); + static void finalize(); + static int value( const difficulty_opt_id &id ); + static difficulty_opt_id getId( int value ); + static int avg_value(); - difficulty_option offence = DIFF_NONE; - difficulty_option defence = DIFF_NONE; - difficulty_option crafting = DIFF_NONE; - difficulty_option wilderness = DIFF_NONE; - difficulty_option social = DIFF_NONE; + const difficulty_opt_id &getId() const { + return id; + } + const translation &name() const { + return name_; + } + int value() const { + return value_; + } + const std::string &color() const { + return color_; + } + private: + bool was_loaded = false; + difficulty_opt_id id; + translation name_; + std::string color_; + int value_ = 0; + static int avg_value_; + friend class generic_factory; +}; - static std::string get_diff_desc( const difficulty_option &diff ); - difficulty_option get_opt_from_str( const std::string &diff_str ) const; +/** + * An aspect of gameplay impacted by difficulty (i.e.: combat, crafting, etc.) +*/ +struct difficulty_impact { + public: + void load( const JsonObject &jo, const std::string &src ); + static const std::vector &get_all(); + static void load_difficulty_impacts( const JsonObject &jo, const std::string &src ); + static void reset(); - void load( const JsonObject &jo ); + const difficulty_impact_id &getId() const { + return id; + } + const translation &name() const { + return name_; + } + private: + bool was_loaded = false; + difficulty_impact_id id; + translation name_; + friend class generic_factory; }; #endif // CATA_SRC_DIFFICULTY_IMPACT_H diff --git a/src/init.cpp b/src/init.cpp index 11ed6d4b1a236..b1a7153f8ced3 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -247,6 +247,8 @@ void DynamicDataLoader::initialize() add( "EXTERNAL_OPTION", &load_external_option ); add( "json_flag", &json_flag::load_all ); add( "fault", &fault::load_fault ); + add( "difficulty_opt", &difficulty_opt::load_difficulty_opts ); + add( "difficulty_impact", &difficulty_impact::load_difficulty_impacts ); add( "relic_procgen_data", &relic_procgen_data::load_relic_procgen_data ); add( "effect_on_condition", &effect_on_conditions::load ); add( "field_type", &field_types::load ); @@ -546,6 +548,8 @@ void DynamicDataLoader::unload_data() clothing_mods::reset(); construction_categories::reset(); construction_groups::reset(); + difficulty_opt::reset(); + difficulty_impact::reset(); dreams.clear(); emit::reset(); enchantment::reset(); @@ -649,6 +653,7 @@ void DynamicDataLoader::finalize_loaded_data( loading_ui &ui ) { _( "Effect on conditions" ), &effect_on_conditions::finalize_all }, { _( "Field types" ), &field_types::finalize_all }, { _( "Ammo effects" ), &ammo_effects::finalize_all }, + { _( "Difficulty ratings" ), &difficulty_opt::finalize }, { _( "Emissions" ), &emit::finalize }, { _( "Items" ), []() diff --git a/src/mutation.h b/src/mutation.h index 32d361a7e154f..3ab1c223c37a1 100644 --- a/src/mutation.h +++ b/src/mutation.h @@ -145,7 +145,7 @@ struct mutation_branch { int ugliness = 0; int cost = 0; // How does the mutation affect the game's difficulty? - difficulty_impact impact_on_difficulty; + std::map difficulty; // costs are consumed every cooldown turns, int cooldown = 0; // bodytemp elements: diff --git a/src/mutation_data.cpp b/src/mutation_data.cpp index 9b3c986a866e1..d95d9e676bed1 100644 --- a/src/mutation_data.cpp +++ b/src/mutation_data.cpp @@ -323,8 +323,14 @@ void mutation_branch::load( const JsonObject &jo, const std::string & ) mandatory( jo, was_loaded, "name", raw_name ); mandatory( jo, was_loaded, "description", raw_desc ); mandatory( jo, was_loaded, "points", points ); - if( jo.has_object( "difficulty_impact" ) ) { - impact_on_difficulty.load( jo.get_object( "difficulty_impact" ) ); + + if( jo.has_member( "difficulty" ) ) { + const JsonArray &diff_arr = jo.get_array( "difficulty" ); + for( const JsonValue &diff : diff_arr ) { + difficulty_impact_id imp( diff.get_array().get_string( 0 ) ); + difficulty_opt_id opt( diff.get_array().get_string( 1 ) ); + difficulty.emplace( imp, opt ); + } } optional( jo, was_loaded, "visibility", visibility, 0 ); @@ -640,6 +646,16 @@ void mutation_branch::check_consistency() debugmsg( "mutation %s refers to undefined species id %s", mid.c_str(), elem.first.c_str() ); } } + for( const auto &diff : mdata.difficulty ) { + if( !diff.first.is_valid() ) { + debugmsg( "difficulty impact %s for mutation %s does not exist", diff.first.c_str(), + mdata.id.c_str() ); + } + if( !diff.second.is_valid() ) { + debugmsg( "difficulty rating %s for mutation %s does not exist", diff.second.c_str(), + mdata.id.c_str() ); + } + } if( s_id && !s_id.value().is_valid() ) { debugmsg( "mutation %s refers to undefined scent type %s", mid.c_str(), s_id.value().c_str() ); } diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 8a2acc697bfad..70283442bf78c 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -304,94 +304,59 @@ static std::string pools_to_string( const avatar &u, pool_type pool ) static std::string difficulty_to_string( const avatar &u ) { - float off_diff = 0.0f; - float def_diff = 0.0f; - float cft_diff = 0.0f; - float wld_diff = 0.0f; - float scl_diff = 0.0f; - int off_cnt = 0; - int def_cnt = 0; - int cft_cnt = 0; - int wld_cnt = 0; - int scl_cnt = 0; - - auto mod_diff = [&]( const difficulty_impact & diff, float mod ) { - if( diff.offence != difficulty_impact::DIFF_NONE ) { - off_diff += static_cast( diff.offence ) * mod; - off_cnt++; - } - if( diff.defence != difficulty_impact::DIFF_NONE ) { - def_diff += static_cast( diff.defence ) * mod; - def_cnt++; - } - if( diff.crafting != difficulty_impact::DIFF_NONE ) { - cft_diff += static_cast( diff.crafting ) * mod; - cft_cnt++; - } - if( diff.wilderness != difficulty_impact::DIFF_NONE ) { - wld_diff += static_cast( diff.wilderness ) * mod; - wld_cnt++; - } - if( diff.social != difficulty_impact::DIFF_NONE ) { - scl_diff += static_cast( diff.social ) * mod; - scl_cnt++; + std::string diff_str = _( "Difficulty" ) + std::string( " |" ); + const scenario *scen = get_scenario(); + const profession *prof = u.prof; + const int avg_val = difficulty_opt::avg_value(); + + for( const difficulty_impact &diff_imp : difficulty_impact::get_all() ) { + if( !diff_imp.getId().is_valid() ) { + continue; } - }; - if( get_scenario() != nullptr ) { - mod_diff( get_scenario()->difficulty(), 1.0f ); - off_diff = off_diff < 1.f ? 3.f : off_diff; - def_diff = def_diff < 1.f ? 3.f : def_diff; - cft_diff = cft_diff < 1.f ? 3.f : cft_diff; - wld_diff = wld_diff < 1.f ? 3.f : wld_diff; - scl_diff = scl_diff < 1.f ? 3.f : scl_diff; - } - if( u.prof != nullptr ) { - mod_diff( u.prof->difficulty(), 1.0f ); - } - for( const profession *prof : u.hobbies ) { + float diff = 0.f; + int diff_cnt = 0; + + auto mod_diff = [&]( const std::map &diff_map, + float mod ) { + auto diff_iter = diff_map.find( diff_imp.getId() ); + if( diff_iter != diff_map.end() ) { + float mod_val = ( diff_iter->second->value() - avg_val ) * mod; + diff += mod_val + avg_val; + diff_cnt++; + } + }; + + if( scen != nullptr ) { + mod_diff( scen->difficulty(), 1.0f ); + if( diff < 1.f ) { + diff = avg_val; + diff_cnt = 1; + } + } if( prof != nullptr ) { + mod_diff( prof->difficulty(), 1.0f ); + } + for( const profession *hob : u.hobbies ) { + if( hob == nullptr ) { + continue; + } // Hobbies have less effect on difficulty - mod_diff( prof->difficulty(), 0.5f ); + mod_diff( hob->difficulty(), 0.5f ); } - } - for( const trait_id &tr : u.my_traits ) { - mod_diff( tr->impact_on_difficulty, 0.8f ); - } - - int off = std::round( off_diff / ( off_cnt > 0 ? off_cnt : 1 ) ); - int def = std::round( def_diff / ( def_cnt > 0 ? def_cnt : 1 ) ); - int cft = std::round( cft_diff / ( cft_cnt > 0 ? cft_cnt : 1 ) ); - int wld = std::round( wld_diff / ( wld_cnt > 0 ? wld_cnt : 1 ) ); - int scl = std::round( scl_diff / ( scl_cnt > 0 ? scl_cnt : 1 ) ); - - auto diff_colr = []( int diff ) { - switch( diff ) { - case 1: - return "light_green"; - case 2: - return "light_cyan"; - case 4: - return "brown"; - case 5: - return "light_red"; - default: - return "yellow"; + for( const trait_id &tr : u.my_traits ) { + if( !tr.is_valid() ) { + continue; + } + mod_diff( tr->difficulty, 0.8f ); } - }; - - auto diff_desc = []( int diff ) { - return difficulty_impact::get_diff_desc( static_cast - ( diff > 0 ? diff : 3 ) ); - }; + int diff_val = std::round( diff / ( diff_cnt > 0 ? diff_cnt : 1 ) ); + difficulty_opt_id diff_id = difficulty_opt::getId( diff_val ); + diff_str += string_format( " %s: %s", diff_imp.name().translated(), + diff_id->color(), diff_id->name() ); + } - return string_format( "%s | %s: %s %s: %s %s: %s %s: %s %s: %s", - _( "Difficulty" ), - _( "Offense" ), diff_colr( off ), diff_desc( off ), - _( "Defense" ), diff_colr( def ), diff_desc( def ), - _( "Crafting" ), diff_colr( cft ), diff_desc( cft ), - _( "Wilderness" ), diff_colr( wld ), diff_desc( wld ), - _( "Social" ), diff_colr( scl ), diff_desc( scl ) ); + return diff_str; } static tab_direction set_points( avatar &u, pool_type & ); diff --git a/src/profession.cpp b/src/profession.cpp index 838243ce61233..5bfa694eda562 100644 --- a/src/profession.cpp +++ b/src/profession.cpp @@ -193,8 +193,14 @@ void profession::load( const JsonObject &jo, const std::string & ) } mandatory( jo, was_loaded, "points", _point_cost ); - if( jo.has_object( "difficulty_impact" ) ) { - _difficulty_impact.load( jo.get_object( "difficulty_impact" ) ); + + if( jo.has_member( "difficulty" ) ) { + const JsonArray &diff_arr = jo.get_array( "difficulty" ); + for( const JsonValue &diff : diff_arr ) { + difficulty_impact_id imp( diff.get_array().get_string( 0 ) ); + difficulty_opt_id opt( diff.get_array().get_string( 1 ) ); + _difficulty.emplace( imp, opt ); + } } if( !was_loaded || jo.has_member( "items" ) ) { @@ -354,6 +360,16 @@ void profession::check_definition() const debugmsg( "skill %s for profession %s does not exist", elem.first.c_str(), id.c_str() ); } } + + for( const auto &diff : _difficulty ) { + if( !diff.first.is_valid() ) { + debugmsg( "difficulty impact %s for profession %s does not exist", diff.first.c_str(), id.c_str() ); + } + if( !diff.second.is_valid() ) { + debugmsg( "difficulty rating %s for profession %s does not exist", diff.second.c_str(), + id.c_str() ); + } + } } bool profession::has_initialized() @@ -526,9 +542,9 @@ profession::StartingSkillList profession::skills() const return _starting_skills; } -const difficulty_impact &profession::difficulty() const +const std::map &profession::difficulty() const { - return _difficulty_impact; + return _difficulty; } bool profession::has_flag( const std::string &flag ) const diff --git a/src/profession.h b/src/profession.h index f8891ee860370..86674da0f2a0f 100644 --- a/src/profession.h +++ b/src/profession.h @@ -51,7 +51,7 @@ class profession translation _description_male; translation _description_female; signed int _point_cost = 0; - difficulty_impact _difficulty_impact; + std::map _difficulty; // TODO: In professions.json, replace lists of itypes (legacy) with item groups itypedecvec legacy_starting_items; @@ -111,7 +111,7 @@ class profession std::vector CBMs() const; std::vector proficiencies() const; StartingSkillList skills() const; - const difficulty_impact &difficulty() const; + const std::map &difficulty() const; std::map spells() const; void learn_spells( avatar &you ) const; diff --git a/src/scenario.cpp b/src/scenario.cpp index 80697d34df324..ef1d99b56fd90 100644 --- a/src/scenario.cpp +++ b/src/scenario.cpp @@ -77,8 +77,14 @@ void scenario::load( const JsonObject &jo, const std::string & ) } mandatory( jo, was_loaded, "points", _point_cost ); - if( jo.has_object( "difficulty_impact" ) ) { - _difficulty_impact.load( jo.get_object( "difficulty_impact" ) ); + + if( jo.has_member( "difficulty" ) ) { + const JsonArray &diff_arr = jo.get_array( "difficulty" ); + for( const JsonValue &diff : diff_arr ) { + difficulty_impact_id imp( diff.get_array().get_string( 0 ) ); + difficulty_opt_id opt( diff.get_array().get_string( 1 ) ); + _difficulty.emplace( imp, opt ); + } } optional( jo, was_loaded, "blacklist_professions", blacklist ); @@ -243,6 +249,15 @@ void scenario::check_definition() const debugmsg( "vehicle prototype %s for profession %s does not exist", _starting_vehicle.c_str(), id.c_str() ); } + + for( const auto &diff : _difficulty ) { + if( !diff.first.is_valid() ) { + debugmsg( "difficulty impact %s for scenario %s does not exist", diff.first.c_str(), id.c_str() ); + } + if( !diff.second.is_valid() ) { + debugmsg( "difficulty rating %s for scenario %s does not exist", diff.second.c_str(), id.c_str() ); + } + } } const string_id &scenario::ident() const @@ -461,9 +476,9 @@ int scenario::start_location_targets_count() const return cnt; } -const difficulty_impact &scenario::difficulty() const +const std::map &scenario::difficulty() const { - return _difficulty_impact; + return _difficulty; } bool scenario::custom_start_date() const diff --git a/src/scenario.h b/src/scenario.h index ad006b84dc412..bc385c0aadc59 100644 --- a/src/scenario.h +++ b/src/scenario.h @@ -46,7 +46,7 @@ class scenario std::set _forbidden_traits; std::vector _allowed_locs; int _point_cost = 0; - difficulty_impact _difficulty_impact; + std::map _difficulty; std::set flags; // flags for some special properties of the scenario std::string _map_extra; std::vector _missions; @@ -91,7 +91,7 @@ class scenario std::string start_name() const; int start_location_count() const; int start_location_targets_count() const; - const difficulty_impact &difficulty() const; + const std::map &difficulty() const; bool custom_start_date() const; bool is_random_hour() const; diff --git a/src/string_id_null_ids.cpp b/src/string_id_null_ids.cpp index 3e9f55cf9c9eb..7aed3d8f0bf87 100644 --- a/src/string_id_null_ids.cpp +++ b/src/string_id_null_ids.cpp @@ -79,3 +79,5 @@ MAKE_NULL_ID2( limb_score, "" ) MAKE_NULL_ID2( bionic_data, "" ) MAKE_NULL_ID2( construction, "constr_null" ) MAKE_NULL_ID2( vehicle_prototype, "null" ) +MAKE_NULL_ID2( difficulty_opt, "none" ) +MAKE_NULL_ID2( difficulty_impact, "none" ) diff --git a/src/type_id.h b/src/type_id.h index 23b79055ef994..ffb1a2eddea68 100644 --- a/src/type_id.h +++ b/src/type_id.h @@ -58,6 +58,12 @@ using scenttype_id = string_id; class ascii_art; using ascii_art_id = string_id; +struct difficulty_opt; +using difficulty_opt_id = string_id; + +struct difficulty_impact; +using difficulty_impact_id = string_id; + class disease_type; using diseasetype_id = string_id; From 628d94526863f62a4866b84346bc16c5c66a6f18 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Thu, 18 Nov 2021 21:17:29 -0500 Subject: [PATCH 06/20] Difficulty info: documentation --- doc/JSON_INFO.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index 3b90b46a05418..ecc8637d08166 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -30,6 +30,8 @@ Use the `Home` key to return to the top. - [Character Modifiers](#character-modifiers) - [Character Modifiers - Value](#character-modifiers---value) - [Bionics](#bionics) + - [Difficulty Rating](#difficulty-rating) + - [Difficulty Impact](#difficulty-impact) - [Dreams](#dreams) - [Disease](#disease) - [Item Groups](#item-groups) @@ -48,6 +50,7 @@ Use the `Home` key to return to the top. - [`description`](#description) - [`name`](#name) - [`points`](#points) + - [`difficulty`](#difficulty) - [`addictions`](#addictions) - [`skills`](#skills) - [`proficiencies`](#proficiencies) @@ -204,6 +207,7 @@ Use the `Home` key to return to the top. - [`description`](#description-1) - [`name`](#name-2) - [`points`](#points-1) + - [`difficulty`](#difficulty-1) - [`items`](#items-3) - [`flags`](#flags-2) - [`cbms`](#cbms-1) @@ -861,6 +865,35 @@ mod = min( max, ( nominator / limb_score ) - subtract ); Bionics effects are defined in the code and new effects cannot be created through JSON alone. When adding a new bionic, if it's not included with another one, you must also add the corresponding CBM item in `data/json/items/bionics.json`. Even for a faulty bionic. +### Difficulty Rating + +```json +{ + "type": "difficulty_opt", + "id": "very_hard", + "value": 5, + "name": "Very Hard", + "color": "light_red" +} +``` + +- `value`: Difficulty value relative to other `difficulty_opt`s +- `name`: Translatable name for this difficulty rating +- `color`: _(optional)_ Defines the color used to highlight the difficulty name in the interface + +### Difficulty Impact + +Difficulty impacts different aspects of gameplay, so these represent different categories that are affected by gameplay. + +```json +{ + "type": "difficulty_impact", + "//": "Difficulty impacting melee and ranged combat", + "id": "combat", + "name": "Combat" +} +``` + ### Dreams | Identifier | Description @@ -1269,6 +1302,22 @@ The in-game name, either one gender-neutral string, or an object with gender spe Point cost of profession. Positive values cost points and negative values grant points. +## `difficulty` +(array of strings) + +Represents the difficulty impact on different aspects of gameplay. Each entry is a pair of strings: a [`difficulty_impact`](#difficulty-impact) and a [`difficulty_opt`](#difficulty-rating). + +Example: +```json +"difficulty": [ + [ "combat", "very_hard" ], + [ "mobility", "very_hard" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] +] +``` + #### `addictions` (optional, array of addictions) @@ -2075,6 +2124,13 @@ The `id` must be exact as it is hardcoded to look for that. "id": "LIGHTEATER", // Unique ID "name": "Optimist", // In-game name displayed "points": 2, // Point cost of the trait. Positive values cost points and negative values give points +"difficulty": [ // Represents the difficulty impact on + [ "combat", "very_hard" ], // different aspects of gameplay. Each + [ "mobility", "very_hard" ], // entry is a pair of strings, refering to + [ "crafting", "normal" ], // "difficulty_impact" and "difficulty_opt" + [ "environment", "very_hard" ], + [ "social", "normal" ] +], "visibility": 0, // Visibility of the trait for purposes of NPC interaction (default: 0) "ugliness": 0, // Ugliness of the trait for purposes of NPC interaction (default: 0) "cut_dmg_bonus": 3, // Bonus to unarmed cut damage (default: 0) @@ -4413,6 +4469,22 @@ The in-game name, either one gender-neutral string, or an object with gender spe Point cost of scenario. Positive values cost points and negative values grant points. +## `difficulty` +(array of strings) + +Represents the difficulty impact on different aspects of gameplay. Each entry is a pair of strings: a [`difficulty_impact`](#difficulty-impact) and a [`difficulty_opt`](#difficulty-rating). + +Example: +```json +"difficulty": [ + [ "combat", "very_hard" ], + [ "mobility", "very_hard" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] +] +``` + ## `items` (optional, object with optional members "both", "male" and "female") From 8fc5ecf2f62c3dd5fbce46d52c74a53ad3641d9f Mon Sep 17 00:00:00 2001 From: David Seguin Date: Thu, 18 Nov 2021 23:08:54 -0500 Subject: [PATCH 07/20] Difficulty info: add difficulty to professions --- data/json/professions.json | 1024 +++++++++++++++++++++++++++++++++++- src/newcharacter.cpp | 6 +- 2 files changed, 1026 insertions(+), 4 deletions(-) diff --git a/data/json/professions.json b/data/json/professions.json index 310e2d3750d87..059e739e5b7ca 100644 --- a/data/json/professions.json +++ b/data/json/professions.json @@ -382,6 +382,13 @@ "name": "Vagabond", "description": "Circumstance left you wandering the world, alone. Now there is nothing to go back to, even if you wanted to. Perhaps your experience in fending for yourself will prove useful in this new world.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "unarmed" }, { "level": 1, "name": "tailor" }, @@ -420,6 +427,13 @@ "name": "Survivor", "description": "Some would say that there's nothing particularly notable about you, but you've survived, and that's more than most could say right now.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "jeans", "longshirt", "socks", "sneakers", "mbag", "pockknife", "water_clean", "wristwatch" ], @@ -435,6 +449,13 @@ "name": "Sheltered Survivor", "description": "At the start of the Cataclysm, you hunkered down in a bomb shelter. You've spent the past months eating canned food, reading books, and tinkering with stuff in the bunker. Now it is winter - time to face the world above.", "points": 4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_fibers", "prof_knitting" ], "skills": [ { "level": 2, "name": "tailor" }, @@ -462,6 +483,13 @@ "name": "Sheltered Militia", "description": "At the start of the Cataclysm, you hunkered down in a bomb shelter with your collection of guns. You've spent the past months eating canned food and practicing your aim. Now it is winter - time to face the world above.", "points": 4, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic", "prof_gunsmithing_improv" ], "skills": [ { "level": 2, "name": "gun" }, { "level": 1, "name": "rifle" }, { "level": 1, "name": "pistol" } ], "items": { @@ -490,6 +518,13 @@ "name": "Tailor", "description": "Tailoring may not seem like the most useful skill when the world has ended. Most people wouldn't expect a simple tailor to live very long. This is your opportunity to prove them wrong.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "//": "Tailoring kit makes an already decent class for careful folks much more powerful.", "skills": [ { "level": 4, "name": "tailor" } ], "proficiencies": [ @@ -515,6 +550,13 @@ "name": "Chef", "description": "Bork bork! Years in the kitchen have left you carrying a prodigious bulk, but you managed to escape the carnage with your trusty butcher knife and only a small collection of stains on your uniform.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "name": "cooking", "level": 4 } ], "items": { "both": { @@ -531,6 +573,13 @@ "name": "Churl", "description": "What the deuyl? Ye ne wist noo thing of this straunge plaas nor what wycked enchauntment brought ye hidder. Wyth this accoustrement ye must needs underfongen to find newe lyflode in the most hidous Cataclysm man hath witnessed sithen that deluge Noe rood out in his greet schippe.", "points": 1, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "footrags", "loincloth", "cloak_wool", "ragpouch", "small_relic", "gloves_wraps", "tunic_rag" ], @@ -556,6 +605,13 @@ "name": "Lab Technician", "description": "Thanks to years of study and hard work in the lab, you're familiar with the basics of scientific inquiry. Only one question remains: can you undo the very Cataclysm your colleagues helped create?", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "computer" }, { "level": 2, "name": "chemistry" }, @@ -581,6 +637,13 @@ "description": "You've always loved cars, and there's nothing like getting under the hood and fixing it yourself. You've kept hold of some handy tools for the job, and at least now you'll never want for parts.", "proficiencies": [ "prof_metalworking", "prof_welding_basic", "prof_elec_soldering" ], "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "mechanics" }, { "level": 1, "name": "driving" } ], "items": { "both": { @@ -602,6 +665,13 @@ "name": "Scoundrel", "description": "Your flexible outlook on the law, the scuffles you've been in (and avoided) at the bar, and your impressive ability to weasel your way out of the consequences of your actions - all these skills have helped ensure your survival. How much longer will they hold out?", "points": 2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_lockpicking" ], "skills": [ { "level": 1, "name": "melee" }, @@ -638,6 +708,13 @@ "name": "Beekeeper", "description": "You used to be a professional apiarist, building and maintaining beehives. You had to abandon your precious bees when the Cataclysm struck, but at least you managed to grab some utensils and honey.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "name": "survival", "level": 2 }, { "name": "fabrication", "level": 1 } ], "items": { "both": { @@ -664,6 +741,13 @@ "name": "Baseball Player", "description": "You played with the local team. You're the only one left, but now you can use your trusty bat for another purpose. Home run!", "points": 1, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "throw" }, { "level": 1, "name": "melee" } ], "items": { "both": { @@ -680,6 +764,13 @@ "name": "Basketball Player", "description": "Your first major game was abruptly cancelled when zombies stormed the court. Quick feet and good reflexes meant you were among the lucky few to escape the stadium alive.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "dodge" }, { "level": 3, "name": "throw" } ], "items": { "both": { @@ -696,6 +787,13 @@ "name": "True Foodperson", "description": "You are the true Foodperson. Some might think Foodperson is just a mascot, but you know better. The mask has become your face, you are real, and the only thing standing between this world and oblivion is you.", "points": 0, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "easy" ] + ], "traits": [ "PROF_FOODP" ], "skills": [ { "level": 2, "name": "speech" } ], "items": { @@ -728,6 +826,13 @@ "name": "Professional Cyclist", "description": "You were a promising cyclist with a bright career in front of you before this all happened. Perhaps you'll never get to participate in the grand tours now, but as the saying goes, life is like riding a bicycle: you've got to keep moving.", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "driving" }, { "level": 2, "name": "dodge" } ], "items": { "both": { @@ -755,6 +860,13 @@ "name": "Major General", "description": "You worked your way up through the ranks from a no-name private to a big shot Major General, respected and decorated. On the downside, years of desk duty have left your shooting skills rusty, and all the medals in the world won't protect you now.", "points": 4, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_easy" ] + ], "proficiencies": [ "prof_gunsmithing_basic" ], "skills": [ { "level": 1, "name": "gun" }, @@ -793,6 +905,13 @@ "name": "Military Recruit", "description": "Joining the military has been your dream for years. You finally got in, just in time for your training to get interrupted by some sort of national emergency. As far as you can tell, military command abandoned you in this hellhole when you missed the emergency evac.", "points": 4, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic" ], "skills": [ { "level": 2, "name": "gun" }, @@ -844,6 +963,13 @@ "name": "Combat Mechanic", "description": "Early in your military career, you were hand-picked for extra training in the mechanic's trade, keeping the armor running. It's been years since you last touched a rifle, and the dead men are marching again…", "points": 4, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic" ], "skills": [ { "level": 2, "name": "gun" }, @@ -890,6 +1016,13 @@ "name": "Combat Engineer", "description": "Your job was simple: Keep the army moving. You built bridges, you built roads, you destroyed fortifications, and you cleared mines. It has been years since you last handled a rifle in basic training; now might be the time to dust off those skills.", "points": 6, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic" ], "skills": [ { "level": 2, "name": "gun" }, @@ -936,6 +1069,13 @@ "name": "Non Comissioned Officer", "description": "You're a veteran of several peacekeeping missions. You led your squad as a sort of parental figure, and they relied on you to give orders and keep them alive. You failed them. And now you're alone.", "points": 7, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic" ], "skills": [ { "level": 3, "name": "gun" }, @@ -989,6 +1129,13 @@ "name": "Rifleman", "description": "When you were young, you dreamed of being a soldier. War is hell and hell is war, but you never thought that it would happen like this.", "points": 6, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic" ], "skills": [ { "level": 3, "name": "gun" }, @@ -1040,6 +1187,13 @@ "name": "Special Operator", "description": "You were the best of the best, the military's finest. That's why you're still alive, even after all your comrades fell to the undead. As far as you can tell, military command abandoned you in this hellhole when you missed the emergency evac.", "points": 8, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "easy" ], + [ "crafting", "easy" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic", "prof_traps", "prof_disarming" ], "skills": [ { "level": 6, "name": "gun" }, @@ -1092,6 +1246,13 @@ "name": { "male": "Butler", "female": "Maid" }, "description": "You were hired to take care of the housekeeping for a wealthy family. Naturally, when things got bad, they all took off on a family vacation to somewhere unknown, leaving you to your fate.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "cooking" }, { "level": 1, "name": "driving" }, { "level": 2, "name": "tailor" } ], "items": { "both": { "items": [ "pocketwatch", "knife_steak" ], "entries": [ { "group": "charged_smart_phone" } ] }, @@ -1105,6 +1266,13 @@ "name": { "male": "Captive", "female": "Captive" }, "description": "You were following a road at night, trying to get away from the horrors of the city, when you heard a voice calling out in the dark. You followed, hoping they were friendly, but suddenly felt a searing pain in your head and blacked out. You just woke up in this strange place… are you even on Earth anymore?", "points": -2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "flags": [ "SCEN_ONLY" ] }, { @@ -1113,6 +1281,13 @@ "name": { "male": "Rescuer", "female": "Rescuer" }, "description": "You were ready. You went in determined to find and rescue your friends. Now the atmosphere in these twisting corridors grows heavy, and you don't feel quite so confident anymore. You might be the one in need of a rescue soon.", "points": 3, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 4, "name": "dodge" }, { "level": 3, "name": "fabrication" }, @@ -1148,6 +1323,13 @@ "name": "Medical Resident", "description": "Fresh out of med school, you've got little in the way of practical experience and just a handful of first-aid supplies. You just hope it will be enough if 'physician, heal thyself' turns out to be more literal than you expected.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 4, "name": "firstaid" } ], "proficiencies": [ "prof_wound_care", "prof_wound_care_expert" ], "traits": [ "PROF_MED" ], @@ -1179,6 +1361,13 @@ "name": "Gangster", "description": "The boss always said he could rely on you to pull through on the tough jobs. Shame he got himself smoked. No problem; the world's always got a place for someone with your kind of talents.", "points": 3, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "melee" }, { "level": 1, "name": "unarmed" }, @@ -1208,6 +1397,13 @@ "name": "Security Guard", "description": "You had a boring, underpaid job watching cameras and patrolling hallways, but things have suddenly gotten a lot more dangerous. You have some useful equipment, but you've never had any call to use it until now.", "points": 1, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ @@ -1241,6 +1437,13 @@ "name": "Landscaper", "description": "You used to mow lawns and trim hedges for the wealthy. Contract work was getting scarce even before the zombies came, but now you've got nothing left except your tools and expertise.", "points": 1, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "fabrication" }, { "level": 2, "name": "survival" } ], "items": { "both": { @@ -1258,6 +1461,13 @@ "//": "They don't have the doctor's passive bonus to surgery. Nursing assistants aren't required to hold a doctorate.", "description": "You went on providing in-home care for the elderly even as the whole world fell apart around you. You can only pray that you don't see your former clients among the walking dead…", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "firstaid" }, { "level": 1, "name": "cooking" } ], "proficiencies": [ "prof_wound_care" ], "items": { @@ -1286,6 +1496,13 @@ "name": "Survivalist", "description": "Living off the land, far from civilization, is nothing new to you. The only difference is all the monsters that suddenly want you dead. Your equipment is basic, but versatile… except that your canteen's run out!", "points": 4, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "easy" ], + [ "crafting", "very_easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic", "prof_gunsmithing_improv", @@ -1339,6 +1556,13 @@ "name": "Hobo", "description": "Society drove you to the fringes and left you with no home, no family, no friends. But for all the crap thrown your way, you're still breathing. For now.", "points": -1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "pants", "knit_scarf", "ragpouch", "bindle", "can_beans", "pockknife" ], @@ -1354,6 +1578,13 @@ "name": "Helicopter Pilot", "description": "You got your pilot's license, and earned a living ferrying businessmen and tourists around. The Cataclysm has grounded you for now, but the sky still calls to you…", "points": 4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 4, "name": "driving" }, { "level": 1, "name": "speech" }, { "level": 3, "name": "mechanics" } ], "proficiencies": [ "prof_helicopter_pilot" ], "items": { @@ -1371,6 +1602,13 @@ "name": "K9 Officer", "description": "You spent your career busting drug smugglers with your faithful canine companion. Now the world has ended, and none of that matters anymore. Your loyal dog is still at your side, though, ready to face the Cataclysm with you.", "points": 4, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "gun" }, { "level": 2, "name": "pistol" }, { "level": 2, "name": "survival" } ], "traits": [ "PROF_POLICE" ], "proficiencies": [ "prof_spotting" ], @@ -1396,6 +1634,13 @@ "name": { "male": "Crazy Cat Dude", "female": "Crazy Cat Lady" }, "description": "Everyone is dead? Oh well, it doesn't matter; it's not like you got along with people much anyway. Your beloved cats are all the friends you need!", "points": 5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "survival" }, { "level": 1, "name": "cooking" }, { "level": 1, "name": "tailor" } ], "proficiencies": [ "prof_knitting", "prof_knitting_speed" ], "pets": [ @@ -1429,6 +1674,13 @@ "name": "Police Officer", "description": "Just a small-town deputy, you got the call and were ready to come to the rescue. Soon it was you who needed rescuing, and you were lucky to escape with your life. Who's going to respect your authority when the government this badge represents might not even exist anymore?", "points": 2, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "gun" }, { "level": 3, "name": "pistol" } ], "traits": [ "PROF_POLICE" ], "proficiencies": [ "prof_spotting" ], @@ -1453,6 +1705,13 @@ "name": "Police Detective", "description": "You were on the brink of a major breakthrough in your latest homicide case when the Cataclysm struck. Now your prime suspect is dead. Everyone's dead. You could really use a smoke.", "points": 4, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "traits": [ "PROF_PD_DET" ], "proficiencies": [ "prof_spotting" ], "items": { @@ -1493,6 +1752,13 @@ "name": "SWAT Officer", "description": "As a member of the police force's most elite division, you are more than adequately trained and equipped to survive the brutal onslaught of the apocalypse. Unfortunately, the chain of command has broken down; your only mission now is to stay alive.", "points": 5, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic", "prof_spotting" ], "skills": [ { "level": 3, "name": "gun" }, { "level": 3, "name": "pistol" }, { "level": 3, "name": "smg" } ], "traits": [ "PROF_SWAT" ], @@ -1523,6 +1789,13 @@ "name": "SWAT CQC Specialist", "description": "As a member of the police force's most elite division, you were given special training and became an expert in close-quarters combat. Unfortunately, the chain of command has broken down; your only mission now is to stay alive.", "points": 5, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "gun" }, { "level": 3, "name": "shotgun" }, @@ -1556,6 +1829,13 @@ "name": "Police Sniper", "description": "Your skill as a sharpshooter served you well in the line of duty, protecting the innocent with a single, well-placed bullet. Now survival itself is on the line, and you can't afford to miss if you don't want to end up as something's dinner.", "points": 5, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic", "prof_spotting" ], "skills": [ { "level": 5, "name": "gun" }, { "level": 4, "name": "rifle" }, { "level": 1, "name": "pistol" } ], "traits": [ "PROF_POLICE" ], @@ -1594,6 +1874,13 @@ "name": "Riot Control Officer", "description": "The riots were brutal, and that was before the dead rose and started to devour the living. The line you were holding broke. It was only through a bit of luck and a lot of head-bashing that you got away in one piece, and the worst is yet to come.", "points": 5, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "melee" }, { "level": 3, "name": "bashing" }, @@ -1635,6 +1922,13 @@ "name": "Motorized Police Officer", "description": "Just a small-town deputy, you got the call and were ready to ride to the rescue. Soon it was you who needed rescuing, and you had to abandon your motorcycle to escape. Who's going to respect your authority when the government this badge represents doesn't exist anymore?", "points": 2, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "gun" }, { "level": 3, "name": "pistol" } ], "traits": [ "PROF_POLICE" ], "proficiencies": [ "prof_spotting" ], @@ -1671,6 +1965,13 @@ "name": "Used Car Salesman", "description": "They said you'd sell your own mother for a dollar. How dare they! You've been around the block a few times, and you'd charge way more than a dollar - and get it, too!", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ], "skills": [ { "level": 4, "name": "speech" } ], "items": { "both": { @@ -1687,6 +1988,13 @@ "name": "Bow Hunter", "description": "Ever since you were a child you loved hunting, and quickly developed a talent for archery. Why, if the world ended, there's nothing you'd want at your side more than your trusty bow. So, when it did, you made sure to bring it along.", "points": 2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_bow_basic", "prof_bow_expert", "prof_bowyery" ], "skills": [ { "level": 2, "name": "archery" } ], "items": { @@ -1718,6 +2026,13 @@ "name": "Crossbow Hunter", "description": "Ever since you were a child you loved hunting, and crossbow hunting was always your favorite. Why, if the world ended, there's nothing you'd want at your side more than your trusty crossbow. So, when it did, you made sure to bring it along.", "points": 2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_bow_basic", "prof_gunsmithing_spring" ], "skills": [ { "level": 2, "name": "rifle" } ], "items": { @@ -1740,6 +2055,13 @@ "name": "Shotgun Hunter", "description": "Ever since you were a child you loved hunting, and one year you got a shotgun for your birthday. Why, if the world ended, there's nothing you'd want at your side more than your trusty shotgun. So, when it did, you made sure to bring it along.", "points": 2, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "gun" }, { "level": 1, "name": "shotgun" } ], "items": { "both": { @@ -1762,6 +2084,13 @@ "name": "Rifle Hunter", "description": "Ever since you were a child you loved hunting, and you fancy yourself a crack shot. Why, if the world ended, there's nothing you'd want at your side more than your trusty rifle. So, when it did, you made sure to bring it along.", "points": 2, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "gun" }, { "level": 1, "name": "rifle" } ], "items": { "both": { @@ -1784,6 +2113,13 @@ "name": { "male": "Handy Man", "female": "Handy Woman" }, "description": "You used to work at a local hardware store, and you did plenty of home renovations yourself. Now you look out at the horizon of a ruined world, and wonder - are your meager skills, and the few supplies you grabbed on the way out, sufficient to help rebuild?", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_plumbing", "prof_elec_soldering", "prof_metalworking", "prof_lockpicking" ], "skills": [ { "level": 2, "name": "fabrication" }, { "level": 1, "name": "traps" } ], "items": { @@ -1806,6 +2142,13 @@ "name": "Trucker", "description": "You once ruled the road in your big rig. When the riots hit, you hopped in and drove it to safety. Now it's just you and your truck against the world.", "points": 5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "mechanics" }, { "level": 4, "name": "driving" } ], "vehicle": "semi_truck_scenario", "items": { @@ -1823,6 +2166,13 @@ "name": "Day Driver", "description": "You love driving, and decided to start making some money doing it. On your way to pick up a customer, a riot broke out around you. You took a long detour to safety, only to find yourself somewhere unfamiliar.", "points": 4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "speech" }, { "level": 4, "name": "driving" } ], "vehicle": "car", "items": { @@ -1840,6 +2190,13 @@ "name": "EMT Firefighter", "description": "On your way to respond to an emergency call, you nearly drove straight into a riot in the city. Turning off of the burning, debris-covered streets, you took a long detour only to find yourself lost. That call will have to wait - you're in an emergency of your own now.", "points": 5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "easy" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "firstaid" }, { "level": 3, "name": "driving" }, { "level": 1, "name": "electronics" } ], "proficiencies": [ "prof_wound_care" ], "vehicle": "fire_engine", @@ -1875,6 +2232,13 @@ "name": "Serviceman", "description": "Employed by a large company, you performed installation and troubleshooting services at the homes of ungrateful luddites. Driving back from your last call, you were suddenly swarmed by what you believed to be angry rioters. You veered off onto an old, neglected side road to escape, only to find yourself lost and low on gas.", "points": 4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "electronics" }, { "level": 2, "name": "driving" }, { "level": 1, "name": "mechanics" } ], "vehicle": "cube_van_cheap", "items": { @@ -1904,6 +2268,13 @@ "name": "Bus Driver", "description": "You made a living driving kids to and from school, a career choice you regretted almost every day. None of the brats were at their normal stops, and the noise of your bus quickly attracted hordes of zombies. You escaped, but now you've gotten lost. At least you're getting a break from the hellish screams of children, though you're starting to hear new ones…", "points": 4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "speech" }, { "level": 3, "name": "driving" } ], "vehicle": "schoolbus", "items": { @@ -1921,6 +2292,13 @@ "name": "Police Interceptor", "description": "An on-duty officer, you received the call and were ready to respond to the robbery. It all went to shit, your backup got eaten, and you were lucky to escape with your life and patrol car.", "points": 6, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "gun" }, { "level": 3, "name": "pistol" }, { "level": 3, "name": "driving" } ], "vehicle": "policecar", "traits": [ "PROF_POLICE" ], @@ -1945,6 +2323,13 @@ "name": "Militia", "description": "You and a group of like-minded individuals built a hideout in the woods from which to launch looting raids in a jury-rigged pickup. The last run went bad, and now all your comrades are dead. Every breath you take now is an act of rebellion against the cruelty of this doomed world. Do not let that flame of hope perish inside you.", "points": 8, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "gun" }, { "level": 2, "name": "rifle" }, @@ -1990,6 +2375,13 @@ "name": "Park Ranger", "description": "Your days of patrolling the park and protecting people and wildlife from each other have taught you many useful skills. After finding a gruesome scene at a campsite and no response when you radioed for help, you stockpiled as many supplies as possible and set out in your pickup looking for answers.", "points": 9, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "easy" ], + [ "crafting", "easy" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "gun" }, { "level": 1, "name": "pistol" }, @@ -2049,6 +2441,13 @@ "name": "Lumberjack", "description": "You're a lumberjack, and you're okay. You felled trees before the world ended, and you suspect the undead aren't nearly as tough.", "points": 0, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "jeans", "socks", "boots", "hat_hunting", "jacket_flannel", "knit_scarf", "vest", "wristwatch", "axe_ring" ], @@ -2064,6 +2463,13 @@ "name": "Fast Food Cook", "description": "The diners at the fancy burger joint where you worked were even more irritable and unreasonable than usual today. You showed them the meaning of fast food… by running for your life!", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "cooking" } ], "items": { "both": { @@ -2080,6 +2486,13 @@ "name": "Electrician", "description": "Small businesses often hired you for electrical work. You were halfway through your latest job when the whole power grid went dead.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_elec_soldering" ], "skills": [ { "level": 3, "name": "electronics" } ], "items": { @@ -2097,6 +2510,13 @@ "name": "Computer Hacker", "description": "Caffeine pills and all-nighters in front of a computer screen made you an expert at writing and cracking code. Sadly, the power's gone out, and suddenly your elite skills seem significantly less useful. At least there's no one stopping you from your dream of breaking into a military mainframe now.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 4, "name": "computer" } ], "items": { "both": { @@ -2117,6 +2537,13 @@ "name": "Backpacker", "description": "For the past few years you've been traveling the world, sightseeing and living off your parents' trust fund. You came home to find the world in ruins, and the only thing between you and death is the open road and your backpack.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "survival" } ], "items": { "both": { @@ -2133,6 +2560,13 @@ "name": "Student", "description": "Just an average student, you find yourself facing a test you never studied for, and the stakes are a bit higher than geometry. Maybe there'll be something useful in one of these books you've been lugging around all year.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ @@ -2159,6 +2593,13 @@ "name": "Shower Victim", "description": "You just stepped out of a nice, hot shower to find the world had ended. You've got some soap, along with the most massively useful thing ever… a towel.", "points": -1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ], "flags": [ "NO_BONUS_ITEMS" ], "items": { "both": { "items": [ "towel_wet" ], "entries": [ { "item": "soap", "custom-flags": [ "auto_wield" ] } ] } } }, @@ -2168,6 +2609,13 @@ "name": "Biker", "description": "You spent most of your life on a motorcycle, out on the open road with your club. Now they're all dead. Time to ride or die.", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 4, "name": "driving" }, { "level": 1, "name": "mechanics" } ], "vehicle": "motorcycle", "items": { @@ -2185,6 +2633,13 @@ "name": "Ballroom Dancer", "description": "Things got a little weird on your way to your weekly dance class. Zombies don't seem to know how to dance, but you're not about to let them step on your toes.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "dodge" } ], "items": { "both": { "items": [ "socks", "knit_scarf", "dance_shoes" ], "entries": [ { "group": "charged_smart_phone" } ] }, @@ -2198,6 +2653,13 @@ "name": "Patient", "description": "When the diagnosis came back positive, you made a vow: to fight for your life, and to never give in to despair. Now is the time to renew that vow.", "points": -2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "jeans", "tshirt", "socks", "sneakers", "wristwatch" ], "entries": [ { "group": "charged_smart_phone" } ] }, "male": [ "briefs" ], @@ -2211,6 +2673,13 @@ "name": "Unwilling Mutant", "description": "You were a human guinea pig, used by laboratory technicians to understand the immense power of mutation. You are determined to live on, if only to spite them for what they did to you.", "points": -1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": [ "subsuit_xl" ], "male": [ "briefs" ], "female": [ "bra", "panties" ] }, "flags": [ "SCEN_ONLY" ] }, @@ -2220,6 +2689,13 @@ "name": "Volunteer Mutant", "description": "Your dreams of becoming a super-human mutant through genetic alteration may have fallen a bit short, but the scientists say you're ready. It's time for a field test.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "chemistry" }, { "level": 2, "name": "electronics" } ], "items": { "both": [ "dress_shirt", "pants", "socks", "boots", "knit_scarf", "coat_lab", "glasses_safety", "wristwatch" ], @@ -2234,6 +2710,13 @@ "name": "Hitchhiker", "description": "Your house has been demolished and your planet destroyed, but at least you still have your towel.", "points": -1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": [ "house_coat", "slippers", "towel", "guidebook" ], "male": [ "boxer_shorts" ], @@ -2246,6 +2729,13 @@ "name": "Trapper", "description": "You spent most of your life trapping with your father. Both of you made a decent living selling your catches and running trapping tutorials. Hopefully, your skills will come in useful against less conventional game.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 4, "name": "traps" }, { "level": 2, "name": "survival" } ], "proficiencies": [ "prof_fibers", "prof_fibers_rope", "prof_traps", "prof_trapsetting" ], "items": { @@ -2279,6 +2769,13 @@ "name": "Blacksmith", "description": "You ran into trouble coming out of class at your community college's metalsmithing program, but despite the havoc you've managed to keep ahold of some of the equipment you were carrying.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 4, "name": "fabrication" } ], "proficiencies": [ "prof_metalworking", "prof_blacksmithing" ], "items": { @@ -2296,6 +2793,13 @@ "name": "Clown", "description": "All you ever wanted was to make people laugh. Dropping out of school and performing at kids' parties was a dream come true until the world ended. There are precious few balloon animals in your future now.", "points": -1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "clown_wig", "clown_suit", "clown_nose", "socks", "clownshoes", "airhorn" ], @@ -2311,6 +2815,13 @@ "name": "Lost Submissive", "description": "In the rush to safety, you were separated from your master by cruel fate. Now you are on your own, with nothing to your name but a suit of really kinky black leather. Unfortunately, there are no safewords in the apocalypse.", "points": -1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "flags": [ "NO_BONUS_ITEMS" ], "proficiencies": [ "prof_fibers", "prof_fibers_rope" ], "items": { @@ -2324,6 +2835,13 @@ "description": "You haven't seen this much blood since the war. The whole world's gone crazy! They ate your grandkids! But dagnabbit, you'll make them all pay for what they've done.", "proficiencies": [ "prof_knitting" ], "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "tobacco", "pipe_tobacco", "socks", "dress_shoes", "knit_scarf" ], @@ -2339,6 +2857,13 @@ "name": "Otaku", "description": "After many late nights with friends watching anime and eating snacks, you decided to make the trip to the premier anime convention in the Northeast. Now zombies are eating everyone, and even worse, the convention is cancelled! At least you were ready in case your costume tore.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "tailor" } ], "items": { "both": { @@ -2355,6 +2880,13 @@ "name": { "male": "Groom", "female": "Bride" }, "description": "The Cataclysm struck on the big day and you escaped with nothing but your wedding attire. Cold feet? You'd just like to keep your feet attached!", "points": -1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "ring_wedding" ], "entries": [ { "group": "charged_smart_phone" } ] }, "male": [ "tux", "socks", "dress_shoes", "briefs" ], @@ -2367,6 +2899,13 @@ "name": { "male": "Punk Rock Dude", "female": "Punk Rock Girl" }, "description": "All those wicked songs about the apocalypse have come to life. Brutal! Now that the system is dead, it's time to party among the bones of the world!", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "trenchcoat", "gloves_fingerless", "socks", "boots_combat", "weed", "tobacco", "rolling_paper", "wristwatch" ], @@ -2382,6 +2921,13 @@ "name": "Firefighter", "description": "As a first responder, you were direct witness to the gut-wrenching horrors of the apocalypse. Separated from most of your equipment and your unit while on call, you were forced to fight your way to safety with little more than your trusty iron and your bunker gear to protect you.", "points": 2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "melee" }, { "level": 1, "name": "firstaid" }, { "level": 1, "name": "swimming" } ], "items": { "both": { @@ -2410,6 +2956,13 @@ "name": { "male": "Rude Boy", "female": "Rude Girl" }, "description": "Your ska band broke up after the drummer became a zombie. Now you're alone in the Cataclysm with some cigarettes and your mp3 player.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "dress_shirt", "tie_skinny", "sunglasses", "pants", "socks", "dress_shoes", "rolling_paper", "tobacco", "wristwatch" ], @@ -2425,6 +2978,13 @@ "name": "Mail Carrier", "description": "Neither snow nor rain nor heat nor gloom of night stays you from the swift completion of your appointed rounds, but nobody said anything about zombies.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "driving" }, { "level": 1, "name": "dodge" } ], "items": { "both": { @@ -2452,6 +3012,13 @@ "name": "Convict", "description": "Your trial was contentious, but ultimately you found yourself behind bars. The Cataclysm has offered you a chance to escape, but freedom may come with a steep price.", "points": 0, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "melee" }, { "level": 1, "name": "traps" } ], "items": { "both": [ "striped_shirt", "striped_pants", "sneakers", "socks", "glass_shiv" ], @@ -2465,6 +3032,13 @@ "name": "Death Row Convict", "description": "You were a serial killer, ready to walk the green mile, but in a twist of fate you're one of the few still alive. True death comes only from your hands, so you're in for a job.", "points": 2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "melee" } ], "traits": [ "KILLER" ], "items": { @@ -2479,6 +3053,13 @@ "name": "Embezzler", "description": "You had a genius plan to skim fractions of cents out of your company's accounts. This plan immediately failed and got you arrested. They said you were too soft for prison, but guess what? They're dead, and you're not.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "skills": [ { "level": 2, "name": "speech" }, { "level": 2, "name": "computer" } ], "items": { "both": [ "striped_shirt", "striped_pants", "sneakers", "socks", "rock_sock" ], @@ -2493,6 +3074,13 @@ "name": "Meth Cook", "description": "You clawed your way out of poverty by selling products everyone wanted, and they had the nerve to put you in jail for it. Too bad you can't sell drugs to zombies.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "chemistry" }, { "level": 2, "name": "firstaid" } ], "items": { "both": { @@ -2510,6 +3098,13 @@ "name": "Political Prisoner", "description": "You did your best to expose what was going on in those labs, but they caught you and threw you in prison on trumped-up charges to silence you. Clearly, they should have listened.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ], "skills": [ { "level": 3, "name": "speech" } ], "items": { "both": { @@ -2527,6 +3122,13 @@ "name": { "male": "Rat Prince", "female": "Rat Princess" }, "description": "You probably needed psychiatric help instead of a prison sentence. At least your loyal subjects have agreed to hold the line as you make your daring escape.", "points": 4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "speech" }, { "level": 1, "name": "survival" } ], "traits": [ "ANIMALEMPATH" ], "pets": [ { "name": "mon_black_rat", "amount": 13 } ], @@ -2543,6 +3145,13 @@ "name": "Burglar", "description": "This could be your lucky break. Plenty of loot to be pilfered, and no cops to be seen. Does it count as breaking and entering if everyone in town is undead?", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_lockpicking" ], "skills": [ { "level": 4, "name": "traps" } ], "items": { @@ -2572,6 +3181,13 @@ "name": "Lawyer", "description": "The jury were in the palm of your hand, but after the defendant tried to eat your brain, you were forced to flee the courtroom in disgrace. Now nobody seems to care about your objections.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "skills": [ { "level": 2, "name": "speech" } ], "items": { "both": { @@ -2599,6 +3215,13 @@ "name": "Priest", "description": "Armageddon has come! You did everything you could to protect your parish faithful, but it appears that prayers were not enough. Now that they are all dead, you should probably find something more tangible to protect you.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ], "skills": [ { "level": 3, "name": "speech" } ], "items": { "both": { @@ -2615,6 +3238,13 @@ "name": "Kannushi", "description": "You were one of the maintainers of a Shinto shrine, performing rituals and sacred tasks. You preferred it when only the spirits of the dead inhabited your shrine, and not their rotting corpses.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "fabrication" }, { "level": 1, "name": "tailor" } ], "items": { "both": { @@ -2631,6 +3261,13 @@ "name": { "male": "Bhikkhu", "female": "Bhikkhuni" }, "description": "Your life was simple at the Vihara, doing household chores and meditating. Your Sangha wanted to attain liberation from suffering, now their rotting corpses will suffer forever.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ], "skills": [ { "level": 3, "name": "speech" } ], "items": { "both": { @@ -2647,6 +3284,13 @@ "name": { "male": "Imam", "female": "Mourchida" }, "description": "You spent much of your time prior to the apocalypse at the local mosque, studying the words of the Prophet and the Quran and guiding your community in prayer. Back then they came from far and wide to listen to you; now they come to eat your brains.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ], "//": "No knife, fire, or decent storage/armor. Skill points are countered.", "skills": [ { "level": 3, "name": "speech" } ], "items": { @@ -2664,6 +3308,13 @@ "name": "Rabbi", "description": "You were celebrating with your flock in the temple when the Cataclysm struck. You sure could use a messiah right now!", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "skills": [ { "level": 2, "name": "speech" }, { "level": 1, "name": "firstaid" } ], "items": { "both": { @@ -2680,6 +3331,13 @@ "name": "Guru", "description": "You spent many years traveling through the world, becoming wise and learned. Normally, you can answer any question, but even you are not quite sure what to do about the ravenous undead.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "//": "1.5 pts skills, cutting implement, and plenty of storage, so lack of fire only goes so far.", "skills": [ { "level": 2, "name": "speech" }, { "level": 1, "name": "survival" } ], "items": { @@ -2709,6 +3367,13 @@ "name": "Preacher", "description": "You devoted your life to spreading the good word, always on the road, traveling from town to town. Now everything has gone to hell, you can't host your daily podcast, and the undead don't seem particularly moved by your sermons.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "//": "Storage + 2 points in skills, - no knife or fire.", "skills": [ { "level": 2, "name": "speech" }, { "level": 1, "name": "driving" }, { "level": 1, "name": "computer" } ], "items": { @@ -2726,6 +3391,13 @@ "name": "Novice Martial Artist", "description": "You've decided today is the day to take your first lesson at the local dojo. You'll be great at it, you're sure of it.", "points": -1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": [ "karate_gi", "judo_belt_white", "mouthpiece", "socks_ankle", "sneakers" ], "male": [ "boxer_shorts" ], @@ -2738,6 +3410,13 @@ "name": "Martial Artist", "description": "'Drop the martial arts!', they said. 'Learn a skill for the REAL world!', they said. Well, you're about to show them! SHOW THEM ALL!", "points": 3, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "traits": [ "PROF_MA_ORANGE" ], "skills": [ { "level": 2, "name": "melee" }, { "level": 2, "name": "unarmed" }, { "level": 2, "name": "dodge" } ], "items": { @@ -2752,6 +3431,13 @@ "name": "Black Belt", "description": "As the world ends, you alone stand against the coming darkness with your fists of steel.", "points": 8, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "traits": [ "PROF_MA_BLACK" ], "skills": [ { "level": 5, "name": "melee" }, { "level": 5, "name": "unarmed" }, { "level": 5, "name": "dodge" } ], "items": { @@ -2766,6 +3452,13 @@ "name": { "male": "Pizza Delivery Boy", "female": "Pizza Delivery Girl" }, "description": "You were delivering the last pizza of the night to the local cryogenics lab when hungry zombies attempted to make a meal out of you. Fleeing for safety, you find yourself with only your wits and some leftover pizza. And they didn't even leave a tip!", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 4, "name": "driving" }, { "level": 1, "name": "speech" } ], "items": { "both": { @@ -2794,6 +3487,13 @@ "name": "Archaeologist", "description": "Following a clue from your dead grandfather's journal, you made your way to a long-lost temple, but then the ground started to shake uncontrollably. You had a bad feeling about that, so you got out of there quickly.", "points": 3, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "melee" }, { "level": 2, "name": "gun" } ], "items": { "both": { @@ -2827,6 +3527,13 @@ "name": { "male": "Paperboy", "female": "Papergirl" }, "description": "You set out this morning to deliver the news of the apocalypse. The undead hordes don't seem to value the latest news, but at least your trusty bicycle is still in working order.", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "driving" }, { "level": 3, "name": "throw" }, { "level": 1, "name": "speech" } ], "items": { "both": { @@ -2861,6 +3568,13 @@ "name": "Farmer", "description": "A patch of soil, some water, and sunlight were all you ever needed; why should things be any different now? With a handful of seeds and your trusty hoe, it's time to rebuild the Earth, one plant at a time.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ @@ -2893,6 +3607,13 @@ "name": "National Guard", "description": "The government activated your National Guard unit to deal with the growing epidemics. Despite your best efforts, you were unable to form up before all communications ceased and you found yourself alone amongst the dead.", "points": 3, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "gun" }, { "level": 2, "name": "firstaid" } ], "items": { "both": { @@ -2909,6 +3630,13 @@ "name": "Hardened Scavenger", "description": "One of the lucky few who escaped the Cataclysm, you made a life for yourself amidst the ruins of civilization. Whether through force, guile, or luck, you've obtained the best gear you could find.", "points": 8, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_fibers", "prof_fibers_rope", "prof_knitting", "prof_closures" ], "skills": [ { "level": 5, "name": "melee" }, @@ -2947,6 +3675,13 @@ "name": "Military Holdout", "description": "You must have paid attention to your survival training in boot camp; otherwise, you would never have lived long enough to outlast the chain of command and find yourself in this predicament. The only mission left now is to survive.", "points": 6, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic" ], "skills": [ { "level": 4, "name": "survival" }, @@ -2997,6 +3732,13 @@ "name": "Mall Security", "description": "You spent dull nights guarding the local mall against teen hooligans and petty thieves. Your job training didn't provide any terribly useful skills, but you do have your trusty tazer, baton, and pocket knife.", "points": 0, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "pants", "socks", "boots", "longshirt", "jacket_light", "holster", "pockknife", "wristwatch", "leather_belt" ], @@ -3017,6 +3759,13 @@ "name": "Naturalist", "description": "Over long years of self-imposed exile in the wilderness, you have come to an understanding with Mother Nature. The world as they knew it might have ended for your forsaken species, but you can hardly tell the difference.", "points": 6, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 6, "name": "survival" }, { "level": 4, "name": "fabrication" }, @@ -3064,6 +3813,13 @@ "name": "Fisher", "description": "You spent most of your days fishing in the swamp, getting by quietly on your catch. You found the buzzing of insects enjoyable, but recently they've gotten bigger and meaner. Now their horrible noises have you spooked - you just hope the fish aren't as nasty.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "swimming" }, { "level": 2, "name": "survival" } ], "proficiencies": [ "prof_fibers" ], "items": { @@ -3099,6 +3855,13 @@ "name": { "male": "Historical Reenactor", "female": "Ahistorical Reenactor" }, "description": "You were on your way to the Annual All New England Revolutionary War Living History exhibition when the end of the world permanently derailed your plans.", "points": 3, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic", "prof_metalworking", "prof_gunsmithing_antique" ], "skills": [ { "level": 2, "name": "tailor" }, @@ -3143,6 +3906,13 @@ "name": { "male": "Ahistorical Reenactor", "female": "Historical Reenactor" }, "description": "You were on your way to the Annual All New England Revolutionary War Living History exhibition when the end of the world made traditional gender roles obsolete.", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_spinning", "prof_closures", "prof_knitting" ], "skills": [ { "level": 2, "name": "tailor" }, @@ -3184,6 +3954,13 @@ "name": { "male": "Skater Boy", "female": "Skater Girl" }, "description": "You love to skate! You've probably spent more time on a pair of blades than off. Things have gotten pretty bad, but at least the grown-ups aren't telling you where you can't roll.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "dodge" } ], "traits": [ "PROF_SKATER" ], "items": { @@ -3213,6 +3990,13 @@ "name": "Juvenile Delinquent", "description": "You never cared for grown-ups telling you what to do, so you ended up spending quite a few days in the principal's office. Now, not needing grown-ups to tell you what to do is the only reason you're alive. Man, you really should've played hooky today.", "points": 2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "gun" }, { "level": 1, "name": "dodge" }, { "level": 1, "name": "melee" } ], "items": { "both": { @@ -3244,6 +4028,13 @@ "name": "Survivalist Jr.", "description": "Your parents were crazy preppers who thought some \"Cataclysm\" was coming, and insisted on preparing you for it. Turns out they were right. You didn't get a chance to thank them. The only thing you can do for them now is what they always hoped you would do in the dark days ahead: survive.", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "survival" }, { "level": 1, "name": "fabrication" }, @@ -3280,6 +4071,13 @@ "name": "Dodgeball Player", "description": "In dodgeball, failing to dodge meant taking a ball to the head and being out of the game. In the Cataclysm, it means getting eaten by monsters. Don't slip up.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "dodge" }, { "level": 1, "name": "throw" } ], "items": { "both": { @@ -3296,6 +4094,13 @@ "name": "Science Club Member", "description": "The school never let your club play with the really fun chemicals, the kind that make things go boom, but there aren't any teachers around to enforce the rules anymore.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "chemistry" }, { "level": 1, "name": "mechanics" } ], "items": { "both": { @@ -3312,6 +4117,13 @@ "name": "A/V Club Member", "description": "You were a member of the school A/V club. You're sure there's some way you can use your technical skills to help you stay alive. You just haven't figured out how to make an awesome death ray yet.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "electronics" }, { "level": 1, "name": "computer" } ], "items": { "both": { @@ -3338,6 +4150,13 @@ "name": "Teacher", "description": "You've been teaching kids all your life, experiencing the joy and aggravation of imparting knowledge to young minds. If zombies have any interest in education, they're not showing it.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "skills": [ { "level": 3, "name": "speech" } ], "items": { "both": { @@ -3354,6 +4173,13 @@ "name": "Photojournalist", "description": "Covering the apocalypse up close could make your career, though finding a publisher seems more difficult a prospect than usual. You managed to hold onto your camera - hopefully you can get some fantastic shots.", "points": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "pants", "dress_shirt", "blazer", "socks", "dress_shoes", "wristwatch", "camera_bag" ], @@ -3372,6 +4198,13 @@ "name": "Gym Teacher", "description": "It was hard enough getting kids to run laps without having to worry about them trying to eat your brains. Zombies won't even line up when you blow your whistle.", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "skills": [ { "level": 2, "name": "dodge" }, { "level": 2, "name": "speech" } ], "items": { "both": { @@ -3388,6 +4221,13 @@ "name": "Miner", "description": "You're a miner, not a minor! Your canteen is dry, your jackhammer is out of gas, and you're on your last pair of batteries for your mining helmet…", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ @@ -3422,6 +4262,13 @@ "description": "Before this all began, you were having the time of your life at your dream job: blowing stuff up. The Cataclysm means you're finally allowed to do it full time.", "skills": [ { "level": 2, "name": "fabrication" } ], "points": 3, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ @@ -3454,6 +4301,13 @@ "name": { "male": "Traceur", "female": "Traceuse" }, "description": "You've practiced parkour for many years, and made the world your playground. It wouldn't be a lie to say that running is your life. Which is good, because now that the end has come, you're running FOR your life.", "points": 5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_parkour" ], "skills": [ { "level": 4, "name": "dodge" } ], "items": { @@ -3471,6 +4325,13 @@ "name": "Tourist", "description": "This seemed like a great place for a vacation, but you're starting to regret ever leaving home. You came here to get a taste of New England, but New England keeps trying to get a taste of you!", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ @@ -3501,7 +4362,14 @@ "id": "naked", "name": "Naked and Afraid", "description": "You were out filming a reality TV show, naked in the woods. Strangely, the cast and crew all seem to have turned into zombies, which is pretty bad timing for you. Looks like it's for real this time…", - "points": -1 + "points": -1, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -3509,6 +4377,13 @@ "name": "Zoo Keeper", "description": "You were called in on your day off to feed the animals at the zoo. For some reason, none of your coworkers bothered showing up for work today.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "traits": [ "ANIMALEMPATH" ], "skills": [ { "level": 1, "name": "firstaid" }, { "level": 1, "name": "survival" } ], "items": { @@ -3536,6 +4411,13 @@ "name": "Urban Samurai", "description": "You were always an inexplicable sight in town, with your funny hair and odd Japanese clothes. Some claimed you were a visiting Shinto god. Little of this concerns you, but last week the grocery service stopped coming and now the TV no longer turns on. This displeases you.", "points": 2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": { "level": 2, "name": "melee" }, "items": { "both": { @@ -3551,6 +4433,13 @@ "name": "Competitive Fencer", "description": "Years of training prepared you for the competitive fencing circuit, but your latest tournament was cut short when zombies invaded the piste. The referee was eaten, so you're not sure if the rules are still in play.", "points": 5, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "melee" }, { "level": 2, "name": "dodge" } ], "traits": [ "MARTIAL_FENCING" ], "items": { @@ -3577,6 +4466,13 @@ "name": "Career Politician", "description": "You've spent your life appealing to the people, persuading many and promising much throughout your time in office. Now that your voting base wants to eat you alive, winning hearts and minds just got that much harder.", "points": 5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ], "skills": [ { "level": 6, "name": "speech" } ], "traits": [ "LIAR" ], "items": { @@ -3594,6 +4490,13 @@ "name": "Rancher", "description": "Taking care of cows, horses, and other animals is your passion, but the ways things are going, this isn't going to be just another day at the ranch.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": { "level": 2, "name": "survival" }, "items": { "both": [ @@ -3620,6 +4523,13 @@ "name": "Roadie", "description": "You've always worked just outside of the limelight, carrying and fixing the equipment and ensuring that the performers got what they needed. The show must go on.", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "fabrication" }, { "level": 1, "name": "driving" }, @@ -3644,6 +4554,13 @@ "name": "Musician", "description": "You nailed your solo, but the audience erupted into screams instead of applause. You weren't able to grab much during the panic, but at least you have your loaded six string on your back.", "points": -1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "skills": [ { "level": 2, "name": "speech" } ], "items": { "both": { @@ -3676,6 +4593,13 @@ "name": "Kitted Survivor", "description": "At the local mall, you saw a sign advertising a discount on survival kits. You bought one, more for show than for actual use. Now it's all you have.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "items": { "both": { "items": [ "sneakers", "socks", "jeans", "longshirt", "wristwatch", "mbag" ], @@ -3691,6 +4615,13 @@ "name": "Wild West Gunslinger", "description": "You made your living on Wild West exhibitions and shows, impressing tourists with your displays of marksmanship. But that world has ended, so you took your trusty six-shooter and wandered into a world where it's always high noon.", "points": 4, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "proficiencies": [ "prof_gunsmithing_basic" ], "skills": [ { "level": 4, "name": "gun" }, @@ -3733,6 +4664,13 @@ "name": { "male": "Frat Boy", "female": "Sorority Girl" }, "description": "You were living the high life, spending your parents' money without a care in the world. At one of your usual crazy parties, the guests became hungry for more than drugs and booze, but you still have a chance to use the last symbol of your luxurious life - your sports car - and get far away.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "skills": [ { "level": 1, "name": "speech" }, { "level": 2, "name": "driving" } ], "vehicle": "car_sports", "items": { @@ -3750,6 +4688,13 @@ "name": "Military Pilot", "description": "You got to see things fall apart from the sky, transporting soldiers and survivors from one holdout to the next. You knew it was only a matter of time before the horrors patrolling the skies shot you down.", "points": 5, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 4, "name": "driving" }, { "level": 3, "name": "pistol" }, @@ -3792,6 +4737,13 @@ "name": "EMT", "description": "You were responding to a call with your partner before you got separated. Now all you have is your trusty ambulance, ready to transport patients through the apocalypse.", "points": 4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "driving" }, { "level": 2, "name": "mechanics" }, @@ -3816,6 +4768,13 @@ "name": "Paramedic", "description": "You were separated from your partner while out on a call. You managed to hang onto some medical supplies, but it's looking like the only life that needs saving now is yours.", "points": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "driving" }, { "level": 1, "name": "mechanics" }, { "level": 5, "name": "firstaid" } ], "proficiencies": [ "prof_wound_care", "prof_wound_care_expert" ], "traits": [ "PROF_MED" ], @@ -3848,6 +4807,13 @@ "name": "Combat Medic", "description": "You were on the front-lines when everything happened, patching up the wounded and providing support. But they wouldn't stop coming. Now you're on your own.", "points": 5, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "gun" }, { "level": 2, "name": "rifle" }, @@ -3910,6 +4876,13 @@ "name": "Relief Volunteer", "description": "You were a member of a non-profit organization dedicated to helping out where help was needed. When the riots happened, you were eager to lend a hand. But you had to cut your plans short when everyone was less interested in handouts, and more interested in eating you.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "firstaid" }, { "level": 1, "name": "speech" } ], "items": { "both": { @@ -3940,6 +4913,13 @@ "name": { "male": "Speed King", "female": "Speed Queen" }, "description": "You used to rule the roads before they were filled with wrecks, undead, and unspeakable horrors. At least there's no speed limits in the apocalypse!", "points": 5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 6, "name": "driving" } ], "vehicle": "superbike", "items": { @@ -3964,6 +4944,13 @@ "name": "Military Corpse Disposal", "description": "In response to the outbreak, you were dispatched to contain the infection by burning the corpses. With command consumed by the undead, your priorities have shifted to basic survival.", "points": 6, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 3, "name": "gun" }, { "level": 3, "name": "rifle" }, @@ -4009,6 +4996,13 @@ "name": "Hazmat Unit", "description": "You were deployed to autopsy one of the rioters showing feral behavior before being put down. When they got back up, you knew this was out of your job description.", "points": 5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 5, "name": "firstaid" } ], "proficiencies": [ "prof_wound_care", "prof_wound_care_expert" ], "traits": [ "PROF_MED" ], @@ -4027,6 +5021,13 @@ "name": "Drug Dealer", "description": "You were about to make your biggest sale yet, but when you met the buyer he tried to bite you. To top it off, it seems that this wasn't some sort of bad high, as the whole town tried going for your throat too.", "points": 2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ], "skills": [ { "level": 1, "name": "melee" }, { "level": 2, "name": "stabbing" }, { "level": 2, "name": "speech" } ], "items": { "both": { @@ -4044,6 +5045,13 @@ "name": "Mafia Boss", "description": "Born into poverty, you joined one of the organized crime families to make a living. There, you quickly made it to the top and became the boss. The government was building a RICO case against you, but the doomsday arrived first. Your crew is gone, but your past life prepared you for a world where violence is common currency.", "points": 5, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ], "skills": [ { "level": 2, "name": "pistol" }, { "level": 2, "name": "smg" }, @@ -4082,6 +5090,13 @@ "name": "Paranormal Investigator", "description": "You were dismissed from your position as a parapsychology professor at the local university and started your own business as a paranormal investigator. Your former colleagues didn't approve of your research, but it looks like it's paying off now.", "points": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ], "skills": [ { "level": 2, "name": "chemistry" }, { "level": 2, "name": "electronics" } ], "traits": [ "SPIRITUAL" ], "proficiencies": [ "prof_electromagnetics" ], @@ -4111,6 +5126,13 @@ "name": "Bird Watcher", "description": "You were at your favorite park looking at the robins when the Cataclysm struck. Now all you have are your binoculars and a lot of trivia about local birds to share with any survivors you may find.", "points": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ], "skills": [ { "level": 1, "name": "survival" } ], "items": { "both": { diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 70283442bf78c..02551dbe12142 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -335,20 +335,20 @@ static std::string difficulty_to_string( const avatar &u ) } } if( prof != nullptr ) { - mod_diff( prof->difficulty(), 1.0f ); + mod_diff( prof->difficulty(), 0.6f ); } for( const profession *hob : u.hobbies ) { if( hob == nullptr ) { continue; } // Hobbies have less effect on difficulty - mod_diff( hob->difficulty(), 0.5f ); + mod_diff( hob->difficulty(), 0.4f ); } for( const trait_id &tr : u.my_traits ) { if( !tr.is_valid() ) { continue; } - mod_diff( tr->difficulty, 0.8f ); + mod_diff( tr->difficulty, 0.4f ); } int diff_val = std::round( diff / ( diff_cnt > 0 ? diff_cnt : 1 ) ); difficulty_opt_id diff_id = difficulty_opt::getId( diff_val ); From 9c75f01daf32cce8e921273b2262753e0f6d6c9b Mon Sep 17 00:00:00 2001 From: David Seguin Date: Fri, 19 Nov 2021 01:13:36 -0500 Subject: [PATCH 08/20] Difficulty info: create weighted attributes for difficulty Each impact of difficulty is weighted differently depending on the source of the difficulty. Environmental difficulty is mostly based on the scenario, while combat difficulty is based more on profession and mutations. --- data/json/difficulty.json | 15 ++++++--- data/json/scenarios.json | 8 ++--- doc/JSON_INFO.md | 10 +++++- src/difficulty_impact.cpp | 20 ++++++++++++ src/difficulty_impact.h | 11 +++++++ src/mutation_data.cpp | 2 +- src/newcharacter.cpp | 64 +++++++++++++++++++++++++-------------- src/profession.cpp | 2 +- src/scenario.cpp | 2 +- 9 files changed, 98 insertions(+), 36 deletions(-) diff --git a/data/json/difficulty.json b/data/json/difficulty.json index 0683b92e16ca8..e745b5dcc4544 100644 --- a/data/json/difficulty.json +++ b/data/json/difficulty.json @@ -38,30 +38,35 @@ "type": "difficulty_impact", "//": "Difficulty impacting melee and ranged combat", "id": "combat", - "name": "Combat" + "name": "Combat", + "weight": { "scenario": 0.2, "profession": 1.0, "hobby": 0.2, "mutation": 0.5 } }, { "type": "difficulty_impact", "//": "Difficulty impacting speed and dexterity", "id": "mobility", - "name": "Mobility" + "name": "Mobility", + "weight": { "scenario": 0.2, "profession": 0.8, "hobby": 0.4, "mutation": 1.0 } }, { "type": "difficulty_impact", "//": "Difficulty impacting learning and applying skills", "id": "crafting", - "name": "Crafting" + "name": "Crafting", + "weight": { "scenario": 0.1, "profession": 1.0, "hobby": 0.8, "mutation": 0.4 } }, { "type": "difficulty_impact", "//": "Difficulty impacting how safe the environment is", "id": "environment", - "name": "Environment" + "name": "Environment", + "weight": { "scenario": 1.0, "profession": 0.4, "hobby": 0.2, "mutation": 0.6 } }, { "type": "difficulty_impact", "//": "Difficulty impacting interaction with NPCs", "id": "social", - "name": "Social" + "name": "Social", + "weight": { "scenario": 0.2, "profession": 0.8, "hobby": 0.4, "mutation": 1.0 } } ] diff --git a/data/json/scenarios.json b/data/json/scenarios.json index 12db38198efba..9f0109a3b25c8 100644 --- a/data/json/scenarios.json +++ b/data/json/scenarios.json @@ -161,10 +161,10 @@ "id": "infected", "points": -4, "difficulty": [ - [ "combat", "hard" ], - [ "mobility", "normal" ], + [ "combat", "very_hard" ], + [ "mobility", "very_hard" ], [ "crafting", "normal" ], - [ "environment", "hard" ], + [ "environment", "very_hard" ], [ "social", "normal" ] ], "start_name": "In Town", @@ -437,7 +437,7 @@ [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "hard" ], + [ "environment", "very_hard" ], [ "social", "normal" ] ], "description": "You were deemed an essential employee and required to stay behind during the facility's evacuation. You better find your misplaced lanyard with your badge before the automated defenses notice that you don't have one.", diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index ecc8637d08166..13a01e1ee31d6 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -890,10 +890,18 @@ Difficulty impacts different aspects of gameplay, so these represent different c "type": "difficulty_impact", "//": "Difficulty impacting melee and ranged combat", "id": "combat", - "name": "Combat" + "name": "Combat", + "weight": { + "scenario": 0.2, + "profession": 1.0, + "hobby": 0.2, + "mutation": 0.5 + } } ``` +`weight` defines how much this gameplay aspect is affected by the source of difficulty. For example, "environment" is mostly affected by the starting scenario, while "combat" is more influenced by profession and mutations. + ### Dreams | Identifier | Description diff --git a/src/difficulty_impact.cpp b/src/difficulty_impact.cpp index 7d503f21d4d0b..f2d9e27dfa638 100644 --- a/src/difficulty_impact.cpp +++ b/src/difficulty_impact.cpp @@ -123,4 +123,24 @@ const std::vector &difficulty_impact::get_all() void difficulty_impact::load( const JsonObject &jo, const std::string & ) { mandatory( jo, was_loaded, "name", name_ ); + if( !jo.has_object( "weight" ) ) { + jo.throw_error( "missing mandatory field \"weight\"" ); + } else { + float readr; + JsonObject jobj = jo.get_object( "weight" ); + mandatory( jobj, was_loaded, "scenario", readr ); + weight_.emplace( SCENARIO, readr ); + mandatory( jobj, was_loaded, "profession", readr ); + weight_.emplace( PROFFESION, readr ); + mandatory( jobj, was_loaded, "hobby", readr ); + weight_.emplace( HOBBY, readr ); + mandatory( jobj, was_loaded, "mutation", readr ); + weight_.emplace( MUTATION, readr ); + } +} + +float difficulty_impact::weight( difficulty_source src ) const +{ + auto w = weight_.find( src ); + return w != weight_.end() ? w->second : 0.0f; } \ No newline at end of file diff --git a/src/difficulty_impact.h b/src/difficulty_impact.h index 73b3214e10cf9..ca3888ab9b252 100644 --- a/src/difficulty_impact.h +++ b/src/difficulty_impact.h @@ -3,6 +3,7 @@ #define CATA_SRC_DIFFICULTY_IMPACT_H #include +#include #include "json.h" #include "translations.h" @@ -50,6 +51,14 @@ struct difficulty_opt { */ struct difficulty_impact { public: + enum difficulty_source { + NONE, + SCENARIO, + PROFFESION, + HOBBY, + MUTATION + }; + void load( const JsonObject &jo, const std::string &src ); static const std::vector &get_all(); static void load_difficulty_impacts( const JsonObject &jo, const std::string &src ); @@ -61,10 +70,12 @@ struct difficulty_impact { const translation &name() const { return name_; } + float weight( difficulty_source src ) const; private: bool was_loaded = false; difficulty_impact_id id; translation name_; + std::map weight_; friend class generic_factory; }; diff --git a/src/mutation_data.cpp b/src/mutation_data.cpp index d95d9e676bed1..4889bc0ea967c 100644 --- a/src/mutation_data.cpp +++ b/src/mutation_data.cpp @@ -326,7 +326,7 @@ void mutation_branch::load( const JsonObject &jo, const std::string & ) if( jo.has_member( "difficulty" ) ) { const JsonArray &diff_arr = jo.get_array( "difficulty" ); - for( const JsonValue &diff : diff_arr ) { + for( const JsonValue diff : diff_arr ) { difficulty_impact_id imp( diff.get_array().get_string( 0 ) ); difficulty_opt_id opt( diff.get_array().get_string( 1 ) ); difficulty.emplace( imp, opt ); diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 02551dbe12142..5e05caf7ee6d8 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -309,49 +309,67 @@ static std::string difficulty_to_string( const avatar &u ) const profession *prof = u.prof; const int avg_val = difficulty_opt::avg_value(); + auto mod_diff = [avg_val]( const std::map &diff_map, + const difficulty_impact_id & cur_imp, float & diff, int &count ) { + auto diff_iter = diff_map.find( cur_imp ); + if( diff_iter != diff_map.end() ) { + diff += diff_iter->second->value() - avg_val; + count++; + } + }; + for( const difficulty_impact &diff_imp : difficulty_impact::get_all() ) { if( !diff_imp.getId().is_valid() ) { continue; } - float diff = 0.f; - int diff_cnt = 0; - - auto mod_diff = [&]( const std::map &diff_map, - float mod ) { - auto diff_iter = diff_map.find( diff_imp.getId() ); - if( diff_iter != diff_map.end() ) { - float mod_val = ( diff_iter->second->value() - avg_val ) * mod; - diff += mod_val + avg_val; - diff_cnt++; - } - }; + float scen_diff = 0.0f; + float prof_diff = 0.0f; + float hobb_diff = 0.0f; + float mut_diff = 0.0f; + int scen_cnt = 0; + int prof_cnt = 0; + int hobb_cnt = 0; + int mut_cnt = 0; if( scen != nullptr ) { - mod_diff( scen->difficulty(), 1.0f ); - if( diff < 1.f ) { - diff = avg_val; - diff_cnt = 1; - } + mod_diff( scen->difficulty(), diff_imp.getId(), scen_diff, scen_cnt ); } + if( prof != nullptr ) { - mod_diff( prof->difficulty(), 0.6f ); + mod_diff( prof->difficulty(), diff_imp.getId(), prof_diff, prof_cnt ); } + for( const profession *hob : u.hobbies ) { if( hob == nullptr ) { continue; } - // Hobbies have less effect on difficulty - mod_diff( hob->difficulty(), 0.4f ); + mod_diff( hob->difficulty(), diff_imp.getId(), hobb_diff, hobb_cnt ); } + hobb_diff = hobb_cnt > 0 ? ( hobb_diff / hobb_cnt ) : 0.0f; + for( const trait_id &tr : u.my_traits ) { if( !tr.is_valid() ) { continue; } - mod_diff( tr->difficulty, 0.4f ); + mod_diff( tr->difficulty, diff_imp.getId(), mut_diff, mut_cnt ); } - int diff_val = std::round( diff / ( diff_cnt > 0 ? diff_cnt : 1 ) ); - difficulty_opt_id diff_id = difficulty_opt::getId( diff_val ); + mut_diff = mut_cnt > 0 ? ( mut_diff / mut_cnt ) : 0.0f; + + const float weight_total = + diff_imp.weight( difficulty_impact::SCENARIO ) * ( scen_cnt > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::PROFFESION ) * ( prof_cnt > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::HOBBY ) * ( hobb_cnt > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::MUTATION ) * ( mut_cnt > 0 ? 1.f : 0.f ); + const float weight_scen = diff_imp.weight( difficulty_impact::SCENARIO ) / weight_total; + const float weight_prof = diff_imp.weight( difficulty_impact::PROFFESION ) / weight_total; + const float weight_hobb = diff_imp.weight( difficulty_impact::HOBBY ) / weight_total; + const float weight_mut = diff_imp.weight( difficulty_impact::MUTATION ) / weight_total; + + float diff = scen_diff * weight_scen + prof_diff * weight_prof + + hobb_diff * weight_hobb + mut_diff * weight_mut; + int diff_val = std::round( diff + avg_val ); + difficulty_opt_id diff_id = difficulty_opt::getId( diff_val > 0 ? diff_val : avg_val ); diff_str += string_format( " %s: %s", diff_imp.name().translated(), diff_id->color(), diff_id->name() ); } diff --git a/src/profession.cpp b/src/profession.cpp index 5bfa694eda562..4adec9bd213bc 100644 --- a/src/profession.cpp +++ b/src/profession.cpp @@ -196,7 +196,7 @@ void profession::load( const JsonObject &jo, const std::string & ) if( jo.has_member( "difficulty" ) ) { const JsonArray &diff_arr = jo.get_array( "difficulty" ); - for( const JsonValue &diff : diff_arr ) { + for( const JsonValue diff : diff_arr ) { difficulty_impact_id imp( diff.get_array().get_string( 0 ) ); difficulty_opt_id opt( diff.get_array().get_string( 1 ) ); _difficulty.emplace( imp, opt ); diff --git a/src/scenario.cpp b/src/scenario.cpp index ef1d99b56fd90..8cec62648cf41 100644 --- a/src/scenario.cpp +++ b/src/scenario.cpp @@ -80,7 +80,7 @@ void scenario::load( const JsonObject &jo, const std::string & ) if( jo.has_member( "difficulty" ) ) { const JsonArray &diff_arr = jo.get_array( "difficulty" ); - for( const JsonValue &diff : diff_arr ) { + for( const JsonValue diff : diff_arr ) { difficulty_impact_id imp( diff.get_array().get_string( 0 ) ); difficulty_opt_id opt( diff.get_array().get_string( 1 ) ); _difficulty.emplace( imp, opt ); From bc7e1ac9331c196fd3acfc63784f19d7bdf60273 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Fri, 19 Nov 2021 10:45:35 -0500 Subject: [PATCH 09/20] Difficulty info: corrections to profession difficulty Co-authored-by: Termineitor244 --- data/json/professions.json | 146 ++++++++++++++++++------------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/data/json/professions.json b/data/json/professions.json index 059e739e5b7ca..d6d1a7421a348 100644 --- a/data/json/professions.json +++ b/data/json/professions.json @@ -386,7 +386,7 @@ [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "easy" ], - [ "environment", "easy" ], + [ "environment", "normal" ], [ "social", "normal" ] ], "skills": [ @@ -431,7 +431,7 @@ [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "easy" ], + [ "environment", "normal" ], [ "social", "normal" ] ], "items": { @@ -453,7 +453,7 @@ [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "very_easy" ], - [ "environment", "easy" ], + [ "environment", "normal" ], [ "social", "normal" ] ], "proficiencies": [ "prof_fibers", "prof_knitting" ], @@ -908,7 +908,7 @@ "difficulty": [ [ "combat", "very_easy" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "easy" ], [ "social", "normal" ] ], @@ -964,7 +964,7 @@ "description": "Early in your military career, you were hand-picked for extra training in the mechanic's trade, keeping the armor running. It's been years since you last touched a rifle, and the dead men are marching again…", "points": 4, "difficulty": [ - [ "combat", "very_easy" ], + [ "combat", "easy" ], [ "mobility", "normal" ], [ "crafting", "very_easy" ], [ "environment", "easy" ], @@ -1017,10 +1017,10 @@ "description": "Your job was simple: Keep the army moving. You built bridges, you built roads, you destroyed fortifications, and you cleared mines. It has been years since you last handled a rifle in basic training; now might be the time to dust off those skills.", "points": 6, "difficulty": [ - [ "combat", "very_easy" ], + [ "combat", "easy" ], [ "mobility", "normal" ], [ "crafting", "very_easy" ], - [ "environment", "very_easy" ], + [ "environment", "easy" ], [ "social", "normal" ] ], "proficiencies": [ "prof_gunsmithing_basic" ], @@ -1072,9 +1072,9 @@ "difficulty": [ [ "combat", "very_easy" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], - [ "environment", "easy" ], - [ "social", "normal" ] + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "easy" ] ], "proficiencies": [ "prof_gunsmithing_basic" ], "skills": [ @@ -1190,7 +1190,7 @@ "difficulty": [ [ "combat", "very_easy" ], [ "mobility", "easy" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "very_easy" ], [ "social", "normal" ] ], @@ -1267,10 +1267,10 @@ "description": "You were following a road at night, trying to get away from the horrors of the city, when you heard a voice calling out in the dark. You followed, hoping they were friendly, but suddenly felt a searing pain in your head and blacked out. You just woke up in this strange place… are you even on Earth anymore?", "points": -2, "difficulty": [ - [ "combat", "normal" ], - [ "mobility", "normal" ], - [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "combat", "hard" ], + [ "mobility", "very_hard" ], + [ "crafting", "hard" ], + [ "environment", "very_hard" ], [ "social", "normal" ] ], "flags": [ "SCEN_ONLY" ] @@ -1282,10 +1282,10 @@ "description": "You were ready. You went in determined to find and rescue your friends. Now the atmosphere in these twisting corridors grows heavy, and you don't feel quite so confident anymore. You might be the one in need of a rescue soon.", "points": 3, "difficulty": [ - [ "combat", "very_easy" ], - [ "mobility", "normal" ], - [ "crafting", "very_easy" ], - [ "environment", "normal" ], + [ "combat", "easy" ], + [ "mobility", "hard" ], + [ "crafting", "easy" ], + [ "environment", "hard" ], [ "social", "normal" ] ], "skills": [ @@ -1326,8 +1326,8 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], - [ "environment", "easy" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], [ "social", "normal" ] ], "skills": [ { "level": 4, "name": "firstaid" } ], @@ -1365,7 +1365,7 @@ [ "combat", "very_easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "easy" ], [ "social", "normal" ] ], "skills": [ @@ -1398,7 +1398,7 @@ "description": "You had a boring, underpaid job watching cameras and patrolling hallways, but things have suddenly gotten a lot more dangerous. You have some useful equipment, but you've never had any call to use it until now.", "points": 1, "difficulty": [ - [ "combat", "very_easy" ], + [ "combat", "easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "easy" ], @@ -1464,7 +1464,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "easy" ], [ "social", "normal" ] ], @@ -1497,10 +1497,10 @@ "description": "Living off the land, far from civilization, is nothing new to you. The only difference is all the monsters that suddenly want you dead. Your equipment is basic, but versatile… except that your canteen's run out!", "points": 4, "difficulty": [ - [ "combat", "easy" ], - [ "mobility", "easy" ], + [ "combat", "normal" ], + [ "mobility", "normal" ], [ "crafting", "very_easy" ], - [ "environment", "easy" ], + [ "environment", "very_easy" ], [ "social", "normal" ] ], "proficiencies": [ @@ -1637,7 +1637,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "normal" ] ], @@ -1678,7 +1678,7 @@ [ "combat", "very_easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "easy" ], [ "social", "normal" ] ], "skills": [ { "level": 3, "name": "gun" }, { "level": 3, "name": "pistol" } ], @@ -1709,7 +1709,7 @@ [ "combat", "very_easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "easy" ], [ "social", "normal" ] ], "traits": [ "PROF_PD_DET" ], @@ -2056,7 +2056,7 @@ "description": "Ever since you were a child you loved hunting, and one year you got a shotgun for your birthday. Why, if the world ended, there's nothing you'd want at your side more than your trusty shotgun. So, when it did, you made sure to bring it along.", "points": 2, "difficulty": [ - [ "combat", "very_easy" ], + [ "combat", "easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "easy" ], @@ -2085,7 +2085,7 @@ "description": "Ever since you were a child you loved hunting, and you fancy yourself a crack shot. Why, if the world ended, there's nothing you'd want at your side more than your trusty rifle. So, when it did, you made sure to bring it along.", "points": 2, "difficulty": [ - [ "combat", "very_easy" ], + [ "combat", "easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "easy" ], @@ -2193,7 +2193,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "very_easy" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "very_easy" ], [ "social", "normal" ] ], @@ -2236,7 +2236,7 @@ [ "combat", "normal" ], [ "mobility", "very_easy" ], [ "crafting", "easy" ], - [ "environment", "easy" ], + [ "environment", "normal" ], [ "social", "normal" ] ], "skills": [ { "level": 3, "name": "electronics" }, { "level": 2, "name": "driving" }, { "level": 1, "name": "mechanics" } ], @@ -2377,7 +2377,7 @@ "points": 9, "difficulty": [ [ "combat", "very_easy" ], - [ "mobility", "easy" ], + [ "mobility", "very_easy" ], [ "crafting", "easy" ], [ "environment", "very_easy" ], [ "social", "normal" ] @@ -2489,7 +2489,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "very_easy" ], + [ "crafting", "easy" ], [ "environment", "easy" ], [ "social", "normal" ] ], @@ -2541,7 +2541,7 @@ [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "easy" ], + [ "environment", "normal" ], [ "social", "normal" ] ], "skills": [ { "level": 1, "name": "survival" } ], @@ -2732,8 +2732,8 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], - [ "environment", "easy" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], [ "social", "normal" ] ], "skills": [ { "level": 4, "name": "traps" }, { "level": 2, "name": "survival" } ], @@ -2860,7 +2860,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "normal" ] ], @@ -3013,7 +3013,7 @@ "description": "Your trial was contentious, but ultimately you found yourself behind bars. The Cataclysm has offered you a chance to escape, but freedom may come with a steep price.", "points": 0, "difficulty": [ - [ "combat", "easy" ], + [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "normal" ], @@ -3241,7 +3241,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "normal" ] ], @@ -3414,7 +3414,7 @@ [ "combat", "easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "easy" ], [ "social", "normal" ] ], "traits": [ "PROF_MA_ORANGE" ], @@ -3432,10 +3432,10 @@ "description": "As the world ends, you alone stand against the coming darkness with your fists of steel.", "points": 8, "difficulty": [ - [ "combat", "easy" ], - [ "mobility", "normal" ], + [ "combat", "very_easy" ], + [ "mobility", "easy" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "very_easy" ], [ "social", "normal" ] ], "traits": [ "PROF_MA_BLACK" ], @@ -3529,7 +3529,7 @@ "points": 3, "difficulty": [ [ "combat", "normal" ], - [ "mobility", "easy" ], + [ "mobility", "very_easy" ], [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "normal" ] @@ -3608,10 +3608,10 @@ "description": "The government activated your National Guard unit to deal with the growing epidemics. Despite your best efforts, you were unable to form up before all communications ceased and you found yourself alone amongst the dead.", "points": 3, "difficulty": [ - [ "combat", "easy" ], + [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], - [ "environment", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], [ "social", "normal" ] ], "skills": [ { "level": 2, "name": "gun" }, { "level": 2, "name": "firstaid" } ], @@ -3633,8 +3633,8 @@ "difficulty": [ [ "combat", "very_easy" ], [ "mobility", "normal" ], - [ "crafting", "very_easy" ], - [ "environment", "easy" ], + [ "crafting", "easy" ], + [ "environment", "hard" ], [ "social", "normal" ] ], "proficiencies": [ "prof_fibers", "prof_fibers_rope", "prof_knitting", "prof_closures" ], @@ -3679,7 +3679,7 @@ [ "combat", "very_easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "easy" ], + [ "environment", "normal" ], [ "social", "normal" ] ], "proficiencies": [ "prof_gunsmithing_basic" ], @@ -3815,7 +3815,7 @@ "points": 2, "difficulty": [ [ "combat", "normal" ], - [ "mobility", "easy" ], + [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "easy" ], [ "social", "normal" ] @@ -4120,7 +4120,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "normal" ] ], @@ -4199,8 +4199,8 @@ "description": "It was hard enough getting kids to run laps without having to worry about them trying to eat your brains. Zombies won't even line up when you blow your whistle.", "points": 3, "difficulty": [ - [ "combat", "normal" ], - [ "mobility", "easy" ], + [ "combat", "easy" ], + [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "easy" ] @@ -4263,10 +4263,10 @@ "skills": [ { "level": 2, "name": "fabrication" } ], "points": 3, "difficulty": [ - [ "combat", "easy" ], + [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "easy" ], - [ "environment", "normal" ], + [ "environment", "easy" ], [ "social", "normal" ] ], "items": { @@ -4494,7 +4494,7 @@ [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "easy" ], [ "social", "normal" ] ], "skills": { "level": 2, "name": "survival" }, @@ -4525,8 +4525,8 @@ "points": 3, "difficulty": [ [ "combat", "normal" ], - [ "mobility", "easy" ], - [ "crafting", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], [ "environment", "normal" ], [ "social", "normal" ] ], @@ -4669,7 +4669,7 @@ [ "mobility", "very_easy" ], [ "crafting", "normal" ], [ "environment", "normal" ], - [ "social", "easy" ] + [ "social", "normal" ] ], "skills": [ { "level": 1, "name": "speech" }, { "level": 2, "name": "driving" } ], "vehicle": "car_sports", @@ -4692,7 +4692,7 @@ [ "combat", "easy" ], [ "mobility", "normal" ], [ "crafting", "easy" ], - [ "environment", "easy" ], + [ "environment", "normal" ], [ "social", "normal" ] ], "skills": [ @@ -4741,7 +4741,7 @@ [ "combat", "normal" ], [ "mobility", "very_easy" ], [ "crafting", "easy" ], - [ "environment", "normal" ], + [ "environment", "very_easy" ], [ "social", "normal" ] ], "skills": [ @@ -4771,8 +4771,8 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], - [ "environment", "easy" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], [ "social", "normal" ] ], "skills": [ { "level": 2, "name": "driving" }, { "level": 1, "name": "mechanics" }, { "level": 5, "name": "firstaid" } ], @@ -4811,7 +4811,7 @@ [ "combat", "very_easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "easy" ], + [ "environment", "very_easy" ], [ "social", "normal" ] ], "skills": [ @@ -4879,7 +4879,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "easy" ], [ "social", "normal" ] ], @@ -4947,7 +4947,7 @@ "difficulty": [ [ "combat", "very_easy" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "easy" ], [ "social", "normal" ] ], @@ -4999,7 +4999,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "easy" ], + [ "crafting", "normal" ], [ "environment", "very_easy" ], [ "social", "normal" ] ], @@ -5046,10 +5046,10 @@ "description": "Born into poverty, you joined one of the organized crime families to make a living. There, you quickly made it to the top and became the boss. The government was building a RICO case against you, but the doomsday arrived first. Your crew is gone, but your past life prepared you for a world where violence is common currency.", "points": 5, "difficulty": [ - [ "combat", "easy" ], + [ "combat", "very_easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "easy" ], [ "social", "very_easy" ] ], "skills": [ From 248d1f952763eca4e483077903f1b7a675660dc3 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Fri, 19 Nov 2021 12:29:39 -0500 Subject: [PATCH 10/20] Difficulty info: show difficulty according to current tab --- src/newcharacter.cpp | 183 +++++++++++++++++++++++++++++++------------ 1 file changed, 134 insertions(+), 49 deletions(-) diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 5e05caf7ee6d8..e1139ac77f4fc 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -302,72 +302,137 @@ static std::string pools_to_string( const avatar &u, pool_type pool ) return "If you see this, this is a bug"; } -static std::string difficulty_to_string( const avatar &u ) +static void modify_diff_impact( const std::map &diff_map, + const difficulty_impact_id &cur_imp, float &diff, int &count ) +{ + auto diff_iter = diff_map.find( cur_imp ); + if( diff_iter != diff_map.end() ) { + diff += diff_iter->second->value() - difficulty_opt::avg_value(); + count++; + } +} + +static std::pair get_diff_val_for( const scenario *scen, + const difficulty_impact &impact ) +{ + float diff = 0.0f; + int count = 0; + + if( scen != nullptr ) { + modify_diff_impact( scen->difficulty(), impact.getId(), diff, count ); + } + + return { diff, count }; +} + +static std::pair get_diff_val_for( const profession *prof, + const difficulty_impact &impact ) +{ + float diff = 0.0f; + int count = 0; + + if( prof != nullptr ) { + modify_diff_impact( prof->difficulty(), impact.getId(), diff, count ); + } + + return { diff, count }; +} + +static std::pair get_diff_val_for( const trait_id &mut, + const difficulty_impact &impact ) +{ + float diff = 0.0f; + int count = 0; + + if( mut.is_valid() ) { + modify_diff_impact( mut->difficulty, impact.getId(), diff, count ); + } + + return { diff, count }; +} + +static std::pair get_diff_val_for( const std::set &hobbies, + const difficulty_impact &impact ) +{ + float diff = 0.0f; + int count = 0; + + for( const profession *hob : hobbies ) { + std::pair val = get_diff_val_for( hob, impact ); + diff += val.first; + count += val.second; + } + diff = count > 0 ? ( diff / count ) : 0.0f; + + return { diff, count }; +} + +static std::pair get_diff_val_for( const std::unordered_set &muts, + const difficulty_impact &impact ) +{ + float diff = 0.0f; + int count = 0; + + for( const trait_id &mut : muts ) { + std::pair val = get_diff_val_for( mut, impact ); + diff += val.first; + count += val.second; + } + diff = count > 0 ? ( diff / count ) : 0.0f; + + return { diff, count }; +} + +static std::string difficulty_to_string( const std::map + &diff_map ) { std::string diff_str = _( "Difficulty" ) + std::string( " |" ); + + for( const auto &diff_pair : diff_map ) { + std::string rating = ""; + std::string colr = "light_gray"; + if( !diff_pair.first.is_valid() ) { + continue; + } else if( diff_pair.second.is_valid() ) { + rating = diff_pair.second->name().translated(); + colr = diff_pair.second->color(); + } + diff_str += string_format( " %s: %s", diff_pair.first->name().translated(), colr, + rating ); + } + + return diff_str; +} + +static std::string difficulty_to_string( const avatar &u ) +{ + std::string diff_str = _( "Overview" ) + std::string( " |" ); const scenario *scen = get_scenario(); const profession *prof = u.prof; const int avg_val = difficulty_opt::avg_value(); - auto mod_diff = [avg_val]( const std::map &diff_map, - const difficulty_impact_id & cur_imp, float & diff, int &count ) { - auto diff_iter = diff_map.find( cur_imp ); - if( diff_iter != diff_map.end() ) { - diff += diff_iter->second->value() - avg_val; - count++; - } - }; - for( const difficulty_impact &diff_imp : difficulty_impact::get_all() ) { if( !diff_imp.getId().is_valid() ) { continue; } - float scen_diff = 0.0f; - float prof_diff = 0.0f; - float hobb_diff = 0.0f; - float mut_diff = 0.0f; - int scen_cnt = 0; - int prof_cnt = 0; - int hobb_cnt = 0; - int mut_cnt = 0; - - if( scen != nullptr ) { - mod_diff( scen->difficulty(), diff_imp.getId(), scen_diff, scen_cnt ); - } - - if( prof != nullptr ) { - mod_diff( prof->difficulty(), diff_imp.getId(), prof_diff, prof_cnt ); - } - - for( const profession *hob : u.hobbies ) { - if( hob == nullptr ) { - continue; - } - mod_diff( hob->difficulty(), diff_imp.getId(), hobb_diff, hobb_cnt ); - } - hobb_diff = hobb_cnt > 0 ? ( hobb_diff / hobb_cnt ) : 0.0f; - - for( const trait_id &tr : u.my_traits ) { - if( !tr.is_valid() ) { - continue; - } - mod_diff( tr->difficulty, diff_imp.getId(), mut_diff, mut_cnt ); - } - mut_diff = mut_cnt > 0 ? ( mut_diff / mut_cnt ) : 0.0f; + std::pair scen_diff = get_diff_val_for( scen, diff_imp ); + std::pair prof_diff = get_diff_val_for( prof, diff_imp ); + std::pair hobb_diff = get_diff_val_for( u.hobbies, diff_imp ); + std::pair mut_diff = get_diff_val_for( u.my_traits, diff_imp ); const float weight_total = - diff_imp.weight( difficulty_impact::SCENARIO ) * ( scen_cnt > 0 ? 1.f : 0.f ) + - diff_imp.weight( difficulty_impact::PROFFESION ) * ( prof_cnt > 0 ? 1.f : 0.f ) + - diff_imp.weight( difficulty_impact::HOBBY ) * ( hobb_cnt > 0 ? 1.f : 0.f ) + - diff_imp.weight( difficulty_impact::MUTATION ) * ( mut_cnt > 0 ? 1.f : 0.f ); + diff_imp.weight( difficulty_impact::SCENARIO ) * ( scen_diff.second > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::PROFFESION ) * ( prof_diff.second > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::HOBBY ) * ( hobb_diff.second > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::MUTATION ) * ( mut_diff.second > 0 ? 1.f : 0.f ); const float weight_scen = diff_imp.weight( difficulty_impact::SCENARIO ) / weight_total; const float weight_prof = diff_imp.weight( difficulty_impact::PROFFESION ) / weight_total; const float weight_hobb = diff_imp.weight( difficulty_impact::HOBBY ) / weight_total; const float weight_mut = diff_imp.weight( difficulty_impact::MUTATION ) / weight_total; - float diff = scen_diff * weight_scen + prof_diff * weight_prof + - hobb_diff * weight_hobb + mut_diff * weight_mut; + float diff = scen_diff.first * weight_scen + prof_diff.first * weight_prof + + hobb_diff.first * weight_hobb + mut_diff.first * weight_mut; int diff_val = std::round( diff + avg_val ); difficulty_opt_id diff_id = difficulty_opt::getId( diff_val > 0 ? diff_val : avg_val ); diff_str += string_format( " %s: %s", diff_imp.name().translated(), @@ -963,7 +1028,22 @@ static void draw_points( const catacurses::window &w, pool_type pool, const avat } else if( netPointCost < 0 ) { mvwprintz( w, point( pMsg_length + 2, 3 ), c_green, " (+%d)", std::abs( netPointCost ) ); } - print_colored_text( w, point( 2, 4 ), color, c_light_gray, difficulty_to_string( u ) ); +} + +static void draw_difficulty( const catacurses::window &w, const avatar &u ) +{ + nc_color color = c_light_gray; + mvwprintz( w, point( 2, 4 ), c_black, std::string( getmaxx( w ) - 3, ' ' ) ); + print_colored_text( w, point( 2, 4 ), color, color, difficulty_to_string( u ) ); +} + +static void draw_difficulty( const catacurses::window &w, + const std::map &diff_map = + std::map() ) +{ + nc_color color = c_light_gray; + mvwprintz( w, point( 2, 4 ), c_black, std::string( getmaxx( w ) - 3, ' ' ) ); + print_colored_text( w, point( 2, 4 ), color, color, difficulty_to_string( diff_map ) ); } template @@ -1533,6 +1613,7 @@ tab_direction set_traits( avatar &u, pool_type pool ) } else if( u.has_trait( cur_trait ) ) { cLine = hi_on; } + draw_difficulty( w, cur_trait->difficulty ); } else { if( u.has_conflicting_trait( cur_trait ) || get_scenario()->is_forbidden_trait( cur_trait ) ) { cLine = c_dark_gray; @@ -1851,6 +1932,7 @@ tab_direction set_profession( avatar &u, pool_type pool ) } // Draw header. draw_points( w, pool, u, netPointCost ); + draw_difficulty( w, sorted_profs[cur_id]->difficulty() ); const char *prof_msg_temp; if( negativeProf ) { //~ 1s - profession name, 2d - current character points. @@ -2270,6 +2352,7 @@ tab_direction set_hobbies( avatar &u, pool_type pool ) } // Draw header. draw_points( w, pool, u, netPointCost ); + draw_difficulty( w, sorted_profs[cur_id]->difficulty() ); const char *prof_msg_temp; if( negativeProf ) { //~ 1s - profession name, 2d - current character points. @@ -2974,6 +3057,7 @@ tab_direction set_scenario( avatar &u, pool_type pool ) // Draw header. draw_points( w, pool, u, netPointCost ); + draw_difficulty( w, sorted_scens[cur_id]->difficulty() ); const char *scen_msg_temp; if( isWide ) { @@ -3472,6 +3556,7 @@ tab_direction set_description( avatar &you, const bool allow_reroll, draw_character_tabs( w, _( "DESCRIPTION" ) ); draw_points( w, pool, you ); + draw_difficulty( w, you ); //Draw the line between editable and non-editable stuff. for( int i = 0; i < getmaxx( w ); ++i ) { From f10c02ad5e114d1a0d8b4af062629fa0fa7ba5af Mon Sep 17 00:00:00 2001 From: David Seguin Date: Fri, 19 Nov 2021 14:56:19 -0500 Subject: [PATCH 11/20] Difficulty info: derive difficulty from stats --- data/json/difficulty.json | 60 ++++++++++++++++++++++++--- data/json/skills.json | 84 +++++++++++++++++++++++++------------- doc/JSON_INFO.md | 15 +++++-- src/difficulty_impact.cpp | 28 +++++++++++++ src/difficulty_impact.h | 11 ++++- src/newcharacter.cpp | 85 ++++++++++++++++++++++++++++++++------- src/skill.cpp | 8 ++++ src/skill.h | 6 +++ 8 files changed, 246 insertions(+), 51 deletions(-) diff --git a/data/json/difficulty.json b/data/json/difficulty.json index e745b5dcc4544..edfdd2e66c113 100644 --- a/data/json/difficulty.json +++ b/data/json/difficulty.json @@ -39,34 +39,84 @@ "//": "Difficulty impacting melee and ranged combat", "id": "combat", "name": "Combat", - "weight": { "scenario": 0.2, "profession": 1.0, "hobby": 0.2, "mutation": 0.5 } + "weight": { + "scenario": 0.2, + "profession": 1.0, + "hobby": 0.2, + "mutation": 0.5, + "skills": 0.8, + "strength": 0.6, + "dexterity": 0.2, + "intelligence": 0.0, + "perception": 0.0 + } }, { "type": "difficulty_impact", "//": "Difficulty impacting speed and dexterity", "id": "mobility", "name": "Mobility", - "weight": { "scenario": 0.2, "profession": 0.8, "hobby": 0.4, "mutation": 1.0 } + "weight": { + "scenario": 0.2, + "profession": 0.8, + "hobby": 0.4, + "mutation": 1.0, + "skills": 0.4, + "strength": 0.0, + "dexterity": 0.3, + "intelligence": 0.0, + "perception": 0.0 + } }, { "type": "difficulty_impact", "//": "Difficulty impacting learning and applying skills", "id": "crafting", "name": "Crafting", - "weight": { "scenario": 0.1, "profession": 1.0, "hobby": 0.8, "mutation": 0.4 } + "weight": { + "scenario": 0.1, + "profession": 1.0, + "hobby": 0.8, + "mutation": 0.4, + "skills": 0.8, + "strength": 0.0, + "dexterity": 0.0, + "intelligence": 0.6, + "perception": 0.0 + } }, { "type": "difficulty_impact", "//": "Difficulty impacting how safe the environment is", "id": "environment", "name": "Environment", - "weight": { "scenario": 1.0, "profession": 0.4, "hobby": 0.2, "mutation": 0.6 } + "weight": { + "scenario": 1.0, + "profession": 0.4, + "hobby": 0.2, + "mutation": 0.6, + "skills": 0.5, + "strength": 0.4, + "dexterity": 0.1, + "intelligence": 0.0, + "perception": 0.4 + } }, { "type": "difficulty_impact", "//": "Difficulty impacting interaction with NPCs", "id": "social", "name": "Social", - "weight": { "scenario": 0.2, "profession": 0.8, "hobby": 0.4, "mutation": 1.0 } + "weight": { + "scenario": 0.2, + "profession": 0.8, + "hobby": 0.4, + "mutation": 1.0, + "skills": 0.8, + "strength": 0.05, + "dexterity": 0.0, + "intelligence": 0.1, + "perception": 0.0 + } } ] diff --git a/data/json/skills.json b/data/json/skills.json index 398e1ee809d42..89d1369565c70 100644 --- a/data/json/skills.json +++ b/data/json/skills.json @@ -6,14 +6,16 @@ "description": "Your skill in speaking to other people. Covers ability in boasting, flattery, threats, persuasion, lies, bartering, and other facets of interpersonal communication. Works best in conjunction with a high level of intelligence.", "companion_survival_rank_factor": 1, "display_category": "display_interaction", - "companion_skill_practice": [ { "skill": "recruiting", "weight": 15 }, { "skill": "recruiting", "weight": 70 } ] + "companion_skill_practice": [ { "skill": "recruiting", "weight": 15 }, { "skill": "recruiting", "weight": 70 } ], + "difficulty_scale": [ [ "social", 1.0 ] ] }, { "type": "skill", "id": "computer", "name": { "str": "computers" }, "description": "Your skill in accessing and manipulating computers. Higher levels can allow a user to navigate complex software systems and even bypass their security.", - "display_category": "display_interaction" + "display_category": "display_interaction", + "difficulty_scale": [ [ "crafting", 0.2 ] ] }, { "type": "skill", @@ -23,7 +25,8 @@ "companion_survival_rank_factor": 1, "companion_industry_rank_factor": 1, "display_category": "display_interaction", - "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ], + "difficulty_scale": [ [ "crafting", 0.1 ], [ "environment", 0.4 ] ] }, { "type": "skill", @@ -32,7 +35,8 @@ "description": "Your skill in engineering, maintaining and repairing vehicles and other mechanical systems. This skill covers the craft of items with complex parts, and plays a role in the installation of bionic equipment.", "companion_industry_rank_factor": 1, "display_category": "display_interaction", - "companion_skill_practice": [ { "skill": "menial", "weight": 10 }, { "skill": "construction", "weight": 20 } ] + "companion_skill_practice": [ { "skill": "menial", "weight": 10 }, { "skill": "construction", "weight": 20 } ], + "difficulty_scale": [ [ "mobility", 0.1 ], [ "crafting", 0.6 ] ] }, { "type": "skill", @@ -41,14 +45,16 @@ "description": "Your skill in manipulating fine devices like security systems, traps, locks and other precision tasks. This skill does not affect the evasion of traps that are triggered.", "companion_survival_rank_factor": 1, "display_category": "display_interaction", - "companion_skill_practice": [ { "skill": "", "weight": 15 }, { "skill": "gathering", "weight": 15 }, { "skill": "trapping", "weight": 80 } ] + "companion_skill_practice": [ { "skill": "", "weight": 15 }, { "skill": "gathering", "weight": 15 }, { "skill": "trapping", "weight": 80 } ], + "difficulty_scale": [ [ "crafting", 0.2 ], [ "environment", 0.2 ] ] }, { "type": "skill", "id": "driving", "name": { "str": "vehicles" }, "description": "Your skill in operating and steering a vehicle in motion, from cars and boats to helicopters and hot air balloons. A higher level allows greater control over vehicles at higher speeds, and reduces the penalty of shooting while driving.", - "display_category": "display_interaction" + "display_category": "display_interaction", + "difficulty_scale": [ [ "mobility", 0.6 ] ] }, { "type": "skill", @@ -56,7 +62,8 @@ "name": { "str": "athletics" }, "description": "Your ability to swim. Affects swimming endurance and ability to swim with weight. note: presently this skill only affects swimming.", "display_category": "display_interaction", - "companion_skill_practice": [ { "skill": "", "weight": 5 }, { "skill": "gathering", "weight": 5 }, { "skill": "trapping", "weight": 5 } ] + "companion_skill_practice": [ { "skill": "", "weight": 5 }, { "skill": "gathering", "weight": 5 }, { "skill": "trapping", "weight": 5 } ], + "difficulty_scale": [ [ "mobility", 0.4 ], [ "environment", 0.2 ] ] }, { "type": "skill", @@ -71,7 +78,8 @@ { "skill": "trapping", "weight": 10 }, { "skill": "menial", "weight": 60 }, { "skill": "construction", "weight": 70 } - ] + ], + "difficulty_scale": [ [ "crafting", 0.8 ], [ "environment", 0.1 ] ] }, { "type": "skill", @@ -80,7 +88,8 @@ "description": "Your skill in combining food ingredients to make other, tastier food items. Also includes food preservation and safety, brewing, butchery, and more.", "companion_industry_rank_factor": 1, "display_category": "display_crafting", - "companion_skill_practice": [ { "skill": "menial", "weight": 15 } ] + "companion_skill_practice": [ { "skill": "menial", "weight": 15 } ], + "difficulty_scale": [ [ "crafting", 0.2 ], [ "environment", 0.2 ] ] }, { "type": "skill", @@ -89,7 +98,8 @@ "description": "Your skill in the craft and repair of clothing, bags, blankets and other textiles. Affects knitting, sewing, stitching, weaving, and nearly anything else involving a needle and thread.", "companion_industry_rank_factor": 1, "display_category": "display_crafting", - "companion_skill_practice": [ { "skill": "menial", "weight": 15 } ] + "companion_skill_practice": [ { "skill": "menial", "weight": 15 } ], + "difficulty_scale": [ [ "crafting", 0.6 ], [ "environment", 0.2 ] ] }, { "type": "skill", @@ -107,7 +117,8 @@ { "skill": "construction", "weight": 10 }, { "skill": "recruiting", "weight": 25 }, { "skill": "combat", "weight": 10 } - ] + ], + "difficulty_scale": [ [ "crafting", 0.2 ], [ "environment", 0.8 ] ] }, { "type": "skill", @@ -115,7 +126,8 @@ "name": { "str": "electronics" }, "description": "Your skill in dealing with electrical systems, used in the craft and repair of objects with electrical components. This skill is an important part of installing and managing bionic implants.", "companion_industry_rank_factor": 1, - "display_category": "display_crafting" + "display_category": "display_crafting", + "difficulty_scale": [ [ "crafting", 0.6 ] ] }, { "type": "skill", @@ -133,7 +145,8 @@ { "skill": "trapping", "weight": 5 }, { "skill": "hunting", "weight": 45 }, { "skill": "combat", "weight": 15 } - ] + ], + "difficulty_scale": [ [ "combat", 0.4 ], [ "crafting", 0.1 ] ] }, { "type": "skill", @@ -142,7 +155,8 @@ "description": "Your overall skill in using bows and firearms. With higher levels, this general experience increases accuracy with any bows or firearms, but is secondary to practice with the type of ranged weapon in question.", "tags": [ "combat_skill" ], "display_category": "display_ranged", - "companion_skill_practice": [ { "skill": "gathering", "weight": 60 }, { "skill": "combat", "weight": 5 } ] + "companion_skill_practice": [ { "skill": "gathering", "weight": 60 }, { "skill": "combat", "weight": 5 } ], + "difficulty_scale": [ [ "combat", 0.8 ], [ "crafting", 0.1 ] ] }, { "type": "skill", @@ -151,7 +165,8 @@ "description": "Your skill in using heavy weapons like rocket, grenade or missile launchers. These weapons have a variety of applications and may carry immense destructive power, but they are cumbersome and hard to manage.", "tags": [ "combat_skill" ], "time_to_attack": { "min_time": 30, "base_time": 100, "time_reduction_per_level": 7 }, - "display_category": "display_ranged" + "display_category": "display_ranged", + "difficulty_scale": [ [ "combat", 0.4 ], [ "crafting", 0.1 ] ] }, { "type": "skill", @@ -161,7 +176,8 @@ "tags": [ "combat_skill" ], "time_to_attack": { "min_time": 10, "base_time": 80, "time_reduction_per_level": 7 }, "display_category": "display_ranged", - "companion_skill_practice": [ { "skill": "hunting", "weight": 25 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 25 } ], + "difficulty_scale": [ [ "combat", 0.6 ], [ "crafting", 0.1 ] ] }, { "type": "skill", @@ -171,7 +187,8 @@ "tags": [ "combat_skill" ], "time_to_attack": { "min_time": 15, "base_time": 75, "time_reduction_per_level": 6 }, "display_category": "display_ranged", - "companion_skill_practice": [ { "skill": "hunting", "weight": 45 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 45 } ], + "difficulty_scale": [ [ "combat", 0.8 ], [ "crafting", 0.1 ] ] }, { "type": "skill", @@ -181,7 +198,8 @@ "tags": [ "combat_skill" ], "time_to_attack": { "min_time": 15, "base_time": 75, "time_reduction_per_level": 6 }, "display_category": "display_ranged", - "companion_skill_practice": [ { "skill": "hunting", "weight": 25 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 25 } ], + "difficulty_scale": [ [ "combat", 0.8 ], [ "crafting", 0.1 ] ] }, { "type": "skill", @@ -191,7 +209,8 @@ "tags": [ "combat_skill" ], "time_to_attack": { "min_time": 20, "base_time": 80, "time_reduction_per_level": 6 }, "display_category": "display_ranged", - "companion_skill_practice": [ { "skill": "hunting", "weight": 25 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 25 } ], + "difficulty_scale": [ [ "combat", 0.7 ], [ "crafting", 0.1 ] ] }, { "type": "skill", @@ -200,7 +219,8 @@ "description": "Your skill in throwing objects over a distance. Skill increases accuracy, and at higher levels, the range of a throw.", "tags": [ "combat_skill" ], "time_to_attack": { "min_time": 50, "base_time": 220, "time_reduction_per_level": 25 }, - "display_category": "display_ranged" + "display_category": "display_ranged", + "difficulty_scale": [ [ "combat", 0.2 ], [ "environment", 0.1 ] ] }, { "type": "skill", @@ -218,7 +238,8 @@ { "skill": "hunting", "weight": 10 }, { "skill": "recruiting", "weight": 5 }, { "skill": "combat", "weight": 20 } - ] + ], + "difficulty_scale": [ [ "combat", 0.8 ], [ "environment", 0.1 ] ] }, { "type": "skill", @@ -228,7 +249,8 @@ "tags": [ "combat_skill" ], "companion_combat_rank_factor": 1, "display_category": "display_melee", - "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ], + "difficulty_scale": [ [ "combat", 0.6 ], [ "environment", 0.1 ] ] }, { "type": "skill", @@ -238,7 +260,8 @@ "tags": [ "combat_skill" ], "companion_combat_rank_factor": 1, "display_category": "display_melee", - "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ], + "difficulty_scale": [ [ "combat", 0.6 ], [ "environment", 0.1 ] ] }, { "type": "skill", @@ -247,7 +270,8 @@ "description": "Your ability to dodge an oncoming threat, be it an enemy's attack, a triggered trap, or a falling rock. This skill is also used in attempts to fall gracefully, and for other acrobatic feats. The first number shown includes modifiers, and the second does not.", "tags": [ "combat_skill" ], "display_category": "display_melee", - "companion_skill_practice": [ { "skill": "hunting", "weight": 15 }, { "skill": "combat", "weight": 20 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 15 }, { "skill": "combat", "weight": 20 } ], + "difficulty_scale": [ [ "combat", 0.3 ], [ "mobility", 0.2 ], [ "environment", 0.1 ] ] }, { "type": "skill", @@ -257,7 +281,8 @@ "tags": [ "combat_skill" ], "companion_combat_rank_factor": 1, "display_category": "display_melee", - "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ], + "difficulty_scale": [ [ "combat", 0.6 ], [ "environment", 0.1 ] ] }, { "type": "skill", @@ -268,7 +293,8 @@ "companion_combat_rank_factor": 1, "companion_survival_rank_factor": 1, "display_category": "display_melee", - "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ] + "companion_skill_practice": [ { "skill": "hunting", "weight": 10 }, { "skill": "combat", "weight": 10 } ], + "difficulty_scale": [ [ "combat", 0.4 ], [ "environment", 0.1 ] ] }, { "type": "skill", @@ -277,7 +303,8 @@ "description": "Your skill in general 'bench science', applying any of a wide range of precision techniques based on your overall understanding of scientific principles. This is not a research skill, but about using the results of others' research.", "companion_industry_rank_factor": 1, "display_category": "display_crafting", - "companion_skill_practice": [ { "skill": "menial", "weight": 15 } ] + "companion_skill_practice": [ { "skill": "menial", "weight": 15 } ], + "difficulty_scale": [ [ "crafting", 0.8 ], [ "environment", 0.2 ] ] }, { "type": "skill", @@ -285,6 +312,7 @@ "name": { "str": "weapon" }, "description": "seeing this is a bug", "tags": [ "contextual_skill" ], - "display_category": "none" + "display_category": "none", + "difficulty_scale": [ ] } ] diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index 13a01e1ee31d6..be7bbe188eabf 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -895,7 +895,12 @@ Difficulty impacts different aspects of gameplay, so these represent different c "scenario": 0.2, "profession": 1.0, "hobby": 0.2, - "mutation": 0.5 + "mutation": 0.5, + "skills": 0.5, + "strength": 0.4, + "dexterity": 0.1, + "intelligence": 0.0, + "perception": 0.4 } } ``` @@ -1310,7 +1315,7 @@ The in-game name, either one gender-neutral string, or an object with gender spe Point cost of profession. Positive values cost points and negative values grant points. -## `difficulty` +#### `difficulty` (array of strings) Represents the difficulty impact on different aspects of gameplay. Each entry is a pair of strings: a [`difficulty_impact`](#difficulty-impact) and a [`difficulty_opt`](#difficulty-rating). @@ -2045,7 +2050,11 @@ it is present to help catch errors. "id" : "smg", // Unique ID. Must be one continuous word, use underscores if necessary "name" : "submachine guns", // In-game name displayed "description" : "Your skill with submachine guns and machine pistols. Halfway between a pistol and an assault rifle, these weapons fire and reload quickly, and may fire in bursts, but they are not very accurate.", // In-game description -"tags" : ["gun_type"] // Special flags (default: none) +"tags" : ["gun_type"], // Special flags (default: none) +"difficulty_scale": [ // Which difficulty_impact_id's scale with this skill + [ "combat", 0.7 ], + [ "crafting", 0.1 ] +] ``` ### Speed Description diff --git a/src/difficulty_impact.cpp b/src/difficulty_impact.cpp index f2d9e27dfa638..6d692057854fb 100644 --- a/src/difficulty_impact.cpp +++ b/src/difficulty_impact.cpp @@ -50,17 +50,25 @@ void difficulty_opt::load( const JsonObject &jo, const std::string & ) } int difficulty_opt::avg_value_ = 0; +int difficulty_opt::min_value_ = 0; +int difficulty_opt::max_value_ = 0; void difficulty_opt::finalize() { + int minv = INT_MAX; + int maxv = INT_MIN; int val_total = 0; int val_count = 0; for( const difficulty_opt &opt : get_all() ) { + minv = minv > opt.value() ? opt.value() : minv; + maxv = maxv < opt.value() ? opt.value() : maxv; val_total += opt.value(); val_count++; } val_count = val_count > 0 ? val_count : 1; difficulty_opt::avg_value_ = std::round( val_total / static_cast( val_count ) ); + difficulty_opt::min_value_ = minv; + difficulty_opt::max_value_ = maxv; } int difficulty_opt::avg_value() @@ -68,6 +76,16 @@ int difficulty_opt::avg_value() return difficulty_opt::avg_value_; } +int difficulty_opt::min_value() +{ + return difficulty_opt::min_value_; +} + +int difficulty_opt::max_value() +{ + return difficulty_opt::max_value_; +} + int difficulty_opt::value( const difficulty_opt_id &id ) { for( const difficulty_opt &opt : get_all() ) { @@ -136,6 +154,16 @@ void difficulty_impact::load( const JsonObject &jo, const std::string & ) weight_.emplace( HOBBY, readr ); mandatory( jobj, was_loaded, "mutation", readr ); weight_.emplace( MUTATION, readr ); + mandatory( jobj, was_loaded, "skills", readr ); + weight_.emplace( SKILL, readr ); + mandatory( jobj, was_loaded, "strength", readr ); + weight_.emplace( STAT_STR, readr ); + mandatory( jobj, was_loaded, "dexterity", readr ); + weight_.emplace( STAT_DEX, readr ); + mandatory( jobj, was_loaded, "intelligence", readr ); + weight_.emplace( STAT_INT, readr ); + mandatory( jobj, was_loaded, "perception", readr ); + weight_.emplace( STAT_PER, readr ); } } diff --git a/src/difficulty_impact.h b/src/difficulty_impact.h index ca3888ab9b252..5db640cd0b6c6 100644 --- a/src/difficulty_impact.h +++ b/src/difficulty_impact.h @@ -23,6 +23,8 @@ struct difficulty_opt { static int value( const difficulty_opt_id &id ); static difficulty_opt_id getId( int value ); static int avg_value(); + static int min_value(); + static int max_value(); const difficulty_opt_id &getId() const { return id; @@ -43,6 +45,8 @@ struct difficulty_opt { std::string color_; int value_ = 0; static int avg_value_; + static int min_value_; + static int max_value_; friend class generic_factory; }; @@ -56,7 +60,12 @@ struct difficulty_impact { SCENARIO, PROFFESION, HOBBY, - MUTATION + MUTATION, + SKILL, + STAT_STR, + STAT_DEX, + STAT_INT, + STAT_PER }; void load( const JsonObject &jo, const std::string &src ); diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index e1139ac77f4fc..f4c45d1ff08c9 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -383,13 +383,50 @@ static std::pair get_diff_val_for( const std::unordered_set( min_val - avg_val ), + static_cast( max_val - avg_val ) ); +} + +static std::string difficulty_to_string( const avatar &u, + difficulty_impact::difficulty_source cur_stat ) +{ + std::string diff_str = _( "Difficulty" ) + std::string( " |" ); + + for( const difficulty_impact &diff_imp : difficulty_impact::get_all() ) { + const bool stat_effect = diff_imp.weight( cur_stat ) > std::numeric_limits::epsilon(); + float diff = get_diff_val_for_stats( u, diff_imp ) + difficulty_opt::avg_value(); + difficulty_opt_id diff_id = difficulty_opt::getId( std::round( diff ) ); + std::string imp_str = string_format( "%c%s%s", + stat_effect ? '[' : ' ', diff_imp.name(), stat_effect ? "]" : "" ); + diff_str += string_format( " %s: %s", imp_str, diff_id->color(), + diff_id->name() ); + } + + return diff_str; +} + static std::string difficulty_to_string( const std::map &diff_map ) { std::string diff_str = _( "Difficulty" ) + std::string( " |" ); for( const auto &diff_pair : diff_map ) { - std::string rating = ""; + std::string rating; std::string colr = "light_gray"; if( !diff_pair.first.is_valid() ) { continue; @@ -397,8 +434,7 @@ static std::string difficulty_to_string( const std::mapname().translated(); colr = diff_pair.second->color(); } - diff_str += string_format( " %s: %s", diff_pair.first->name().translated(), colr, - rating ); + diff_str += string_format( " %s: %s", diff_pair.first->name(), colr, rating ); } return diff_str; @@ -420,23 +456,31 @@ static std::string difficulty_to_string( const avatar &u ) std::pair prof_diff = get_diff_val_for( prof, diff_imp ); std::pair hobb_diff = get_diff_val_for( u.hobbies, diff_imp ); std::pair mut_diff = get_diff_val_for( u.my_traits, diff_imp ); - - const float weight_total = - diff_imp.weight( difficulty_impact::SCENARIO ) * ( scen_diff.second > 0 ? 1.f : 0.f ) + - diff_imp.weight( difficulty_impact::PROFFESION ) * ( prof_diff.second > 0 ? 1.f : 0.f ) + - diff_imp.weight( difficulty_impact::HOBBY ) * ( hobb_diff.second > 0 ? 1.f : 0.f ) + - diff_imp.weight( difficulty_impact::MUTATION ) * ( mut_diff.second > 0 ? 1.f : 0.f ); + float stat_diff = get_diff_val_for_stats( u, diff_imp ); + + const float weight_stats_total = + diff_imp.weight( difficulty_impact::STAT_STR ) + + diff_imp.weight( difficulty_impact::STAT_DEX ) + + diff_imp.weight( difficulty_impact::STAT_INT ) + + diff_imp.weight( difficulty_impact::STAT_PER ); + const float weight_total = weight_stats_total + + diff_imp.weight( difficulty_impact::SCENARIO ) * ( scen_diff.second > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::PROFFESION ) * ( prof_diff.second > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::HOBBY ) * ( hobb_diff.second > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::MUTATION ) * ( mut_diff.second > 0 ? 1.f : 0.f ); const float weight_scen = diff_imp.weight( difficulty_impact::SCENARIO ) / weight_total; const float weight_prof = diff_imp.weight( difficulty_impact::PROFFESION ) / weight_total; const float weight_hobb = diff_imp.weight( difficulty_impact::HOBBY ) / weight_total; const float weight_mut = diff_imp.weight( difficulty_impact::MUTATION ) / weight_total; + const float weight_stats = weight_stats_total / weight_total; float diff = scen_diff.first * weight_scen + prof_diff.first * weight_prof + - hobb_diff.first * weight_hobb + mut_diff.first * weight_mut; + hobb_diff.first * weight_hobb + mut_diff.first * weight_mut + + stat_diff * weight_stats; int diff_val = std::round( diff + avg_val ); difficulty_opt_id diff_id = difficulty_opt::getId( diff_val > 0 ? diff_val : avg_val ); - diff_str += string_format( " %s: %s", diff_imp.name().translated(), - diff_id->color(), diff_id->name() ); + diff_str += string_format( " %s: %s", diff_imp.name(), diff_id->color(), + diff_id->name() ); } return diff_str; @@ -1037,9 +1081,16 @@ static void draw_difficulty( const catacurses::window &w, const avatar &u ) print_colored_text( w, point( 2, 4 ), color, color, difficulty_to_string( u ) ); } +static void draw_difficulty( const catacurses::window &w, const avatar &u, + difficulty_impact::difficulty_source stat ) +{ + nc_color color = c_light_gray; + mvwprintz( w, point( 2, 4 ), c_black, std::string( getmaxx( w ) - 3, ' ' ) ); + print_colored_text( w, point( 2, 4 ), color, color, difficulty_to_string( u, stat ) ); +} + static void draw_difficulty( const catacurses::window &w, - const std::map &diff_map = - std::map() ) + const std::map &diff_map ) { nc_color color = c_light_gray; mvwprintz( w, point( 2, 4 ), c_black, std::string( getmaxx( w ) - 3, ' ' ) ); @@ -1242,8 +1293,10 @@ tab_direction set_stats( avatar &u, pool_type pool ) mvwprintz( w, point( 16, 9 ), c_light_gray, "%2d", u.per_max ); werase( w_description ); + difficulty_impact::difficulty_source diff_src = difficulty_impact::NONE; switch( sel ) { case 1: + diff_src = difficulty_impact::STAT_STR; mvwprintz( w, point( 2, 6 ), COL_SELECT, _( "Strength:" ) ); mvwprintz( w, point( 16, 6 ), c_light_gray, "%2d", u.str_max ); if( u.str_max >= HIGH_STAT ) { @@ -1263,6 +1316,7 @@ tab_direction set_stats( avatar &u, pool_type pool ) break; case 2: + diff_src = difficulty_impact::STAT_DEX; mvwprintz( w, point( 2, 7 ), COL_SELECT, _( "Dexterity:" ) ); mvwprintz( w, point( 16, 7 ), c_light_gray, "%2d", u.dex_max ); if( u.dex_max >= HIGH_STAT ) { @@ -1284,6 +1338,7 @@ tab_direction set_stats( avatar &u, pool_type pool ) break; case 3: { + diff_src = difficulty_impact::STAT_INT; mvwprintz( w, point( 2, 8 ), COL_SELECT, _( "Intelligence:" ) ); mvwprintz( w, point( 16, 8 ), c_light_gray, "%2d", u.int_max ); if( u.int_max >= HIGH_STAT ) { @@ -1303,6 +1358,7 @@ tab_direction set_stats( avatar &u, pool_type pool ) break; case 4: + diff_src = difficulty_impact::STAT_PER; mvwprintz( w, point( 2, 9 ), COL_SELECT, _( "Perception:" ) ); mvwprintz( w, point( 16, 9 ), c_light_gray, "%2d", u.per_max ); if( u.per_max >= HIGH_STAT ) { @@ -1317,6 +1373,7 @@ tab_direction set_stats( avatar &u, pool_type pool ) _( "Perception is also used for detecting traps and other things of interest." ) ); break; } + draw_difficulty( w, u, diff_src ); wnoutrefresh( w ); wnoutrefresh( w_description ); diff --git a/src/skill.cpp b/src/skill.cpp index 8d71aec1198ea..a01a2c15e6009 100644 --- a/src/skill.cpp +++ b/src/skill.cpp @@ -147,6 +147,14 @@ void Skill::load_skill( const JsonObject &jsobj ) sk._companion_industry_rank_factor = jsobj.get_int( "companion_industry_rank_factor", 0 ); sk._companion_skill_practice = companion_skill_practice; sk._obsolete = jsobj.get_bool( "obsolete", false ); + if( jsobj.has_member( "difficulty_scale" ) ) { + for( JsonValue jval : jsobj.get_array( "difficulty_scale" ) ) { + JsonArray diff = jval.get_array(); + if( !diff.empty() ) { + sk._difficulty_scale.emplace( diff.get_string( 0 ), diff.get_float( 1 ) ); + } + } + } if( sk.is_contextual_skill() ) { contextual_skills[sk.ident()] = sk; diff --git a/src/skill.h b/src/skill.h index 6a7dc934f161f..ce16a7b12b517 100644 --- a/src/skill.h +++ b/src/skill.h @@ -11,6 +11,7 @@ #include #include "calendar.h" +#include "difficulty_impact.h" #include "game_constants.h" #include "translations.h" #include "type_id.h" @@ -39,6 +40,7 @@ class Skill std::set _tags; time_info_t _time_to_attack; skill_displayType_id _display_type; + std::unordered_map _difficulty_scale; std::unordered_map _companion_skill_practice; // these are not real skills, they depend on context static std::map contextual_skills; @@ -72,6 +74,10 @@ class Skill std::string description() const { return _description.translated(); } + float get_difficulty_scale( const difficulty_impact_id &impact ) const { + return _difficulty_scale.find( impact ) == _difficulty_scale.end() ? 0.0f : + _difficulty_scale.at( impact ); + } int get_companion_skill_practice( const std::string &companion_skill ) const { return _companion_skill_practice.find( companion_skill ) == _companion_skill_practice.end() ? 0 : _companion_skill_practice.at( companion_skill ); From 1be98225ea63c591fa13b406f2ffe8977ee525e2 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Fri, 19 Nov 2021 22:02:48 -0500 Subject: [PATCH 12/20] Difficulty info: derive difficulty from skills --- src/newcharacter.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index f4c45d1ff08c9..221fe756cfb43 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -402,6 +402,61 @@ static float get_diff_val_for_stats( const avatar &u, const difficulty_impact &i static_cast( max_val - avg_val ) ); } +static float get_diff_val_for( const skill_id &sk, int lvl, const difficulty_impact &impact ) +{ + const int avg_val = difficulty_opt::avg_value(); + const int min_val = difficulty_opt::min_value(); + const int max_val = difficulty_opt::max_value(); + float diff = 0; + + if( sk.is_valid() ) { + float mod = sk->get_difficulty_scale( impact.getId() ); + diff = lvl * mod; + // normalize to difficulty range + diff *= ( min_val - avg_val ) / 5.0f; + } + + return clamp( diff, static_cast( min_val - avg_val ), + static_cast( max_val - avg_val ) ); +} + +static std::pair get_diff_val_for( const SkillLevelMap &skills, + const difficulty_impact &impact ) +{ + float diff = 0; + int count = 0; + + for( const auto &sk : skills ) { + if( sk.second.level() > 0 ) { + diff += get_diff_val_for( sk.first, sk.second.level(), impact ); + count++; + } + } + diff = count > 0 ? ( diff / count ) : 0.0f; + + return { diff, count }; +} + +static std::string difficulty_to_string( const avatar &u, const skill_id &skill ) +{ + std::string diff_str = _( "Difficulty" ) + std::string( " |" ); + + for( const difficulty_impact &diff_imp : difficulty_impact::get_all() ) { + const bool sk_effect = skill->get_difficulty_scale( diff_imp.getId() ) > + std::numeric_limits::epsilon(); + if( !sk_effect ) { + continue; + } + float diff = get_diff_val_for( skill, u.get_skill_level( skill ), + diff_imp ) + difficulty_opt::avg_value(); + difficulty_opt_id diff_id = difficulty_opt::getId( std::round( diff ) ); + diff_str += string_format( " %s: %s", diff_imp.name(), diff_id->color(), + diff_id->name() ); + } + + return diff_str; +} + static std::string difficulty_to_string( const avatar &u, difficulty_impact::difficulty_source cur_stat ) { @@ -456,6 +511,7 @@ static std::string difficulty_to_string( const avatar &u ) std::pair prof_diff = get_diff_val_for( prof, diff_imp ); std::pair hobb_diff = get_diff_val_for( u.hobbies, diff_imp ); std::pair mut_diff = get_diff_val_for( u.my_traits, diff_imp ); + std::pair skl_diff = get_diff_val_for( u.get_all_skills(), diff_imp ); float stat_diff = get_diff_val_for_stats( u, diff_imp ); const float weight_stats_total = @@ -467,16 +523,18 @@ static std::string difficulty_to_string( const avatar &u ) diff_imp.weight( difficulty_impact::SCENARIO ) * ( scen_diff.second > 0 ? 1.f : 0.f ) + diff_imp.weight( difficulty_impact::PROFFESION ) * ( prof_diff.second > 0 ? 1.f : 0.f ) + diff_imp.weight( difficulty_impact::HOBBY ) * ( hobb_diff.second > 0 ? 1.f : 0.f ) + - diff_imp.weight( difficulty_impact::MUTATION ) * ( mut_diff.second > 0 ? 1.f : 0.f ); + diff_imp.weight( difficulty_impact::MUTATION ) * ( mut_diff.second > 0 ? 1.f : 0.f ) + + diff_imp.weight( difficulty_impact::SKILL ) * ( skl_diff.second > 0 ? 1.f : 0.f ); const float weight_scen = diff_imp.weight( difficulty_impact::SCENARIO ) / weight_total; const float weight_prof = diff_imp.weight( difficulty_impact::PROFFESION ) / weight_total; const float weight_hobb = diff_imp.weight( difficulty_impact::HOBBY ) / weight_total; const float weight_mut = diff_imp.weight( difficulty_impact::MUTATION ) / weight_total; + const float weight_skl = diff_imp.weight( difficulty_impact::SKILL ) / weight_total; const float weight_stats = weight_stats_total / weight_total; float diff = scen_diff.first * weight_scen + prof_diff.first * weight_prof + hobb_diff.first * weight_hobb + mut_diff.first * weight_mut + - stat_diff * weight_stats; + skl_diff.first * weight_skl + stat_diff * weight_stats; int diff_val = std::round( diff + avg_val ); difficulty_opt_id diff_id = difficulty_opt::getId( diff_val > 0 ? diff_val : avg_val ); diff_str += string_format( " %s: %s", diff_imp.name(), diff_id->color(), @@ -1081,6 +1139,13 @@ static void draw_difficulty( const catacurses::window &w, const avatar &u ) print_colored_text( w, point( 2, 4 ), color, color, difficulty_to_string( u ) ); } +static void draw_difficulty( const catacurses::window &w, const avatar &u, const skill_id &skill ) +{ + nc_color color = c_light_gray; + mvwprintz( w, point( 2, 4 ), c_black, std::string( getmaxx( w ) - 3, ' ' ) ); + print_colored_text( w, point( 2, 4 ), color, color, difficulty_to_string( u, skill ) ); +} + static void draw_difficulty( const catacurses::window &w, const avatar &u, difficulty_impact::difficulty_source stat ) { @@ -2786,6 +2851,7 @@ tab_direction set_skills( avatar &u, pool_type pool ) ctxt.get_desc( "NEXT_TAB" ), ctxt.get_desc( "PREV_TAB" ) ); draw_points( w, pool, u ); + draw_difficulty( w, u, currentSkill->ident() ); // Clear the bottom of the screen. werase( w_description ); mvwprintz( w, point( remaining_points_length + 9, 3 ), c_light_gray, From 2d5835c0a4a55fd80b5760bb98e18709aa286b12 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Fri, 19 Nov 2021 22:31:15 -0500 Subject: [PATCH 13/20] Difficulty info: add difficulty to hobbies --- data/json/hobbies.json | 673 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 599 insertions(+), 74 deletions(-) diff --git a/data/json/hobbies.json b/data/json/hobbies.json index 8555481144ccb..27f04ee4008ee 100644 --- a/data/json/hobbies.json +++ b/data/json/hobbies.json @@ -6,7 +6,14 @@ "name": "Heroin Dependence", "description": "The last thing you remember was meeting God behind the local Foodplace. Then people started eating each other. This doesn't feel like a fever dream.", "points": -3, - "addictions": [ { "intensity": 40, "type": "opiate" } ] + "addictions": [ { "intensity": 40, "type": "opiate" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -15,7 +22,14 @@ "name": "Nicotine Dependence", "description": "Your coworkers always muttered when you had to duck outside every hour for a smoke, but it ended up saving your life when things got bad. You'll need to find a steady supply of nicotine if you want to keep the cravings at bay.", "points": -1, - "addictions": [ { "intensity": 10, "type": "nicotine" } ] + "addictions": [ { "intensity": 10, "type": "nicotine" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -25,7 +39,14 @@ "description": "Cocaine. It is, indeed, a helluva drug. You blew your money on some rocks, and before you knew it you were turning tricks behind the local pharmacy just to score a little more. Where are you going to get your next fix now?", "points": -2, "traits": [ "STIMBOOST" ], - "addictions": [ { "intensity": 20, "type": "crack" } ] + "addictions": [ { "intensity": 20, "type": "crack" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -35,7 +56,14 @@ "description": "You're not entirely sure what happened last night, but you woke up on the floor and everything has completely gone to shit. The only thing running through your head, though, is where you're gonna find your next hit.", "points": -2, "traits": [ "STIMBOOST" ], - "addictions": [ { "intensity": 30, "type": "amphetamine" } ] + "addictions": [ { "intensity": 30, "type": "amphetamine" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -44,7 +72,14 @@ "name": "Painkiller Dependence", "description": "After a bad accident, you became hooked on the opiates prescribed to you for the pain. With the pharmacies shut down and your dealers turned undead, satisfying those cravings just got a lot more difficult.", "points": -2, - "addictions": [ { "intensity": 20, "type": "opiate" } ] + "addictions": [ { "intensity": 20, "type": "opiate" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -54,7 +89,14 @@ "description": "One drink became two, two became too many, and before long you were only able to find solace at the bottom of a bottle. God-damn, you need a drink.", "points": -2, "traits": [ "DISORGANIZED" ], - "addictions": [ { "intensity": 20, "type": "alcohol" } ] + "addictions": [ { "intensity": 20, "type": "alcohol" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -64,7 +106,14 @@ "description": "You'd been having trouble falling asleep, so you started taking prescription sleep meds. Now you can hardly seem to fall asleep at all without them, and you'll need plenty of rest to face the days ahead.", "points": -3, "traits": [ "INSOMNIA" ], - "addictions": [ { "intensity": 20, "type": "sleeping pill" } ] + "addictions": [ { "intensity": 20, "type": "sleeping pill" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -74,7 +123,14 @@ "description": "Coffee was your faithful companion every morning, and without it you feel like a zombie. Thanks to all the actual zombies shambling about, getting your caffiene fix will be much harder now.", "points": -1, "traits": [ "STIMBOOST" ], - "addictions": [ { "intensity": 10, "type": "caffeine" } ] + "addictions": [ { "intensity": 10, "type": "caffeine" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -84,7 +140,14 @@ "description": "You liked to make your own costumes and wear them to various conventions. Now that everyone is dead or dying, maybe this will be useful for something else.", "points": 1, "skills": [ { "level": 1, "name": "tailor" } ], - "proficiencies": [ "prof_closures", "prof_leatherworking_basic" ] + "proficiencies": [ "prof_closures", "prof_leatherworking_basic" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -94,7 +157,14 @@ "description": "Whether it was for fun, innocent utilty, or criminal intent, you learned the basics of how to silently pick locks. Now, being able to get into secured places just got a lot more useful.", "points": 1, "proficiencies": [ "prof_lockpicking" ], - "skills": [ { "level": 1, "name": "traps" } ] + "skills": [ { "level": 1, "name": "traps" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -104,7 +174,14 @@ "description": "You've practiced parkour for many years, and made the world your playground. It wouldn't be a lie to say that running is your life. Which is good, because now that the end has come, you're running for your life.", "points": 2, "proficiencies": [ "prof_parkour" ], - "skills": [ { "level": 1, "name": "swimming" } ] + "skills": [ { "level": 1, "name": "swimming" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -114,7 +191,14 @@ "description": "You enjoyed camping in the vast wilderness as a means of escaping the pace of modern life. The wilderness isn't filled with people, so it must be safe. Right? It must be.", "points": 2, "skills": [ { "level": 2, "name": "survival" }, { "level": 1, "name": "firstaid" }, { "level": 1, "name": "cooking" } ], - "traits": [ "OUTDOORSMAN" ] + "traits": [ "OUTDOORSMAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -125,7 +209,14 @@ "points": 4, "skills": [ { "level": 3, "name": "survival" }, { "level": 1, "name": "fabrication" }, { "level": 1, "name": "cooking" } ], "proficiencies": [ "prof_fibers", "prof_leatherworking_basic", "prof_fibers_rope", "prof_traps", "prof_knapping", "prof_carving" ], - "traits": [ "OUTDOORSMAN" ] + "traits": [ "OUTDOORSMAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -135,7 +226,14 @@ "description": "You're probably one of the last people alive who knows how to safely operate a flying vehicle. It remains to be seen whether you'll live long enough to make use of that skill.", "points": 2, "skills": [ { "level": 2, "name": "driving" }, { "level": 2, "name": "mechanics" } ], - "proficiencies": [ "prof_helicopter_pilot" ] + "proficiencies": [ "prof_helicopter_pilot" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -144,7 +242,14 @@ "name": "Reading", "description": "You love reading, but you never seemed to have enough time. Maybe the Cataclysm is a blessing in disguise.", "points": 1, - "traits": [ "LOVES_BOOKS" ] + "traits": [ "LOVES_BOOKS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -154,7 +259,14 @@ "description": "Perhaps you produced illicit chemicals for your own consumption, or to sell to others. Or maybe you're just a real nerd about chemistry. In any case, you know your way around a Periodic Table.", "points": 3, "proficiencies": [ "prof_intro_chemistry", "prof_intro_chem_synth" ], - "skills": [ { "level": 3, "name": "chemistry" }, { "level": 1, "name": "cooking" } ] + "skills": [ { "level": 3, "name": "chemistry" }, { "level": 1, "name": "cooking" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -164,7 +276,14 @@ "description": "You enjoy nocking back an arrow and hearing it whistle through the air. If you can get the proper gear together and stay on-target, you'll have a good, quiet alternative to using guns.", "points": 3, "skills": [ { "level": 3, "name": "archery" }, { "level": 2, "name": "gun" } ], - "proficiencies": [ "prof_bow_basic" ] + "proficiencies": [ "prof_bow_basic" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -174,7 +293,14 @@ "description": "You're a strong swimmer, and you're pretty sure zombies aren't. You can't swim forever, but it's certainly an advantage over the undead.", "points": 2, "skills": [ { "level": 4, "name": "swimming" } ], - "traits": [ "OUTDOORSMAN" ] + "traits": [ "OUTDOORSMAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -183,7 +309,14 @@ "name": "Baseball", "description": "You got the stance, you got the grip, you got the game. Swinging at a zombie's head is close enough to swinging at a baseball… right?", "points": 3, - "skills": [ { "level": 3, "name": "bashing" }, { "level": 2, "name": "throw" }, { "level": 1, "name": "swimming" } ] + "skills": [ { "level": 3, "name": "bashing" }, { "level": 2, "name": "throw" }, { "level": 1, "name": "swimming" } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -193,7 +326,14 @@ "description": "You loved immersing yourself in virtual worlds through video games. Now you're faced with real survival horror, and no extra lives.", "points": 1, "skills": [ { "level": 1, "name": "computer" } ], - "traits": [ "WAKEFUL" ] + "traits": [ "WAKEFUL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -203,7 +343,14 @@ "description": "You liked to trap little wild animals such as mice and other rodents. This skill could be useful for working with more deadly devices, if you're creative enough.", "points": 2, "proficiencies": [ "prof_traps", "prof_disarming" ], - "skills": [ { "level": 3, "name": "traps" } ] + "skills": [ { "level": 3, "name": "traps" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -212,7 +359,14 @@ "name": "Dodgeball", "description": "Dodging fast-moving balls as though your life depended on it was fun. Dodging zombies isn't as fun, but your life certainly depends on it.", "points": 3, - "skills": [ { "level": 3, "name": "dodge" }, { "level": 2, "name": "throw" }, { "level": 1, "name": "swimming" } ] + "skills": [ { "level": 3, "name": "dodge" }, { "level": 2, "name": "throw" }, { "level": 1, "name": "swimming" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -222,7 +376,14 @@ "description": "You found unexpected solace while soldering components to circuit boards.", "points": 3, "proficiencies": [ "prof_elec_soldering" ], - "skills": [ { "level": 3, "name": "electronics" }, { "level": 2, "name": "computer" } ] + "skills": [ { "level": 3, "name": "electronics" }, { "level": 2, "name": "computer" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -239,7 +400,14 @@ "prof_leatherworking_basic", "prof_plasticworking" ], - "skills": [ { "level": 3, "name": "fabrication" }, { "level": 1, "name": "tailor" } ] + "skills": [ { "level": 3, "name": "fabrication" }, { "level": 1, "name": "tailor" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -249,7 +417,14 @@ "description": "You enjoyed cooking for yourself and others. The grocery stores are closed for good, so you might need to start getting creative with your recipes.", "points": 2, "proficiencies": [ "prof_baking", "prof_baking_bread", "prof_baking_desserts_1", "prof_food_prep", "prof_knife_skills" ], - "skills": [ { "level": 3, "name": "cooking" } ] + "skills": [ { "level": 3, "name": "cooking" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -258,7 +433,14 @@ "name": "Paintball", "description": "Pretending to shoot at your friends has always been fun. Now you can do it for real.", "points": 2, - "skills": [ { "level": 3, "name": "rifle" }, { "level": 1, "name": "gun" } ] + "skills": [ { "level": 3, "name": "rifle" }, { "level": 1, "name": "gun" } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -267,7 +449,14 @@ "name": "Plinking", "description": "You enjoyed target plinking with your airsoft pistol. You're a good shot, but you'll need a real gun for it to matter.", "points": 2, - "skills": [ { "level": 3, "name": "pistol" }, { "level": 1, "name": "gun" } ] + "skills": [ { "level": 3, "name": "pistol" }, { "level": 1, "name": "gun" } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -276,7 +465,14 @@ "name": "Skeet Shooting", "description": "Where the skeet go, your shot follows. Throw enough pellets downrange, and you'll at least hit something.", "points": 2, - "skills": [ { "level": 3, "name": "shotgun" }, { "level": 1, "name": "gun" } ] + "skills": [ { "level": 3, "name": "shotgun" }, { "level": 1, "name": "gun" } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -286,7 +482,14 @@ "description": "You are an incredibly social individual, with the projection and vocabulary to make people listen.", "points": 1, "skills": [ { "level": 3, "name": "speech" } ], - "traits": [ "BOOMING_VOICE" ] + "traits": [ "BOOMING_VOICE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "profession", @@ -295,7 +498,14 @@ "name": "Street Fighting", "description": "You were constantly instigating fights in the street. You can throw and dodge a punch better than most.", "points": 2, - "skills": [ { "level": 1, "name": "melee" }, { "level": 3, "name": "unarmed" }, { "level": 2, "name": "dodge" } ] + "skills": [ { "level": 1, "name": "melee" }, { "level": 3, "name": "unarmed" }, { "level": 2, "name": "dodge" } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -304,7 +514,14 @@ "name": "Knife Throwing", "description": "You learned how to throw knives before the world ended, a skill that can be deadly in the right situation.", "points": 2, - "skills": [ { "level": 3, "name": "throw" } ] + "skills": [ { "level": 3, "name": "throw" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -314,7 +531,14 @@ "description": "You used to sew torn clothes back together, and have even made your own clothes a few times.", "points": 3, "proficiencies": [ "prof_closures", "prof_elastics", "prof_knitting" ], - "skills": [ { "level": 3, "name": "tailor" }, { "level": 1, "name": "fabrication" } ] + "skills": [ { "level": 3, "name": "tailor" }, { "level": 1, "name": "fabrication" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -324,7 +548,14 @@ "description": "You were in a fencing club, and you weren't too shabby with a saber. If you can get your hands on a real sword, you'll be a formidable fighter.", "points": 5, "skills": [ { "level": 3, "name": "stabbing" }, { "level": 1, "name": "melee" } ], - "traits": [ "MARTIAL_FENCING" ] + "traits": [ "MARTIAL_FENCING" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -333,7 +564,14 @@ "name": "Motorsports", "description": "You're a big fan of cars and other things that go vroom, whether it's fixing them or driving them. You may not be a professional, but you know your way around an engine.", "points": 1, - "skills": [ { "level": 3, "name": "driving" }, { "level": 1, "name": "mechanics" } ] + "skills": [ { "level": 3, "name": "driving" }, { "level": 1, "name": "mechanics" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -343,7 +581,14 @@ "description": "You have received some martial arts training at a local dojo. You start with your choice of Karate, Judo, Aikido, Tai Chi, Taekwondo, or Pankration.", "points": 4, "skills": [ { "level": 2, "name": "melee" }, { "level": 3, "name": "unarmed" } ], - "traits": [ "MARTIAL_ARTS" ] + "traits": [ "MARTIAL_ARTS" ], + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -353,7 +598,14 @@ "description": "You have taken some self-defense classes at a nearby gym. You start with your choice of Boxing, Capoeira, Krav Maga, Muay Thai, Ninjutsu, Wing Chun, or Zui Quan.", "points": 4, "skills": [ { "level": 2, "name": "melee" }, { "level": 3, "name": "unarmed" } ], - "traits": [ "MARTIAL_ARTS2" ] + "traits": [ "MARTIAL_ARTS2" ], + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -363,7 +615,14 @@ "description": "You have studied the arts of the Shaolin monks. You start with one of the five animal fighting styles: Tiger, Crane, Leopard, Snake, or Dragon.", "points": 5, "skills": [ { "level": 2, "name": "melee" }, { "level": 3, "name": "unarmed" }, { "level": 3, "name": "dodge" } ], - "traits": [ "MARTIAL_ARTS3" ] + "traits": [ "MARTIAL_ARTS3" ], + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -378,7 +637,14 @@ { "level": 3, "name": "stabbing" }, { "level": 3, "name": "cutting" } ], - "traits": [ "MARTIAL_ARTS5" ] + "traits": [ "MARTIAL_ARTS5" ], + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -388,7 +654,14 @@ "description": "Everyone eats to live, but you live to eat. Tasty food will raise your morale more, and you aren't as upset by gross food. You also eat faster, and can overeat with less chance of getting sick.", "points": 3, "traits": [ "GOURMAND" ], - "skills": [ { "level": 2, "name": "cooking" } ] + "skills": [ { "level": 2, "name": "cooking" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -398,7 +671,14 @@ "description": "You ran the Boston Marathon every year. That conditioning should make you better equipped than most in avoiding the dead.", "points": 5, "traits": [ "GOODCARDIO", "FLEET" ], - "skills": [ { "level": 2, "name": "swimming" } ] + "skills": [ { "level": 2, "name": "swimming" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -407,7 +687,14 @@ "name": "Book Hating", "description": "Reading is for nerds! You've managed to make hatred of the written word a central part of your identity. Or, perhaps, you have a barrier that makes books additionally challenging and frustrating for you. Whatever the reason, boring books are more boring, and you can't have fun by reading books.", "points": -1, - "traits": [ "HATES_BOOKS" ] + "traits": [ "HATES_BOOKS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -417,7 +704,14 @@ "description": "You absolutely love meat, and dislike eating fruits and vegetables. Your particular tastes have turned you into a decent amateur butcher.", "points": -3, "traits": [ "ANTIFRUIT", "MEATARIAN" ], - "skills": [ { "level": 2, "name": "survival" }, { "level": 2, "name": "cooking" } ] + "skills": [ { "level": 2, "name": "survival" }, { "level": 2, "name": "cooking" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -427,7 +721,14 @@ "description": "You have been a vegetarian for so long that eating meat makes you feel sick. You like to supplement your diet with wild plants and mushrooms foraged in the woods.", "points": -1, "traits": [ "VEGETARIAN" ], - "skills": [ { "level": 2, "name": "cooking" }, { "level": 2, "name": "survival" } ] + "skills": [ { "level": 2, "name": "cooking" }, { "level": 2, "name": "survival" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -437,7 +738,14 @@ "description": "You are skilled in maneuvering on skates. You suffer lower penalties to dodging and are less likely to fall down if hit in melee combat while you're wearing rollerskates or rollerblades.", "points": 2, "skills": [ { "level": 2, "name": "dodge" } ], - "traits": [ "PROF_SKATER" ] + "traits": [ "PROF_SKATER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -446,7 +754,14 @@ "name": "Arts and Crafts", "description": "You loved doing crafts at home. Now, you might want to channel those skills into making more practical things.", "points": 1, - "skills": [ { "level": 1, "name": "fabrication" }, { "level": 2, "name": "tailor" } ] + "skills": [ { "level": 1, "name": "fabrication" }, { "level": 2, "name": "tailor" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -455,7 +770,14 @@ "name": "Car Restoration", "description": "Spending time every weekend in your garage working on an old classic car was your favorite pasttime. You never finished the car, but at least you learned a little over the years.", "points": 2, - "skills": [ { "level": 3, "name": "mechanics" }, { "level": 1, "name": "driving" } ] + "skills": [ { "level": 3, "name": "mechanics" }, { "level": 1, "name": "driving" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -465,7 +787,14 @@ "description": "Pranks and physical jokes are a passion of yours, from the setup right through to playing innocent at the end.", "points": 1, "skills": [ { "level": 1, "name": "traps" }, { "level": 1, "name": "speech" } ], - "traits": [ "LIAR" ] + "traits": [ "LIAR" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "profession", @@ -475,7 +804,14 @@ "description": "You were deep into the fashion scene, keeping up on the latest trends and even modelling clothes yourself. Having style and good looks is just as, if not more, important to you than practicality.", "points": 2, "skills": [ { "level": 2, "name": "speech" }, { "level": 1, "name": "tailor" } ], - "traits": [ "STYLISH" ] + "traits": [ "STYLISH" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "profession", @@ -485,7 +821,14 @@ "description": "You're a master of throwing on the potter's wheel, able to shape clay into whatever shape you need.", "points": 2, "skills": [ { "level": 2, "name": "fabrication" }, { "level": 1, "name": "survival" } ], - "proficiencies": [ "prof_pottery", "prof_pottery_glazing" ] + "proficiencies": [ "prof_pottery", "prof_pottery_glazing" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "subtype": "hobby", @@ -495,7 +838,14 @@ "description": "You figured you could save money on ammo by learning to make your own. Now that the factories are shut down, your abilities just went from handy to lifesaving.", "points": 3, "proficiencies": [ "prof_handloading" ], - "skills": [ { "level": 3, "name": "fabrication" }, { "level": 2, "name": "gun" } ] + "skills": [ { "level": 3, "name": "fabrication" }, { "level": 2, "name": "gun" } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "subtype": "hobby", @@ -505,7 +855,14 @@ "description": "As the Game Master, you've guided players' journeys through dungeons and fortresses. Now, you're the last member of your party.", "points": 2, "traits": [ "PROF_DICEMASTER" ], - "skills": [ { "level": 2, "name": "speech" } ] + "skills": [ { "level": 2, "name": "speech" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "profession", @@ -515,7 +872,14 @@ "description": "You whiled your nights away using, building and repairing old ham radios. Now you have no one to talk to. But you won't give up hope, and maybe your electronics knowledge can help you somehow.", "points": 2, "skills": [ { "level": 3, "name": "electronics" } ], - "proficiencies": [ "prof_elec_soldering", "prof_elec_circuits" ] + "proficiencies": [ "prof_elec_soldering", "prof_elec_circuits" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -524,7 +888,14 @@ "name": "Golf", "points": 2, "description": "The backswing's a breeze, and your drive could get skulls into the green if you tried.", - "skills": [ { "level": 2, "name": "bashing" }, { "level": 1, "name": "melee" }, { "level": 1, "name": "driving" } ] + "skills": [ { "level": 2, "name": "bashing" }, { "level": 1, "name": "melee" }, { "level": 1, "name": "driving" } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -533,7 +904,14 @@ "name": "Basketball", "description": "Your ability to play point or post will beat the undead in overtime.", "points": 2, - "skills": [ { "level": 2, "name": "throw" }, { "level": 2, "name": "dodge" }, { "level": 1, "name": "swimming" } ] + "skills": [ { "level": 2, "name": "throw" }, { "level": 2, "name": "dodge" }, { "level": 1, "name": "swimming" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -542,7 +920,14 @@ "name": "Target Shooting", "description": "You liked going to the local gun range and shooting at some targets or blasting cans off of fence posts. Maybe if you just imagine targets on those undead, this could help.", "points": 2, - "skills": [ { "level": 3, "name": "gun" } ] + "skills": [ { "level": 3, "name": "gun" } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -552,7 +937,14 @@ "description": "You've got training and some experience in dealing with urgent injuries. In the absence of any medical professionals, that'll have to do.", "points": 1, "skills": [ { "level": 2, "name": "firstaid" } ], - "proficiencies": [ "prof_wound_care" ] + "proficiencies": [ "prof_wound_care" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -561,7 +953,14 @@ "name": "Trap Shooting", "description": "Nothing like the smell of gunsmoke and blowing ceramic orange discs out of the sky. Time to shoot at things a little fleshier than clay pigeons.", "points": 2, - "skills": [ { "level": 2, "name": "gun" }, { "level": 2, "name": "shotgun" } ] + "skills": [ { "level": 2, "name": "gun" }, { "level": 2, "name": "shotgun" } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -571,7 +970,14 @@ "description": "You enjoyed inviting the neighborhood to a backyard cookout on the weekends. You, of course, were the grill master.", "points": 1, "skills": [ { "level": 2, "name": "cooking" } ], - "proficiencies": [ "prof_food_prep", "prof_knife_skills" ] + "proficiencies": [ "prof_food_prep", "prof_knife_skills" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -581,7 +987,14 @@ "points": 2, "description": "With enough time and materials, you could make a boat from scratch. These undead can't swim, right?", "skills": [ { "level": 3, "name": "fabrication" } ], - "proficiencies": [ "prof_carving", "prof_carpentry_basic" ] + "proficiencies": [ "prof_carving", "prof_carpentry_basic" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -591,7 +1004,14 @@ "points": 1, "description": "A quiet day at the lake would be a welcome break from the hordes. Though, now that you think about it, the fish have been acting strangely vicious lately too.", "skills": [ { "level": 2, "name": "survival" }, { "level": 1, "name": "swimming" } ], - "traits": [ "OUTDOORSMAN" ] + "traits": [ "OUTDOORSMAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "subtype": "hobby", @@ -601,7 +1021,14 @@ "description": "You could have been the next Browning, if not for the those pesky corpses walking around. It's time to test for accuracy.", "points": 3, "proficiencies": [ "prof_gunsmithing_basic", "prof_gunsmithing_improv" ], - "skills": [ { "level": 3, "name": "fabrication" }, { "level": 1, "name": "gun" }, { "level": 1, "name": "traps" } ] + "skills": [ { "level": 3, "name": "fabrication" }, { "level": 1, "name": "gun" }, { "level": 1, "name": "traps" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "subtype": "hobby", @@ -616,7 +1043,14 @@ { "level": 1, "name": "swimming" }, { "level": 1, "name": "dodge" } ], - "traits": [ "PROF_SKATER" ] + "traits": [ "PROF_SKATER" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -626,7 +1060,14 @@ "description": "Your time in the rink has taught you that sometimes the best way forward is straight through whoever's trying to block you.", "points": 3, "skills": [ { "level": 2, "name": "bashing" }, { "level": 2, "name": "swimming" }, { "level": 1, "name": "melee" } ], - "traits": [ "PROF_SKATER" ] + "traits": [ "PROF_SKATER" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -643,7 +1084,14 @@ "prof_food_prep", "prof_knife_skills" ], - "skills": [ { "level": 3, "name": "cooking" } ] + "skills": [ { "level": 3, "name": "cooking" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -660,6 +1108,13 @@ "prof_food_prep", "prof_brewing", "prof_winemaking" + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] ] }, { @@ -669,7 +1124,14 @@ "name": "Sports Coaching", "description": "They tore apart your team, but you're determined to keep the team spirit alive.", "points": 1, - "skills": [ { "level": 3, "name": "speech" }, { "level": 1, "name": "swimming" } ] + "skills": [ { "level": 3, "name": "speech" }, { "level": 1, "name": "swimming" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "profession", @@ -678,7 +1140,14 @@ "name": "Gardening", "description": "Your green thumb will come in handy when the grocery stores are overrun.", "points": 1, - "skills": [ { "level": 2, "name": "survival" }, { "level": 1, "name": "cooking" } ] + "skills": [ { "level": 2, "name": "survival" }, { "level": 1, "name": "cooking" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -688,7 +1157,14 @@ "description": "Your knots are strong, whether they're made from cloth or natural cordage.", "points": 1, "skills": [ { "level": 1, "name": "survival" }, { "level": 1, "name": "tailor" } ], - "proficiencies": [ "prof_fibers", "prof_fibers_rope" ] + "proficiencies": [ "prof_fibers", "prof_fibers_rope" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -698,7 +1174,14 @@ "description": "You enjoyed trekking on long trails in nature with all your necessities strapped to your back.", "points": 3, "skills": [ { "level": 2, "name": "survival" }, { "level": 2, "name": "firstaid" } ], - "traits": [ "OUTDOORSMAN", "GOODCARDIO", "NOMAD" ] + "traits": [ "OUTDOORSMAN", "GOODCARDIO", "NOMAD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -708,7 +1191,14 @@ "description": "You loved learning and sharing interesting facts about many different topics. None of them are useful anymore, but your strong memory certainly is.", "points": 3, "skills": [ { "level": 1, "name": "speech" } ], - "traits": [ "GOODMEMORY" ] + "traits": [ "GOODMEMORY" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "profession", @@ -718,7 +1208,14 @@ "description": "You spent hours welding discarded scrap into large and intricate designs. Some said you were just welding junk into bigger junk. You call it art.", "points": 2, "skills": [ { "level": 2, "name": "fabrication" } ], - "proficiencies": [ "prof_welding_basic" ] + "proficiencies": [ "prof_welding_basic" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -728,7 +1225,14 @@ "description": "You went to loud concerts and spent your time in the mosh pits. Now that everything's gone to hell, the whole world is your mosh pit.", "points": 1, "skills": [ { "level": 1, "name": "unarmed" } ], - "traits": [ "BADHEARING", "MASOCHIST", "PAINRESIST" ] + "traits": [ "BADHEARING", "MASOCHIST", "PAINRESIST" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -738,7 +1242,14 @@ "description": "Whether you twirled, spun, juggled, or ate it, your manipulation of flaming objects was impressive and terrifying to behold.", "points": 1, "traits": [ "PYROMANIA", "ADRENALINE", "DEFT" ], - "skills": [ { "level": 1, "name": "survival" } ] + "skills": [ { "level": 1, "name": "survival" } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "profession", @@ -748,7 +1259,14 @@ "description": "You loved meeting new people on the dance floor. These zombies aren't terribly friendly, but they're ready to tango!", "points": 2, "skills": [ { "level": 1, "name": "dodge" }, { "level": 2, "name": "speech" } ], - "traits": [ "LIGHTSTEP" ] + "traits": [ "LIGHTSTEP" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "profession", @@ -757,6 +1275,13 @@ "name": "Meditation", "description": "You make a habit of clearing your thoughts and finding your center, even amidst the chaos of the world.", "points": 2, - "traits": [ "SELFAWARE", "SPIRITUAL" ] + "traits": [ "SELFAWARE", "SPIRITUAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] } ] From 2b322137252db00ebd1c8542a5cc75c011e9b42b Mon Sep 17 00:00:00 2001 From: David Seguin Date: Sat, 20 Nov 2021 02:02:26 -0500 Subject: [PATCH 14/20] Difficulty info: add difficulty to traits/mutations --- data/json/mutations/mutations.json | 4603 +++++++++++++++++++++++++--- 1 file changed, 4111 insertions(+), 492 deletions(-) diff --git a/data/json/mutations/mutations.json b/data/json/mutations/mutations.json index ad7171cbc4c74..03514cc9b5c05 100644 --- a/data/json/mutations/mutations.json +++ b/data/json/mutations/mutations.json @@ -9,7 +9,14 @@ "changes_to": [ "FLEET2" ], "category": [ "SPIDER", "MOUSE", "RABBIT" ], "types": [ "RUNNING" ], - "movecost_flatground_modifier": 0.85 + "movecost_flatground_modifier": 0.85, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -36,7 +43,14 @@ } ] ], - "transform": { "target": "BIOLUM0_active", "msg_transform": "Your photophore starts glowing.", "active": true, "moves": 10 } + "transform": { "target": "BIOLUM0_active", "msg_transform": "Your photophore starts glowing.", "active": true, "moves": 10 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -76,7 +90,14 @@ "prereqs": [ "BIOLUM0" ], "changes_to": [ "BIOLUM2" ], "transform": { "target": "BIOLUM1_active", "msg_transform": "Your photophore starts glowing.", "active": true, "moves": 10 }, - "category": [ "ELFA", "INSECT", "FISH" ] + "category": [ "ELFA", "INSECT", "FISH" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -103,7 +124,14 @@ "prereqs": [ "BIOLUM1" ], "changes_to": [ "BIOLUM3" ], "category": [ "ELFA", "INSECT", "FISH" ], - "transform": { "target": "BIOLUM2_active", "msg_transform": "Your photophore starts glowing.", "active": true, "moves": 10 } + "transform": { "target": "BIOLUM2_active", "msg_transform": "Your photophore starts glowing.", "active": true, "moves": 10 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -125,7 +153,14 @@ "types": [ "BIOLUM" ], "prereqs": [ "BIOLUM2" ], "category": [ "INSECT" ], - "spells_learned": [ [ "spell_spit_flare", 1 ] ] + "spells_learned": [ [ "spell_spit_flare", 1 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -153,7 +188,14 @@ } ] ], - "transform": { "target": "HYDE", "msg_transform": "The anger overtakes you!", "active": false, "moves": 10 } + "transform": { "target": "HYDE", "msg_transform": "The anger overtakes you!", "active": false, "moves": 10 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -181,7 +223,14 @@ "passive_mods": { "int_mod": -8, "str_mod": 3 }, "ugliness": 8, "visibility": 8, - "social_modifiers": { "intimidate": 4 } + "social_modifiers": { "intimidate": 4 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -192,7 +241,14 @@ "starting_trait": true, "category": [ "ALPHA", "MOUSE", "ELFA", "RABBIT" ], "cancels": [ "BADHEARING" ], - "hearing_modifier": 1.25 + "hearing_modifier": 1.25, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -205,7 +261,14 @@ "threshreq": [ "THRESH_ELFA" ], "category": [ "ELFA" ], "cancels": [ "BADHEARING" ], - "hearing_modifier": 1.75 + "hearing_modifier": 1.75, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -225,6 +288,13 @@ { "part": "hand_l", "neutral": 12 }, { "part": "hand_r", "neutral": 12 }, { "part": "torso", "neutral": 10 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] ] }, { @@ -238,7 +308,14 @@ "cancels": [ "BADCARDIO" ], "changes_to": [ "GOODCARDIO2" ], "category": [ "FISH", "LUPINE", "MOUSE", "INSECT" ], - "max_stamina_modifier": 1.25 + "max_stamina_modifier": 1.25, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -251,7 +328,14 @@ "cancels": [ "BADCARDIO" ], "threshreq": [ "THRESH_MOUSE", "THRESH_RABBIT" ], "category": [ "MOUSE", "RABBIT" ], - "max_stamina_modifier": 1.4 + "max_stamina_modifier": 1.4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -261,7 +345,14 @@ "description": "You're just generally quick! You get a 10% bonus to action points.", "starting_trait": true, "category": [ "FISH", "BIRD", "INSECT", "TROGLOBITE", "CHIMERA", "RAPTOR", "MOUSE", "RABBIT" ], - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SPEED", "multiply": 0.1 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SPEED", "multiply": 0.1 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -276,6 +367,13 @@ "condition": { "compare_int": [ { "u_val": "pos_z" }, { "const": 0 } ], "op": "<" }, "values": [ { "value": "BONUS_BLOCK", "add": 1 }, { "value": "BONUS_DODGE", "add": 1 } ] } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] ] }, { @@ -290,6 +388,13 @@ "condition": { "not": "is_day" }, "values": [ { "value": "FOOTSTEP_NOISE", "multiply": 0.5 }, { "value": "ATTACK_NOISE", "multiply": 0.8 } ] } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] ] }, { @@ -320,7 +425,14 @@ "description": "Nothing gets you down! You savor the joys of life, ignore its hardships, and are generally happier than most people.", "starting_trait": true, "valid": false, - "cancels": [ "BADTEMPER" ] + "cancels": [ "BADTEMPER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -334,7 +446,14 @@ "category": [ "MEDICAL" ], "healing_awake": 0.2, "healing_resting": 0.5, - "mending_modifier": 2.0 + "mending_modifier": 2.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -347,7 +466,14 @@ "types": [ "METABOLISM" ], "changes_to": [ "GIZZARD", "COLDBLOOD" ], "category": [ "FISH", "BIRD", "INSECT", "TROGLOBITE", "GASTROPOD" ], - "metabolism_modifier": -0.333 + "metabolism_modifier": -0.333, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -360,7 +486,14 @@ "valid": false, "cancels": [ "INSOMNIA" ], "category": [ "MOUSE", "INSECT", "GASTROPOD" ], - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SLEEPY", "add": 24 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SLEEPY", "add": 24 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -372,7 +505,14 @@ "cancels": [ "INSOMNIA" ], "threshreq": [ "THRESH_MOUSE", "THRESH_RABBIT" ], "category": [ "MOUSE", "RABBIT" ], - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SLEEPY", "add": 40 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SLEEPY", "add": 40 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -387,6 +527,13 @@ "condition": { "compare_int": [ { "u_val": "pos_z" }, { "const": 0 } ], "op": "<" }, "values": [ { "value": "SLEEPY", "add": 20 } ] } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] ] }, { @@ -398,7 +545,14 @@ "cancels": [ "INSOMNIA" ], "threshreq": [ "THRESH_FISH", "THRESH_BATRACHIAN" ], "category": [ "BATRACHIAN", "FISH" ], - "enchantments": [ { "condition": "u_is_underwater", "values": [ { "value": "SLEEPY", "add": 40 } ] } ] + "enchantments": [ { "condition": "u_is_underwater", "values": [ { "value": "SLEEPY", "add": 40 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -409,7 +563,14 @@ "starting_trait": true, "valid": false, "cancels": [ "MORE_PAIN", "MORE_PAIN2", "MORE_PAIN3" ], - "category": [ "MEDICAL" ] + "category": [ "MEDICAL" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -422,7 +583,14 @@ "cancels": [ "ELFA_NV", "ELFA_FNV", "FEL_NV", "URSINE_EYE" ], "category": [ "BIRD", "CATTLE", "INSECT", "BATRACHIAN" ], "active": true, - "starts_active": true + "starts_active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -432,7 +600,14 @@ "description": "Your system is rather tolerant of poisons and toxins, and most will affect you less.", "starting_trait": true, "leads_to": [ "EATPOISON" ], - "category": [ "INSECT", "SLIME", "SPIDER", "MEDICAL", "CEPHALOPOD" ] + "category": [ "INSECT", "SLIME", "SPIDER", "MEDICAL", "CEPHALOPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -443,7 +618,14 @@ "reading_speed_multiplier": 0.8, "starting_trait": true, "valid": false, - "cancels": [ "ILLITERATE", "SLOWREADER" ] + "cancels": [ "ILLITERATE", "SLOWREADER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -452,7 +634,14 @@ "points": 1, "description": "The bottoms of your feet are tough, and you are accustomed to going barefoot. You receive no movement penalty for not wearing shoes.", "starting_trait": true, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -465,7 +654,14 @@ "category": [ "CATTLE" ], "movecost_modifier": 1.02, "movecost_swim_modifier": 1.3, - "hp_modifier": 0.1 + "hp_modifier": 0.1, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -478,7 +674,14 @@ "category": [ "CATTLE" ], "movecost_modifier": 1.04, "movecost_swim_modifier": 1.7, - "hp_modifier": 0.2 + "hp_modifier": 0.2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -491,7 +694,14 @@ "cancels": [ "FLIMSY", "FLIMSY2", "FLIMSY3", "GLASSJAW" ], "changes_to": [ "TOUGH2" ], "social_modifiers": { "intimidate": 2 }, - "hp_modifier": 0.2 + "hp_modifier": 0.2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -504,7 +714,14 @@ "prereqs": [ "TOUGH" ], "changes_to": [ "TOUGH3" ], "social_modifiers": { "intimidate": 3 }, - "hp_modifier": 0.3 + "hp_modifier": 0.3, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -516,7 +733,14 @@ "cancels": [ "FLIMSY", "FLIMSY2", "FLIMSY3", "GLASSJAW" ], "prereqs": [ "TOUGH2" ], "social_modifiers": { "intimidate": 4 }, - "hp_modifier": 0.4 + "hp_modifier": 0.4, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -533,6 +757,13 @@ "cut": 1, "bash": 1 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] ] }, { @@ -544,7 +775,14 @@ "obtain_cost_multiplier": 0.9, "starting_trait": true, "valid": false, - "cancels": [ "DISORGANIZED" ] + "cancels": [ "DISORGANIZED" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -555,7 +793,14 @@ "starting_trait": true, "valid": false, "cancels": [ "BADBACK" ], - "weight_capacity_modifier": 1.35 + "weight_capacity_modifier": 1.35, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -566,7 +811,14 @@ "starting_trait": true, "valid": false, "cancels": [ "SLOWLEARNER" ], - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "LEARNING_FOCUS", "add": 15 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "LEARNING_FOCUS", "add": 15 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -576,7 +828,14 @@ "consume_time_modifier": 1.5, "description": "You've been taught proper table manners from your early childhood on; now, you can't even think about eating without being seated at a table and taking your time. Eating without a table and chair frustrates you, but eating like a civilized person gives you a bigger morale bonus.", "starting_trait": true, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -588,7 +847,14 @@ "vomit_multiplier": 0.5, "changes_to": [ "NAUSEA" ], "//": "nope. This does NOT lead to EATPOISON. Stomach problems are part of the GI upgrades--one advantage to not having Robust Genetics.", - "cancels": [ "WEAKSTOMACH" ] + "cancels": [ "WEAKSTOMACH" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -601,7 +867,14 @@ "//": "Create an effect on condition that reduces nausea quickly whenever it occurs by one intensity per vomit?", "category": [ "BATRACHIAN" ], "threshreq": [ "THRESH_BATRACHIAN" ], - "cancels": [ "WEAKSTOMACH" ] + "cancels": [ "WEAKSTOMACH" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -613,7 +886,14 @@ "starting_trait": true, "valid": false, "cancels": [ "FORGETFUL" ], - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "MAP_MEMORY", "multiply": 1 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "MAP_MEMORY", "multiply": 1 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -622,7 +902,14 @@ "points": 1, "description": "While you're not any better at melee combat, you are better at recovering from a miss, and will be able to attempt another strike faster.", "starting_trait": true, - "category": [ "BIRD", "BEAST", "RAPTOR", "MOUSE", "RABBIT", "FELINE" ] + "category": [ "BIRD", "BEAST", "RAPTOR", "MOUSE", "RABBIT", "FELINE" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -632,7 +919,14 @@ "description": "You've always felt that there is more to the world than we can see. Whether driven by religious beliefs or philosophical interest, you find great inspiration in studying holy texts and experiencing mystical things.", "starting_trait": true, "social_modifiers": { "persuade": 5 }, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "mutation", @@ -642,7 +936,14 @@ "description": "You can handle intoxicants well. Their effects clear up more quickly for you.", "starting_trait": true, "leads_to": [ "ALCMET", "EATPOISON" ], - "cancels": [ "LIGHTWEIGHT" ] + "cancels": [ "LIGHTWEIGHT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -655,7 +956,14 @@ "starting_trait": true, "valid": false, "active": true, - "stomach_size_multiplier": 2.0 + "stomach_size_multiplier": 2.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -664,7 +972,14 @@ "points": 1, "description": "There's nothing quite like the smell of a good book! Books are more fun (or less boring) for you!", "valid": false, - "cancels": [ "ILLITERATE", "HATES_BOOKS" ] + "cancels": [ "ILLITERATE", "HATES_BOOKS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -675,7 +990,14 @@ "starting_trait": true, "valid": false, "category": [ "BATRACHIAN" ], - "cancels": [ "ADDICTIVE" ] + "cancels": [ "ADDICTIVE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -686,7 +1008,14 @@ "starting_trait": true, "category": [ "BEAST", "ELFA" ], "changes_to": [ "ANIMALEMPATH2" ], - "cancels": [ "ANIMALDISCORD" ] + "cancels": [ "ANIMALDISCORD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -696,7 +1025,14 @@ "description": "Something about your presence is calming to animals, and they will treat you with innate trust. This only applies to natural animals such as woodland creatures.", "category": [ "ELFA" ], "prereqs": [ "ANIMALEMPATH" ], - "cancels": [ "ANIMALDISCORD" ] + "cancels": [ "ANIMALDISCORD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -706,7 +1042,14 @@ "description": "There's something about you that creatures find frightening, and they are more likely to try to flee.", "starting_trait": true, "category": [ "BEAST", "INSECT", "CHIMERA" ], - "social_modifiers": { "intimidate": 15 } + "social_modifiers": { "intimidate": 15 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "mutation", @@ -716,7 +1059,14 @@ "description": "It's very unlikely that you will catch ambient diseases like the cold or flu.", "starting_trait": true, "changes_to": [ "DISIMMUNE" ], - "category": [ "CATTLE", "RAT", "MEDICAL" ] + "category": [ "CATTLE", "RAT", "MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -726,7 +1076,14 @@ "description": "If you are in a very dangerous situation, you may experience a temporary rush which increases your speed and strength significantly.", "starting_trait": true, "changes_to": [ "ADRENALINE2" ], - "category": [ "BEAST", "CHIMERA" ] + "category": [ "BEAST", "CHIMERA" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -742,7 +1099,14 @@ "hunger": true, "thirst": true, "dodge_modifier": 2, - "movecost_modifier": 0.9 + "movecost_modifier": 0.9, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -754,7 +1118,14 @@ "types": [ "SLEEP" ], "starting_trait": true, "category": [ "ALPHA", "ELFA" ], - "fatigue_modifier": -0.15 + "fatigue_modifier": -0.15, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -765,7 +1136,14 @@ "starting_trait": true, "valid": false, "active": true, - "category": [ "MEDICAL" ] + "category": [ "MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -775,7 +1153,14 @@ "description": "Although you still suffer the negative effects of pain, it also brings a unique pleasure to you.", "starting_trait": true, "valid": false, - "changes_to": [ "MASOCHIST_MED", "CENOBITE" ] + "changes_to": [ "MASOCHIST_MED", "CENOBITE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -785,7 +1170,14 @@ "points": 2, "mixed_effect": true, "description": "You have a unique history with stimulants (like coffee or amphetamines). You can tolerate a lot more of them without overdosing, but if you indulge too much, you start seeing things…", - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -794,7 +1186,14 @@ "points": 2, "description": "Practicality is far less important than style. Your morale is improved by wearing fashionable and attractive clothing.", "starting_trait": true, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -805,7 +1204,14 @@ "starting_trait": true, "category": [ "BIRD", "ELFA", "FELINE" ], "cancels": [ "CLUMSY" ], - "noise_modifier": 0.4 + "noise_modifier": 0.4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -815,7 +1221,14 @@ "description": "You have a very strong genetic base. If you mutate, the odds that the mutation will be beneficial are greatly increased.", "starting_trait": true, "cancels": [ "CHAOTIC_BAD" ], - "category": [ "FISH", "SLIME", "ALPHA", "MEDICAL" ] + "category": [ "FISH", "SLIME", "ALPHA", "MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -827,7 +1240,14 @@ "valid": false, "category": [ "BIRD", "MOUSE" ], "cancels": [ "UNOBSERVANT" ], - "overmap_sight": 5 + "overmap_sight": 5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -838,7 +1258,14 @@ "valid": false, "starting_trait": true, "cancels": [ "EAGLEEYED" ], - "overmap_sight": -10 + "overmap_sight": -10, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -850,7 +1277,14 @@ "starting_trait": true, "valid": false, "cancels": [ "VEGETARIAN", "HERBIVORE", "RUMINANT", "GRAZER" ], - "flags": [ "CANNIBAL" ] + "flags": [ "CANNIBAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -861,7 +1295,14 @@ "starting_trait": true, "valid": false, "cancels": [ "VEGETARIAN", "HERBIVORE", "RUMINANT", "GRAZER" ], - "flags": [ "STRICT_HUMANITARIAN" ] + "flags": [ "STRICT_HUMANITARIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -873,7 +1314,14 @@ "valid": false, "social_modifiers": { "intimidate": 5 }, "cancels": [ "KILLER", "PACIFIST" ], - "flags": [ "CANNIBAL" ] + "flags": [ "CANNIBAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "mutation", @@ -886,7 +1334,14 @@ "social_modifiers": { "intimidate": 10 }, "prereqs": [ "PSYCHOPATH" ], "cancels": [ "PACIFIST" ], - "flags": [ "CANNIBAL" ] + "flags": [ "CANNIBAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "mutation", @@ -896,7 +1351,14 @@ "description": "You have received some martial arts training at a local dojo. You start with your choice of Karate, Judo, Aikido, Tai Chi, Taekwondo, or Pankration.", "player_display": false, "initial_ma_styles": [ "style_karate", "style_judo", "style_aikido", "style_tai_chi", "style_taekwondo", "style_pankration" ], - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -914,7 +1376,14 @@ "style_wingchun", "style_boxing" ], - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -924,7 +1393,14 @@ "description": "You have studied the arts of the Shaolin monks. You start with one of the five animal fighting styles: Tiger, Crane, Leopard, Snake, or Dragon.", "player_display": false, "initial_ma_styles": [ "style_tiger", "style_crane", "style_leopard", "style_snake", "style_dragon" ], - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -943,7 +1419,14 @@ "style_swordsmanship", "style_medievalpole" ], - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -952,7 +1435,14 @@ "points": 0, "description": "You were an avid fencer, starting with foil and moving onto saber, then épée. You competed nationally and dabbled with some of the historical fencing weapons afforded by HEMA's popularity.", "initial_ma_styles": [ "style_fencing" ], - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -964,7 +1454,14 @@ "category": [ "ALPHA" ], "cancels": [ "SMELLY2" ], "scent_intensity": 300, - "types": [ "SCENT" ] + "types": [ "SCENT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -973,7 +1470,14 @@ "points": 1, "description": "You have no qualms about bending the truth, and have practically no tells. Telling lies and otherwise bluffing will be much easier for you.", "cancels": [ "TRUTHTELLER" ], - "social_modifiers": { "lie": 40 } + "social_modifiers": { "lie": 40 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ] }, { "type": "mutation", @@ -984,7 +1488,14 @@ "purifiable": false, "starting_trait": true, "valid": false, - "cancels": [ "XXXL" ] + "cancels": [ "XXXL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -995,7 +1506,14 @@ "purifiable": false, "starting_trait": true, "valid": false, - "cancels": [ "XS" ] + "cancels": [ "XS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1008,7 +1526,14 @@ "starting_trait": true, "category": [ "ALPHA", "FELINE", "LUPINE", "RABBIT" ], "cancels": [ "UGLY", "DEFORMED", "DEFORMED2", "DEFORMED3" ], - "changes_to": [ "BEAUTIFUL" ] + "changes_to": [ "BEAUTIFUL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "mutation", @@ -1018,7 +1543,14 @@ "description": "Whether due to injury or age, your knees aren't particularly strong or flexible. Moving over rough terrain will slow you down more than normal.", "starting_trait": true, "valid": false, - "movecost_obstacle_modifier": 1.25 + "movecost_obstacle_modifier": 1.25, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1028,7 +1560,14 @@ "description": "Your knees are strong and capable of angles that you couldn't imagine previously. Moving over rough terrain will slow you down less than normal.", "category": [ "BATRACHIAN" ], "valid": false, - "movecost_obstacle_modifier": 0.9 + "movecost_obstacle_modifier": 0.9, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1039,7 +1578,14 @@ "starting_trait": true, "valid": false, "cancels": [ "GOODCARDIO" ], - "max_stamina_modifier": 0.75 + "max_stamina_modifier": 0.75, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1050,7 +1596,14 @@ "starting_trait": true, "cancels": [ "URSINE_EYE" ], "category": [ "BEAST", "TROGLOBITE" ], - "flags": [ "MYOPIC" ] + "flags": [ "MYOPIC" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1061,7 +1614,14 @@ "starting_trait": true, "types": [ "HEALING" ], "healing_resting": -0.25, - "mending_modifier": 0.75 + "mending_modifier": 0.75, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1074,7 +1634,14 @@ "purifiable": false, "types": [ "HEALING" ], "healing_resting": -0.66, - "mending_modifier": 0.33 + "mending_modifier": 0.33, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1087,7 +1654,14 @@ "purifiable": false, "types": [ "HEALING" ], "healing_resting": -0.9, - "mending_modifier": 0.1 + "mending_modifier": 0.1, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1098,7 +1672,14 @@ "starting_trait": true, "valid": false, "category": [ "BATRACHIAN" ], - "flags": [ "HYPEROPIC" ] + "flags": [ "HYPEROPIC" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1108,7 +1689,14 @@ "description": "You're quite the heavy sleeper. Noises are unlikely to wake you up.", "changes_to": [ "HEAVYSLEEPER2" ], "starting_trait": true, - "category": [ "INSECT", "PLANT", "MEDICAL", "LUPINE" ] + "category": [ "INSECT", "PLANT", "MEDICAL", "LUPINE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1121,7 +1709,14 @@ "types": [ "SLEEP" ], "category": [ "BEAST", "CHIMERA", "MOUSE", "RABBIT" ], "fatigue_modifier": 0.333, - "fatigue_regen_modifier": 0.333 + "fatigue_regen_modifier": 0.333, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1131,7 +1726,14 @@ "description": "You will occasionally need to use an inhaler, or else suffer severe physical limitations. However, you are guaranteed to start with an inhaler.", "social_modifiers": { "intimidate": -2 }, "starting_trait": true, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1142,7 +1744,14 @@ "starting_trait": true, "category": [ "BIRD", "ELFA" ], "cancels": [ "STRONGBACK" ], - "weight_capacity_modifier": 0.65 + "weight_capacity_modifier": 0.65, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1152,7 +1761,14 @@ "description": "Things just keep getting you down. You tend to be unhappy, and it takes some doing to cheer you up.", "starting_trait": true, "cancels": [ "OPTIMISTIC" ], - "category": [ "URSINE", "LIZARD", "CHIMERA" ] + "category": [ "URSINE", "LIZARD", "CHIMERA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1162,7 +1778,14 @@ "description": "You are terrible at organizing and storing your possessions. You retrieve things from containers 10% slower.", "obtain_cost_multiplier": 1.1, "valid": false, - "cancels": [ "PACKMULE" ] + "cancels": [ "PACKMULE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1172,7 +1795,14 @@ "description": "You never learned to read! Books and computers are off-limits to you.", "starting_trait": true, "valid": false, - "cancels": [ "FASTREADER", "SLOWREADER", "PROF_DICEMASTER", "LOVES_BOOKS", "HATES_BOOKS" ] + "cancels": [ "FASTREADER", "SLOWREADER", "PROF_DICEMASTER", "LOVES_BOOKS", "HATES_BOOKS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1184,7 +1814,14 @@ "category": [ "PLANT", "GASTROPOD" ], "cancels": [ "GOODHEARING" ], "changes_to": [ "DEAF" ], - "hearing_modifier": 0.5 + "hearing_modifier": 0.5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1196,7 +1833,14 @@ "prereqs": [ "BADHEARING" ], "cancels": [ "GOODHEARING" ], "hearing_modifier": 0.0, - "flags": [ "DEAF" ] + "flags": [ "DEAF" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -1207,7 +1851,14 @@ "starting_trait": true, "valid": false, "cancels": [ "FASTLEARNER" ], - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "LEARNING_FOCUS", "add": -15 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "LEARNING_FOCUS", "add": -15 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1219,7 +1870,14 @@ "valid": false, "category": [ "MEDICAL" ], "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SLEEPY", "add": -12 } ] } ], - "cancels": [ "EASYSLEEPER" ] + "cancels": [ "EASYSLEEPER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1231,7 +1889,14 @@ "valid": false, "vitamins_absorb_multi": [ [ "flesh", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], "cancels": [ "CARNIVORE", "CANNIBAL", "EATDEAD", "STRICT_HUMANITARIAN", "SAPIOVORE" ], - "changes_to": [ "HERBIVORE" ] + "changes_to": [ "HERBIVORE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1247,6 +1912,13 @@ "cut": -1, "bash": -1 } + ], + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] ] }, { @@ -1258,7 +1930,14 @@ "valid": false, "starting_trait": true, "vitamins_absorb_multi": [ [ "veggy", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], - "cancels": [ "HERBIVORE", "RUMINANT", "GRAZER" ] + "cancels": [ "HERBIVORE", "RUMINANT", "GRAZER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1267,7 +1946,14 @@ "points": -1, "description": "Reading is for nerds! Boring books are more boring, and you can't have fun by reading books.", "valid": false, - "cancels": [ "ILLITERATE", "LOVES_BOOKS" ] + "cancels": [ "ILLITERATE", "LOVES_BOOKS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1278,7 +1964,14 @@ "valid": false, "starting_trait": true, "vitamins_absorb_multi": [ [ "fruit", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], - "cancels": [ "HERBIVORE", "RUMINANT", "GRAZER" ] + "cancels": [ "HERBIVORE", "RUMINANT", "GRAZER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1287,7 +1980,14 @@ "points": -1, "description": "You, like 75 percent of the world, cannot tolerate milk or milk based products. It's possible for you to eat them, but you will suffer morale penalties and obtain less nutrition from them.", "vitamins_absorb_multi": [ [ "milk", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], - "starting_trait": true + "starting_trait": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1298,7 +1998,14 @@ "starting_trait": true, "cancels": [ "PROJUNK" ], "vitamins_absorb_multi": [ [ "junk", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], - "category": [ "BEAST", "RAPTOR", "ALPHA", "ELFA", "RABBIT", "GASTROPOD" ] + "category": [ "BEAST", "RAPTOR", "ALPHA", "ELFA", "RABBIT", "GASTROPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1307,7 +2014,14 @@ "points": -2, "description": "You have a rare allergy that prevents you from eating wheat. It's possible for you to eat wheat-based products, but you will suffer morale penalties and obtain less nutrition from them.", "vitamins_absorb_multi": [ [ "wheat", [ [ "vitA", 0 ], [ "vitB", 0 ], [ "vitC", 0 ], [ "calcium", 0 ], [ "iron", 0 ] ] ] ], - "starting_trait": true + "starting_trait": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1318,7 +2032,14 @@ "starting_trait": true, "cancels": [ "ANTIJUNK" ], "changes_to": [ "PROJUNK2" ], - "category": [ "MOUSE", "INSECT" ] + "category": [ "MOUSE", "INSECT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1330,7 +2051,14 @@ "prereqs": [ "PROJUNK" ], "cancels": [ "ANTIJUNK" ], "threshreq": [ "THRESH_MOUSE" ], - "category": [ "MOUSE" ] + "category": [ "MOUSE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1341,7 +2069,14 @@ "starting_trait": true, "social_modifiers": { "intimidate": -2 }, "category": [ "BIRD", "RAPTOR" ], - "cancels": [ "TOUGH" ] + "cancels": [ "TOUGH" ], + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1354,7 +2089,14 @@ "starting_trait": true, "category": [ "BEAST", "MEDICAL", "CHIMERA", "MOUSE", "INSECT", "RABBIT" ], "cancels": [ "GOODMEMORY" ], - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "MAP_MEMORY", "multiply": -0.5 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "MAP_MEMORY", "multiply": -0.5 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1364,7 +2106,14 @@ "description": "Alcohol and drugs go straight to your head. You suffer the negative effects of these for longer.", "starting_trait": true, "category": [ "MEDICAL" ], - "cancels": [ "TOLERANCE" ] + "cancels": [ "TOLERANCE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1375,7 +2124,14 @@ "starting_trait": true, "valid": false, "category": [ "MEDICAL", "MOUSE", "RABBIT" ], - "cancels": [ "NONADDICTIVE" ] + "cancels": [ "NONADDICTIVE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1387,7 +2143,14 @@ "changes_to": [ "SMELLY2" ], "types": [ "SCENT" ], "scent_intensity": 800, - "category": [ "FELINE", "LUPINE", "MOUSE" ] + "category": [ "FELINE", "LUPINE", "MOUSE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1396,7 +2159,14 @@ "points": -2, "description": "You suffer from a minor chemical imbalance, whether mental or physical. Minor changes to your internal chemistry will manifest themselves on occasion, such as hunger, sleepiness, narcotic effects, etc.", "starting_trait": true, - "category": [ "SLIME", "MEDICAL", "CHIMERA", "ELFA" ] + "category": [ "SLIME", "MEDICAL", "CHIMERA", "ELFA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1407,7 +2177,14 @@ "starting_trait": true, "cancels": [ "ANIMALEMPATH" ], "changes_to": [ "ANIMALDISCORD2" ], - "category": [ "LUPINE", "BEAST", "RAPTOR", "INSECT" ] + "category": [ "LUPINE", "BEAST", "RAPTOR", "INSECT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1417,7 +2194,14 @@ "description": "Natural animals like dogs and wolves see you as prey, and are liable to attack you on sight.", "cancels": [ "ANIMALEMPATH" ], "prereqs": [ "ANIMALDISCORD" ], - "category": [ "MOUSE", "RABBIT" ] + "category": [ "MOUSE", "RABBIT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1428,7 +2212,14 @@ "reading_speed_multiplier": 1.3, "starting_trait": true, "valid": false, - "cancels": [ "ILLITERATE", "FASTREADER" ] + "cancels": [ "ILLITERATE", "FASTREADER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1438,7 +2229,14 @@ "description": "Ever since the sky first broke, you have felt unwell, your head split by alien thoughts. You will periodically suffer from delusions, ranging from minor effects to full visual hallucinations. Some of these effects may be controlled through the use of antipsychotics.", "starting_trait": true, "valid": false, - "category": [ "MEDICAL" ] + "category": [ "MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1448,7 +2246,14 @@ "description": "You randomly fall asleep without any reason.", "starting_trait": true, "valid": false, - "category": [ "MEDICAL" ] + "category": [ "MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1458,7 +2263,14 @@ "description": "You make more noise while walking. You're also more likely to set off traps.", "starting_trait": true, "cancels": [ "LIGHTSTEP" ], - "noise_modifier": 1.7 + "noise_modifier": 1.7, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1468,7 +2280,14 @@ "description": "When very hungry or under the effects of stimulants, you may find your hands shaking uncontrollably, severely reducing your Dexterity.", "starting_trait": true, "valid": false, - "category": [ "MEDICAL", "MOUSE", "RABBIT" ] + "category": [ "MEDICAL", "MOUSE", "RABBIT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1477,7 +2296,14 @@ "points": -4, "description": "You don't feel right unless you're carrying as much as you can. You suffer morale penalties for carrying less than maximum volume (weight is ignored). Xanax can help control this anxiety.", "starting_trait": true, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1486,7 +2312,14 @@ "points": -4, "description": "You tend to specialize in one skill and be poor at all others. You advance at half speed in all skills except your best one. Note that combining this with Fast Learner will come out to a slower rate of learning for all skills.", "starting_trait": true, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1497,7 +2330,14 @@ "starting_trait": true, "social_modifiers": { "intimidate": -10 }, "valid": false, - "cancels": [ "PSYCHOPATH", "KILLER", "PRED1", "PRED2", "PRED3", "PRED4", "PACK_HUNTER" ] + "cancels": [ "PSYCHOPATH", "KILLER", "PRED1", "PRED2", "PRED3", "PRED4", "PACK_HUNTER" ], + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1507,7 +2347,14 @@ "description": "Your morale will shift up and down at random, often dramatically.", "starting_trait": true, "valid": false, - "category": [ "MEDICAL", "ELFA" ] + "category": [ "MEDICAL", "ELFA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1517,7 +2364,14 @@ "description": "You can't move as fast as most, resulting in a 15% speed penalty on flat ground.", "starting_trait": true, "types": [ "RUNNING" ], - "movecost_flatground_modifier": 1.15 + "movecost_flatground_modifier": 1.15, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1528,7 +2382,14 @@ "starting_trait": true, "vomit_multiplier": 2, "changes_to": [ "NAUSEA" ], - "cancels": [ "STRONGSTOMACH" ] + "cancels": [ "STRONGSTOMACH" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1537,7 +2398,14 @@ "points": -1, "description": "You are badly allergic to wool, and cannot wear any clothing made of the substance.", "starting_trait": true, - "valid": true + "valid": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1547,7 +2415,14 @@ "description": "When you try to tell a lie, you blush, stammer, and get all shifty-eyed. Telling lies and otherwise bluffing will be much more difficult for you.", "starting_trait": true, "cancels": [ "LIAR" ], - "social_modifiers": { "lie": -40 } + "social_modifiers": { "lie": -40 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -1560,7 +2435,14 @@ "starting_trait": true, "cancels": [ "PRETTY", "BEAUTIFUL", "BEAUTIFUL2", "BEAUTIFUL3" ], "changes_to": [ "DEFORMED" ], - "category": [ "RAPTOR", "FELINE", "LUPINE", "BATRACHIAN" ] + "category": [ "RAPTOR", "FELINE", "LUPINE", "BATRACHIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -1571,7 +2453,14 @@ "starting_trait": true, "changes_to": [ "SUNBURN" ], "category": [ "TROGLOBITE", "MOUSE", "RABBIT" ], - "types": [ "skin_tone" ] + "types": [ "skin_tone" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1585,7 +2474,14 @@ "cancels": [ "TOUGH", "TOUGH2", "TOUGH3" ], "category": [ "MOUSE", "ELFA", "RABBIT" ], "changes_to": [ "FLIMSY2" ], - "hp_modifier": -0.25 + "hp_modifier": -0.25, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1599,7 +2495,14 @@ "cancels": [ "TOUGH", "TOUGH2", "TOUGH3" ], "prereqs": [ "FLIMSY" ], "changes_to": [ "FLIMSY3" ], - "hp_modifier": -0.5 + "hp_modifier": -0.5, + "difficulty": [ + [ "combat", "very_hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1612,7 +2515,14 @@ "social_modifiers": { "intimidate": -4 }, "cancels": [ "TOUGH", "TOUGH2", "TOUGH3" ], "prereqs": [ "FLIMSY2" ], - "hp_modifier": -0.75 + "hp_modifier": -0.75, + "difficulty": [ + [ "combat", "very_hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1623,7 +2533,14 @@ "description": "The events of the Cataclysm have damaged your DNA beyond repair. You mutate frequently, and all mutations you receive (from any source) are negative.", "starting_trait": true, "cancels": [ "ROBUST" ], - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1635,7 +2552,14 @@ "description": "Your skin is slightly rough. This has no gameplay effect.", "types": [ "SKIN" ], "changes_to": [ "SCALES", "FEATHERS", "LIGHTFUR", "CHITIN", "PLANTSKIN", "PATCHSKIN1" ], - "category": [ "LIZARD" ] + "category": [ "LIZARD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1648,7 +2572,14 @@ "cancels": [ "ELFA_NV", "ELFA_FNV", "FEL_NV", "URSINE_EYE" ], "category": [ "FISH", "BEAST", "INSECT", "RAT", "CHIMERA", "LUPINE", "MOUSE" ], "active": true, - "starts_active": true + "starts_active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1661,7 +2592,14 @@ "cancels": [ "ELFA_NV", "ELFA_FNV", "FEL_NV", "URSINE_EYE" ], "category": [ "FISH", "TROGLOBITE", "SPIDER" ], "active": true, - "starts_active": true + "starts_active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1674,7 +2612,14 @@ "leads_to": [ "CEPH_VISION" ], "cancels": [ "BIRD_EYE", "LIZ_EYE", "FEL_EYE", "URSINE_EYE", "COMPOUND_EYES", "ELFAEYES" ], "flags": [ "EYE_MEMBRANE" ], - "category": [ "CEPHALOPOD" ] + "category": [ "CEPHALOPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -1687,7 +2632,14 @@ "cancels": [ "BIRD_EYE", "LIZ_EYE", "FEL_EYE", "URSINE_EYE", "COMPOUND_EYES" ], "category": [ "LUPINE" ], "mixed_effect": true, - "social_modifiers": { "lie": -5, "persuade": 5, "intimidate": -5 } + "social_modifiers": { "lie": -5, "persuade": 5, "intimidate": -5 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1699,7 +2651,14 @@ "cancels": [ "LIZ_IR", "FEL_NV", "NIGHTVISION", "NIGHTVISION2", "NIGHTVISION3", "ELFA_NV", "ELFA_FNV" ], "category": [ "CEPHALOPOD" ], "active": true, - "starts_active": true + "starts_active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1711,7 +2670,14 @@ "valid": false, "cancels": [ "BIRD_EYE", "LIZ_EYE", "FEL_EYE", "URSINE_EYE", "COMPOUND_EYES" ], "category": [ "ELFA" ], - "social_modifiers": { "lie": 5, "persuade": 5, "intimidate": -5 } + "social_modifiers": { "lie": 5, "persuade": 5, "intimidate": -5 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "mutation", @@ -1724,7 +2690,14 @@ "cancels": [ "LIZ_IR", "FEL_NV", "NIGHTVISION", "NIGHTVISION2", "NIGHTVISION3" ], "category": [ "ELFA" ], "active": true, - "starts_active": true + "starts_active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1736,7 +2709,14 @@ "cancels": [ "LIZ_IR", "FEL_NV", "NIGHTVISION", "NIGHTVISION2", "NIGHTVISION3" ], "category": [ "ELFA" ], "active": true, - "starts_active": true + "starts_active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1749,7 +2729,14 @@ "social_modifiers": { "lie": 2, "persuade": 2 }, "leads_to": [ "FEL_NV" ], "cancels": [ "ELFAEYES", "LIZ_EYE", "BIRD_EYE", "URSINE_EYE", "COMPOUND_EYES" ], - "category": [ "FELINE", "BEAST" ] + "category": [ "FELINE", "BEAST" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1761,7 +2748,14 @@ "cancels": [ "ELFA_NV", "ELFA_FNV", "LIZ_IR", "NIGHTVISION", "NIGHTVISION2", "NIGHTVISION3" ], "category": [ "FELINE" ], "active": true, - "starts_active": true + "starts_active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1783,7 +2777,14 @@ "category": [ "URSINE", "BATRACHIAN" ], "flags": [ "MYOPIC_IN_LIGHT" ], "active": true, - "starts_active": true + "starts_active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1796,7 +2797,14 @@ "prereqs": [ "PER_UP" ], "threshreq": [ "THRESH_BIRD" ], "category": [ "BIRD" ], - "passive_mods": { "per_mod": 4 } + "passive_mods": { "per_mod": 4 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1807,7 +2815,14 @@ "flags": [ "INFRARED" ], "prereqs": [ "NIGHTVISION3" ], "cancels": [ "LIZ_IR" ], - "category": [ "INSECT", "TROGLOBITE", "SPIDER" ] + "category": [ "INSECT", "TROGLOBITE", "SPIDER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1820,7 +2835,14 @@ "social_modifiers": { "persuade": -1, "intimidate": 1 }, "leads_to": [ "LIZ_IR" ], "cancels": [ "ELFAEYES", "FEL_EYE", "URSINE_EYE", "BIRD_EYE", "COMPOUND_EYES" ], - "category": [ "LIZARD", "RAPTOR" ] + "category": [ "LIZARD", "RAPTOR" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1831,7 +2853,14 @@ "flags": [ "INFRARED" ], "prereqs": [ "LIZ_EYE" ], "cancels": [ "ELFA_NV", "ELFA_FNV", "FEL_NV", "INFRARED" ], - "category": [ "LIZARD", "RAPTOR" ] + "category": [ "LIZARD", "RAPTOR" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1845,7 +2874,14 @@ "category": [ "PLANT", "BATRACHIAN" ], "healing_awake": 0.66, "healing_resting": 0.5, - "mending_modifier": 4.0 + "mending_modifier": 4.0, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1858,7 +2894,14 @@ "category": [ "SLIME", "TROGLOBITE" ], "healing_awake": 2.0, "healing_resting": 1.5, - "mending_modifier": 16.0 + "mending_modifier": 16.0, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1872,7 +2915,14 @@ "prereqs": [ "FASTHEALER" ], "threshreq": [ "THRESH_LIZARD" ], "category": [ "LIZARD" ], - "mending_modifier": 20.0 + "mending_modifier": 20.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1886,7 +2936,14 @@ "changes_to": [ "WAKEFUL3" ], "threshreq": [ "THRESH_ALPHA", "THRESH_ELFA", "THRESH_BATRACHIAN" ], "category": [ "ALPHA", "ELFA", "BATRACHIAN" ], - "fatigue_modifier": -0.25 + "fatigue_modifier": -0.25, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1901,7 +2958,14 @@ "threshreq": [ "THRESH_ELFA" ], "category": [ "ELFA" ], "fatigue_modifier": -0.5, - "fatigue_regen_modifier": 0.5 + "fatigue_regen_modifier": 0.5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -1947,6 +3011,13 @@ "chance": 19, "base_damage": { "damage_type": "stab", "amount": 20 } } + ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] ] }, { @@ -1967,7 +3038,14 @@ "body_part": "mouth", "chance": 18, "base_damage": [ { "damage_type": "cut", "amount": 3 }, { "damage_type": "bash", "amount": 3 } ] - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -1980,7 +3058,14 @@ "prereqs": [ "EYEBULGE" ], "category": [ "LIZARD", "FISH", "BATRACHIAN" ], "flags": [ "EYE_MEMBRANE" ], - "wet_protection": [ { "part": "eyes", "neutral": 1 } ] + "wet_protection": [ { "part": "eyes", "neutral": 1 } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -1993,7 +3078,14 @@ "category": [ "FISH", "BATRACHIAN" ], "cancels": [ "GILLS_CEPH" ], "flags": [ "GILLS" ], - "wet_protection": [ { "part": "head", "good": 1 } ] + "wet_protection": [ { "part": "head", "good": 1 } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2006,7 +3098,14 @@ "category": [ "CEPHALOPOD" ], "cancels": [ "GILLS" ], "flags": [ "GILLS" ], - "wet_protection": [ { "part": "head", "good": 1 } ] + "wet_protection": [ { "part": "head", "good": 1 } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2041,6 +3140,13 @@ "cut": 1, "bash": 2 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] ] }, { @@ -2078,7 +3184,14 @@ "bash": 3 } ], - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SPEED", "multiply": -0.2 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SPEED", "multiply": -0.2 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -2113,7 +3226,14 @@ "bash": 5 } ], - "enchantments": [ "ENCH_TRAIT_MSKIN" ] + "enchantments": [ "ENCH_TRAIT_MSKIN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -2145,6 +3265,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth" ], "cut": 2 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2178,7 +3305,14 @@ "cut": 4 } ], - "passive_mods": { "dex_mod": -2 } + "passive_mods": { "dex_mod": -2 }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2209,6 +3343,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth" ], "cut": 1 } + ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2223,7 +3364,14 @@ "movecost_modifier": 0.9, "attackcost_modifier": 0.9, "weight_capacity_modifier": 0.8, - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "EXTRA_BASH", "multiply": 0.4 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "EXTRA_BASH", "multiply": 0.4 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -2243,6 +3391,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth" ], "bash": 1 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2258,7 +3413,14 @@ "types": [ "SKIN" ], "prereqs": [ "FEATHERS" ], "threshreq": [ "THRESH_BIRD" ], - "category": [ "BIRD" ] + "category": [ "BIRD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -2273,7 +3435,14 @@ "category": [ "SPIDER", "MOUSE" ], "types": [ "SKIN" ], "prereqs": [ "SKIN_ROUGH" ], - "changes_to": [ "FUR", "FELINE_FUR", "LUPINE_FUR", "URSINE_FUR", "CHITIN_FUR", "RABBIT_FUR" ] + "changes_to": [ "FUR", "FELINE_FUR", "LUPINE_FUR", "URSINE_FUR", "CHITIN_FUR", "RABBIT_FUR" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2294,6 +3463,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth" ], "bash": 1 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2315,6 +3491,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth" ], "bash": 1 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2335,6 +3518,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth" ], "bash": 1 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2350,7 +3540,14 @@ "types": [ "SKIN" ], "prereqs": [ "LIGHTFUR" ], "leads_to": [ "LYNX_FUR" ], - "category": [ "BEAST", "FELINE", "MOUSE" ] + "category": [ "BEAST", "FELINE", "MOUSE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2363,7 +3560,14 @@ "types": [ "SKIN" ], "prereqs": [ "FELINE_FUR" ], "category": [ "FELINE" ], - "armor": [ { "parts": [ "head", "mouth" ], "bash": 1 } ] + "armor": [ { "parts": [ "head", "mouth" ], "bash": 1 } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -2397,7 +3601,14 @@ "category": [ "CHIMERA" ], "types": [ "SKIN" ], "prereqs": [ "SKIN_ROUGH" ], - "changes_to": [ "PATCHSKIN2" ] + "changes_to": [ "PATCHSKIN2" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -2430,7 +3641,14 @@ ], "category": [ "CHIMERA" ], "types": [ "SKIN" ], - "prereqs": [ "PATCHSKIN1" ] + "prereqs": [ "PATCHSKIN1" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -2462,6 +3680,13 @@ "bash": 2, "cut": 2 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2497,7 +3722,14 @@ "cut": 4 } ], - "passive_mods": { "dex_mod": -1 } + "passive_mods": { "dex_mod": -1 }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2545,7 +3777,14 @@ "bullet": 1 } ], - "passive_mods": { "dex_mod": -1 } + "passive_mods": { "dex_mod": -1 }, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -2567,6 +3806,13 @@ "bash": 2, "cut": 2 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2589,6 +3835,13 @@ "bash": 4, "cut": 4 } + ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2626,7 +3879,14 @@ "bullet": 1 } ], - "passive_mods": { "dex_mod": -1 } + "passive_mods": { "dex_mod": -1 }, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -2638,7 +3898,14 @@ "description": "Significant amounts of your hairs have loosened. If some creature tries to attack you, your assailant is quite likely to get fine, bristly chitin in an irritating spot; it doesn't carry your venom but it will be distracting.", "prereqs": [ "CHITIN_FUR2", "CHITIN_FUR3" ], "threshreq": [ "THRESH_SPIDER" ], - "category": [ "SPIDER" ] + "category": [ "SPIDER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -2648,7 +3915,14 @@ "visibility": 1, "ugliness": 2, "description": "Your skin is covered with fine spines. Whenever an unarmed opponent strikes a part of your body that is not covered by clothing, they will receive moderate damage.", - "changes_to": [ "QUILLS" ] + "changes_to": [ "QUILLS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2658,7 +3932,14 @@ "visibility": 3, "ugliness": 3, "description": "Your body is covered with large quills. Whenever an unarmed opponent strikes a part of your body that is not covered by clothing, they will receive significant damage.", - "prereqs": [ "SPINES" ] + "prereqs": [ "SPINES" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2672,7 +3953,14 @@ "cost": 10, "hunger": true, "ranged_mutation": { "type": "mut_quills", "message": "You fire off some of your quills." }, - "prereqs": [ "QUILLS" ] + "prereqs": [ "QUILLS" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2704,7 +3992,14 @@ "cut": 1 } ], - "thirst_modifier": -0.2 + "thirst_modifier": -0.2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2734,6 +4029,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth" ], "cut": 2 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -2746,7 +4048,14 @@ "pierce_dmg_bonus": 2, "description": "Your skin is covered in small, woody thorns. Whenever an unarmed opponent strikes a part of your body that is not covered by clothing, they will receive minor damage. Your punches may also deal extra damage.", "prereqs": [ "BARK" ], - "category": [ "PLANT" ] + "category": [ "PLANT" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2759,7 +4068,14 @@ "prereqs": [ "PLANTSKIN", "BARK" ], "changes_to": [ "LEAVES2" ], "category": [ "PLANT", "ELFA" ], - "wet_protection": [ { "part": "head", "ignored": 1 } ] + "wet_protection": [ { "part": "head", "ignored": 1 } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2775,7 +4091,14 @@ "changes_to": [ "LEAVES3" ], "category": [ "PLANT" ], "wet_protection": [ { "part": "head", "ignored": 4 }, { "part": "arm_l", "ignored": 5 }, { "part": "arm_r", "ignored": 5 } ], - "encumbrance_covered": [ [ "arm_l", 5 ], [ "arm_r", 5 ] ] + "encumbrance_covered": [ [ "arm_l", 5 ], [ "arm_r", 5 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -2790,7 +4113,14 @@ "threshreq": [ "THRESH_PLANT" ], "category": [ "PLANT" ], "wet_protection": [ { "part": "head", "ignored": 5 }, { "part": "arm_l", "ignored": 8 }, { "part": "arm_r", "ignored": 8 } ], - "encumbrance_covered": [ [ "arm_l", 10 ], [ "arm_r", 10 ] ] + "encumbrance_covered": [ [ "arm_l", 10 ], [ "arm_r", 10 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -2803,7 +4133,14 @@ "prereqs": [ "PLANTSKIN", "BARK" ], "prereqs2": [ "LEAVES" ], "threshreq": [ "THRESH_PLANT" ], - "category": [ "PLANT" ] + "category": [ "PLANT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -2820,7 +4157,14 @@ "category": [ "PLANT", "ELFA" ], "changes_to": [ "ROSEBUDS" ], "scent_mask": -200, - "social_modifiers": { "lie": 10 } + "social_modifiers": { "lie": 10 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ] }, { "type": "mutation", @@ -2834,7 +4178,14 @@ "cancels": [ "SMELLY", "SMELLY2" ], "threshreq": [ "THRESH_PLANT", "THRESH_ELFA" ], "category": [ "PLANT", "ELFA" ], - "social_modifiers": { "lie": 15, "persuade": 10 } + "social_modifiers": { "lie": 15, "persuade": 10 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ] }, { "type": "mutation", @@ -2849,7 +4200,14 @@ "changes_to": [ "M_FERTILE" ], "cancels": [ "M_BLOSSOMS", "M_BLOOM" ], "threshreq": [ "THRESH_MYCUS" ], - "category": [ "MYCUS" ] + "category": [ "MYCUS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2868,7 +4226,14 @@ "active": true, "cost": 8, "hunger": true, - "thirst": true + "thirst": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2884,7 +4249,14 @@ "changes_to": [ "M_BLOOM" ], "cancels": [ "M_SPORES", "M_FERTILE" ], "threshreq": [ "THRESH_MYCUS" ], - "category": [ "MYCUS" ] + "category": [ "MYCUS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2904,7 +4276,14 @@ "cost": 10, "hunger": true, "thirst": true, - "fatigue": true + "fatigue": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2923,7 +4302,14 @@ "cost": 10, "hunger": true, "thirst": true, - "fatigue": true + "fatigue": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -2936,7 +4322,14 @@ "types": [ "CLAWS" ], "changes_to": [ "CLAWS", "TALONS" ], "cancels": [ "ARM_TENTACLES", "ARM_TENTACLES_4", "ARM_TENTACLES_8" ], - "category": [ "RAPTOR" ] + "category": [ "RAPTOR" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -2953,7 +4346,14 @@ "prereqs": [ "NAILS" ], "changes_to": [ "CLAWS_RETRACT", "CLAWS_RAT" ], "cancels": [ "ARM_TENTACLES", "ARM_TENTACLES_4", "ARM_TENTACLES_8" ], - "category": [ "BEAST", "RAT", "URSINE" ] + "category": [ "BEAST", "RAT", "URSINE" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2970,7 +4370,14 @@ "prereqs": [ "CLAWS" ], "changes_to": [ "CLAWS_ST" ], "cancels": [ "ARM_TENTACLES", "ARM_TENTACLES_4", "ARM_TENTACLES_8" ], - "category": [ "RAT" ] + "category": [ "RAT" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -2991,7 +4398,14 @@ "prereqs2": [ "PAWS" ], "threshreq": [ "THRESH_RAT" ], "cancels": [ "ARM_TENTACLES", "ARM_TENTACLES_4", "ARM_TENTACLES_8" ], - "category": [ "RAT" ] + "category": [ "RAT" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -3005,7 +4419,14 @@ "cancels": [ "ARM_TENTACLES", "ARM_TENTACLES_4", "ARM_TENTACLES_8" ], "category": [ "FELINE" ], "transform": { "target": "CLAWS_RETRACT_active", "msg_transform": "You extend your claws.", "active": false, "moves": 10 }, - "cost": 0 + "cost": 0, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3034,7 +4455,14 @@ "encumbrance_always": [ [ "hand_l", 20 ], [ "hand_r", 20 ] ], "prereqs": [ "ARM_TENTACLES", "ARM_TENTACLES_4", "ARM_TENTACLES_8" ], "threshreq": [ "THRESH_CEPHALOPOD" ], - "category": [ "CEPHALOPOD" ] + "category": [ "CEPHALOPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3057,7 +4485,14 @@ ] } ], - "category": [ "CEPHALOPOD" ] + "category": [ "CEPHALOPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3069,7 +4504,14 @@ "description": "You exude slime from your pores. You can spread that slime on an opponent in melee range.", "spells_learned": [ [ "spell_slime_spray", 1 ] ], "prereqs": [ "VISCOUS", "AMORPHOUS" ], - "category": [ "GASTROPOD" ] + "category": [ "GASTROPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3080,7 +4522,14 @@ "ugliness": 3, "description": "You develop a reservoir of fluids that bulges out of your abdomen. Your body has adapted to containing extra liquids in event of shortfalls.", "thirst_modifier": 0.75, - "category": [ "INSECT" ] + "category": [ "INSECT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3104,6 +4553,13 @@ "base_damage": { "damage_type": "heat", "amount": 15 }, "strength_damage": { "damage_type": "heat", "amount": 2 } } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] ] }, { @@ -3124,7 +4580,14 @@ "prereqs": [ "NAILS" ], "cancels": [ "ARM_TENTACLES", "ARM_TENTACLES_4", "ARM_TENTACLES_8" ], "category": [ "LIZARD", "BIRD", "CHIMERA" ], - "allowed_items": [ "ALLOWS_TALONS" ] + "allowed_items": [ "ALLOWS_TALONS" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3132,7 +4595,14 @@ "name": { "str": "Radiogenic" }, "points": 3, "description": "Your system has adapted to radiation. While irradiated, you will actually heal slowly, converting the radiation into hit points.", - "category": [ "SLIME", "MEDICAL" ] + "category": [ "SLIME", "MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3143,7 +4613,14 @@ "purifiable": false, "valid": false, "category": [ "MARLOSS" ], - "flags": [ "mycus" ] + "flags": [ "mycus" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3154,7 +4631,14 @@ "purifiable": false, "valid": false, "category": [ "MARLOSS" ], - "flags": [ "mycus" ] + "flags": [ "mycus" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3165,7 +4649,14 @@ "purifiable": false, "valid": false, "category": [ "MARLOSS" ], - "flags": [ "mycus" ] + "flags": [ "mycus" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3174,7 +4665,14 @@ "points": 0, "description": "Ever since you had that life-threatening reaction to that Marloss junk, you can't bear the thought of ever eating it again!", "purifiable": false, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3183,7 +4681,14 @@ "points": 0, "description": "Ever since you had that life-threatening reaction to those mutagen and purifier things, you can't bear the thought of ever using them again!", "purifiable": false, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3193,7 +4698,14 @@ "description": "Your body produces low-level pheromones, identifying you as a friend to many species of insects. Insects will attack you much less.", "prereqs": [ "SMELLY2" ], "types": [ "SCENT" ], - "category": [ "INSECT" ] + "category": [ "INSECT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3203,7 +4715,14 @@ "description": "Your body produces low-level pheromones, identifying you as a friend to many species of amphibian. Amphibians will attack you much less.", "prereqs": [ "SMELLY2" ], "types": [ "SCENT" ], - "category": [ "BATRACHIAN" ] + "category": [ "BATRACHIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3213,7 +4732,14 @@ "description": "Your body produces low-level pheromones which put mammals at ease. They will be less likely to attack or flee from you.", "prereqs": [ "SMELLY2" ], "types": [ "SCENT" ], - "category": [ "BEAST", "CATTLE" ] + "category": [ "BEAST", "CATTLE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3223,7 +4749,14 @@ "description": "Your body is simply immune to diseases. You will never catch an ambient disease.", "prereqs": [ "DISRESISTANT" ], "category": [ "PLANT", "SLIME", "TROGLOBITE" ], - "flags": [ "NO_DISEASE" ] + "flags": [ "NO_DISEASE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3233,7 +4766,14 @@ "description": "Your immune system is particularly good at resisting infections. You have an increased chance for bad wounds and infections to heal on their own, and only suffer reduced penalties from them.", "starting_trait": true, "changes_to": [ "INFIMMUNE" ], - "category": [ "TROGLOBITE", "RAT", "MEDICAL", "GASTROPOD" ] + "category": [ "TROGLOBITE", "RAT", "MEDICAL", "GASTROPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3243,7 +4783,14 @@ "description": "Your bloodstream has developed antibiotic properties. Your wounds will never become infected.", "prereqs": [ "DISRESISTANT" ], "prereqs2": [ "INFRESIST" ], - "category": [ "MEDICAL" ] + "category": [ "MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3254,7 +4801,14 @@ "valid": false, "purifiable": false, "threshreq": [ "THRESH_MYCUS" ], - "category": [ "MYCUS" ] + "category": [ "MYCUS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3265,7 +4819,14 @@ "prereqs": [ "DISRESISTANT" ], "prereqs2": [ "INFRESIST" ], "flags": [ "PARAIMMUNE" ], - "category": [ "ELFA", "CHIMERA", "MEDICAL", "SLIME" ] + "category": [ "ELFA", "CHIMERA", "MEDICAL", "SLIME" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3276,7 +4837,14 @@ "prereqs": [ "POISRESIST" ], "leads_to": [ "EATPOISON" ], "changes_to": [ "POISONOUS2" ], - "category": [ "SLIME", "TROGLOBITE", "SPIDER", "CEPHALOPOD", "GASTROPOD" ] + "category": [ "SLIME", "TROGLOBITE", "SPIDER", "CEPHALOPOD", "GASTROPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3286,7 +4854,14 @@ "description": "Your venom has become particularly strong. You're confident that your bites or other cutting/stabbing natural attacks will take your target down quickly.", "prereqs": [ "POISONOUS" ], "threshreq": [ "THRESH_SPIDER" ], - "category": [ "SPIDER" ] + "category": [ "SPIDER" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3299,7 +4874,14 @@ "description": "The skin on your hands is now a mucous membrane that produces a thick, acrid slime. Attacks using your hand will cause minor acid damage. Slightly increases wet benefits.", "prereqs": [ "SLIMY" ], "category": [ "SLIME" ], - "wet_protection": [ { "part": "hand_l", "good": 5 }, { "part": "hand_r", "good": 5 } ] + "wet_protection": [ { "part": "hand_l", "good": 5 }, { "part": "hand_r", "good": 5 } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3311,7 +4893,14 @@ "changes_to": [ "BENDY2" ], "threshreq": [ "THRESH_SLIME", "THRESH_ELFA" ], "category": [ "SLIME", "ELFA" ], - "passive_mods": { "dex_mod": 1 } + "passive_mods": { "dex_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3328,7 +4917,14 @@ "leads_to": [ "AMORPHOUS" ], "category": [ "SLIME" ], "passive_mods": { "dex_mod": 3, "str_mod": -2 }, - "hp_adjustment": 3 + "hp_adjustment": 3, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3346,7 +4942,14 @@ "threshreq": [ "THRESH_SLIME" ], "category": [ "SLIME" ], "passive_mods": { "dex_mod": 4, "str_mod": -4 }, - "hp_adjustment": 6 + "hp_adjustment": 6, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3357,7 +4960,14 @@ "description": "Your extremities have gained strength but lost fine motor skills. -1 Dexterity +2 Strength.", "changes_to": [ "GASTROPOD_EXTREMITY2" ], "category": [ "GASTROPOD" ], - "passive_mods": { "dex_mod": -1, "str_mod": 2 } + "passive_mods": { "dex_mod": -1, "str_mod": 2 }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3378,7 +4988,14 @@ "chance": 15, "base_damage": { "damage_type": "cut", "amount": 15 }, "strength_damage": { "damage_type": "cut", "amount": 2 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3398,7 +5015,14 @@ "chance": 25, "base_damage": { "damage_type": "stab", "amount": 15 }, "strength_damage": { "damage_type": "stab", "amount": 3 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -3410,7 +5034,14 @@ "description": "Your eyes are compound, like those of an insect. This increases your Perception by 2 whenever you aren't wearing eyewear.", "cancels": [ "ELFAEYES", "FEL_EYE", "URSINE_EYE", "BIRD_EYE", "LIZ_EYE" ], "prereqs": [ "EYEBULGE" ], - "category": [ "INSECT" ] + "category": [ "INSECT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -3420,7 +5051,14 @@ "visibility": 1, "description": "The bottoms of your feet are strongly padded. You receive no movement penalty for not wearing shoes, and even receive a 10% bonus when moving barefoot.", "types": [ "LEGS" ], - "category": [ "BEAST", "URSINE", "FELINE", "LUPINE" ] + "category": [ "BEAST", "URSINE", "FELINE", "LUPINE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3432,7 +5070,14 @@ "leads_to": [ "LEAPING_LEGS", "FELINE_LEAP" ], "prereqs": [ "PADDED_FEET" ], "movecost_modifier": 0.88, - "category": [ "BATRACHIAN", "RABBIT", "FELINE", "LUPINE" ] + "category": [ "BATRACHIAN", "RABBIT", "FELINE", "LUPINE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3458,7 +5103,14 @@ "description": "You've gained a strong ability to leap from a standing position.", "spells_learned": [ [ "spell_short_leap", 1 ] ], "changes_to": [ "LEAPING_LEGS2" ], - "category": [ "BATRACHIAN", "RABBIT" ] + "category": [ "BATRACHIAN", "RABBIT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3470,7 +5122,14 @@ "description": "You've gained a strong ability to leap a significant distance from a standing position and crush whatever you land on.", "spells_learned": [ [ "spell_crushing_leap", 1 ] ], "threshreq": [ "THRESH_BATRACHIAN" ], - "category": [ "BATRACHIAN" ] + "category": [ "BATRACHIAN" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3491,7 +5150,14 @@ "attack_text_npc": "%1$s slashes %2$s with a talon", "chance": 20, "strength_damage": { "damage_type": "cut", "amount": 4 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3513,7 +5179,14 @@ "attack_text_npc": "%1$s kicks %2$s with their hooves", "chance": 15, "strength_damage": { "damage_type": "bash", "amount": 3 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3524,7 +5197,14 @@ "prereqs": [ "TOLERANCE" ], "prereqs2": [ "SAPROVORE" ], "category": [ "TROGLOBITE" ], - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3535,7 +5215,14 @@ "prereqs": [ "PAINRESIST" ], "prereqs2": [ "STOCKY_TROGLO" ], "threshreq": [ "THRESH_TROGLOBITE" ], - "category": [ "TROGLOBITE" ] + "category": [ "TROGLOBITE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3548,7 +5235,14 @@ "//": "Trading X for Y usually means reducing X to gain Y, so I switched the order.", "threshreq": [ "THRESH_TROGLOBITE" ], "category": [ "TROGLOBITE" ], - "passive_mods": { "str_mod": 2, "dex_mod": -2 } + "passive_mods": { "str_mod": 2, "dex_mod": -2 }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3557,7 +5251,14 @@ "points": 2, "description": "Your digestive system is specialized to allow you to consume decaying material. You can eat rotten food, albeit for less nutrition than usual.", "category": [ "TROGLOBITE", "CHIMERA", "GASTROPOD" ], - "flags": [ "IMMUNE_SPOIL" ] + "flags": [ "IMMUNE_SPOIL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3573,7 +5274,14 @@ "cancels": [ "GRAZER" ], "leads_to": [ "CHLOROMORPH" ], "category": [ "PLANT" ], - "flags": [ "IMMUNE_SPOIL" ] + "flags": [ "IMMUNE_SPOIL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -3588,7 +5296,14 @@ "prereqs2": [ "LIGHTEATER" ], "threshreq": [ "THRESH_BIRD" ], "cancels": [ "GOURMAND" ], - "category": [ "BIRD" ] + "category": [ "BIRD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3600,7 +5315,14 @@ "purifiable": false, "threshreq": [ "THRESH_MYCUS" ], "cancels": [ "GOURMAND", "BEAK", "BEAK_PECK", "BEAK_HUM" ], - "category": [ "MYCUS" ] + "category": [ "MYCUS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3613,7 +5335,14 @@ "cancels": [ "CARNIVORE", "CANNIBAL", "EATDEAD", "STRICT_HUMANITARIAN", "SAPIOVORE", "ANTIFRUIT", "MEATARIAN" ], "category": [ "CATTLE" ], "active": true, - "cost": 0 + "cost": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3626,7 +5355,14 @@ "cancels": [ "CARNIVORE", "CANNIBAL", "EATDEAD", "STRICT_HUMANITARIAN", "SAPIOVORE", "ANTIFRUIT", "MEATARIAN" ], "category": [ "CATTLE", "RABBIT" ], "active": true, - "cost": 0 + "cost": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3641,7 +5377,14 @@ "threshreq": [ "THRESH_TROGLOBITE", "THRESH_CHIMERA", "THRESH_RAPTOR", "THRESH_RAT", "THRESH_MOUSE", "THRESH_BATRACHIAN" ], "vitamins_absorb_multi": [ [ "all", [ [ "mutant_toxin", 0.25 ] ] ] ], "category": [ "TROGLOBITE", "RAPTOR", "RAT", "CHIMERA", "BATRACHIAN" ], - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3655,7 +5398,14 @@ "vitamins_absorb_multi": [ [ "all", [ [ "mutant_toxin", 0.25 ] ] ] ], "category": [ "RAT", "CHIMERA", "MOUSE" ], "flags": [ "IMMUNE_SPOIL" ], - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3669,7 +5419,14 @@ "prereqs2": [ "INCISORS" ], "threshreq": [ "THRESH_RAT", "THRESH_RABBIT" ], "category": [ "RAT", "RABBIT" ], - "active": true + "active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3683,7 +5440,14 @@ "prereqs": [ "PAWS", "PAWS_LARGE" ], "threshreq": [ "THRESH_LUPINE", "THRESH_URSINE" ], "category": [ "LUPINE", "URSINE" ], - "active": true + "active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3708,7 +5472,14 @@ "chance": 20, "base_damage": { "damage_type": "stab", "amount": 25 }, "strength_damage": { "damage_type": "stab", "amount": 1 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -3727,7 +5498,14 @@ "msg_transform": "Your hyper-metabolism starts burning up calories.", "active": true, "moves": 0 - } + }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3759,7 +5537,14 @@ "attack_text_npc": "%1$s headbutts %2$s with their horns", "chance": 20, "base_damage": [ { "damage_type": "stab", "amount": 3 }, { "damage_type": "bash", "amount": 3 } ] - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3779,7 +5564,14 @@ "attack_text_npc": "%1$s headbutts %2$s with their curled horns", "chance": 20, "base_damage": { "damage_type": "bash", "amount": 14 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3799,7 +5591,14 @@ "attack_text_npc": "%1$s stabs %2$s with their pointed horns", "chance": 22, "base_damage": { "damage_type": "stab", "amount": 24 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3819,7 +5618,14 @@ "attack_text_npc": "%1$s butts %2$s with their antlers", "chance": 20, "base_damage": { "damage_type": "bash", "amount": 4 } - } + }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3835,7 +5641,14 @@ "active": true, "starts_active": true, "restricts_gear": [ "head" ], - "allow_soft_gear": true + "allow_soft_gear": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -3846,7 +5659,14 @@ "prereqs": [ "FLEET" ], "types": [ "RUNNING" ], "category": [ "BIRD" ], - "movecost_flatground_modifier": 0.7 + "movecost_flatground_modifier": 0.7, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -3858,7 +5678,14 @@ "description": "You have a short, stubby tail, like a rabbit's. It serves no purpose.", "types": [ "TAIL" ], "changes_to": [ "TAIL_LONG", "TAIL_THICK", "TAIL_FIN", "TAIL_RAT", "TAIL_RAPTOR" ], - "category": [ "URSINE" ] + "category": [ "URSINE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3875,7 +5702,14 @@ "movecost_swim_modifier": 0.75, "restricts_gear": [ "leg_l", "leg_r" ], "allowed_items": [ "ALLOWS_TAIL" ], - "allow_soft_gear": true + "allow_soft_gear": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3892,7 +5726,14 @@ "restricts_gear": [ "leg_l", "leg_r" ], "allowed_items": [ "ALLOWS_TAIL" ], "allow_soft_gear": true, - "dodge_modifier": 2 + "dodge_modifier": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3908,7 +5749,14 @@ "restricts_gear": [ "leg_l", "leg_r" ], "allowed_items": [ "ALLOWS_TAIL" ], "allow_soft_gear": true, - "dodge_modifier": 1 + "dodge_modifier": 1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3924,7 +5772,14 @@ "restricts_gear": [ "leg_l", "leg_r" ], "allowed_items": [ "ALLOWS_TAIL" ], "allow_soft_gear": true, - "dodge_modifier": 2 + "dodge_modifier": 2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -3947,7 +5802,14 @@ "chance": 20, "base_damage": { "damage_type": "bash", "amount": 8 } }, - "dodge_modifier": 1 + "dodge_modifier": 1, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3963,7 +5825,14 @@ "restricts_gear": [ "leg_l", "leg_r" ], "allowed_items": [ "ALLOWS_TAIL" ], "allow_soft_gear": true, - "dodge_modifier": 3 + "dodge_modifier": 3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -3979,7 +5848,14 @@ "allowed_items": [ "ALLOWS_TAIL" ], "allow_soft_gear": true, "social_modifiers": { "lie": -20, "persuade": 10 }, - "dodge_modifier": 4 + "dodge_modifier": 4, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4000,7 +5876,14 @@ "attack_text_npc": "%1$s stings %2$s with their tail", "chance": 20, "base_damage": { "damage_type": "stab", "amount": 20 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4021,7 +5904,14 @@ "attack_text_npc": "%1$s clubs %2$s with their tail", "chance": 20, "base_damage": { "damage_type": "bash", "amount": 18 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4036,7 +5926,14 @@ "category": [ "URSINE" ], "active": true, "cost": 0, - "stomach_size_multiplier": 3.0 + "stomach_size_multiplier": 3.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4058,7 +5955,14 @@ "cancels": [ "FLIMSY", "FLIMSY2", "FLIMSY3", "GLASSJAW" ], "changes_to": [ "MUT_TOUGH2" ], "category": [ "URSINE", "CATTLE", "CHIMERA", "BEAST", "LIZARD", "MEDICAL", "BATRACHIAN" ], - "hp_modifier_secondary": 0.2 + "hp_modifier_secondary": 0.2, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4073,7 +5977,14 @@ "cancels": [ "FLIMSY", "FLIMSY2", "FLIMSY3", "GLASSJAW" ], "changes_to": [ "MUT_TOUGH3" ], "category": [ "URSINE", "CATTLE", "CHIMERA", "MEDICAL" ], - "hp_modifier_secondary": 0.3 + "hp_modifier_secondary": 0.3, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4087,7 +5998,14 @@ "threshreq": [ "THRESH_URSINE", "THRESH_CATTLE" ], "cancels": [ "FLIMSY", "FLIMSY2", "FLIMSY3", "GLASSJAW" ], "category": [ "URSINE", "CATTLE" ], - "hp_modifier_secondary": 0.4 + "hp_modifier_secondary": 0.4, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4095,7 +6013,14 @@ "name": { "str": "Pain Recovery" }, "points": 3, "description": "You recover from pain slightly faster than normal.", - "changes_to": [ "PAINREC2" ] + "changes_to": [ "PAINREC2" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4104,7 +6029,14 @@ "points": 5, "description": "You recover from pain faster than normal.", "prereqs": [ "PAINREC1" ], - "changes_to": [ "PAINREC3" ] + "changes_to": [ "PAINREC3" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4113,7 +6045,14 @@ "points": 8, "description": "You recover from pain much faster than normal.", "prereqs": [ "PAINREC2" ], - "category": [ "MEDICAL" ] + "category": [ "MEDICAL" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4130,7 +6069,14 @@ "leads_to": [ "MUT_TOUGH" ], "changes_to": [ "CENOBITE" ], "//": "MASOCHIST_MED and NOPAIN don't cancel each other. By design. Poor painless folks...", - "category": [ "MEDICAL" ] + "category": [ "MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4146,7 +6092,14 @@ "prereqs2": [ "PAINREC3", "ADDICTIVE" ], "threshreq": [ "THRESH_MEDICAL" ], "//": "CENOBITE and NOPAIN also don't cancel each other. By design. Poor painless cenobites...", - "category": [ "MEDICAL" ] + "category": [ "MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -4161,7 +6114,14 @@ "cancels": [ "MORE_PAIN", "MORE_PAIN2", "MORE_PAIN3" ], "threshreq": [ "THRESH_MEDICAL" ], "//": "MASOCHIST_MED, CENOBITE, and NOPAIN don't cancel each other. By design. Poor painless people...", - "category": [ "MEDICAL" ] + "category": [ "MEDICAL" ], + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4172,7 +6132,14 @@ "starting_trait": true, "//": "The MORE_PAIN mutations will always increase the pain you receive by at least 1.", "cancels": [ "PAINRESIST", "NOPAIN" ], - "changes_to": [ "MORE_PAIN2" ] + "changes_to": [ "MORE_PAIN2" ], + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4182,7 +6149,14 @@ "description": "Your body experiences pain out of proportion to the physical causes. Pain dealt to you is increased by 50%.", "prereqs": [ "MORE_PAIN" ], "cancels": [ "PAINRESIST", "NOPAIN" ], - "changes_to": [ "MORE_PAIN3" ] + "changes_to": [ "MORE_PAIN3" ], + "difficulty": [ + [ "combat", "very_hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4191,7 +6165,14 @@ "points": -5, "description": "Your body reacts cripplingly to any source of pain. Pain dealt to you is doubled.", "prereqs": [ "MORE_PAIN2" ], - "cancels": [ "PAINRESIST", "NOPAIN" ] + "cancels": [ "PAINRESIST", "NOPAIN" ], + "difficulty": [ + [ "combat", "very_hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4215,7 +6196,14 @@ ], "cancels": [ "PACIFIST", "MANSBESTFRIEND" ], "category": [ "BEAST", "RAPTOR", "CHIMERA", "LUPINE", "FELINE", "URSINE", "LIZARD", "SPIDER" ], - "flags": [ "PRED1" ] + "flags": [ "PRED1" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4240,7 +6228,14 @@ ], "cancels": [ "PACIFIST" ], "category": [ "BEAST", "RAPTOR", "CHIMERA", "LUPINE", "FELINE", "URSINE", "LIZARD", "SPIDER" ], - "flags": [ "PRED2" ] + "flags": [ "PRED2" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4268,7 +6263,14 @@ "cancels": [ "PACIFIST" ], "category": [ "BEAST", "RAPTOR", "CHIMERA", "LUPINE", "FELINE", "URSINE", "LIZARD", "SPIDER" ], "passive_mods": { "int_mod": -1 }, - "flags": [ "PRED3" ] + "flags": [ "PRED3" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4285,7 +6287,14 @@ "threshreq": [ "THRESH_BEAST", "THRESH_RAPTOR", "THRESH_CHIMERA", "THRESH_URSINE" ], "category": [ "BEAST", "RAPTOR", "CHIMERA", "URSINE" ], "passive_mods": { "int_mod": -3 }, - "flags": [ "PRED4" ] + "flags": [ "PRED4" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4301,7 +6310,14 @@ "threshreq": [ "THRESH_BEAST", "THRESH_RAPTOR", "THRESH_CHIMERA", "THRESH_URSINE", "THRESH_LIZARD", "THRESH_SPIDER" ], "cancels": [ "VEGETARIAN", "HERBIVORE", "RUMINANT", "GRAZER" ], "category": [ "BEAST", "RAPTOR", "CHIMERA", "URSINE", "LIZARD", "SPIDER" ], - "flags": [ "CANNIBAL" ] + "flags": [ "CANNIBAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4317,7 +6333,14 @@ "cancels": [ "PACIFIST" ], "threshreq": [ "THRESH_LUPINE" ], "category": [ "LUPINE" ], - "flags": [ "PRED3" ] + "flags": [ "PRED3" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4331,7 +6354,14 @@ "prereqs": [ "M_SKIN" ], "prereqs2": [ "M_DEPENDENT" ], "threshreq": [ "THRESH_MYCUS" ], - "category": [ "MYCUS" ] + "category": [ "MYCUS" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4344,7 +6374,14 @@ "types": [ "WINGS" ], "prereqs": [ "WINGS_STUB" ], "threshreq": [ "THRESH_BIRD" ], - "category": [ "BIRD" ] + "category": [ "BIRD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4363,7 +6400,14 @@ "fatigue": true, "hunger": true, "thirst": true, - "movecost_modifier": 0.75 + "movecost_modifier": 0.75, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4377,7 +6421,14 @@ "prereqs": [ "MOUTH_FLAPS" ], "cancels": [ "MANDIBLES" ], "category": [ "CEPHALOPOD" ], - "wet_protection": [ { "part": "mouth", "neutral": 4 } ] + "wet_protection": [ { "part": "mouth", "neutral": 4 } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -4405,7 +6456,14 @@ "body_part": "mouth", "chance": 22, "base_damage": { "damage_type": "cut", "amount": 12 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -4430,7 +6488,14 @@ "body_part": "mouth", "chance": 22, "base_damage": { "damage_type": "stab", "amount": 15 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -4449,7 +6514,14 @@ "movecost_flatground_modifier": 1.25, "restricts_gear": [ "leg_l", "leg_r", "foot_l", "foot_r" ], "noise_modifier": 0.25, - "destroys_gear": true + "destroys_gear": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -4459,7 +6531,14 @@ "description": "By pushing your whole 'foot' against the ground you are able to move across rough terrain without losing your 'footing'.", "prereqs": [ "GASTROPOD_FOOT" ], "threshreq": [ "THRESH_GASTROPOD" ], - "category": [ "GASTROPOD" ] + "category": [ "GASTROPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4473,7 +6552,14 @@ "cancels": [ "WEB_SPINNER" ], "leads_to": [ "MUCUS_SECRETION2" ], "changes_to": [ "SNAIL_TRAIL" ], - "category": [ "GASTROPOD" ] + "category": [ "GASTROPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4491,7 +6577,14 @@ "base_damage": { "damage_type": "acid", "amount": 6 } }, "prereqs": [ "MUCUS_SECRETION" ], - "category": [ "GASTROPOD" ] + "category": [ "GASTROPOD" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4507,7 +6600,14 @@ "cost": 20, "time": 100, "thirst": true, - "hunger": true + "hunger": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -4520,7 +6620,14 @@ "types": [ "EARS" ], "category": [ "BEAST", "CATTLE", "CHIMERA" ], "changes_to": [ "LUPINE_EARS" ], - "hearing_modifier": 1.5 + "hearing_modifier": 1.5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4532,7 +6639,14 @@ "description": "Your hearing has evolved further and is now on par with that of wolves. You can hear things significantly farther away.", "types": [ "EARS" ], "category": [ "LUPINE" ], - "hearing_modifier": 1.75 + "hearing_modifier": 1.75, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4543,7 +6657,14 @@ "description": "Your ears have extended into long, pointed, velvety ones, like those of a feline. You find it easier to tune in on sounds from afar.", "types": [ "EARS" ], "category": [ "FELINE" ], - "hearing_modifier": 1.25 + "hearing_modifier": 1.25, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4555,7 +6676,14 @@ "description": "Your ears have grown longer and rounder, much like those of a bear. You can hear things a little farther away.", "types": [ "EARS" ], "category": [ "URSINE" ], - "hearing_modifier": 1.25 + "hearing_modifier": 1.25, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4567,7 +6695,14 @@ "description": "Your upper earlobes have grown noticeably higher. Fortunately, they don't get in the way of your headgear, much. Unfortunately, they also don't seem to help your hearing any.", "valid": false, "types": [ "EARS" ], - "category": [ "ELFA" ] + "category": [ "ELFA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4580,7 +6715,14 @@ "valid": false, "types": [ "EARS" ], "category": [ "MOUSE", "RAT" ], - "hearing_modifier": 2.0 + "hearing_modifier": 2.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4589,7 +6731,14 @@ "points": 1, "description": "Your body excretes very fine amounts of a chemical which prevents you from sticking to webs. Walking through webs does not affect you at all.", "leads_to": [ "WEB_WEAVER" ], - "category": [ "SPIDER" ] + "category": [ "SPIDER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4601,7 +6750,14 @@ "threshreq": [ "THRESH_SPIDER" ], "cancels": [ "SLIMY" ], "changes_to": [ "WEB_WEAVER" ], - "category": [ "SPIDER" ] + "category": [ "SPIDER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4617,7 +6773,14 @@ "cost": 8, "time": 100, "hunger": true, - "thirst": true + "thirst": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4627,7 +6790,14 @@ "description": "Your webbing is easily strong enough to support your weight. You'll use it to descend any sheer drops you may encounter.", "prereqs": [ "WEB_WEAVER" ], "threshreq": [ "THRESH_SPIDER" ], - "category": [ "SPIDER" ] + "category": [ "SPIDER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4642,7 +6812,14 @@ "cost": 30, "hunger": true, "thirst": true, - "spawn_item": { "type": "rope_30", "message": "You spin a rope from your silk." } + "spawn_item": { "type": "rope_30", "message": "You spin a rope from your silk." }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4653,7 +6830,14 @@ "ugliness": 1, "description": "You have a handsome set of whiskers around your mouth. These make you more aware of vibrations in the air, and improve your ability to dodge very slightly.", "types": [ "WHISKERS" ], - "category": [ "FELINE", "RABBIT" ] + "category": [ "FELINE", "RABBIT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4665,7 +6849,14 @@ "description": "You have a set of prominent rodent-like whiskers around your mouth. These make you more aware of vibrations in the air, and improve your ability to dodge slightly.", "types": [ "WHISKERS" ], "prereqs": [ "MUZZLE_RAT" ], - "category": [ "RAT", "MOUSE" ] + "category": [ "RAT", "MOUSE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4687,7 +6878,14 @@ "bash": 1 } ], - "movecost_modifier": 1.05 + "movecost_modifier": 1.05, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4706,7 +6904,14 @@ "category": [ "URSINE", "CATTLE", "LIZARD", "CHIMERA" ], "passive_mods": { "str_mod": 2 }, "stomach_size_multiplier": 1.5, - "weight_capacity_modifier": 1.05 + "weight_capacity_modifier": 1.05, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4725,7 +6930,14 @@ "category": [ "URSINE", "CATTLE", "LIZARD", "CHIMERA" ], "passive_mods": { "str_mod": 2 }, "stomach_size_multiplier": 1.5, - "weight_capacity_modifier": 1.05 + "weight_capacity_modifier": 1.05, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4748,7 +6960,14 @@ "restricts_gear": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r", "hand_l", "hand_r", "head", "foot_l", "foot_r" ], "destroys_gear": true, "stomach_size_multiplier": 2.0, - "weight_capacity_modifier": 1.1 + "weight_capacity_modifier": 1.1, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -4770,7 +6989,14 @@ "restricts_gear": [ "torso", "leg_l", "leg_r", "arm_l", "arm_r", "hand_l", "hand_r", "head", "foot_l", "foot_r" ], "destroys_gear": true, "stomach_size_multiplier": 2.0, - "weight_capacity_modifier": 1.1 + "weight_capacity_modifier": 1.1, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4780,7 +7006,14 @@ "description": "Your muscles are a little stronger. +1 Strength.", "changes_to": [ "STR_UP_2" ], "category": [ "INSECT", "ELFA", "RAPTOR" ], - "passive_mods": { "str_mod": 1 } + "passive_mods": { "str_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4791,7 +7024,14 @@ "prereqs": [ "STR_UP" ], "changes_to": [ "STR_UP_3", "STR_ALPHA" ], "category": [ "LIZARD", "CATTLE", "PLANT", "ALPHA" ], - "passive_mods": { "str_mod": 2 } + "passive_mods": { "str_mod": 2 }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4804,7 +7044,14 @@ "changes_to": [ "STR_UP_4" ], "leads_to": [ "MUT_TOUGH" ], "category": [ "CHIMERA", "LUPINE", "TROGLOBITE" ], - "passive_mods": { "str_mod": 4 } + "passive_mods": { "str_mod": 4 }, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4818,7 +7065,14 @@ "leads_to": [ "MUT_TOUGH" ], "threshreq": [ "THRESH_BEAST", "THRESH_URSINE" ], "category": [ "BEAST", "URSINE" ], - "passive_mods": { "str_mod": 7 } + "passive_mods": { "str_mod": 7 }, + "difficulty": [ + [ "combat", "very_hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4830,7 +7084,14 @@ "prereqs": [ "STR_UP_2" ], "threshreq": [ "THRESH_ALPHA" ], "category": [ "ALPHA" ], - "passive_mods": { "str_mod": 2 } + "passive_mods": { "str_mod": 2 }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4840,7 +7101,14 @@ "description": "You are a little nimbler. +1 Dexterity.", "changes_to": [ "DEX_UP_2", "DEX_ALPHA" ], "category": [ "INSECT", "SLIME", "ALPHA" ], - "passive_mods": { "dex_mod": 1 } + "passive_mods": { "dex_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4851,7 +7119,14 @@ "prereqs": [ "DEX_UP" ], "changes_to": [ "DEX_UP_3" ], "category": [ "LIZARD", "SPIDER", "CHIMERA", "RAPTOR", "MOUSE", "RABBIT" ], - "passive_mods": { "dex_mod": 2 } + "passive_mods": { "dex_mod": 2 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4862,7 +7137,14 @@ "prereqs": [ "DEX_UP_2" ], "changes_to": [ "DEX_UP_4" ], "category": [ "BIRD", "ELFA", "FELINE" ], - "passive_mods": { "dex_mod": 4 } + "passive_mods": { "dex_mod": 4 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4873,7 +7155,14 @@ "prereqs": [ "DEX_UP_3" ], "threshreq": [ "THRESH_CEPHALOPOD", "THRESH_FISH" ], "category": [ "CEPHALOPOD", "FISH" ], - "passive_mods": { "dex_mod": 7 } + "passive_mods": { "dex_mod": 7 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4885,7 +7174,14 @@ "prereqs": [ "DEX_UP" ], "threshreq": [ "THRESH_ALPHA" ], "category": [ "ALPHA" ], - "passive_mods": { "dex_mod": 1 } + "passive_mods": { "dex_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4895,7 +7191,14 @@ "description": "You are a little smarter. +1 Intelligence.", "changes_to": [ "INT_UP_2", "INT_ALPHA", "INT_SLIME" ], "category": [ "SLIME", "ALPHA" ], - "passive_mods": { "int_mod": 1 } + "passive_mods": { "int_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4905,7 +7208,14 @@ "description": "You are smarter. +2 Intelligence.", "prereqs": [ "INT_UP" ], "changes_to": [ "INT_UP_3" ], - "passive_mods": { "int_mod": 2 } + "passive_mods": { "int_mod": 2 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4918,7 +7228,14 @@ "prereqs": [ "INT_UP_2" ], "changes_to": [ "INT_UP_4" ], "category": [ "ELFA" ], - "passive_mods": { "int_mod": 4 } + "passive_mods": { "int_mod": 4 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4931,7 +7248,14 @@ "prereqs": [ "INT_UP_3" ], "threshreq": [ "THRESH_CEPHALOPOD" ], "category": [ "CEPHALOPOD" ], - "passive_mods": { "int_mod": 7 } + "passive_mods": { "int_mod": 7 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -4943,7 +7267,14 @@ "prereqs": [ "INT_UP" ], "threshreq": [ "THRESH_ALPHA" ], "category": [ "ALPHA" ], - "passive_mods": { "int_mod": 1 } + "passive_mods": { "int_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4965,6 +7296,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth", "eyes" ], "bash": -3 } + ], + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "very_easy" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] ] }, { @@ -4975,7 +7313,14 @@ "description": "Your senses are a little keener. +1 Perception.", "changes_to": [ "PER_UP_2" ], "leads_to": [ "BIRD_EYE" ], - "passive_mods": { "per_mod": 1 } + "passive_mods": { "per_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4986,7 +7331,14 @@ "prereqs": [ "PER_UP" ], "changes_to": [ "PER_UP_3", "PER_ALPHA" ], "category": [ "ALPHA", "CHIMERA", "BATRACHIAN" ], - "passive_mods": { "per_mod": 2 } + "passive_mods": { "per_mod": 2 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -4997,7 +7349,14 @@ "prereqs": [ "PER_UP_2" ], "changes_to": [ "PER_UP_4" ], "category": [ "ELFA", "RAPTOR" ], - "passive_mods": { "per_mod": 4 } + "passive_mods": { "per_mod": 4 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5008,7 +7367,14 @@ "prereqs": [ "PER_UP_3" ], "threshreq": [ "THRESH_BIRD" ], "category": [ "BIRD" ], - "passive_mods": { "per_mod": 7 } + "passive_mods": { "per_mod": 7 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5020,7 +7386,14 @@ "prereqs": [ "PER_UP_2" ], "threshreq": [ "THRESH_ALPHA" ], "category": [ "ALPHA" ], - "passive_mods": { "per_mod": 2 } + "passive_mods": { "per_mod": 2 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5037,7 +7410,14 @@ "prereqs2": [ "AMORPHOUS" ], "threshreq": [ "THRESH_SLIME" ], "category": [ "SLIME" ], - "passive_mods": { "per_mod": -8 } + "passive_mods": { "per_mod": -8 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5055,7 +7435,14 @@ "threshreq": [ "THRESH_SLIME" ], "category": [ "SLIME" ], "flags": [ "EYE_MEMBRANE" ], - "passive_mods": { "per_mod": 5 } + "passive_mods": { "per_mod": 5 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5072,7 +7459,14 @@ "stomach_size_multiplier": 0.5, "hp_modifier": -0.05, "dodge_modifier": 1, - "weight_capacity_modifier": 0.8 + "weight_capacity_modifier": 0.8, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5091,7 +7485,14 @@ "hp_modifier": -0.3, "dodge_modifier": 2, "weight_capacity_modifier": 0.5, - "noise_modifier": 0.0 + "noise_modifier": 0.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5111,7 +7512,14 @@ "hp_modifier": -0.25, "dodge_modifier": 2, "weight_capacity_modifier": 0.7, - "noise_modifier": 0.0 + "noise_modifier": 0.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5126,7 +7534,14 @@ "category": [ "MOUSE" ], "stealth_modifier": 40, "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "SPEED", "multiply": 0.15 } ] } ], - "movecost_modifier": 0.75 + "movecost_modifier": 0.75, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5136,7 +7551,14 @@ "points": -1, "description": "Just thinking of mutagen (such a lovely word! 'Mutagen'. Perfect!) makes you thirsty. And you so love your new parts. You simply must have more mutagen!", "threshreq": [ "THRESH_MEDICAL", "THRESH_CHIMERA" ], - "category": [ "MEDICAL", "CHIMERA" ] + "category": [ "MEDICAL", "CHIMERA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5146,7 +7568,14 @@ "visibility": 3, "ugliness": 3, "description": "You have a pair of bumps on your skull.", - "changes_to": [ "HORNS", "ANTENNAE" ] + "changes_to": [ "HORNS", "ANTENNAE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5157,7 +7586,14 @@ "ugliness": 4, "description": "You have a flattened nose and thin slits for nostrils, giving you a lizard-like appearance. This makes breathing slightly difficult and increases mouth encumbrance by 10.", "encumbrance_always": [ [ "mouth", 10 ] ], - "category": [ "LIZARD", "CEPHALOPOD", "RAPTOR" ] + "category": [ "LIZARD", "CEPHALOPOD", "RAPTOR" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5167,7 +7603,14 @@ "visibility": 1, "ugliness": 3, "description": "Your tongue is forked, like that of a reptile. This has no effect.", - "category": [ "LIZARD", "RAPTOR" ] + "category": [ "LIZARD", "RAPTOR" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5178,7 +7621,14 @@ "ugliness": 3, "changes_to": [ "LONG_TONGUE2" ], "description": "Your tongue has lengthened and often extends far beyond your mouth. This has no effect.", - "category": [ "BATRACHIAN" ] + "category": [ "BATRACHIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5198,7 +7648,14 @@ "chance": 15, "base_damage": { "damage_type": "bash", "amount": 15 }, "strength_damage": { "damage_type": "bash", "amount": 2 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5210,7 +7667,14 @@ "description": "Your eyes bulge out several inches from your skull. This does not affect your vision in any way.", "leads_to": [ "MEMBRANE" ], "changes_to": [ "COMPOUND_EYES", "EYESTALKS1" ], - "category": [ "BATRACHIAN" ] + "category": [ "BATRACHIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5225,7 +7689,14 @@ "category": [ "GASTROPOD" ], "restricts_gear": [ "eyes" ], "allow_soft_gear": true, - "passive_mods": { "per_mod": 1 } + "passive_mods": { "per_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5239,7 +7710,14 @@ "category": [ "GASTROPOD" ], "armor": [ { "parts": "eyes", "cut": 3, "bash": 1 } ], "restricts_gear": [ "eyes" ], - "passive_mods": { "per_mod": 2 } + "passive_mods": { "per_mod": 2 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5250,7 +7728,14 @@ "ugliness": 6, "description": "Skin tabs and odd flaps of skin surround your mouth. They don't affect your eating, but are unpleasant to look at.", "category": [ "CHIMERA" ], - "changes_to": [ "MOUTH_TENTACLES", "MANDIBLES" ] + "changes_to": [ "MOUTH_TENTACLES", "MANDIBLES" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5260,7 +7745,14 @@ "visibility": 2, "ugliness": 2, "description": "You have a pair of stubby little wings projecting from your shoulderblades. They can be wiggled at will, but are useless.", - "changes_to": [ "WINGS_BIRD", "WINGS_BAT", "WINGS_INSECT", "WINGS_BUTTERFLY" ] + "changes_to": [ "WINGS_BIRD", "WINGS_BAT", "WINGS_INSECT", "WINGS_BUTTERFLY" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5272,7 +7764,14 @@ "description": "You have a pair of large, leathery wings. You can move them a little, but they are useless, and in fact put you off balance, reducing your ability to dodge slightly.", "types": [ "WINGS" ], "prereqs": [ "WINGS_STUB" ], - "dodge_modifier": -3 + "dodge_modifier": -3, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5292,7 +7791,14 @@ "restricts_gear": [ "torso" ], "social_modifiers": { "lie": 15, "persuade": 5, "intimidate": -20 }, "dodge_modifier": -4, - "movecost_modifier": 0.9 + "movecost_modifier": 0.9, + "difficulty": [ + [ "combat", "hard" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "mutation", @@ -5305,7 +7811,14 @@ "changes_to": [ "ALBINO" ], "leads_to": [ "TROGLO" ], "category": [ "LUPINE" ], - "types": [ "skin_tone" ] + "types": [ "skin_tone" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5316,7 +7829,14 @@ "ugliness": 2, "description": "Your skin is covered in a pattern of red spots.", "changes_to": [ "SORES" ], - "category": [ "BATRACHIAN" ] + "category": [ "BATRACHIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5330,7 +7850,14 @@ "prereqs": [ "SMELLY" ], "leads_to": [ "PHEROMONE_INSECT", "PHEROMONE_MAMMAL", "PHEROMONE_AMPHIBIAN" ], "cancels": [ "WEAKSCENT" ], - "category": [ "FISH", "BEAST", "SLIME", "CHIMERA", "URSINE", "BATRACHIAN" ] + "category": [ "FISH", "BEAST", "SLIME", "CHIMERA", "URSINE", "BATRACHIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5343,7 +7870,14 @@ "cancels": [ "PRETTY", "BEAUTIFUL", "BEAUTIFUL2", "BEAUTIFUL3" ], "prereqs": [ "UGLY" ], "changes_to": [ "DEFORMED2" ], - "category": [ "FISH", "CATTLE", "INSECT", "CEPHALOPOD", "FELINE", "LUPINE", "BATRACHIAN" ] + "category": [ "FISH", "CATTLE", "INSECT", "CEPHALOPOD", "FELINE", "LUPINE", "BATRACHIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5356,7 +7890,14 @@ "cancels": [ "PRETTY", "BEAUTIFUL", "BEAUTIFUL2", "BEAUTIFUL3" ], "prereqs": [ "DEFORMED" ], "changes_to": [ "DEFORMED3" ], - "category": [ "BEAST", "URSINE", "PLANT", "GASTROPOD" ] + "category": [ "BEAST", "URSINE", "PLANT", "GASTROPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5368,7 +7909,14 @@ "description": "Your visage is disgusting and liable to induce vomiting. People will not want to interact with you unless they have a very good reason to.", "cancels": [ "PRETTY", "BEAUTIFUL", "BEAUTIFUL2", "BEAUTIFUL3" ], "prereqs": [ "DEFORMED2" ], - "category": [ "SLIME", "RAT", "CHIMERA" ] + "category": [ "SLIME", "RAT", "CHIMERA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5381,7 +7929,14 @@ "cancels": [ "UGLY", "DEFORMED", "DEFORMED2", "DEFORMED3" ], "prereqs": [ "PRETTY" ], "category": [ "RABBIT" ], - "changes_to": [ "BEAUTIFUL2" ] + "changes_to": [ "BEAUTIFUL2" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ] }, { "type": "mutation", @@ -5393,7 +7948,14 @@ "description": "You are a vision of beauty. Some people will react very well to your looks, and most people will trust you immediately.", "cancels": [ "UGLY", "DEFORMED", "DEFORMED2", "DEFORMED3" ], "prereqs": [ "BEAUTIFUL" ], - "changes_to": [ "BEAUTIFUL3" ] + "changes_to": [ "BEAUTIFUL3" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ] }, { "type": "mutation", @@ -5405,7 +7967,14 @@ "description": "You are incredibly beautiful. People cannot help themselves due to your charms, and will do whatever they can to please you.", "cancels": [ "UGLY", "DEFORMED", "DEFORMED2", "DEFORMED3" ], "prereqs": [ "BEAUTIFUL2" ], - "category": [ "ELFA" ] + "category": [ "ELFA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_easy" ] + ] }, { "type": "mutation", @@ -5427,7 +7996,14 @@ "MUZZLE_RAT", "RABBIT_NOSE" ], - "category": [ "FELINE" ] + "category": [ "FELINE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5442,7 +8018,14 @@ "prereqs": [ "SNOUT" ], "category": [ "CATTLE" ], "restricts_gear": [ "mouth" ], - "social_modifiers": { "intimidate": 15 } + "social_modifiers": { "intimidate": 15 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5465,7 +8048,14 @@ "body_part": "mouth", "chance": 18, "base_damage": { "damage_type": "cut", "amount": 4 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5487,7 +8077,14 @@ "body_part": "mouth", "chance": 20, "base_damage": { "damage_type": "cut", "amount": 5 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5500,7 +8097,14 @@ "types": [ "MUZZLE" ], "prereqs": [ "SNOUT" ], "category": [ "RAT" ], - "restricts_gear": [ "mouth" ] + "restricts_gear": [ "mouth" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5523,7 +8127,14 @@ "body_part": "mouth", "chance": 18, "base_damage": { "damage_type": "stab", "amount": 18 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5536,7 +8147,14 @@ "description": "Your face and jaws have widened like a frogs. It looks hideous but it allows you to eat food whole.", "types": [ "MUZZLE" ], "category": [ "BATRACHIAN" ], - "consume_time_modifier": 0.25 + "consume_time_modifier": 0.25, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5554,7 +8172,14 @@ "threshreq": [ "THRESH_INSECT" ], "category": [ "INSECT" ], "active": true, - "restricts_gear": [ "mouth" ] + "restricts_gear": [ "mouth" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5568,7 +8193,14 @@ "movecost_modifier": 0.8, "attackcost_modifier": 0.8, "weight_capacity_modifier": 0.6, - "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "EXTRA_BASH", "multiply": 0.8 } ] } ] + "enchantments": [ { "condition": "ALWAYS", "values": [ { "value": "EXTRA_BASH", "multiply": 0.8 } ] } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5581,7 +8213,14 @@ "prereqs": [ "WEAKSTOMACH" ], "changes_to": [ "VOMITOUS", "EATPOISON" ], "category": [ "ALPHA" ], - "active": true + "active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5593,7 +8232,14 @@ "prereqs": [ "NAUSEA" ], "changes_to": [ "EATPOISON" ], "category": [ "SLIME", "RAT", "MEDICAL", "ELFA", "BATRACHIAN" ], - "active": true + "active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5605,7 +8251,14 @@ "changes_to": [ "PERSISTENCE_HUNTER2" ], "category": [ "LUPINE" ], "fatigue_modifier": -0.1, - "stamina_regen_modifier": 0.1 + "stamina_regen_modifier": 0.1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5618,7 +8271,14 @@ "threshreq": [ "THRESH_LUPINE" ], "category": [ "LUPINE" ], "fatigue_modifier": -0.2, - "stamina_regen_modifier": 0.2 + "stamina_regen_modifier": 0.2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5631,7 +8291,14 @@ "changes_to": [ "HUNGER2", "MET_RAT" ], "category": [ "RAT", "ALPHA", "MEDICAL", "ELFA", "BEAST", "SLIME", "RAPTOR", "CHIMERA", "MOUSE", "RABBIT" ], "metabolism_modifier": 0.5, - "stamina_regen_modifier": 0.1 + "stamina_regen_modifier": 0.1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5649,7 +8316,14 @@ "healing_resting": 0.5, "fatigue_modifier": 0.5, "fatigue_regen_modifier": 0.333, - "metabolism_modifier": 0.333 + "metabolism_modifier": 0.333, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5662,7 +8336,14 @@ "types": [ "METABOLISM" ], "category": [ "BEAST", "SLIME", "RAPTOR" ], "metabolism_modifier": 1.0, - "stamina_regen_modifier": 0.3 + "stamina_regen_modifier": 0.3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5675,7 +8356,14 @@ "types": [ "METABOLISM" ], "category": [ "CHIMERA" ], "metabolism_modifier": 2.0, - "stamina_regen_modifier": 0.5 + "stamina_regen_modifier": 0.5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5687,7 +8375,14 @@ "changes_to": [ "THIRST2" ], "cancels": [ "NO_THIRST" ], "category": [ "SLIME", "CEPHALOPOD", "CHIMERA", "ELFA", "GASTROPOD" ], - "thirst_modifier": 0.5 + "thirst_modifier": 0.5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5699,7 +8394,14 @@ "changes_to": [ "THIRST3" ], "cancels": [ "NO_THIRST" ], "category": [ "FISH", "SLIME", "CEPHALOPOD" ], - "thirst_modifier": 1.0 + "thirst_modifier": 1.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5710,7 +8412,14 @@ "cancels": [ "NO_THIRST" ], "prereqs": [ "THIRST2" ], "category": [ "BATRACHIAN" ], - "thirst_modifier": 2.0 + "thirst_modifier": 2.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5722,7 +8431,14 @@ "category": [ "MOUSE" ], "cancels": [ "THIRST", "THIRST2", "THIRST3" ], "flags": [ "NO_THIRST" ], - "purifiable": false + "purifiable": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5732,7 +8448,14 @@ "description": "You could probably sleep through a firefight.", "valid": false, "prereqs": [ "HEAVYSLEEPER" ], - "category": [ "BEAST", "LUPINE" ] + "category": [ "BEAST", "LUPINE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5743,7 +8466,14 @@ "prereqs": [ "SLEEPY" ], "types": [ "SLEEP" ], "category": [ "FELINE" ], - "fatigue_modifier": 1.0 + "fatigue_modifier": 1.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5756,7 +8486,14 @@ "changes_to": [ "ROT2" ], "category": [ "ELFA" ], "healing_awake": -0.002, - "healing_resting": -0.25 + "healing_resting": -0.25, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5769,7 +8506,14 @@ "prereqs": [ "ROT1" ], "changes_to": [ "ROT3" ], "category": [ "CHIMERA" ], - "healing_awake": -0.02 + "healing_awake": -0.02, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5781,7 +8525,14 @@ "types": [ "HEALING" ], "prereqs": [ "ROT2" ], "category": [ "ALPHA" ], - "healing_awake": -0.08 + "healing_awake": -0.08, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5792,7 +8543,14 @@ "prereqs": [ "ALBINO" ], "prereqs2": [ "TROGLO2", "TROGLO3" ], "category": [ "TROGLOBITE" ], - "types": [ "skin_tone" ] + "types": [ "skin_tone" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5803,7 +8561,14 @@ "ugliness": 6, "description": "Your extremities are covered in painful sores. The pain is worse when they are covered in clothing.", "prereqs": [ "SPOTS" ], - "category": [ "SLIME" ] + "category": [ "SLIME" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5813,7 +8578,14 @@ "description": "Sunlight makes you uncomfortable. If you are outdoors and the weather is Sunny, you suffer -1 to all stats.", "cancels": [ "SUNLIGHT_DEPENDENT" ], "changes_to": [ "TROGLO2" ], - "category": [ "LIZARD", "BEAST", "INSECT", "SLIME", "SPIDER", "BATRACHIAN" ] + "category": [ "LIZARD", "BEAST", "INSECT", "SLIME", "SPIDER", "BATRACHIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5824,7 +8596,14 @@ "cancels": [ "SUNLIGHT_DEPENDENT" ], "prereqs": [ "TROGLO" ], "changes_to": [ "TROGLO3" ], - "category": [ "RAT" ] + "category": [ "RAT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5834,7 +8613,14 @@ "description": "Sunlight makes you extremely uncomfortable, resulting in large penalties to all stats.", "cancels": [ "SUNLIGHT_DEPENDENT" ], "prereqs": [ "TROGLO2" ], - "category": [ "TROGLOBITE" ] + "category": [ "TROGLOBITE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5848,7 +8634,14 @@ "category": [ "LIZARD", "FISH", "SLIME", "BATRACHIAN" ], "wet_protection": [ { "part": "hand_l", "good": 3 }, { "part": "hand_r", "good": 3 } ], "encumbrance_covered": [ [ "hand_l", 50 ], [ "hand_r", 50 ] ], - "passive_mods": { "dex_mod": -1 } + "passive_mods": { "dex_mod": -1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5866,7 +8659,14 @@ "prereqs": [ "CLAWS", "CLAWS_RETRACT", "CLAWS_RAT" ], "cancels": [ "TALONS" ], "changes_to": [ "PAWS_LARGE" ], - "category": [ "LUPINE", "RAT", "FELINE" ] + "category": [ "LUPINE", "RAT", "FELINE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "hard" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5893,7 +8693,14 @@ "types": [ "HANDS" ], "prereqs": [ "PAWS" ], "cancels": [ "TALONS" ], - "category": [ "BEAST", "URSINE" ] + "category": [ "BEAST", "URSINE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "very_hard" ], + [ "environment", "hard" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -5916,7 +8723,14 @@ "body_part": "mouth", "chance": 15, "base_damage": { "damage_type": "stab", "amount": 15 } - } + }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5944,6 +8758,13 @@ "chance": 15, "hardcoded_effect": true } + ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] ] }, { @@ -5965,7 +8786,14 @@ "wet_protection": [ { "part": "mouth", "ignored": 2 } ], "active": true, "restricts_gear": [ "mouth" ], - "destroys_gear": true + "destroys_gear": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -5975,7 +8803,14 @@ "mixed_effect": true, "description": "Your DNA has been damaged in a way that causes you to continually develop more mutations.", "changes_to": [ "CHAOTIC" ], - "category": [ "SLIME", "MEDICAL", "CHIMERA" ] + "category": [ "SLIME", "MEDICAL", "CHIMERA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5985,7 +8820,14 @@ "purifiable": false, "description": "Your body alters itself rapidly, and without your intervention or conscious control.", "prereqs": [ "UNSTABLE", "MUT_JUNKIE" ], - "category": [ "CHIMERA" ] + "category": [ "CHIMERA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -5995,7 +8837,14 @@ "bodytemp_modifiers": [ 250, 250 ], "description": "Your body has become radioactive! You continuously emit low levels of radiation, which slowly contaminates the world around you.", "changes_to": [ "RADIOACTIVE2" ], - "category": [ "SLIME" ] + "category": [ "SLIME" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6006,7 +8855,14 @@ "description": "Your body has become radioactive! You continuously emit moderate levels of radiation, which contaminates the world around you.", "prereqs": [ "RADIOACTIVE1" ], "changes_to": [ "RADIOACTIVE3" ], - "category": [ "ELFA" ] + "category": [ "ELFA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6015,7 +8871,14 @@ "points": -6, "bodytemp_modifiers": [ 1500, 1500 ], "description": "Your body has become radioactive! You continuously emit heavy levels of radiation, making your surroundings unlivable.", - "prereqs": [ "RADIOACTIVE2" ] + "prereqs": [ "RADIOACTIVE2" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "very_hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6039,6 +8902,13 @@ { "part": "hand_l", "neutral": 2, "good": 3 }, { "part": "hand_r", "neutral": 2, "good": 3 }, { "part": "torso", "neutral": 14, "good": 26 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] ] }, { @@ -6070,6 +8940,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth", "eyes" ], "acid": 2 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] ] }, { @@ -6093,7 +8970,14 @@ "bash": 4 } ], - "movecost_modifier": 1.25 + "movecost_modifier": 1.25, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6113,7 +8997,14 @@ "active": true, "cost": 40, "hunger": true, - "thirst": true + "thirst": true, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6123,7 +9014,14 @@ "description": "Your body's ability to digest meat is severely hampered. Eating meat has a good chance of making you vomit it back up; even if you manage to keep it down, its nutritional value is greatly reduced.", "cancels": [ "CARNIVORE", "CANNIBAL", "EATDEAD", "STRICT_HUMANITARIAN", "SAPIOVORE", "ANTIFRUIT", "MEATARIAN" ], "prereqs": [ "VEGETARIAN" ], - "leads_to": [ "RUMINANT" ] + "leads_to": [ "RUMINANT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6134,7 +9032,14 @@ "cancels": [ "VEGETARIAN", "HERBIVORE", "RUMINANT", "GRAZER" ], "leads_to": [ "SAPROVORE" ], "category": [ "LIZARD", "SPIDER", "CHIMERA", "RAPTOR", "FELINE", "BATRACHIAN" ], - "vitamin_rates": [ [ "vitC", -1200 ] ] + "vitamin_rates": [ [ "vitC", -1200 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6145,7 +9050,14 @@ "types": [ "RUNNING" ], "changes_to": [ "PONDEROUS2" ], "category": [ "URSINE" ], - "movecost_modifier": 1.1 + "movecost_modifier": 1.1, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6157,7 +9069,14 @@ "prereqs": [ "PONDEROUS1" ], "changes_to": [ "PONDEROUS3" ], "category": [ "CATTLE" ], - "movecost_modifier": 1.2 + "movecost_modifier": 1.2, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6168,7 +9087,14 @@ "types": [ "RUNNING" ], "prereqs": [ "PONDEROUS2" ], "category": [ "PLANT" ], - "movecost_modifier": 1.3 + "movecost_modifier": 1.3, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6177,7 +9103,14 @@ "points": -5, "description": "You feel very sluggish when not in direct sunlight. You suffer a 5% drop in speed when in shade, and a 10% drop in speed when in the dark.", "cancels": [ "TROGLO", "TROGLO2", "TROGLO3" ], - "category": [ "PLANT" ] + "category": [ "PLANT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6191,7 +9124,14 @@ "prereqs": [ "PLANTSKIN", "BARK" ], "changes_to": [ "VINES2" ], "category": [ "PLANT" ], - "encumbrance_always": [ [ "torso", 10 ] ] + "encumbrance_always": [ [ "torso", 10 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6214,7 +9154,14 @@ "hardcoded_effect": true } ], - "encumbrance_always": [ [ "torso", 10 ] ] + "encumbrance_always": [ [ "torso", 10 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6241,6 +9188,13 @@ "chance": 1, "hardcoded_effect": true } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] ] }, { @@ -6252,7 +9206,14 @@ "ugliness": 2, "description": "Roots have started growing from your leaf-like hair. They don't seem to do much.", "prereqs": [ "LEAVES" ], - "category": [ "PLANT", "ELFA" ] + "category": [ "PLANT", "ELFA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -6267,7 +9228,14 @@ "changes_to": [ "ROOTS2" ], "cancels": [ "LEG_TENTACLES", "HOOVES" ], "category": [ "PLANT" ], - "encumbrance_covered": [ [ "foot_l", 10 ], [ "foot_r", 10 ] ] + "encumbrance_covered": [ [ "foot_l", 10 ], [ "foot_r", 10 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6285,7 +9253,14 @@ "threshreq": [ "THRESH_PLANT" ], "changes_to": [ "ROOTS3" ], "category": [ "PLANT" ], - "encumbrance_covered": [ [ "foot_l", 10 ], [ "foot_r", 10 ] ] + "encumbrance_covered": [ [ "foot_l", 10 ], [ "foot_r", 10 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6300,7 +9275,14 @@ "prereqs2": [ "SAPROPHAGE" ], "threshreq": [ "THRESH_PLANT" ], "category": [ "PLANT" ], - "encumbrance_covered": [ [ "foot_l", 10 ], [ "foot_r", 10 ] ] + "encumbrance_covered": [ [ "foot_l", 10 ], [ "foot_r", 10 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6319,7 +9301,14 @@ "cancels": [ "SMELLY", "SMELLY2" ], "category": [ "PLANT" ], "scent_type": "sc_flower", - "encumbrance_covered": [ [ "foot_l", 10 ], [ "foot_r", 10 ] ] + "encumbrance_covered": [ [ "foot_l", 10 ], [ "foot_r", 10 ] ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6331,7 +9320,14 @@ "threshreq": [ "THRESH_PLANT", "THRESH_ELFA" ], "category": [ "PLANT", "ELFA" ], "active": true, - "cost": 0 + "cost": 0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6344,7 +9340,14 @@ "types": [ "METABOLISM" ], "category": [ "FISH", "CEPHALOPOD", "SPIDER", "GASTROPOD" ], "temperature_speed_modifier": 0.2, - "metabolism_modifier": -0.333 + "metabolism_modifier": -0.333, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6358,7 +9361,14 @@ "types": [ "METABOLISM" ], "category": [ "RAPTOR", "PLANT" ], "temperature_speed_modifier": 0.333, - "metabolism_modifier": -0.5 + "metabolism_modifier": -0.5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6372,7 +9382,14 @@ "types": [ "METABOLISM" ], "category": [ "INSECT", "LIZARD", "BATRACHIAN" ], "temperature_speed_modifier": 0.5, - "metabolism_modifier": -0.5 + "metabolism_modifier": -0.5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6387,7 +9404,14 @@ "types": [ "METABOLISM" ], "category": [ "LIZARD", "PLANT", "BATRACHIAN" ], "temperature_speed_modifier": 0.5, - "metabolism_modifier": -0.5 + "metabolism_modifier": -0.5, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6398,7 +9422,14 @@ "description": "You have a growling, rough voice. Persuading NPCs will be more difficult, but threatening them will be easier.", "changes_to": [ "SNARL" ], "category": [ "RAT", "URSINE", "LUPINE" ], - "social_modifiers": { "persuade": -20, "lie": -10, "intimidate": 10 } + "social_modifiers": { "persuade": -20, "lie": -10, "intimidate": 10 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -6409,7 +9440,14 @@ "description": "You have a low, croaking voice, like an aged grandparent. Persuading NPCs will be easier, but threatening them will be more difficult.", "cancels": [ "SNARL" ], "category": [ "BATRACHIAN" ], - "social_modifiers": { "persuade": 10, "lie": 10, "intimidate": -10 } + "social_modifiers": { "persuade": 10, "lie": 10, "intimidate": -10 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "easy" ] + ] }, { "type": "mutation", @@ -6420,7 +9458,14 @@ "description": "You have a threatening snarl in your voice. Persuading NPCs will be near impossible, but threatening them will be much easier.", "prereqs": [ "GROWL" ], "category": [ "BEAST", "CHIMERA", "FELINE", "LUPINE" ], - "social_modifiers": { "persuade": -60, "lie": -40, "intimidate": 20 } + "social_modifiers": { "persuade": -60, "lie": -40, "intimidate": 20 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6430,7 +9475,14 @@ "points": -1, "description": "You hiss when speaking. Persuading NPCs will be more difficult, but threatening them will be easier.", "category": [ "LIZARD", "RAPTOR" ], - "social_modifiers": { "persuade": -20, "lie": -10, "intimidate": 10 } + "social_modifiers": { "persuade": -20, "lie": -10, "intimidate": 10 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -6439,7 +9491,14 @@ "points": -2, "description": "You occasionally shout uncontrollably.", "changes_to": [ "SHOUT2" ], - "category": [ "RAPTOR" ] + "category": [ "RAPTOR" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6449,7 +9508,14 @@ "description": "You sometimes scream uncontrollably.", "prereqs": [ "SHOUT1" ], "changes_to": [ "SHOUT3" ], - "category": [ "BEAST" ] + "category": [ "BEAST" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6458,7 +9524,14 @@ "points": -4, "description": "You frequently let out a piercing howl.", "prereqs": [ "SHOUT2" ], - "category": [ "CHIMERA", "LUPINE" ] + "category": [ "CHIMERA", "LUPINE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "hard" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6476,7 +9549,14 @@ { "part": "hand_r", "neutral": 10 } ], "encumbrance_always": [ [ "arm_l", 20 ], [ "arm_r", 20 ] ], - "armor": [ { "parts": [ "arm_l", "arm_r" ], "bash": 1 } ] + "armor": [ { "parts": [ "arm_l", "arm_r" ], "bash": 1 } ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -6494,7 +9574,14 @@ "threshreq": [ "THRESH_INSECT", "THRESH_SPIDER" ], "category": [ "INSECT", "SPIDER" ], "restricts_gear": [ "torso" ], - "passive_mods": { "dex_mod": -2 } + "passive_mods": { "dex_mod": -2 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6510,7 +9597,14 @@ "prereqs": [ "INSECT_ARMS" ], "prereqs2": [ "ANTENNAE" ], "threshreq": [ "THRESH_INSECT" ], - "category": [ "INSECT" ] + "category": [ "INSECT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6530,7 +9624,14 @@ "threshreq": [ "THRESH_SPIDER" ], "category": [ "SPIDER" ], "restricts_gear": [ "torso" ], - "passive_mods": { "dex_mod": -4 } + "passive_mods": { "dex_mod": -4 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "very_hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6546,7 +9647,14 @@ "prereqs": [ "ARACHNID_ARMS" ], "prereqs2": [ "POISONOUS", "POISONOUS2", "WEB_RAPPEL" ], "threshreq": [ "THRESH_SPIDER" ], - "category": [ "SPIDER" ] + "category": [ "SPIDER" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6585,7 +9693,14 @@ "hardcoded_effect": true } ], - "passive_mods": { "dex_mod": 1 } + "passive_mods": { "dex_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6623,7 +9738,14 @@ "hardcoded_effect": true } ], - "passive_mods": { "dex_mod": 1 } + "passive_mods": { "dex_mod": 1 }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6661,7 +9783,14 @@ "hardcoded_effect": true } ], - "passive_mods": { "dex_mod": 1 } + "passive_mods": { "dex_mod": 1 }, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6678,7 +9807,14 @@ "wet_protection": [ { "part": "torso", "ignored": 26 } ], "restricts_gear": [ "torso" ], "destroys_gear": true, - "armor": [ { "parts": "torso", "bash": 6, "cut": 14, "bullet": 4 } ] + "armor": [ { "parts": "torso", "bash": 6, "cut": 14, "bullet": 4 } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -6700,7 +9836,14 @@ "active": true, "restricts_gear": [ "torso" ], "destroys_gear": true, - "armor": [ { "parts": "torso", "bash": 9, "cut": 17, "bullet": 6 } ] + "armor": [ { "parts": "torso", "bash": 9, "cut": 17, "bullet": 6 } ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -6708,6 +9851,7 @@ "name": { "str": "Nacreous Shell" }, "points": -1, "visibility": 10, + "//": "Is this a mistake? Ugliness should probably be positive for this trait", "ugliness": -2, "mixed_effect": true, "description": "Your protective shell has developed increased strength and hardness and a mother of pearl sheen.", @@ -6719,7 +9863,14 @@ "active": true, "restricts_gear": [ "torso" ], "destroys_gear": true, - "armor": [ { "parts": "torso", "bash": 18, "cut": 32, "bullet": 9 } ] + "armor": [ { "parts": "torso", "bash": 18, "cut": 32, "bullet": 9 } ], + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6742,7 +9893,14 @@ ], "restricts_gear": [ "foot_l", "foot_r" ], "movecost_modifier": 1.2, - "noise_modifier": 0.0 + "noise_modifier": 0.0, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -6755,7 +9913,14 @@ "description": "Your lower tentacles have developed suckers. They make land movement marginally more tiring, but do a good job of keeping you set in place.", "prereqs": [ "LEG_TENTACLES" ], "threshreq": [ "THRESH_CEPHALOPOD" ], - "category": [ "CEPHALOPOD" ] + "category": [ "CEPHALOPOD" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -6765,7 +9930,14 @@ "description": "You sometimes look back on your days before your tail came in. But you're better now.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6775,7 +9947,14 @@ "description": "You feel bad for all the creatures that don't carry their home on their backs.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6785,7 +9964,14 @@ "description": "You're sure you'll fly someday. In the meantime, there are still nests to build.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6795,7 +9981,14 @@ "description": "Ninety percent of the planet, and it's yours to explore. And colonize. And enjoy. What was that about a surface?", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6805,7 +9998,14 @@ "description": "It's about time you grew out. Now that you've matured, it is time to make something of yourself.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6815,7 +10015,14 @@ "description": "Stalking prey, eating well, and lying in the sun. Mmm, all you could ever desire.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6825,7 +10032,14 @@ "description": "You're the perfect candidate to lead a pack.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6836,7 +10050,14 @@ "cancels": [ "CARNIVORE" ], "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6846,7 +10067,14 @@ "description": "Civilization collapsed? Great! You and your kin will never have to worry about a slaughterhouse again.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6856,7 +10084,14 @@ "description": "It would be good to be a queen, having workers constantly servicing your every need… but how would you keep them in line?", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6866,7 +10101,14 @@ "description": "Well, you still have those other walking flowers--and the mushrooms, too--to deal with. But you'll manage.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6876,7 +10118,14 @@ "description": "What was that old advertisement? 'Paint the planet'? That might be a good long-term goal, but for now…", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6886,7 +10135,14 @@ "description": "Not much point to rebuilding up in that horribly bright, roofless wasteland. Now that you've become accustomed to your new digs, there's the beginning of a great empire right here, underground.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6896,7 +10152,14 @@ "description": "Strange aeons, true, but Death seems to be slacking, and you are doing just fine.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6906,7 +10169,14 @@ "description": "Well, maybe you'll just have to make your own worldwide web.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6916,7 +10186,14 @@ "description": "Hey. Civilization fell. You're still around. 'Rat' just isn't respectful.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6926,7 +10203,14 @@ "description": "After all those experiments, what's a few more, hmm?", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6936,7 +10220,14 @@ "description": "You're the perfect candidate to tidy this mess.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6946,7 +10237,14 @@ "description": "You are the tree under which humankind will shelter during these dark times.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6956,7 +10254,14 @@ "description": "You can't tell what you are anymore. Everything and yet nothing, like you weren't meant to exist. But you do, and you're a force, no matter what happens.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6966,7 +10271,14 @@ "description": "The chance to undo not one but TWO extinction events. You're confident you'll do fine.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6976,7 +10288,14 @@ "description": "A perfect ambush predator, if only there were less competition.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6986,7 +10305,14 @@ "description": "So much food, everywhere! And nobody's even guarding it anymore! These are good times.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -6998,7 +10324,14 @@ "purifiable": false, "threshold": true, "category": [ "MARLOSS" ], - "flags": [ "mycus" ] + "flags": [ "mycus" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7009,7 +10342,14 @@ "valid": false, "purifiable": false, "threshold": true, - "flags": [ "mycus" ] + "flags": [ "mycus" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7019,7 +10359,14 @@ "flags": [ "ACID_IMMUNE" ], "description": "Your mutated flesh is immune to the damaging effects of acid.", "threshreq": [ "THRESH_INSECT", "THRESH_CHIMERA", "THRESH_MEDICAL", "THRESH_SLIME" ], - "category": [ "INSECT", "CHIMERA", "MEDICAL", "SLIME" ] + "category": [ "INSECT", "CHIMERA", "MEDICAL", "SLIME" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7029,7 +10376,14 @@ "description": "Your body has developed a wonderful defense mechanism. Instead of normal blood, you bleed a strong molecular acid which will damage any creature foolish enough to harm you.", "prereqs": [ "ACIDPROOF" ], "threshreq": [ "THRESH_INSECT", "THRESH_CHIMERA", "THRESH_MEDICAL", "THRESH_SLIME" ], - "category": [ "INSECT", "CHIMERA", "MEDICAL", "SLIME" ] + "category": [ "INSECT", "CHIMERA", "MEDICAL", "SLIME" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7037,7 +10391,14 @@ "name": { "str": "Pyromaniac" }, "points": -2, "description": "You have an unhealthy obsession with fire, and you get anxious if you don't light them every now and then or stand near them often. However, you gain a mood bonus from doing so.", - "starting_trait": true + "starting_trait": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7048,7 +10409,14 @@ "category": [ "FISH", "BATRACHIAN" ], "threshreq": [ "THRESH_FISH", "THRESH_BATRACHIAN" ], "movecost_swim_modifier": 0.45, - "purifiable": false + "purifiable": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "easy" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7062,7 +10430,14 @@ "threshreq": [ "THRESH_FISH", "THRESH_BATRACHIAN" ], "armor": [ { "parts": "eyes", "cut": 3, "bash": 1 } ], "flags": [ "EYE_MEMBRANE", "SEESLEEP" ], - "active": true + "active": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -7072,7 +10447,14 @@ "description": "Falling asleep underwater is easy for you, and you spend less time asleep when you rest there. You can also eat underwater, though you can't drink.", "prereqs": [ "SEESLEEP" ], "category": [ "FISH", "BATRACHIAN" ], - "threshreq": [ "THRESH_FISH" ] + "threshreq": [ "THRESH_FISH" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7082,7 +10464,14 @@ "description": "Your flesh is highly poisonous, and creatures that bite you will receive a nasty surprise.", "category": [ "FISH", "GASTROPOD" ], "threshreq": [ "THRESH_FISH" ], - "purifiable": false + "purifiable": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7092,7 +10481,14 @@ "description": "Your gills and skin are highly permeable to moisture, and you can hydrate your body through osmosis. While submerged in fresh water, any thirst you might have will be slaked.", "prereqs": [ "GILLS" ], "category": [ "FISH", "BATRACHIAN" ], - "threshreq": [ "THRESH_FISH", "THRESH_BATRACHIAN" ] + "threshreq": [ "THRESH_FISH", "THRESH_BATRACHIAN" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7101,7 +10497,14 @@ "points": 2, "description": "A network of jelly-filled electroreceptors, like that of a shark, have grown throughout your face and nose. They are very sensitive to magnetic fields, allowing you to see robots and creatures charged with electricity through walls, but being shocked will seriously mess you up.", "category": [ "FISH" ], - "mixed_effect": true + "mixed_effect": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7125,7 +10528,14 @@ "chance": 20, "base_damage": { "damage_type": "stab", "amount": 25 } }, - "purifiable": false + "purifiable": false, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "very_hard" ] + ] }, { "type": "mutation", @@ -7135,7 +10545,14 @@ "description": "You are a duly sworn law enforcement officer, with jurisdiction throughout the New England region thanks to interstate agreements. Whether that means anything now is another question.", "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7145,7 +10562,14 @@ "description": "You are a duly sworn law enforcement officer, with jurisdiction throughout the New England region thanks to interstate agreements. Whether that means anything now is another question.", "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7155,7 +10579,14 @@ "description": "You are a cybernetically-resurrected law enforcement officer, with jurisdiction throughout the New England region thanks to interstate agreements. Whether you can do for the law what the law did for you is another question.", "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7165,7 +10596,14 @@ "description": "Thou art a lewede man, a lowly cowherd, though where thi catel been thou hast not ynn certain.", "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7175,7 +10613,14 @@ "description": "You are a duly sworn law enforcement investigator, with jurisdiction throughout the New England region thanks to interstate agreements. Whether your shield means anything now is another question.", "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7186,7 +10631,14 @@ "cancels": [ "PROF_HUB01_ANCILLIARY" ], "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7197,7 +10649,14 @@ "cancels": [ "PROF_FED" ], "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7207,7 +10666,14 @@ "description": "You are the true Foodperson, some might think Foodperson is just a mascot, but you know better. You are Foodperson, the mask has become your face; you are real, and the only thing standing between this world and oblivion is you.", "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7218,7 +10684,14 @@ "description": "You were just through with the administrative formalities for your residency when the Cataclysm struck. \"Your\" hospital was overrun and evacuated, but there's always work for a good doctor.", "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7226,7 +10699,14 @@ "name": { "str": "Skater" }, "points": 1, "description": "You are skilled in maneuvering on skates. You suffer lower penalties to dodging and are less likely to fall down if hit in melee combat while you're wearing rollerskates or rollerblades.", - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7255,7 +10735,14 @@ "style_zui_quan" ], "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7284,7 +10771,14 @@ ], "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "very_easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7295,7 +10789,14 @@ "valid": false, "initial_ma_styles": [ "style_boxing" ], "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7305,7 +10806,14 @@ "description": "You're trained in proper operation of the Autodoc, an advanced machine used for surgical procedures. Operations involving it will be moderately more likely to succeed.", "valid": false, "purifiable": false, - "profession": true + "profession": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7317,7 +10825,14 @@ "valid": false, "purifiable": false, "profession": true, - "cancels": [ "ILLITERATE" ] + "cancels": [ "ILLITERATE" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7585,7 +11100,14 @@ "name": { "str": "Squeamish" }, "points": -1, "starting_trait": true, - "description": "You can't even think about putting filthy clothes on yourself, especially from zombies' corpses." + "description": "You can't even think about putting filthy clothes on yourself, especially from zombies' corpses.", + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7622,7 +11144,14 @@ "description": "You're too adventurous for your own good. The more time you spend somewhere, the unhappier it makes you to be there.", "starting_trait": true, "changes_to": [ "NOMAD2" ], - "category": [ "BIRD", "FISH", "CHIMERA" ] + "category": [ "BIRD", "FISH", "CHIMERA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7632,7 +11161,14 @@ "description": "You can't bear to stay still for long. Your morale will suffer unless you constantly explore new territory.", "prereqs": [ "NOMAD" ], "changes_to": [ "NOMAD3" ], - "category": [ "BIRD", "FISH", "CHIMERA" ] + "category": [ "BIRD", "FISH", "CHIMERA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7641,7 +11177,14 @@ "points": -4, "description": "Spending any amount of time in familiar places makes you miserable. Must. Keep. Moving.", "prereqs": [ "NOMAD2" ], - "category": [ "CHIMERA" ] + "category": [ "CHIMERA" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7650,7 +11193,14 @@ "points": -8, "description": "Whether from personal choice or childhood trauma, traveling with vehicles is off-limits to you, even if your life depended on it.", "starting_trait": true, - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "hard" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7660,7 +11210,14 @@ "description": "You have fast reflexes, allowing you to dodge attacks more easily.", "starting_trait": true, "dodge_modifier": 3, - "category": [ "FELINE" ] + "category": [ "FELINE" ], + "difficulty": [ + [ "combat", "easy" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7670,7 +11227,14 @@ "description": "You really want to eat some carrots. Welcome to the Lagomorpha family.", "valid": false, "purifiable": false, - "threshold": true + "threshold": true, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7683,7 +11247,14 @@ "valid": false, "types": [ "EARS" ], "category": [ "RABBIT" ], - "hearing_modifier": 1.8 + "hearing_modifier": 1.8, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7695,7 +11266,14 @@ "description": "Your stubby tail has become fuzzy and more round. It looks adorable, but doesn't seem to serve another purpose beyond that.", "types": [ "TAIL" ], "cancels": [ "TAIL_STUB" ], - "category": [ "RABBIT" ] + "category": [ "RABBIT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7715,6 +11293,13 @@ "parts": [ "torso", "head", "arm_l", "arm_r", "hand_l", "hand_r", "leg_l", "leg_r", "foot_l", "foot_r", "mouth" ], "bash": 1 } + ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "easy" ], + [ "social", "hard" ] ] }, { @@ -7738,7 +11323,14 @@ "attack_text_npc": "%1$s kicks %2$s with their large feet", "chance": 15, "strength_damage": { "damage_type": "bash", "amount": 1.5 } - } + }, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "hard" ] + ] }, { "type": "mutation", @@ -7750,7 +11342,14 @@ "description": "Your nose has morphed into a cute bunny nose, along with the snout. It's extremely twitchy too.", "types": [ "MUZZLE" ], "prereqs": [ "SNOUT" ], - "category": [ "RABBIT" ] + "category": [ "RABBIT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7765,7 +11364,14 @@ "types": [ "HANDS" ], "prereqs": [ "NAILS" ], "cancels": [ "TALONS" ], - "category": [ "RABBIT" ] + "category": [ "RABBIT" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "hard" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7784,7 +11390,14 @@ "points": 0, "description": "Your ability to feel or express emotion has been greatly hampered.", "category": [ "MEDICAL" ], - "threshreq": [ "THRESH_MEDICAL" ] + "threshreq": [ "THRESH_MEDICAL" ], + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] + ] }, { "type": "mutation", @@ -7792,7 +11405,13 @@ "name": { "str": "Booming Voice" }, "points": 0, "description": "You know how to project your voice. You are able to shout much louder than the average person.", - "valid": false + "valid": false, + "difficulty": [ + [ "combat", "normal" ], + [ "mobility", "normal" ], + [ "crafting", "normal" ], + [ "environment", "normal" ], + [ "social", "normal" ] }, { "type": "mutation", From ac4bd8e5941b698224977b97e4b25f635cafcaf6 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Sat, 20 Nov 2021 02:21:34 -0500 Subject: [PATCH 15/20] Difficulty info: corrections to scenario and hobbies Co-authored-by: Termineitor244 --- data/json/hobbies.json | 12 +++++------ data/json/scenarios.json | 46 ++++++++++++++++++++-------------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/data/json/hobbies.json b/data/json/hobbies.json index 27f04ee4008ee..bb496e3283e1f 100644 --- a/data/json/hobbies.json +++ b/data/json/hobbies.json @@ -361,7 +361,7 @@ "points": 3, "skills": [ { "level": 3, "name": "dodge" }, { "level": 2, "name": "throw" }, { "level": 1, "name": "swimming" } ], "difficulty": [ - [ "combat", "normal" ], + [ "combat", "easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "normal" ], @@ -741,7 +741,7 @@ "traits": [ "PROF_SKATER" ], "difficulty": [ [ "combat", "normal" ], - [ "mobility", "normal" ], + [ "mobility", "easy" ], [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "normal" ] @@ -906,7 +906,7 @@ "points": 2, "skills": [ { "level": 2, "name": "throw" }, { "level": 2, "name": "dodge" }, { "level": 1, "name": "swimming" } ], "difficulty": [ - [ "combat", "normal" ], + [ "combat", "easy" ], [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "normal" ], @@ -1046,7 +1046,7 @@ "traits": [ "PROF_SKATER" ], "difficulty": [ [ "combat", "easy" ], - [ "mobility", "normal" ], + [ "mobility", "easy" ], [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "normal" ] @@ -1063,7 +1063,7 @@ "traits": [ "PROF_SKATER" ], "difficulty": [ [ "combat", "easy" ], - [ "mobility", "normal" ], + [ "mobility", "easy" ], [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "normal" ] @@ -1197,7 +1197,7 @@ [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "normal" ], - [ "social", "easy" ] + [ "social", "normal" ] ] }, { diff --git a/data/json/scenarios.json b/data/json/scenarios.json index 9f0109a3b25c8..eb837a4fc8444 100644 --- a/data/json/scenarios.json +++ b/data/json/scenarios.json @@ -133,7 +133,7 @@ [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "easy" ], + [ "environment", "very_easy" ], [ "social", "normal" ] ], "description": "You've found some distant safe place, devoid of the living dead. Looks like you're on your own…", @@ -195,7 +195,7 @@ [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "hard" ], [ "social", "normal" ] ], "forced_traits": [ "HAS_NEMESIS" ], @@ -233,10 +233,10 @@ "name": "Challenge - Fungal Infection", "points": -8, "difficulty": [ - [ "combat", "normal" ], - [ "mobility", "normal" ], + [ "combat", "hard" ], + [ "mobility", "hard" ], [ "crafting", "normal" ], - [ "environment", "hard" ], + [ "environment", "very_hard" ], [ "social", "normal" ] ], "description": "You feel spores crawling beneath your skin. It's only a matter of time.", @@ -473,7 +473,7 @@ [ "combat", "hard" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "hard" ], + [ "environment", "very_hard" ], [ "social", "normal" ] ], "description": "It is the winter after zero hour. As you were scavenging for food and a warm place to stay at, you heard the sound of lots of movement nearby.", @@ -500,7 +500,7 @@ "name": "The Next Summer", "points": 0, "difficulty": [ - [ "combat", "normal" ], + [ "combat", "very_hard" ], [ "mobility", "normal" ], [ "crafting", "normal" ], [ "environment", "hard" ], @@ -531,10 +531,10 @@ "name": "Sheltered", "points": -3, "difficulty": [ - [ "combat", "normal" ], + [ "combat", "hard" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "hard" ], [ "social", "normal" ] ], "description": "When the apocalypse broke out, you were funneled into a nearby shelter. Here you have lived, never leaving, lest the unknowns of the outside world hurt you. Supplies are running low, and for the first time since the Cataclysm, you will be forced to face the outside world.", @@ -571,7 +571,7 @@ "points": -4, "difficulty": [ [ "combat", "normal" ], - [ "mobility", "normal" ], + [ "mobility", "hard" ], [ "crafting", "normal" ], [ "environment", "hard" ], [ "social", "normal" ] @@ -598,7 +598,7 @@ "points": -6, "difficulty": [ [ "combat", "normal" ], - [ "mobility", "normal" ], + [ "mobility", "hard" ], [ "crafting", "normal" ], [ "environment", "very_hard" ], [ "social", "normal" ] @@ -624,9 +624,9 @@ "name": "Challenge - Mi-Go Camp", "points": -8, "difficulty": [ - [ "combat", "normal" ], - [ "mobility", "normal" ], - [ "crafting", "normal" ], + [ "combat", "hard" ], + [ "mobility", "hard" ], + [ "crafting", "hard" ], [ "environment", "very_hard" ], [ "social", "normal" ] ], @@ -645,7 +645,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "normal" ], + [ "crafting", "hard" ], [ "environment", "normal" ], [ "social", "normal" ] ], @@ -720,9 +720,9 @@ "points": 2, "difficulty": [ [ "combat", "normal" ], - [ "mobility", "normal" ], + [ "mobility", "very_easy" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "very_easy" ], [ "social", "normal" ] ], "description": "While the world was falling apart someone called to order some of Foodplace's delicious food™ and they sent you to do the delivery. You're not sure about much, but one thing is certain: that delicious food™ is going to get delivered even if that's the last thing you do!", @@ -761,7 +761,7 @@ "difficulty": [ [ "combat", "normal" ], [ "mobility", "normal" ], - [ "crafting", "normal" ], + [ "crafting", "hard" ], [ "environment", "normal" ], [ "social", "normal" ] ], @@ -779,7 +779,7 @@ [ "combat", "normal" ], [ "mobility", "normal" ], [ "crafting", "normal" ], - [ "environment", "normal" ], + [ "environment", "hard" ], [ "social", "normal" ] ], "description": "While being transported to a different military base, the pilot lost control of the helicopter and crashed in the middle of nowhere. Hopefully some of the soldiers that were with you also survived the accident.", @@ -826,9 +826,9 @@ "name": "Overrun", "points": 3, "difficulty": [ - [ "combat", "normal" ], - [ "mobility", "normal" ], - [ "crafting", "normal" ], + [ "combat", "easy" ], + [ "mobility", "hard" ], + [ "crafting", "easy" ], [ "environment", "hard" ], [ "social", "normal" ] ], @@ -914,7 +914,7 @@ "points": -4, "difficulty": [ [ "combat", "normal" ], - [ "mobility", "normal" ], + [ "mobility", "hard" ], [ "crafting", "normal" ], [ "environment", "hard" ], [ "social", "normal" ] From 887b5420d2f18d44ea4864b33308fb2826a1f179 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Mon, 29 Nov 2021 22:16:15 -0500 Subject: [PATCH 16/20] Difficulty info: switch to new lang string extraction --- lang/string_extractor/parser.py | 6 +++++- lang/string_extractor/parsers/difficulty_impact.py | 5 +++++ lang/string_extractor/parsers/difficulty_opt.py | 5 +++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 lang/string_extractor/parsers/difficulty_impact.py create mode 100644 lang/string_extractor/parsers/difficulty_opt.py diff --git a/lang/string_extractor/parser.py b/lang/string_extractor/parser.py index 08e0d6b1e68f8..5a1fa6411a3dc 100644 --- a/lang/string_extractor/parser.py +++ b/lang/string_extractor/parser.py @@ -8,6 +8,8 @@ from .parsers.construction import parse_construction from .parsers.construction_category import parse_construction_category from .parsers.construction_group import parse_construction_group +from .parsers.difficulty_impact import parse_difficulty_impact +from .parsers.difficulty_opt import parse_difficulty_opt from .parsers.dream import parse_dream from .parsers.effect_on_condition import parse_effect_on_condition from .parsers.effect_type import parse_effect_type @@ -108,8 +110,10 @@ def dummy_parser(json, origin): "construction": parse_construction, "construction_category": parse_construction_category, "construction_group": parse_construction_group, - "dream": parse_dream, + "difficulty_impact": parse_difficulty_impact, + "difficulty_opt": parse_difficulty_opt, "disease_type": dummy_parser, + "dream": parse_dream, "effect_on_condition": parse_effect_on_condition, "effect_type": parse_effect_type, "emit": dummy_parser, diff --git a/lang/string_extractor/parsers/difficulty_impact.py b/lang/string_extractor/parsers/difficulty_impact.py new file mode 100644 index 0000000000000..defb47ddcb422 --- /dev/null +++ b/lang/string_extractor/parsers/difficulty_impact.py @@ -0,0 +1,5 @@ +from ..write_text import write_text + + +def parse_difficulty_impact(json, origin): + write_text(json["name"], origin, comment="Aspect of gameplay affected by difficulty") diff --git a/lang/string_extractor/parsers/difficulty_opt.py b/lang/string_extractor/parsers/difficulty_opt.py new file mode 100644 index 0000000000000..2285af0087cc5 --- /dev/null +++ b/lang/string_extractor/parsers/difficulty_opt.py @@ -0,0 +1,5 @@ +from ..write_text import write_text + + +def parse_difficulty_opt(json, origin): + write_text(json["name"], origin, comment="Difficulty rating") From 2f68f9fcc2f1384139f742a8983c0672c8e22718 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Mon, 29 Nov 2021 22:58:25 -0500 Subject: [PATCH 17/20] Update lang/string_extractor/parsers/difficulty_impact.py Co-authored-by: BrettDong --- lang/string_extractor/parsers/difficulty_impact.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lang/string_extractor/parsers/difficulty_impact.py b/lang/string_extractor/parsers/difficulty_impact.py index defb47ddcb422..50f7fbdef5f4a 100644 --- a/lang/string_extractor/parsers/difficulty_impact.py +++ b/lang/string_extractor/parsers/difficulty_impact.py @@ -2,4 +2,5 @@ def parse_difficulty_impact(json, origin): - write_text(json["name"], origin, comment="Aspect of gameplay affected by difficulty") + write_text(json["name"], origin, + comment="Aspect of gameplay affected by difficulty") From ef7a0673b7b51062a9315d7cba6e8af8d93bd923 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Mon, 29 Nov 2021 23:26:17 -0500 Subject: [PATCH 18/20] Update lang/string_extractor/parsers/difficulty_impact.py Co-authored-by: Binrui Dong --- lang/string_extractor/parsers/difficulty_impact.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lang/string_extractor/parsers/difficulty_impact.py b/lang/string_extractor/parsers/difficulty_impact.py index 50f7fbdef5f4a..ea84bf2f1e162 100644 --- a/lang/string_extractor/parsers/difficulty_impact.py +++ b/lang/string_extractor/parsers/difficulty_impact.py @@ -2,5 +2,7 @@ def parse_difficulty_impact(json, origin): - write_text(json["name"], origin, - comment="Aspect of gameplay affected by difficulty") + comment = ["Aspect of gameplay affected by difficulty"] + if "//" in json: + comment.append(json["//"]) + write_text(json["name"], origin, comment=comment) From 6ffe4462f2bcea558d351ce3d5cd81c12f2eba37 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Wed, 1 Dec 2021 10:54:16 -0500 Subject: [PATCH 19/20] Post-merge fix: missing bracket in mutations.json --- data/json/mutations/mutations.json | 1 + 1 file changed, 1 insertion(+) diff --git a/data/json/mutations/mutations.json b/data/json/mutations/mutations.json index 03514cc9b5c05..2241cc36c030c 100644 --- a/data/json/mutations/mutations.json +++ b/data/json/mutations/mutations.json @@ -11412,6 +11412,7 @@ [ "crafting", "normal" ], [ "environment", "normal" ], [ "social", "normal" ] + ] }, { "type": "mutation", From d618217e295990c90c0418195cc706dd213cb949 Mon Sep 17 00:00:00 2001 From: David Seguin Date: Fri, 10 Dec 2021 00:08:20 -0500 Subject: [PATCH 20/20] Difficulty info: minor adjustment to overview ratings --- src/newcharacter.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 221fe756cfb43..1d7b8ae4b9935 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -359,8 +359,10 @@ static std::pair get_diff_val_for( const std::set val = get_diff_val_for( hob, impact ); - diff += val.first; - count += val.second; + if( val.first != 0 ) { + diff += val.first; + count += val.second; + } } diff = count > 0 ? ( diff / count ) : 0.0f; @@ -375,8 +377,10 @@ static std::pair get_diff_val_for( const std::unordered_set val = get_diff_val_for( mut, impact ); - diff += val.first; - count += val.second; + if( val.first != 0 ) { + diff += val.first; + count += val.second; + } } diff = count > 0 ? ( diff / count ) : 0.0f;