From 74f70fc7c9ed6cca44da94f50810cabcedf441ea Mon Sep 17 00:00:00 2001 From: eso Date: Fri, 1 Dec 2023 23:22:29 -0800 Subject: [PATCH 01/13] restore and repair code removed in "Remove city horde spawning (#49279)" This reverts and modifies commit 76612800d24a1b06fe49b7dcd93f94247ed75beb. --- src/overmap.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/overmap.cpp b/src/overmap.cpp index 64fd00e1cc891..39b29b9b1af90 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -6591,6 +6591,19 @@ void overmap::place_specials( overmap_special_batch &enabled_specials ) void overmap::place_mongroups() { + // Cities are full of zombies + for( city &elem : cities ) { + if( get_option( "WANDER_SPAWNS" ) ) { + if( !one_in( 16 ) || elem.size > 5 ) { + mongroup m( GROUP_ZOMBIE, project_to( project_combine( elem.pos_om, + tripoint_om_omt( elem.pos, 0 ) ) ), elem.size * 80 ); + m.horde = true; + m.wander( *this ); + add_mon_group( m ); + } + } + } + if( get_option( "DISABLE_ANIMAL_CLASH" ) ) { // Figure out where swamps are, and place swamp monsters for( int x = 3; x < OMAPX - 3; x += 7 ) { From 80eff2981b99ddfd58493445f81001a73008d382 Mon Sep 17 00:00:00 2001 From: eso Date: Sat, 2 Dec 2023 04:58:01 -0800 Subject: [PATCH 02/13] optionify city horde spawns, distribute hordes without wandering enabled --- data/core/game_balance.json | 21 +++++++++++++++++++++ src/overmap.cpp | 16 ++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/data/core/game_balance.json b/data/core/game_balance.json index 72044ac7310dc..e6dd7ff350b42 100644 --- a/data/core/game_balance.json +++ b/data/core/game_balance.json @@ -104,6 +104,27 @@ "stype": "bool", "value": false }, + { + "type": "EXTERNAL_OPTION", + "name": "SPAWN_CITY_HORDE_THRESHOLD", + "info": "Minimum city size to guarantee extra zombies are spawned in cities. 0 means all cities spawn extra zombies. Negative values disable extra city zombies.", + "stype": "int", + "value": 4 + }, + { + "type": "EXTERNAL_OPTION", + "name": "SPAWN_CITY_HORDE_SMALL_CITY_CHANCE", + "info": "Probability of a city smaller than SPAWN_HORDE_THRESHOLD having city zombies spawned, express in 'one in x' fashion .", + "stype": "int", + "value": 16 + }, + { + "type": "EXTERNAL_OPTION", + "name": "SPAWN_CITY_HORDE_SCALAR", + "info": "A scaling factor that determines how many zombies are spawned in cites, multiplied by city size, when city hordes are indicated.", + "stype": "int", + "value": 80 + }, { "type": "EXTERNAL_OPTION", "name": "SPAWN_ANIMAL_DENSITY", diff --git a/src/overmap.cpp b/src/overmap.cpp index 39b29b9b1af90..a1c061b009c93 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -6591,14 +6591,18 @@ void overmap::place_specials( overmap_special_batch &enabled_specials ) void overmap::place_mongroups() { - // Cities are full of zombies + // Cities can be full of zombies for( city &elem : cities ) { - if( get_option( "WANDER_SPAWNS" ) ) { - if( !one_in( 16 ) || elem.size > 5 ) { + if( get_option( "SPAWN_CITY_HORDE_THRESHOLD" ) > -1 ) { + if( !one_in( get_option( "SPAWN_CITY_HORDE_SMALL_CITY_CHANCE" ) ) || + elem.size > get_option( "SPAWN_CITY_HORDE_THRESHOLD" ) ) { + mongroup m( GROUP_ZOMBIE, project_to( project_combine( elem.pos_om, - tripoint_om_omt( elem.pos, 0 ) ) ), elem.size * 80 ); - m.horde = true; - m.wander( *this ); + tripoint_om_omt( elem.pos, 0 ) ) ), elem.size * get_option( "SPAWN_CITY_HORDE_SCALAR" ) ); + if( get_option( "WANDER_SPAWNS" ) ) { + m.horde = true; + m.wander( *this ); + } add_mon_group( m ); } } From 93e456ce22844d159fc534be35dcb6b022a253dc Mon Sep 17 00:00:00 2001 From: eso Date: Sat, 2 Dec 2023 08:44:59 -0800 Subject: [PATCH 03/13] some debug options for seeing hordes on the map --- src/overmap_ui.cpp | 4 +++- src/sdltiles.cpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/overmap_ui.cpp b/src/overmap_ui.cpp index 3737fb96c5f5a..ea5c9ade4f6f7 100644 --- a/src/overmap_ui.cpp +++ b/src/overmap_ui.cpp @@ -94,6 +94,7 @@ static const oter_str_id oter_unexplored( "unexplored" ); static const oter_type_str_id oter_type_forest_trail( "forest_trail" ); static const trait_id trait_DEBUG_NIGHTVISION( "DEBUG_NIGHTVISION" ); +static const trait_id trait_DEBUG_CLAIRVOYANCE( "DEBUG_CLAIRVOYANCE" ); #if defined(__ANDROID__) #include @@ -783,7 +784,8 @@ static void draw_ascii( ter_sym = "!"; } else if( blink && showhordes && overmap_buffer.get_horde_size( omp ) >= HORDE_VISIBILITY_SIZE && - get_and_assign_los( los, player_character, omp, sight_points ) ) { + ( get_and_assign_los( los, player_character, omp, sight_points ) || + uistate.overmap_debug_mongroup || trait_DEBUG_CLAIRVOYANCE ) ) { // Display Hordes only when within player line-of-sight ter_color = c_green; ter_sym = overmap_buffer.get_horde_size( omp ) > HORDE_VISIBILITY_SIZE * 2 ? "Z" : "z"; diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index 7e3c9d97aa647..76ce7d0afa588 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -100,6 +100,7 @@ static const oter_type_str_id oter_type_forest_trail( "forest_trail" ); static const trait_id trait_DEBUG_NIGHTVISION( "DEBUG_NIGHTVISION" ); +static const trait_id trait_DEBUG_CLAIRVOYANCE( "DEBUG_CLAIRVOYANCE" ); //*********************************** //Globals * @@ -891,7 +892,8 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt ¢er_abs_ const tripoint_abs_omt omp = origin + point( col, row ); const bool see = overmap_buffer.seen( omp ); - const bool los = see && you.overmap_los( omp, sight_points ); + const bool los = see && ( you.overmap_los( omp, sight_points ) || uistate.overmap_debug_mongroup || + trait_DEBUG_CLAIRVOYANCE ); // the full string from the ter_id including _north etc. std::string id; int rotation = 0; From 8424b295cc40075bab894e2953188732d8d07226 Mon Sep 17 00:00:00 2001 From: eso Date: Sat, 2 Dec 2023 08:45:30 -0800 Subject: [PATCH 04/13] clamp effective horde size for tileset purposes --- src/sdltiles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index 76ce7d0afa588..149039f813cf1 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -939,7 +939,7 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt ¢er_abs_ // a little bit of hardcoded fallbacks for hordes if( find_tile_with_season( id ) ) { // NOLINTNEXTLINE(cata-translate-string-literal) - draw_from_id_string( string_format( "overmap_horde_%d", horde_size ), + draw_from_id_string( string_format( "overmap_horde_%d", horde_size < 10 ? horde_size : 10 ), omp.raw(), 0, 0, lit_level::LIT, false ); } else { switch( horde_size ) { From a81b43a216a029660994bf916f7c8db9c2205a80 Mon Sep 17 00:00:00 2001 From: eso Date: Sat, 2 Dec 2023 08:46:54 -0800 Subject: [PATCH 05/13] distribute zombies across the city area evenly, only on roads also some more data-driven logic --- data/core/game_balance.json | 11 ++++++++-- src/overmap.cpp | 42 +++++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/data/core/game_balance.json b/data/core/game_balance.json index e6dd7ff350b42..943db9ec4db87 100644 --- a/data/core/game_balance.json +++ b/data/core/game_balance.json @@ -118,12 +118,19 @@ "stype": "int", "value": 16 }, + { + "type": "EXTERNAL_OPTION", + "name": "SPAWN_CITY_HORDE_SPREAD", + "info": "A scaling factor that determines how far from the center of cities extra zombies spawn, multiplied by city size, when city hordes are indicated.", + "stype": "float", + "value": 1.5 + }, { "type": "EXTERNAL_OPTION", "name": "SPAWN_CITY_HORDE_SCALAR", "info": "A scaling factor that determines how many zombies are spawned in cites, multiplied by city size, when city hordes are indicated.", - "stype": "int", - "value": 80 + "stype": "float", + "value": 80.0 }, { "type": "EXTERNAL_OPTION", diff --git a/src/overmap.cpp b/src/overmap.cpp index a1c061b009c93..4e981f7a2280a 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -6593,18 +6593,42 @@ void overmap::place_mongroups() { // Cities can be full of zombies for( city &elem : cities ) { - if( get_option( "SPAWN_CITY_HORDE_THRESHOLD" ) > -1 ) { - if( !one_in( get_option( "SPAWN_CITY_HORDE_SMALL_CITY_CHANCE" ) ) || - elem.size > get_option( "SPAWN_CITY_HORDE_THRESHOLD" ) ) { + if( get_option( "SPAWN_CITY_HORDE_THRESHOLD" ) > -1 && + ( elem.size > get_option( "SPAWN_CITY_HORDE_THRESHOLD" ) || + !one_in( get_option( "SPAWN_CITY_HORDE_SMALL_CITY_CHANCE" ) ) ) ) { + + int desired_zombies = elem.size * get_option( "SPAWN_CITY_HORDE_SCALAR" ) * + get_option( "SPAWN_DENSITY" ); + + tripoint_abs_omt city_center = project_combine( elem.pos_om, tripoint_om_omt( elem.pos, 0 ) ); + + std::vector submap_list; + for( tripoint_abs_omt const &t : points_in_radius( city_center, elem.size * 1.5, 0 ) ) { + if( overmap_buffer.ter( t )->get_type_id() == oter_type_road ) { + tripoint_abs_sm this_sm = project_to( t ); + submap_list.push_back( this_sm ); + submap_list.push_back( this_sm + point( 0, 1 ) ); + submap_list.push_back( this_sm + point( 1, 0 ) ); + submap_list.push_back( this_sm + point( 1, 1 ) ); + } + } - mongroup m( GROUP_ZOMBIE, project_to( project_combine( elem.pos_om, - tripoint_om_omt( elem.pos, 0 ) ) ), elem.size * get_option( "SPAWN_CITY_HORDE_SCALAR" ) ); - if( get_option( "WANDER_SPAWNS" ) ) { - m.horde = true; - m.wander( *this ); + while( desired_zombies > 0 ) { + std::shuffle( submap_list.begin(), submap_list.end(), rng_get_engine() ); + for( tripoint_abs_sm const &s : submap_list ) { + if( desired_zombies <= 0 ) { + break; + } + mongroup m( GROUP_ZOMBIE, s, desired_zombies > 10 ? 10 : desired_zombies ); + if( get_option( "WANDER_SPAWNS" ) ) { + m.horde = true; + m.wander( *this ); + } + add_mon_group( m ); + desired_zombies = - 10; } - add_mon_group( m ); } + } } From da2233cdf016574b7e6a3038ea07ddbda3ba8517 Mon Sep 17 00:00:00 2001 From: eso Date: Sat, 2 Dec 2023 17:19:18 -0800 Subject: [PATCH 06/13] restructure for readability, comments, and preventing infinite loops --- src/overmap.cpp | 98 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/src/overmap.cpp b/src/overmap.cpp index 4e981f7a2280a..4b0abd0c9d952 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -5203,8 +5203,7 @@ void overmap::place_cities() tripoint_om_omt p; city tmp; - - + tmp.pos_om = pos(); if( use_random_cities ) { // randomly make some cities smaller or larger int size = rng( op_city_size - 1, op_city_size + city_size_adjust ); @@ -6592,43 +6591,74 @@ void overmap::place_specials( overmap_special_batch &enabled_specials ) void overmap::place_mongroups() { // Cities can be full of zombies - for( city &elem : cities ) { - if( get_option( "SPAWN_CITY_HORDE_THRESHOLD" ) > -1 && - ( elem.size > get_option( "SPAWN_CITY_HORDE_THRESHOLD" ) || - !one_in( get_option( "SPAWN_CITY_HORDE_SMALL_CITY_CHANCE" ) ) ) ) { - - int desired_zombies = elem.size * get_option( "SPAWN_CITY_HORDE_SCALAR" ) * - get_option( "SPAWN_DENSITY" ); - - tripoint_abs_omt city_center = project_combine( elem.pos_om, tripoint_om_omt( elem.pos, 0 ) ); - - std::vector submap_list; - for( tripoint_abs_omt const &t : points_in_radius( city_center, elem.size * 1.5, 0 ) ) { - if( overmap_buffer.ter( t )->get_type_id() == oter_type_road ) { - tripoint_abs_sm this_sm = project_to( t ); - submap_list.push_back( this_sm ); - submap_list.push_back( this_sm + point( 0, 1 ) ); - submap_list.push_back( this_sm + point( 1, 0 ) ); - submap_list.push_back( this_sm + point( 1, 1 ) ); + int city_spawn_threshold = get_option( "SPAWN_CITY_HORDE_THRESHOLD" ); + if( city_spawn_threshold > -1 ) { + int city_spawn_chance = get_option( "SPAWN_CITY_HORDE_SMALL_CITY_CHANCE" ); + float city_spawn_scalar = get_option( "SPAWN_CITY_HORDE_SCALAR" ); + float city_spawn_spread = get_option( "SPAWN_CITY_HORDE_SPREAD" ); + float spawn_density = get_option( "SPAWN_DENSITY" ); + + for( city &elem : cities ) { + if( elem.size > city_spawn_threshold || !one_in( city_spawn_chance ) ) { + + // with the default numbers (80 scalar, 1 density), a size 16 city + // will produce 1280 zombies. + int desired_zombies = elem.size * city_spawn_scalar * spawn_density; + + tripoint_abs_omt city_center = project_combine( elem.pos_om, tripoint_om_omt( elem.pos, 0 ) ); + + std::vector submap_list; + + // gather all of the points in range to test for viable placement of hordes. + for( tripoint_abs_omt const &temp_omt : points_in_radius( city_center, + static_cast( elem.size * city_spawn_spread ), 0 ) ) { + + // right now we're only placing city horde spawns on roads, for simplicity. + // this can be replaced with an OMT flag for later for better flexibility. + if( overmap_buffer.ter( temp_omt )->get_type_id() == oter_type_road ) { + tripoint_abs_sm this_sm = project_to( temp_omt ); + + // for some reason old style spawns are submap-aligned. + // get all four quadrants for better distribution. + submap_list.push_back( this_sm ); + submap_list.push_back( this_sm + point( 0, 1 ) ); + submap_list.push_back( this_sm + point( 1, 0 ) ); + submap_list.push_back( this_sm + point( 1, 1 ) ); + } } - } - while( desired_zombies > 0 ) { - std::shuffle( submap_list.begin(), submap_list.end(), rng_get_engine() ); - for( tripoint_abs_sm const &s : submap_list ) { - if( desired_zombies <= 0 ) { - break; - } - mongroup m( GROUP_ZOMBIE, s, desired_zombies > 10 ? 10 : desired_zombies ); - if( get_option( "WANDER_SPAWNS" ) ) { - m.horde = true; - m.wander( *this ); + if( submap_list.empty() ) { + // somehow the city has no roads. this shouldn't happen. + add_msg_debug( debugmode::DF_OVERMAP, "city %s centered at omt %s, but there were no roads!", + elem.name, city_center.to_string() ); + continue; + } + + add_msg_debug( debugmode::DF_OVERMAP, "adding %i zombies in hordes to city %s centered at omt %s.", + desired_zombies, elem.name, city_center.to_string() ); + + // if there aren't enough roads, we'll just reuse them, re-shuffled. + while( desired_zombies > 0 ) { + std::shuffle( submap_list.begin(), submap_list.end(), rng_get_engine() ); + for( tripoint_abs_sm const &s : submap_list ) { + if( desired_zombies <= 0 ) { + break; + } + mongroup m( GROUP_ZOMBIE, s, desired_zombies > 10 ? 10 : desired_zombies ); + + // with wander_spawns (aka wandering hordes) off, these become 'normal' + // zombie spawns and behave like ants, triffids, fungals, etc. + // they won't try very hard to get placed in the world, so there will + // probably be fewer zombies than expected. + if( get_option( "WANDER_SPAWNS" ) ) { + m.horde = true; + m.wander( *this ); + } + add_mon_group( m ); + desired_zombies -= 10; } - add_mon_group( m ); - desired_zombies = - 10; } } - } } From eed3695e6f3e8512020f1a922a4ae77d4d84c21a Mon Sep 17 00:00:00 2001 From: eso Date: Sun, 3 Dec 2023 13:19:29 -0800 Subject: [PATCH 07/13] fix debug horde rendering --- src/overmap_ui.cpp | 2 +- src/sdltiles.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/overmap_ui.cpp b/src/overmap_ui.cpp index ea5c9ade4f6f7..44b8263af4a33 100644 --- a/src/overmap_ui.cpp +++ b/src/overmap_ui.cpp @@ -785,7 +785,7 @@ static void draw_ascii( } else if( blink && showhordes && overmap_buffer.get_horde_size( omp ) >= HORDE_VISIBILITY_SIZE && ( get_and_assign_los( los, player_character, omp, sight_points ) || - uistate.overmap_debug_mongroup || trait_DEBUG_CLAIRVOYANCE ) ) { + uistate.overmap_debug_mongroup || player_character.has_trait( trait_DEBUG_CLAIRVOYANCE ) ) ) { // Display Hordes only when within player line-of-sight ter_color = c_green; ter_sym = overmap_buffer.get_horde_size( omp ) > HORDE_VISIBILITY_SIZE * 2 ? "Z" : "z"; diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index 149039f813cf1..0d8fb26199255 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -893,7 +893,7 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt ¢er_abs_ const bool see = overmap_buffer.seen( omp ); const bool los = see && ( you.overmap_los( omp, sight_points ) || uistate.overmap_debug_mongroup || - trait_DEBUG_CLAIRVOYANCE ); + you.has_trait( trait_DEBUG_CLAIRVOYANCE ) ); // the full string from the ter_id including _north etc. std::string id; int rotation = 0; From b9f61c64d7032091901967a62c00a934bf1263ce Mon Sep 17 00:00:00 2001 From: eso Date: Sun, 3 Dec 2023 21:54:05 -0800 Subject: [PATCH 08/13] cascading mapgen prevention --- src/overmap.cpp | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/overmap.cpp b/src/overmap.cpp index 4b0abd0c9d952..7bdfcbd80d122 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -6610,26 +6610,33 @@ void overmap::place_mongroups() std::vector submap_list; // gather all of the points in range to test for viable placement of hordes. - for( tripoint_abs_omt const &temp_omt : points_in_radius( city_center, + for( tripoint_om_omt const &temp_omt : points_in_radius( tripoint_om_omt( elem.pos, 0 ), static_cast( elem.size * city_spawn_spread ), 0 ) ) { - // right now we're only placing city horde spawns on roads, for simplicity. - // this can be replaced with an OMT flag for later for better flexibility. - if( overmap_buffer.ter( temp_omt )->get_type_id() == oter_type_road ) { - tripoint_abs_sm this_sm = project_to( temp_omt ); - - // for some reason old style spawns are submap-aligned. - // get all four quadrants for better distribution. - submap_list.push_back( this_sm ); - submap_list.push_back( this_sm + point( 0, 1 ) ); - submap_list.push_back( this_sm + point( 1, 0 ) ); - submap_list.push_back( this_sm + point( 1, 1 ) ); + // running too close to the edge of the overmap can get us cascading mapgen + if( inbounds( temp_omt, 2 ) ) { + + tripoint_abs_omt target_omt = project_combine( elem.pos_om, temp_omt ); + + // right now we're only placing city horde spawns on roads, for simplicity. + // this can be replaced with an OMT flag for later for better flexibility. + if( overmap_buffer.ter( target_omt )->get_type_id() == oter_type_road ) { + tripoint_abs_sm this_sm = project_to( target_omt ); + + // for some reason old style spawns are submap-aligned. + // get all four quadrants for better distribution. + submap_list.push_back( this_sm ); + submap_list.push_back( this_sm + point( 0, 1 ) ); + submap_list.push_back( this_sm + point( 1, 0 ) ); + submap_list.push_back( this_sm + point( 1, 1 ) ); + } } } if( submap_list.empty() ) { // somehow the city has no roads. this shouldn't happen. - add_msg_debug( debugmode::DF_OVERMAP, "city %s centered at omt %s, but there were no roads!", + add_msg_debug( debugmode::DF_OVERMAP, + "tried to add zombie hordes to city %s centered at omt %s, but there were no roads!", elem.name, city_center.to_string() ); continue; } From 20165867b88ec8795cace6bdb939c420ccc63f03 Mon Sep 17 00:00:00 2001 From: eso Date: Sun, 3 Dec 2023 23:36:36 -0800 Subject: [PATCH 09/13] all pre-seed spawns are hordes, wander spawns is still needed to move --- src/do_turn.cpp | 5 ++++- src/overmap.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/do_turn.cpp b/src/do_turn.cpp index f06b5eeaedd1c..5a6ad12af3b02 100644 --- a/src/do_turn.cpp +++ b/src/do_turn.cpp @@ -456,7 +456,10 @@ bool do_turn() // Move hordes every 2.5 min if( calendar::once_every( time_duration::from_minutes( 2.5 ) ) ) { - overmap_buffer.move_hordes(); + + if( get_option( "WANDER_SPAWNS" ) ) { + overmap_buffer.move_hordes(); + } if( u.has_trait( trait_HAS_NEMESIS ) ) { overmap_buffer.move_nemesis(); } diff --git a/src/overmap.cpp b/src/overmap.cpp index 7bdfcbd80d122..3a9e0149f73eb 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -6657,8 +6657,8 @@ void overmap::place_mongroups() // zombie spawns and behave like ants, triffids, fungals, etc. // they won't try very hard to get placed in the world, so there will // probably be fewer zombies than expected. + m.horde = true; if( get_option( "WANDER_SPAWNS" ) ) { - m.horde = true; m.wander( *this ); } add_mon_group( m ); From 7a9efcb5bf7a396e0bf8cda66ee544a2b9af303f Mon Sep 17 00:00:00 2001 From: eso Date: Mon, 4 Dec 2023 03:23:38 -0800 Subject: [PATCH 10/13] attempt to concentrate spawns closer to city center --- src/overmap.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/overmap.cpp b/src/overmap.cpp index 3a9e0149f73eb..ce5b17c614e5e 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -6605,13 +6605,17 @@ void overmap::place_mongroups() // will produce 1280 zombies. int desired_zombies = elem.size * city_spawn_scalar * spawn_density; + float city_effective_radius = elem.size * city_spawn_spread; + + int city_distance_increment = std::ceil( city_effective_radius / 4 ); + tripoint_abs_omt city_center = project_combine( elem.pos_om, tripoint_om_omt( elem.pos, 0 ) ); std::vector submap_list; // gather all of the points in range to test for viable placement of hordes. for( tripoint_om_omt const &temp_omt : points_in_radius( tripoint_om_omt( elem.pos, 0 ), - static_cast( elem.size * city_spawn_spread ), 0 ) ) { + static_cast( city_effective_radius ), 0 ) ) { // running too close to the edge of the overmap can get us cascading mapgen if( inbounds( temp_omt, 2 ) ) { @@ -6625,10 +6629,23 @@ void overmap::place_mongroups() // for some reason old style spawns are submap-aligned. // get all four quadrants for better distribution. - submap_list.push_back( this_sm ); - submap_list.push_back( this_sm + point( 0, 1 ) ); - submap_list.push_back( this_sm + point( 1, 0 ) ); - submap_list.push_back( this_sm + point( 1, 1 ) ); + std::vector local_sm_list; + local_sm_list.push_back( this_sm ); + local_sm_list.push_back( this_sm + point( 0, 1 ) ); + local_sm_list.push_back( this_sm + point( 1, 0 ) ); + local_sm_list.push_back( this_sm + point( 1, 1 ) ); + + // shuffle, then prune submaps based on distance from city center + // this should let us concentrate hordes closer to the center. + // the shuffling is so they aren't all aligned consistently. + int new_size = 4 - ( trig_dist( target_omt, city_center ) / city_distance_increment ); + if( new_size > 0 ) { + std::shuffle( local_sm_list.begin(), local_sm_list.end(), rng_get_engine() ); + local_sm_list.resize( new_size ); + + submap_list.insert( submap_list.end(), local_sm_list.begin(), local_sm_list.end() ); + } + } } } From 27c72b7f4250f2fc174b118a01ebc21f2efcd786 Mon Sep 17 00:00:00 2001 From: eso Date: Mon, 4 Dec 2023 04:32:18 -0800 Subject: [PATCH 11/13] repairs for test purposes. --- data/core/game_balance.json | 2 +- src/overmap.cpp | 10 +++++----- src/overmap_ui.cpp | 2 +- src/sdltiles.cpp | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/data/core/game_balance.json b/data/core/game_balance.json index 943db9ec4db87..7ebb00410852a 100644 --- a/data/core/game_balance.json +++ b/data/core/game_balance.json @@ -107,7 +107,7 @@ { "type": "EXTERNAL_OPTION", "name": "SPAWN_CITY_HORDE_THRESHOLD", - "info": "Minimum city size to guarantee extra zombies are spawned in cities. 0 means all cities spawn extra zombies. Negative values disable extra city zombies.", + "info": "Minimum city size to guarantee extra zombies are spawned in cities. 0 means all cities spawn extra zombies. Negative values disable extra city zombies.", "stype": "int", "value": 4 }, diff --git a/src/overmap.cpp b/src/overmap.cpp index ce5b17c614e5e..9cfb8dbcebf76 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -6631,9 +6631,9 @@ void overmap::place_mongroups() // get all four quadrants for better distribution. std::vector local_sm_list; local_sm_list.push_back( this_sm ); - local_sm_list.push_back( this_sm + point( 0, 1 ) ); - local_sm_list.push_back( this_sm + point( 1, 0 ) ); - local_sm_list.push_back( this_sm + point( 1, 1 ) ); + local_sm_list.push_back( this_sm + point_east ); + local_sm_list.push_back( this_sm + point_south ); + local_sm_list.push_back( this_sm + point_south_east ); // shuffle, then prune submaps based on distance from city center // this should let us concentrate hordes closer to the center. @@ -6654,12 +6654,12 @@ void overmap::place_mongroups() // somehow the city has no roads. this shouldn't happen. add_msg_debug( debugmode::DF_OVERMAP, "tried to add zombie hordes to city %s centered at omt %s, but there were no roads!", - elem.name, city_center.to_string() ); + elem.name, city_center.to_string_writable() ); continue; } add_msg_debug( debugmode::DF_OVERMAP, "adding %i zombies in hordes to city %s centered at omt %s.", - desired_zombies, elem.name, city_center.to_string() ); + desired_zombies, elem.name, city_center.to_string_writable() ); // if there aren't enough roads, we'll just reuse them, re-shuffled. while( desired_zombies > 0 ) { diff --git a/src/overmap_ui.cpp b/src/overmap_ui.cpp index 44b8263af4a33..6ae11cfe9f23c 100644 --- a/src/overmap_ui.cpp +++ b/src/overmap_ui.cpp @@ -93,8 +93,8 @@ static const oter_str_id oter_unexplored( "unexplored" ); static const oter_type_str_id oter_type_forest_trail( "forest_trail" ); -static const trait_id trait_DEBUG_NIGHTVISION( "DEBUG_NIGHTVISION" ); static const trait_id trait_DEBUG_CLAIRVOYANCE( "DEBUG_CLAIRVOYANCE" ); +static const trait_id trait_DEBUG_NIGHTVISION( "DEBUG_NIGHTVISION" ); #if defined(__ANDROID__) #include diff --git a/src/sdltiles.cpp b/src/sdltiles.cpp index 0d8fb26199255..f42594d018975 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -99,8 +99,8 @@ static const oter_type_str_id oter_type_forest_trail( "forest_trail" ); -static const trait_id trait_DEBUG_NIGHTVISION( "DEBUG_NIGHTVISION" ); static const trait_id trait_DEBUG_CLAIRVOYANCE( "DEBUG_CLAIRVOYANCE" ); +static const trait_id trait_DEBUG_NIGHTVISION( "DEBUG_NIGHTVISION" ); //*********************************** //Globals * From 9e2fc32764b4925f45afa1c7733ec0405b4ff1b7 Mon Sep 17 00:00:00 2001 From: Tonkatsu <7764202+tenmillimaster@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:42:04 -0600 Subject: [PATCH 12/13] Fix Fn Fal missing variant (#70006) * fal migration * ah make it spawn maybe --- data/json/itemgroups/Weapons_Mods_Ammo/guns.json | 2 +- data/json/itemgroups/Weapons_Mods_Ammo/nested_guns.json | 2 +- data/json/items/gun/308.json | 2 +- data/json/monsters/robofac_robots.json | 2 +- data/json/obsoletion/migration_items.json | 5 +++++ data/json/recipes/weapon/magazines.json | 2 +- data/mods/Generic_Guns/firearms/gg_firearms_migration.json | 2 +- 7 files changed, 11 insertions(+), 6 deletions(-) diff --git a/data/json/itemgroups/Weapons_Mods_Ammo/guns.json b/data/json/itemgroups/Weapons_Mods_Ammo/guns.json index 09fab7fcf2f46..579fb73e6890c 100644 --- a/data/json/itemgroups/Weapons_Mods_Ammo/guns.json +++ b/data/json/itemgroups/Weapons_Mods_Ammo/guns.json @@ -768,7 +768,7 @@ { "item": "m60_semi", "prob": 5 }, { "item": "oa93", "prob": 3 }, { "item": "steyr_aug", "prob": 5 }, - { "item": "fn_fal", "prob": 40 }, + { "item": "fn_fal_semi", "variant": "fal_dsa", "prob": 40 }, { "item": "hk_g3", "prob": 40 }, { "item": "hk_g36", "prob": 30 }, { "item": "m1918", "prob": 30 }, diff --git a/data/json/itemgroups/Weapons_Mods_Ammo/nested_guns.json b/data/json/itemgroups/Weapons_Mods_Ammo/nested_guns.json index ec526e271cc1b..f84507f4f2892 100644 --- a/data/json/itemgroups/Weapons_Mods_Ammo/nested_guns.json +++ b/data/json/itemgroups/Weapons_Mods_Ammo/nested_guns.json @@ -1494,7 +1494,7 @@ "subtype": "collection", "ammo": 100, "entries": [ - { "item": "fn_fal", "charges-min": 0, "charges-max": 20 }, + { "item": "fn_fal_semi", "charges-min": 0, "charges-max": 20 }, { "item": "falmag" }, { "item": "falmag", "prob": 50 }, { "group": "on_hand_308" } diff --git a/data/json/items/gun/308.json b/data/json/items/gun/308.json index e42b7ef9f5692..8f08b97f10033 100644 --- a/data/json/items/gun/308.json +++ b/data/json/items/gun/308.json @@ -1,6 +1,6 @@ [ { - "id": "fn_fal", + "id": "fn_fal_semi", "copy-from": "rifle_semi_vintage", "looks_like": "modular_ar15", "type": "GUN", diff --git a/data/json/monsters/robofac_robots.json b/data/json/monsters/robofac_robots.json index e72ea08871843..bc63b23ef7381 100644 --- a/data/json/monsters/robofac_robots.json +++ b/data/json/monsters/robofac_robots.json @@ -105,7 +105,7 @@ "type": "gun", "cooldown": 1, "move_cost": 150, - "gun_type": "fn_fal", + "gun_type": "fn_fal_semi", "ammo_type": "762_51", "fake_skills": [ [ "gun", 8 ], [ "rifle", 8 ] ], "fake_dex": 12, diff --git a/data/json/obsoletion/migration_items.json b/data/json/obsoletion/migration_items.json index 8d90b03dab842..8b6dcca583017 100644 --- a/data/json/obsoletion/migration_items.json +++ b/data/json/obsoletion/migration_items.json @@ -335,5 +335,10 @@ "id": "rm4504", "type": "MIGRATION", "replace": "pressurized_tank_modern" + }, + { + "id": "fn_fal", + "type": "MIGRATION", + "replace": "fn_fal_semi" } ] diff --git a/data/json/recipes/weapon/magazines.json b/data/json/recipes/weapon/magazines.json index ad72ed2a46cbc..0199b3bbcf0ac 100644 --- a/data/json/recipes/weapon/magazines.json +++ b/data/json/recipes/weapon/magazines.json @@ -239,7 +239,7 @@ "skills_required": [ "gun", 1 ], "time": "20 m", "autolearn": true, - "tools": [ [ [ "fn_fal", -1 ] ], [ [ "small_repairkit", 10 ], [ "large_repairkit", 5 ] ] ], + "tools": [ [ [ "fn_fal_semi", -1 ] ], [ [ "small_repairkit", 10 ], [ "large_repairkit", 5 ] ] ], "using": [ [ "308_casehead", 1 ] ], "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "HAMMER", "level": 1 }, { "id": "SCREW_FINE", "level": 1 } ], "components": [ [ [ "sheet_metal_small", 1 ] ], [ [ "spring", 1 ] ], [ [ "duct_tape", 40 ] ] ] diff --git a/data/mods/Generic_Guns/firearms/gg_firearms_migration.json b/data/mods/Generic_Guns/firearms/gg_firearms_migration.json index e27856a8f4fe6..9d55d85b654a7 100644 --- a/data/mods/Generic_Guns/firearms/gg_firearms_migration.json +++ b/data/mods/Generic_Guns/firearms/gg_firearms_migration.json @@ -336,7 +336,7 @@ "sig_assault_rifle", "steyr_aug", "iwi_tavor_x95_300blk", - "fn_fal", + "fn_fal_semi", "m1a", "sks", "mosin44", From 96b2e8d3ad132bd7ec9773c9ed95836cf4709036 Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:43:06 -0600 Subject: [PATCH 13/13] [MoM] Even Even More Powers (#69993) * Initial commit * Fixes * Edits * Add Mirror-mask * Account for concentration * Various fixes * Tactics -> Tactician --- .../effectoncondition/eoc_learn_recipes.json | 7 +- .../eoc_on_power_use_events.json | 21 +- .../effectoncondition/eoc_power_effects.json | 117 ++++------ .../effects/effects_psionic.json | 104 ++++++++- .../enchantments/enchantments_player.json | 40 ++++ .../MindOverMatter/mutations/temporary.json | 172 ++++++++++++++ .../MindOverMatter/powers/clairsentience.json | 148 +++++++++++- .../clairsentience_concentration_eocs.json | 215 ++++++++++++++++-- .../MindOverMatter/powers/photokinesis.json | 58 ++++- .../photokinesis_concentration_eoc.json | 83 +++++++ .../powers/photokinesis_eocs.json | 66 ++++++ .../practice/clairsentient_practice.json | 211 +++++++++++++++++ .../practice/photokinesis_practice.json | 53 +++++ 13 files changed, 1182 insertions(+), 113 deletions(-) create mode 100644 data/mods/MindOverMatter/powers/photokinesis_concentration_eoc.json diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json b/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json index c9e6bf2721686..0c311462b3e05 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json @@ -25,12 +25,16 @@ { "u_learn_recipe": "practice_clair_night_vision" }, { "u_learn_recipe": "practice_clair_danger_sense" }, { "u_learn_recipe": "practice_clair_speed_reading" }, + { "u_learn_recipe": "practice_clair_aura_sight" }, { "u_learn_recipe": "practice_clair_spot_weakness" }, { "u_learn_recipe": "practice_clair_ranged_enhance" }, { "u_learn_recipe": "practice_clair_voyance" }, { "u_learn_recipe": "practice_clair_dodge_power" }, - { "u_learn_recipe": "practice_clair_clear_sight" }, + { "u_learn_recipe": "practice_clair_craft_bonus" }, { "u_learn_recipe": "practice_clair_see_map" }, + { "u_learn_recipe": "practice_clair_perfect_shot" }, + { "u_learn_recipe": "practice_clair_clear_sight" }, + { "u_learn_recipe": "practice_clair_group_tactics" }, { "u_learn_recipe": "practice_clair_omniscience" } ] }, @@ -66,6 +70,7 @@ { "u_learn_recipe": "practice_photokinetic_camouflage" }, { "u_learn_recipe": "practice_photokinetic_rad_immunity" }, { "u_learn_recipe": "practice_photokinetic_light_arms" }, + { "u_learn_recipe": "practice_photokinetic_hide_ugly" }, { "u_learn_recipe": "practice_photokinetic_light_image" }, { "u_learn_recipe": "practice_photokinetic_radio" }, { "u_learn_recipe": "practice_photokinetic_invisibility" }, diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_on_power_use_events.json b/data/mods/MindOverMatter/effectoncondition/eoc_on_power_use_events.json index 0cd3b6dd0fa64..1ee391e25c651 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_on_power_use_events.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_on_power_use_events.json @@ -7,7 +7,10 @@ "run_eocs": [ "EOC_BIOKIN_REMOVE_METABOLISM_ENHANCE", "EOC_CLAIR_REMOVE_SPEED_READ", - "EOC_PHOTO_REMOVE_LIGHT_LOCAL", + "EOC_CLAIR_REMOVE_SEE_AURAS", + "EOC_CLAIR_REMOVE_CRAFT_BONUS", + "EOC_PHOTOKIN_REMOVE_LIGHT_LOCAL", + "EOC_PHOTOKIN_REMOVE_HIDE_UGLY", "EOC_PHOTOKIN_REMOVE_RADIO", "EOC_PYRO_REMOVE_FIRE_TOOL", "EOC_PYRO_REMOVE_TORCH_WELD", @@ -17,7 +20,8 @@ "EOC_TELEPATH_REMOVE_TELEPATHIC_CONCENTRATION" ] }, - { "u_lose_effect": "effect_telepath_invisibility" } + { "u_lose_effect": "effect_telepath_invisibility" }, + { "u_lose_effect": "effect_clair_perfect_shot" } ] }, { @@ -29,6 +33,8 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_clair_see_auras" }, + { "u_has_effect": "effect_clair_craft_bonus" }, { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, @@ -69,6 +75,8 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_clair_see_auras" }, + { "u_has_effect": "effect_clair_craft_bonus" }, { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, @@ -109,6 +117,9 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_clair_see_auras" }, + { "u_has_effect": "effect_clair_craft_bonus" }, + { "u_has_effect": "effect_clair_perfect_shot" }, { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, @@ -149,6 +160,9 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_clair_see_auras" }, + { "u_has_effect": "effect_clair_craft_bonus" }, + { "u_has_effect": "effect_clair_perfect_shot" }, { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, @@ -191,6 +205,9 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_clair_see_auras" }, + { "u_has_effect": "effect_clair_craft_bonus" }, + { "u_has_effect": "effect_clair_perfect_shot" }, { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json b/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json index 1a9ccc7591384..3ba06e210defa 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_power_effects.json @@ -112,95 +112,68 @@ "id": "EOC_END_PSI_POWERS", "//": "This should remove absolutely all powers.", "effect": [ - { "u_lose_effect": "effect_biokin_physical" }, - { "u_lose_effect": "effect_biokin_pkill_1" }, - { "u_lose_effect": "effect_biokin_pkill_2" }, - { "u_lose_effect": "effect_biokin_pkill_3" }, - { "u_lose_effect": "effect_biokin_pkill_4" }, - { "u_lose_effect": "effect_biokin_pkill_5" }, - { "u_lose_effect": "effect_biokin_pkill_6" }, - { "u_lose_effect": "effect_biokin_flexibility" }, - { "u_lose_effect": "effect_biokin_hammerhand" }, - { "u_remove_item_with": "biokin_hammerhand_item" }, - { "u_lose_effect": "effect_biokin_enhance_mobility" }, - { "u_remove_item_with": "biokin_enhance_mobility_item_1" }, - { "u_remove_item_with": "biokin_enhance_mobility_item_2" }, - { "u_remove_item_with": "biokin_enhance_mobility_item_3" }, - { "u_remove_item_with": "biokin_enhance_mobility_item_4" }, - { "u_remove_item_with": "biokin_enhance_mobility_item_5" }, - { "u_remove_item_with": "biokin_enhance_mobility_item_6" }, + { + "run_eocs": [ + "EOC_BIOKIN_REMOVE_OVERCOME_PAIN", + "EOC_BIOKIN_REMOVE_PHYSICAL_ENHANCE", + "EOC_BIOKIN_REMOVE_BREATHE_SKIN", + "EOC_BIOKIN_REMOVE_CLIMATE_CONTROL", + "EOC_BIOKIN_REMOVE_ENHANCE_MOBILITY", + "EOC_BIOKIN_REMOVE_HAMMERHAND", + "EOC_BIOKIN_REMOVE_REFLEX_ENHANCE", + "EOC_BIOKIN_REMOVE_METABOLISM_ENHANCE", + "EOC_CLAIR_REMOVE_NIGHT_EYES", + "EOC_CLAIR_REMOVE_SPEED_READ", + "EOC_CLAIR_REMOVE_DANGER_SENSE", + "EOC_CLAIR_REMOVE_SEE_AURAS", + "EOC_CLAIR_REMOVE_RANGED_ENHANCE", + "EOC_CLAIR_REMOVE_DODGE_POWER", + "EOC_CLAIR_REMOVE_CRAFT_BONUS", + "EOC_CLAIR_REMOVE_CLEAR_SIGHT", + "EOC_CLAIR_REMOVE_GROUP_TACTICS", + "EOC_ELECTROKIN_REMOVE_SEE_ELECTRICITY", + "EOC_ELECTROKIN_REMOVE_PERSONAL_BATTERY", + "EOC_ELECTROKIN_REMOVE_REDUCE_PAIN", + "EOC_PHOTOKIN_REMOVE_LIGHT_LOCAL", + "EOC_PHOTOKIN_REMOVE_RAD_IMMUNITY", + "EOC_PHOTOKIN_REMOVE_HIDE_UGLY", + "EOC_PHOTOKIN_REMOVE_RADIO", + "EOC_PYRO_REMOVE_FIRE_TOOL", + "EOC_PYRO_REMOVE_WARMTH_CLOAK", + "EOC_PYRO_REMOVE_TORCH_WELD", + "EOC_TELEKIN_REMOVE_MOMENTUM", + "EOC_TELEKIN_REMOVE_TELEKINETIC_STRENGTH", + "EOC_TELEKIN_REMOVE_SHIELD", + "EOC_TELEKIN_REMOVE_JACKING_TOOL", + "EOC_TELEKIN_REMOVE_LEVITATION", + "EOC_TELEPATH_REMOVE_TELEPATHIC_CONCENTRATION", + "EOC_TELEPATH_REMOVE_TELEPATHIC_SHIELD", + "EOC_TELEPATH_REMOVE_TELEPATHIC_MORALE", + "EOC_TELEPATH_REMOVE_SENSE_MINDS", + "EOC_TELEPORT_REMOVE_STRIDE", + "EOC_VITAKIN_REMOVE_HEALTH_POWER" + ] + }, { "u_lose_effect": "effect_biokin_armor_skin" }, - { "u_lose_effect": "effect_biokin_climate_control" }, { "u_lose_effect": "effect_biokin_sealed" }, { "u_lose_effect": "effect_biokin_combat_dance" }, { "u_lose_effect": "effect_biokin_perfected_motion" }, - { "u_lose_effect": "effect_clair_night_eyes_1" }, - { "u_lose_effect": "effect_clair_night_eyes_2" }, - { "u_lose_effect": "effect_clair_night_eyes_3" }, - { "u_lose_effect": "effect_clair_night_eyes_4" }, - { "u_lose_effect": "effect_clair_night_eyes_5" }, - { "u_lose_effect": "effect_clair_night_eyes_6" }, - { "u_lose_effect": "effect_clair_night_eyes_7" }, - { "u_lose_effect": "effect_clair_night_eyes_8" }, - { "u_lose_effect": "effect_clair_premonition" }, - { "u_lose_trait": "CLAIR_SPEED_READ" }, - { "u_lose_effect": "effect_clair_speed_reader" }, - { "u_lose_effect": "effect_clair_ranged_enhance" }, { "u_lose_effect": "effect_clair_sense_rads_self" }, { "u_remove_item_with": "clair_sense_rad_item" }, - { "u_lose_effect": "effect_clair_dodge" }, - { "u_lose_effect": "effect_clair_clear_sight" }, + { "u_lose_effect": "effect_clair_perfect_shot" }, { "u_lose_effect": "effect_clair_omniscence" }, - { "u_lose_effect": "effect_electrokin_see_electricity" }, { "u_lose_effect": "effect_electrokin_zap_enemies" }, { "u_lose_effect": "effect_electrokin_melee_attacks" }, - { "u_lose_effect": "effect_electrokin_personal_battery" }, { "u_lose_effect": "effect_electrokinetic_speed_boost" }, - { "u_lose_effect": "effect_photokin_light_local" }, { "u_lose_effect": "effect_photokin_dodge" }, - { "u_lose_effect": "effect_photokinetic_radio" }, - { "u_remove_item_with": "item_photokinetic_radio" }, - { "u_remove_item_with": "item_photokinetic_radio_on" }, { "u_lose_effect": "effect_photokin_invisibility" }, { "u_lose_effect": "effect_photokin_arms" }, - { "u_lose_effect": "effect_pyrokinetic_cloak" }, - { "u_remove_item_with": "pyrokinetic_fire_tool" }, - { "u_remove_item_with": "pyrokinetic_torch_weld" }, { "u_lose_effect": "effect_pyrokinetic_aura" }, { "u_lose_effect": "effect_pyrokinetic_flame_immunity" }, - { "u_lose_effect": "effect_telekinetic_momentum" }, { "u_lose_effect": "effect_telekinetic_slowfall" }, - { "u_lose_effect": "effect_telekinetic_strength" }, - { "u_lose_effect": "effect_telekinetic_armor" }, - { "u_remove_item_with": "telekin_lifting_jack_1" }, - { "u_remove_item_with": "telekin_lifting_jack_2" }, - { "u_remove_item_with": "telekin_lifting_jack_3" }, - { "u_remove_item_with": "telekin_lifting_jack_4" }, - { "u_remove_item_with": "telekin_lifting_jack_5" }, - { "u_remove_item_with": "telekin_lifting_jack_6" }, - { "u_remove_item_with": "telekin_lifting_jack_7" }, - { "u_remove_item_with": "telekin_lifting_jack_8" }, - { "u_remove_item_with": "telekin_lifting_jack_9" }, - { "u_remove_item_with": "telekin_lifting_jack_10" }, - { "u_remove_item_with": "telekin_lifting_jack_11" }, - { "u_remove_item_with": "telekin_lifting_jack_12" }, - { "u_remove_item_with": "telekin_lifting_jack_13" }, - { "u_remove_item_with": "telekin_lifting_jack_14" }, - { "u_remove_item_with": "telekin_lifting_jack_15" }, - { "u_remove_item_with": "telekin_lifting_jack_16" }, - { "u_remove_item_with": "telekin_lifting_jack_17" }, - { "u_remove_item_with": "telekin_lifting_jack_18" }, - { "u_remove_item_with": "telekin_lifting_jack_19" }, - { "u_remove_item_with": "telekin_lifting_jack_20" }, - { "u_lose_effect": "effect_telekinetic_levitation" }, { "u_lose_effect": "effect_telekinetic_aegis" }, - { "u_lose_effect": "effect_telepathic_learning_bonus" }, - { "u_lose_effect": "effect_telepath_sense_minds" }, - { "u_lose_effect": "effect_telepathic_morale" }, { "u_lose_effect": "effect_telepath_invisibility" }, { "u_lose_effect": "effect_telepath_network_effect" }, - { "u_lose_effect": "effect_teleport_stride" }, - { "u_lose_effect": "effect_vita_health" }, { "u_lose_effect": "effect_vitakin_purge_rads" }, { "u_lose_effect": "effect_vita_super_heal" }, { "u_lose_effect": "effect_vita_return_from_death" }, @@ -226,14 +199,18 @@ "EOC_CLAIR_REMOVE_NIGHT_EYES", "EOC_CLAIR_REMOVE_SPEED_READ", "EOC_CLAIR_REMOVE_DANGER_SENSE", + "EOC_CLAIR_REMOVE_SEE_AURAS", "EOC_CLAIR_REMOVE_RANGED_ENHANCE", "EOC_CLAIR_REMOVE_DODGE_POWER", + "EOC_CLAIR_REMOVE_CRAFT_BONUS", "EOC_CLAIR_REMOVE_CLEAR_SIGHT", + "EOC_CLAIR_REMOVE_GROUP_TACTICS", "EOC_ELECTROKIN_REMOVE_SEE_ELECTRICITY", "EOC_ELECTROKIN_REMOVE_PERSONAL_BATTERY", "EOC_ELECTROKIN_REMOVE_REDUCE_PAIN", "EOC_PHOTOKIN_REMOVE_LIGHT_LOCAL", "EOC_PHOTOKIN_REMOVE_RAD_IMMUNITY", + "EOC_PHOTOKIN_REMOVE_HIDE_UGLY", "EOC_PHOTOKIN_REMOVE_RADIO", "EOC_PYRO_REMOVE_FIRE_TOOL", "EOC_PYRO_REMOVE_WARMTH_CLOAK", diff --git a/data/mods/MindOverMatter/effects/effects_psionic.json b/data/mods/MindOverMatter/effects/effects_psionic.json index 68aff4692eeeb..90f461c14f4d2 100644 --- a/data/mods/MindOverMatter/effects/effects_psionic.json +++ b/data/mods/MindOverMatter/effects/effects_psionic.json @@ -616,7 +616,7 @@ "type": "effect_type", "id": "effect_clair_speed_reader", "name": [ "Speed Reader" ], - "desc": [ "You are absorb knowledge from books like a sponge absorbs water." ], + "desc": [ "You are absorbing knowledge from books like a sponge absorbs water." ], "apply_message": "", "remove_message": "", "rating": "good", @@ -645,6 +645,34 @@ } ] }, + { + "type": "effect_type", + "id": "effect_clair_see_auras", + "name": [ "Aura Sight" ], + "desc": [ "Swirling colors are visible around others, revealing their emotions." ], + "apply_message": "", + "remove_message": "The colors fade away.", + "rating": "good", + "max_duration": "7 days", + "enchantments": [ + { + "values": [ + { + "value": "SOCIAL_LIE", + "add": { + "math": [ "min(( 5 + ( u_val('spell_level', 'spell: clair_see_auras') ) * (scaling_factor(u_val('intelligence') ) ) ), 20)" ] + } + }, + { + "value": "SOCIAL_PERSUADE", + "add": { + "math": [ "min(( 5 + ( u_val('spell_level', 'spell: clair_see_auras') ) * (scaling_factor(u_val('intelligence') ) ) ), 20)" ] + } + } + ] + } + ] + }, { "type": "effect_type", "id": "effect_clair_weak_point", @@ -781,6 +809,27 @@ ], "flags": [ "UNCANNY_DODGE" ] }, + { + "type": "effect_type", + "id": "effect_clair_craft_bonus", + "name": [ "Intuitive Artistry" ], + "desc": [ + "You just know what you need to do next. It's harder for you to pay attention to anything else due to the shifting futures, however." + ], + "rating": "good", + "max_duration": "7 days", + "enchantments": [ { "values": [ { "value": "MOVE_COST", "multiply": 3 } ] } ], + "flags": [ "MYOPIC" ] + }, + { + "type": "effect_type", + "id": "effect_clair_perfect_shot", + "name": [ "One Perfect Shot" ], + "desc": [ "Do it. Take the shot." ], + "rating": "good", + "max_duration": "10 seconds", + "enchantments": [ { "values": [ { "value": "RANGED_DAMAGE", "multiply": 1.5 }, { "value": "WEAPON_DISPERSION", "multiply": -1 } ] } ] + }, { "type": "effect_type", "id": "effect_clair_clear_sight", @@ -810,6 +859,50 @@ "venom_blind" ] }, + { + "type": "effect_type", + "id": "effect_clair_group_tactics_other", + "name": [ "Prescient Tactics" ], + "desc": [ "You're being informed of the best way to fight." ], + "apply_message": "", + "rating": "good", + "max_duration": "7 days", + "max_intensity": 3, + "int_decay_step": -1, + "int_decay_tick": 2, + "int_decay_remove": true, + "base_mods": { "dodge_mod": [ 4 ] }, + "enchantments": [ + { + "values": [ + { + "value": "BONUS_DODGE", + "add": { + "math": [ "(1 + ( u_val('spell_level', 'spell: clair_group_tactics') / 8) * (scaling_factor(u_val('intelligence') ) ) )" ] + } + }, + { + "value": "BONUS_BLOCK", + "add": { + "math": [ "(1 + ( u_val('spell_level', 'spell: clair_group_tactics') / 8) * (scaling_factor(u_val('intelligence') ) ) )" ] + } + } + ] + } + ] + }, + { + "type": "effect_type", + "id": "effect_clair_group_tactics_self", + "name": [ "Prescient Tactics" ], + "desc": [ "You're calling out tactics to your followers. It's much harder to concentrate on your own defense." ], + "apply_message": "", + "remove_message": "As the visions fade, you stop calling out orders.", + "rating": "good", + "max_duration": "30 minutes", + "base_mods": { "dodge_mod": [ -6 ], "hit_mod": [ -5 ] }, + "enchantments": [ "ench_clair_group_tactics" ] + }, { "type": "effect_type", "id": "effect_clair_omniscence", @@ -1045,6 +1138,15 @@ "flags": [ "PHOTOKIN_CHAR_IMMUNE", "NO_RADIATION", "GLARE_RESIST" ], "enchantments": [ { "values": [ { "value": "LUMINATION", "add": 15 } ] } ] }, + { + "type": "effect_type", + "id": "effect_photokin_hide_ugly", + "name": [ "Mirror-Mask" ], + "desc": [ "You're just another survivor. There's definitely nothing odd about you at all." ], + "rating": "good", + "remove_message": "The illusions around you fall away.", + "max_duration": "7 days" + }, { "type": "effect_type", "id": "effect_photokinetic_radio", diff --git a/data/mods/MindOverMatter/enchantments/enchantments_player.json b/data/mods/MindOverMatter/enchantments/enchantments_player.json index 7db1bea1b5b26..b739775ab4c47 100644 --- a/data/mods/MindOverMatter/enchantments/enchantments_player.json +++ b/data/mods/MindOverMatter/enchantments/enchantments_player.json @@ -26,6 +26,46 @@ "min_duration": 200, "max_duration": 200 }, + { + "type": "enchantment", + "id": "enchant_clair_speed_read", + "condition": "ALWAYS", + "has": "HELD", + "values": [ + { + "value": "READING_EXP", + "add": { + "math": [ "( ( u_val('spell_level', 'spell: clair_speed_reading') * 0.15) * (scaling_factor(u_val('intelligence') )))" ] + } + } + ] + }, + { + "type": "enchantment", + "id": "ench_clair_group_tactics", + "condition": "ALWAYS", + "has": "HELD", + "values": [ { "value": "BONUS_DODGE", "add": -1 } ], + "intermittent_activation": { "effects": [ { "frequency": "2 seconds", "spell_effects": [ { "id": "clair_group_tactics_aoe" } ] } ] } + }, + { + "id": "clair_group_tactics_aoe", + "type": "SPELL", + "name": "[Ψ]Prescient Tactics AoE", + "description": "This provides the buff to your followers. It's a bug if you have it directly.", + "message": "", + "teachable": false, + "valid_targets": [ "ally" ], + "flags": [ "PSIONIC", "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "IGNORE_WALLS", "NO_EXPLOSION_SFX" ], + "effect": "attack", + "effect_str": "effect_clair_group_tactics_other", + "shape": "blast", + "min_aoe": 20, + "max_aoe": 20, + "//": "Range here is C conversational range", + "min_duration": 200, + "max_duration": 200 + }, { "type": "enchantment", "id": "enchant_electrokin_zap_enemies", diff --git a/data/mods/MindOverMatter/mutations/temporary.json b/data/mods/MindOverMatter/mutations/temporary.json index 44cb3017872f6..05f5727541380 100644 --- a/data/mods/MindOverMatter/mutations/temporary.json +++ b/data/mods/MindOverMatter/mutations/temporary.json @@ -1,4 +1,176 @@ [ + { + "type": "mutation", + "id": "CLAIR_SPEED_READ", + "name": { "str": "Speed Reader" }, + "points": 1, + "description": "Your powers allow you to absorb knowledge at a greatly accelerated pace.", + "reading_speed_multiplier": 0.66, + "valid": false, + "enchantments": [ "enchant_clair_speed_read" ] + }, + { + "type": "mutation", + "id": "CLAIR_CRAFT_BONUS_01", + "name": { "str": "Intuitive Artistry" }, + "points": 0, + "description": "Gazing into the near future lets you know what part goes where.", + "valid": false, + "crafting_speed_multiplier": 1.04, + "craft_skill_bonus": [ + [ "electronics", 1 ], + [ "tailor", 1 ], + [ "mechanics", 1 ], + [ "cooking", 1 ], + [ "chemistry", 1 ], + [ "fabrication", 1 ] + ] + }, + { + "type": "mutation", + "id": "CLAIR_CRAFT_BONUS_02", + "name": { "str": "Intuitive Artistry" }, + "points": 0, + "description": "Gazing into the near future lets you know what part goes where.", + "valid": false, + "crafting_speed_multiplier": 1.08, + "craft_skill_bonus": [ + [ "electronics", 2 ], + [ "tailor", 2 ], + [ "mechanics", 2 ], + [ "cooking", 2 ], + [ "chemistry", 2 ], + [ "fabrication", 2 ] + ] + }, + { + "type": "mutation", + "id": "CLAIR_CRAFT_BONUS_03", + "name": { "str": "Intuitive Artistry" }, + "points": 0, + "description": "Gazing into the near future lets you know what part goes where.", + "valid": false, + "crafting_speed_multiplier": 1.12, + "craft_skill_bonus": [ + [ "electronics", 3 ], + [ "tailor", 3 ], + [ "mechanics", 3 ], + [ "cooking", 3 ], + [ "chemistry", 3 ], + [ "fabrication", 3 ] + ] + }, + { + "type": "mutation", + "id": "CLAIR_CRAFT_BONUS_04", + "name": { "str": "Intuitive Artistry" }, + "points": 0, + "description": "Gazing into the near future lets you know what part goes where.", + "valid": false, + "crafting_speed_multiplier": 1.16, + "craft_skill_bonus": [ + [ "electronics", 4 ], + [ "tailor", 4 ], + [ "mechanics", 4 ], + [ "cooking", 4 ], + [ "chemistry", 4 ], + [ "fabrication", 4 ] + ] + }, + { + "type": "mutation", + "id": "CLAIR_CRAFT_BONUS_05", + "name": { "str": "Intuitive Artistry" }, + "points": 0, + "description": "Gazing into the near future lets you know what part goes where.", + "valid": false, + "crafting_speed_multiplier": 1.2, + "craft_skill_bonus": [ + [ "electronics", 5 ], + [ "tailor", 5 ], + [ "mechanics", 5 ], + [ "cooking", 5 ], + [ "chemistry", 5 ], + [ "fabrication", 5 ] + ] + }, + { + "type": "mutation", + "id": "CLAIR_CRAFT_BONUS_06", + "name": { "str": "Intuitive Artistry" }, + "points": 0, + "description": "Gazing into the near future lets you know what part goes where.", + "valid": false, + "crafting_speed_multiplier": 1.24, + "craft_skill_bonus": [ + [ "electronics", 6 ], + [ "tailor", 6 ], + [ "mechanics", 6 ], + [ "cooking", 6 ], + [ "chemistry", 6 ], + [ "fabrication", 6 ] + ] + }, + { + "id": "PHOTOKIN_HIDE_UGLY_01", + "type": "mutation", + "name": { "str": "Mirror-Mask" }, + "description": "You're just an average Joe.", + "points": 0, + "visibility": 0, + "ugliness": -2, + "player_display": false + }, + { + "id": "PHOTOKIN_HIDE_UGLY_02", + "type": "mutation", + "name": { "str": "Mirror-Mask" }, + "description": "You're just an average Joe.", + "points": 0, + "visibility": 0, + "ugliness": -4, + "player_display": false + }, + { + "id": "PHOTOKIN_HIDE_UGLY_03", + "type": "mutation", + "name": { "str": "Mirror-Mask" }, + "description": "You're just an average Joe.", + "points": 0, + "visibility": 0, + "ugliness": -6, + "player_display": false + }, + { + "id": "PHOTOKIN_HIDE_UGLY_04", + "type": "mutation", + "name": { "str": "Mirror-Mask" }, + "description": "You're just an average Joe.", + "points": 0, + "visibility": 0, + "ugliness": -8, + "player_display": false + }, + { + "id": "PHOTOKIN_HIDE_UGLY_05", + "type": "mutation", + "name": { "str": "Mirror-Mask" }, + "description": "You're just an average Joe.", + "points": 0, + "visibility": 0, + "ugliness": -10, + "player_display": false + }, + { + "id": "PHOTOKIN_HIDE_UGLY_06", + "type": "mutation", + "name": { "str": "Mirror-Mask" }, + "description": "You're just an average Joe.", + "points": 0, + "visibility": 0, + "ugliness": -12, + "player_display": false + }, { "id": "TELELIXIRDOWN", "type": "mutation", diff --git a/data/mods/MindOverMatter/powers/clairsentience.json b/data/mods/MindOverMatter/powers/clairsentience.json index c9a5ac4976a23..e34bc01ff2e0c 100644 --- a/data/mods/MindOverMatter/powers/clairsentience.json +++ b/data/mods/MindOverMatter/powers/clairsentience.json @@ -34,7 +34,7 @@ "u_effect_intensity('effect_clair_night_eyes') > -1 ? 10 : max((50 -(u_val('spell_level', 'spell: clair_night_vision') * 2)), 20)" ] }, - "learn_spells": { "clair_danger_sense": 9, "clair_voyance": 12, "clair_see_map": 18 } + "learn_spells": { "clair_see_auras": 7, "clair_danger_sense": 9, "clair_voyance": 12, "clair_see_map": 18 } }, { "id": "clair_speed_reading", @@ -73,7 +73,13 @@ "u_effect_intensity('effect_clair_speed_reader') > -1 ? 10 : max((500 -(u_val('spell_level', 'spell: clair_speed_reading') * 12)), 250)" ] }, - "learn_spells": { "clair_spot_weakness": 5, "clair_ranged_enhance": 7, "clair_voyance": 9, "clair_clear_sight": 15 } + "learn_spells": { + "clair_spot_weakness": 5, + "clair_see_auras": 7, + "clair_ranged_enhance": 8, + "clair_voyance": 9, + "clair_clear_sight": 15 + } }, { "id": "clair_danger_sense", @@ -147,7 +153,43 @@ "final_casting_time": 75, "casting_time_increment": -5.5, "ignored_monster_species": [ "PSI_NULL" ], - "learn_spells": { "clair_ranged_enhance": 6, "clair_voyance": 8, "clair_clear_sight": 15 } + "learn_spells": { "clair_ranged_enhance": 6, "clair_voyance": 10, "clair_clear_sight": 15 } + }, + { + "id": "clair_see_auras", + "type": "SPELL", + "name": "[Ψ]Aura Sight (C)", + "description": "You can see people's emotions and physical state as a hazy swirl of color around their body. This makes it much easier to get them to do what you want.\n\nThis power is maintained by concentration and may fail if concentration is interrupted. It is canceled by engaging in combat.", + "message": "", + "teachable": false, + "valid_targets": [ "self" ], + "spell_class": "CLAIRSENTIENT", + "skill": "metaphysics", + "flags": [ "PSIONIC", "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "IGNORE_WALLS", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ], + "difficulty": 3, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "effect_on_condition", + "effect_str": "EOC_CLAIR_SEE_AURAS_INITIATE", + "extra_effects": [ { "id": "psionic_drained_difficulty_three", "hit_self": true } ], + "shape": "blast", + "min_duration": { + "math": [ "( (u_val('spell_level', 'spell: clair_see_auras') * 9000) + 65000) * (scaling_factor(u_val('intelligence') ) )" ] + }, + "max_duration": { + "math": [ "( (u_val('spell_level', 'spell: clair_see_auras') * 19000) + 120000) * (scaling_factor(u_val('intelligence') ) )" ] + }, + "energy_source": "STAMINA", + "base_energy_cost": { + "math": [ + "u_effect_intensity('effect_clair_see_auras') > -1 ? 0 : max((4000 - (u_val('spell_level', 'spell: clair_see_auras') * 125)), 1750)" + ] + }, + "base_casting_time": { + "math": [ + "u_effect_intensity('effect_clair_see_auras') > -1 ? 10 : max((300 -(u_val('spell_level', 'spell: clair_see_auras') * 8.5)), 100)" + ] + }, + "learn_spells": { "clair_dodge_power": 9, "clair_clear_sight": 15 } }, { "id": "clair_sense_rads", @@ -259,7 +301,7 @@ "u_effect_intensity('effect_clair_ranged_enhance') > -1 ? 10 : max((200 -(u_val('spell_level', 'spell: clair_ranged_enhance') * 6)), 125)" ] }, - "learn_spells": { "clair_spot_weakness": 5, "clair_see_map": 9, "clair_clear_sight": 12 } + "learn_spells": { "clair_spot_weakness": 5, "clair_see_map": 9, "clair_perfect_shot": 12, "clair_clear_sight": 16 } }, { "id": "clair_voyance", @@ -339,7 +381,69 @@ "u_effect_intensity('effect_clair_dodge') > -1 ? 10 : max((150 -(u_val('spell_level', 'spell: clair_dodge_power') * 9)), 70)" ] }, - "learn_spells": { "clair_spot_weakness": 3, "clair_ranged_enhance": 6, "clair_clear_sight": 9, "clair_voyance": 12 } + "learn_spells": { "clair_spot_weakness": 3, "clair_ranged_enhance": 6, "clair_clear_sight": 10, "clair_perfect_shot": 12 } + }, + { + "id": "clair_craft_bonus", + "type": "SPELL", + "name": "[Ψ]Intuitive Artisan (C)", + "description": "Opening yourself up to the immediate future, you can see the best option to take when crafting or working on a task.\n\nThis power is maintained by concentration and may fail if concentration is interrupted. It is canceled by engaging in combat.", + "message": "", + "teachable": false, + "valid_targets": [ "self" ], + "spell_class": "CLAIRSENTIENT", + "skill": "metaphysics", + "flags": [ "PSIONIC", "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ], + "difficulty": 6, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "effect_on_condition", + "effect_str": "EOC_CLAIR_CRAFT_BONUS_INITIATE", + "shape": "blast", + "min_duration": { + "math": [ "( (u_val('spell_level', 'spell: clair_craft_bonus') * 25000) + 121500) * (scaling_factor(u_val('intelligence') ) )" ] + }, + "max_duration": { + "math": [ "( (u_val('spell_level', 'spell: clair_craft_bonus') * 60000) + 270000) * (scaling_factor(u_val('intelligence') ) )" ] + }, + "energy_source": "STAMINA", + "base_energy_cost": { + "math": [ + "u_effect_intensity('effect_clair_craft_bonus') > -1 ? 0 : max((5500 - (u_val('spell_level', 'spell: clair_craft_bonus') * 145)), 2250)" + ] + }, + "base_casting_time": { + "math": [ + "u_effect_intensity('effect_clair_craft_bonus') > -1 ? 10 : max((150 -(u_val('spell_level', 'spell: clair_craft_bonus') * 9)), 70)" + ] + }, + "learn_spells": { "clair_clear_sight": 8, "clair_omniscience": 12 } + }, + { + "id": "clair_perfect_shot", + "type": "SPELL", + "name": "[Ψ]One Perfect Shot", + "description": "Gaze into the future and, taking your enemy's future movements into account, fire at the perfect moment. This power will only last for a single attack.", + "message": "It's time to take the shot.", + "teachable": false, + "valid_targets": [ "self" ], + "spell_class": "CLAIRSENTIENT", + "skill": "metaphysics", + "flags": [ "PSIONIC", "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "IGNORE_WALLS", "NO_EXPLOSION_SFX" ], + "difficulty": 7, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "attack", + "effect_str": "effect_clair_perfect_shot", + "extra_effects": [ { "id": "psionic_drained_difficulty_seven", "hit_self": true } ], + "shape": "blast", + "min_duration": 1000, + "max_duration": 1000, + "energy_source": "STAMINA", + "base_energy_cost": 6500, + "final_energy_cost": 3500, + "energy_increment": -160, + "base_casting_time": 100, + "final_casting_time": 35, + "casting_time_increment": -4.5 }, { "id": "clair_see_map", @@ -399,6 +503,40 @@ }, "learn_spells": { "clair_omniscience": 7 } }, + { + "id": "clair_group_tactics", + "type": "SPELL", + "name": "[Ψ]Prescient Tactician (C)", + "description": "Gazing into the near future, you can call out warnings to your followers so they can avoid attacks before they occur. This will greatly increase their defensive capability, though it will be harder for you to defend yourself.\n\nThis power is maintained by concentration and may fail if concentration is interrupted. It requires even more concentration than usual.", + "message": "", + "teachable": false, + "valid_targets": [ "self" ], + "spell_class": "CLAIRSENTIENT", + "skill": "metaphysics", + "flags": [ "PSIONIC", "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "RANDOM_DURATION", "NO_EXPLOSION_SFX" ], + "difficulty": 9, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "effect_on_condition", + "effect_str": "EOC_CLAIR_GROUP_TACTICS_INITIATE", + "shape": "blast", + "min_duration": { + "math": [ "( (u_val('spell_level', 'spell: clair_group_tactics') * 1200) + 6000) * (scaling_factor(u_val('intelligence') ) )" ] + }, + "max_duration": { + "math": [ "( (u_val('spell_level', 'spell: clair_group_tactics') * 2500) + 18000) * (scaling_factor(u_val('intelligence') ) )" ] + }, + "energy_source": "STAMINA", + "base_energy_cost": { + "math": [ + "u_effect_intensity('effect_clair_group_tactics_self') > -1 ? 0 : max((6500 - (u_val('spell_level', 'spell: clair_group_tactics') * 150)), 2500)" + ] + }, + "base_casting_time": { + "math": [ + "u_effect_intensity('effect_clair_group_tactics_self') > -1 ? 10 : max((200 -(u_val('spell_level', 'spell: clair_group_tactics') * 7.5)), 60)" + ] + } + }, { "id": "clair_omniscience", "type": "SPELL", diff --git a/data/mods/MindOverMatter/powers/clairsentience_concentration_eocs.json b/data/mods/MindOverMatter/powers/clairsentience_concentration_eocs.json index 9c64767645104..3611d10a13cf3 100644 --- a/data/mods/MindOverMatter/powers/clairsentience_concentration_eocs.json +++ b/data/mods/MindOverMatter/powers/clairsentience_concentration_eocs.json @@ -124,31 +124,6 @@ { "u_lose_effect": "effect_clair_speed_reader" } ] }, - { - "type": "mutation", - "//": "This and following are all necessary because reading_speed_multiplier is hardcoded. Redo the whole thing once it isn't.", - "id": "CLAIR_SPEED_READ", - "name": { "str": "Speed Reader" }, - "points": 1, - "description": "Your powers allow you to absorb knowledge at a greatly accelerated pace.", - "reading_speed_multiplier": 0.66, - "valid": false, - "enchantments": [ "enchant_clair_speed_read" ] - }, - { - "type": "enchantment", - "id": "enchant_clair_speed_read", - "condition": "ALWAYS", - "has": "HELD", - "values": [ - { - "value": "READING_EXP", - "add": { - "math": [ "( ( u_val('spell_level', 'spell: clair_speed_reading') * 0.15) * (scaling_factor(u_val('intelligence') )))" ] - } - } - ] - }, { "type": "effect_on_condition", "id": "EOC_CLAIR_SPEED_READING_DRAIN", @@ -174,6 +149,58 @@ ], "false_effect": [ ] }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_SEE_AURAS_INITIATE", + "condition": { "not": { "u_has_effect": "effect_clair_see_auras" } }, + "effect": [ + { "u_message": "Swirling colors coalesce around others' bodies", "type": "good" }, + { "run_eocs": "EOC_POWER_MAINTENANCE_PLUS_ONE" }, + { "u_add_effect": "effect_clair_see_auras", "duration": "PERMANENT" }, + { "u_cast_spell": { "id": "psionic_drained_difficulty_three", "hit_self": true } }, + { + "queue_eocs": "EOC_CLAIR_SEE_AURAS_DRAIN", + "time_in_future": [ + { + "math": [ "( (u_val('spell_level', 'spell: clair_see_auras') * 90) + 650) * (scaling_factor(u_val('intelligence') ) )" ] + }, + { + "math": [ "( (u_val('spell_level', 'spell: clair_see_auras') * 190) + 1200) * (scaling_factor(u_val('intelligence') ) )" ] + } + ] + } + ], + "false_effect": [ { "run_eocs": "EOC_CLAIR_REMOVE_SEE_AURAS" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_REMOVE_SEE_AURAS", + "condition": { "u_has_effect": "effect_clair_see_auras" }, + "effect": [ { "run_eocs": "EOC_POWER_MAINTENANCE_MINUS_ONE" }, { "u_lose_effect": "effect_clair_see_auras" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_SEE_AURAS_DRAIN", + "condition": { "u_has_effect": "effect_clair_see_auras" }, + "effect": [ + { "u_cast_spell": { "id": "psionic_maintenance_drained_difficulty_three", "hit_self": true } }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_kcal_cost(3)" ] }, + { "math": [ "u_val('spell_exp', 'spell: clair_see_auras')", "+=", "(maintenance_exp_factor(u_val('focus')))" ] }, + { "run_eocs": "EOC_POWER_MAINTENANCE_CONCENTRATION_CHECK" }, + { + "queue_eocs": "EOC_CLAIR_SEE_AURAS_DRAIN", + "time_in_future": [ + { + "math": [ "( (u_val('spell_level', 'spell: clair_see_auras') * 90) + 650) * (scaling_factor(u_val('intelligence') ) )" ] + }, + { + "math": [ "( (u_val('spell_level', 'spell: clair_see_auras') * 190) + 1200) * (scaling_factor(u_val('intelligence') ) )" ] + } + ] + } + ], + "false_effect": [ ] + }, { "type": "effect_on_condition", "id": "EOC_CLAIR_DANGER_SENSE_INITIATE", @@ -336,6 +363,84 @@ ], "false_effect": [ ] }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_CRAFT_BONUS_INITIATE", + "condition": { "not": { "u_has_effect": "effect_clair_craft_bonus" } }, + "effect": [ + { "u_message": "You can see how it all fits together, and how it *should* fit together.", "type": "good" }, + { "run_eocs": [ "EOC_POWER_MAINTENANCE_PLUS_ONE", "EOC_CLAIR_CRAFT_BONUS_SWITCHER" ] }, + { "u_add_effect": "effect_clair_craft_bonus", "duration": "PERMANENT" }, + { "u_cast_spell": { "id": "psionic_drained_difficulty_six", "hit_self": true } }, + { + "queue_eocs": "EOC_CLAIR_CRAFT_BONUS_DRAIN", + "time_in_future": [ + { + "math": [ "( (u_val('spell_level', 'spell: clair_craft_bonus') * 250) + 1215) * (scaling_factor(u_val('intelligence') ) )" ] + }, + { + "math": [ "( (u_val('spell_level', 'spell: clair_craft_bonus') * 600) + 2700) * (scaling_factor(u_val('intelligence') ) )" ] + } + ] + } + ], + "false_effect": [ { "run_eocs": "EOC_CLAIR_REMOVE_CRAFT_BONUS" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_CRAFT_BONUS_SWITCHER", + "effect": { + "switch": { "u_val": "spell_level", "spell": "clair_craft_bonus" }, + "cases": [ + { "case": 0, "effect": { "u_add_trait": "CLAIR_CRAFT_BONUS_01" } }, + { "case": 4, "effect": { "u_add_trait": "CLAIR_CRAFT_BONUS_02" } }, + { "case": 8, "effect": { "u_add_trait": "CLAIR_CRAFT_BONUS_03" } }, + { "case": 12, "effect": { "u_add_trait": "CLAIR_CRAFT_BONUS_04" } }, + { "case": 16, "effect": { "u_add_trait": "CLAIR_CRAFT_BONUS_05" } }, + { "case": 20, "effect": { "u_add_trait": "CLAIR_CRAFT_BONUS_06" } } + ] + } + }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_REMOVE_CRAFT_BONUS", + "condition": { "u_has_effect": "effect_clair_craft_bonus" }, + "effect": [ + { "run_eocs": "EOC_POWER_MAINTENANCE_MINUS_ONE" }, + { "u_lose_effect": "effect_clair_craft_bonus" }, + { "u_lose_trait": "CLAIR_CRAFT_BONUS_01" }, + { "u_lose_trait": "CLAIR_CRAFT_BONUS_02" }, + { "u_lose_trait": "CLAIR_CRAFT_BONUS_03" }, + { "u_lose_trait": "CLAIR_CRAFT_BONUS_04" }, + { "u_lose_trait": "CLAIR_CRAFT_BONUS_05" }, + { "u_lose_trait": "CLAIR_CRAFT_BONUS_06" } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_CRAFT_BONUS_DRAIN", + "condition": { "u_has_effect": "effect_clair_craft_bonus" }, + "effect": [ + { "u_cast_spell": { "id": "psionic_maintenance_drained_difficulty_six", "hit_self": true } }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_kcal_cost(6)" ] }, + { + "math": [ "u_val('spell_exp', 'spell: clair_craft_bonus')", "+=", "(maintenance_exp_factor(u_val('focus')))" ] + }, + { "run_eocs": "EOC_POWER_MAINTENANCE_CONCENTRATION_CHECK" }, + { + "queue_eocs": "EOC_CLAIR_CRAFT_BONUS_DRAIN", + "time_in_future": [ + { + "math": [ "( (u_val('spell_level', 'spell: clair_craft_bonus') * 250) + 1215) * (scaling_factor(u_val('intelligence') ) )" ] + }, + { + "math": [ "( (u_val('spell_level', 'spell: clair_craft_bonus') * 600) + 2700) * (scaling_factor(u_val('intelligence') ) )" ] + } + ] + } + ], + "false_effect": [ ] + }, { "type": "effect_on_condition", "id": "EOC_CLAIR_CLEAR_SIGHT_INITIATE", @@ -389,5 +494,65 @@ } ], "false_effect": [ ] + }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_GROUP_TACTICS_INITIATE", + "condition": { "not": { "u_has_effect": "effect_clair_group_tactics_self" } }, + "effect": [ + { + "u_message": "As the visions overtake you, you start involuntarily calling out warnings to your allies.", + "type": "good" + }, + { "run_eocs": [ "EOC_POWER_MAINTENANCE_PLUS_ONE", "EOC_POWER_MAINTENANCE_PLUS_ONE" ] }, + { "u_add_effect": "effect_clair_group_tactics_self", "duration": "PERMANENT" }, + { "u_cast_spell": { "id": "psionic_drained_difficulty_nine", "hit_self": true } }, + { + "queue_eocs": "EOC_CLAIR_GROUP_TACTICS_DRAIN", + "time_in_future": [ + { + "math": [ "( (u_val('spell_level', 'spell: clair_group_tactics') * 12) + 60) * (scaling_factor(u_val('intelligence') ) )" ] + }, + { + "math": [ "( (u_val('spell_level', 'spell: clair_group_tactics') * 25) + 180) * (scaling_factor(u_val('intelligence') ) )" ] + } + ] + } + ], + "false_effect": [ { "run_eocs": "EOC_CLAIR_REMOVE_GROUP_TACTICS" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_REMOVE_GROUP_TACTICS", + "condition": { "u_has_effect": "effect_clair_group_tactics_self" }, + "effect": [ + { "run_eocs": [ "EOC_POWER_MAINTENANCE_MINUS_ONE", "EOC_POWER_MAINTENANCE_MINUS_ONE" ] }, + { "u_lose_effect": "effect_clair_group_tactics_self" } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_CLAIR_GROUP_TACTICS_DRAIN", + "condition": { "u_has_effect": "effect_clair_group_tactics_self" }, + "effect": [ + { "u_cast_spell": { "id": "psionic_maintenance_drained_difficulty_nine", "hit_self": true } }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_kcal_cost(9)" ] }, + { + "math": [ "u_val('spell_exp', 'spell: clair_group_tactics')", "+=", "(maintenance_exp_factor(u_val('focus')))" ] + }, + { "run_eocs": "EOC_POWER_MAINTENANCE_CONCENTRATION_CHECK" }, + { + "queue_eocs": "EOC_CLAIR_GROUP_TACTICS_DRAIN", + "time_in_future": [ + { + "math": [ "( (u_val('spell_level', 'spell: clair_group_tactics') * 12) + 60) * (scaling_factor(u_val('intelligence') ) )" ] + }, + { + "math": [ "( (u_val('spell_level', 'spell: clair_group_tactics') * 25) + 180) * (scaling_factor(u_val('intelligence') ) )" ] + } + ] + } + ], + "false_effect": [ ] } ] diff --git a/data/mods/MindOverMatter/powers/photokinesis.json b/data/mods/MindOverMatter/powers/photokinesis.json index 09dc20f64c24e..36c782d155003 100644 --- a/data/mods/MindOverMatter/powers/photokinesis.json +++ b/data/mods/MindOverMatter/powers/photokinesis.json @@ -204,7 +204,7 @@ "base_casting_time": 125, "final_casting_time": 50, "casting_time_increment": -7.5, - "learn_spells": { "photokinetic_light_arms": 8, "photokinetic_invisibility": 18 } + "learn_spells": { "photokinetic_rad_immunity": 8, "photokinetic_invisibility": 18 } }, { "id": "photokinetic_light_dodge", @@ -240,7 +240,7 @@ "base_casting_time": 125, "final_casting_time": 65, "casting_time_increment": -9.5, - "learn_spells": { "photokinetic_rad_immunity": 5, "photokinetic_light_image": 12, "photokinetic_invisibility": 18 } + "learn_spells": { "photokinetic_hide_ugly": 12, "photokinetic_light_image": 15, "photokinetic_invisibility": 18 } }, { "id": "photokinetic_light_beam", @@ -323,7 +323,7 @@ "base_casting_time": 150, "final_casting_time": 75, "casting_time_increment": -8, - "learn_spells": { "photokinetic_light_image": 7, "photokinetic_invisibility": 12 } + "learn_spells": { "photokinetic_light_image": 7, "photokinetic_hide_ugly": 10, "photokinetic_invisibility": 14 } }, { "id": "photokinetic_rad_immunity", @@ -398,7 +398,47 @@ "base_casting_time": 250, "final_casting_time": 100, "casting_time_increment": -12.5, - "learn_spells": { "photokinetic_light_flash": 6, "photokinetic_light_disintegrate": 12 } + "learn_spells": { "photokinetic_hide_ugly": 6, "photokinetic_light_flash": 9, "photokinetic_light_disintegrate": 12 } + }, + { + "id": "photokinetic_hide_ugly", + "type": "SPELL", + "name": "[Ψ]Mirror-Mask (C)", + "description": "Hide your true form behind unassuming illusions, preventing baseline humans from reacting poorly to your presence if you are mutated or a cyborg.\n\nThis power is maintained by concentration and may fail if concentration is interrupted. It is canceled by engaging in combat.", + "message": "", + "teachable": false, + "valid_targets": [ "self" ], + "spell_class": "PHOTOKINETIC", + "skill": "metaphysics", + "flags": [ "PSIONIC", "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "RANDOM_DURATION" ], + "difficulty": 4, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "effect_on_condition", + "effect_str": "EOC_PHOTOKIN_HIDE_UGLY_INITIATE", + "extra_effects": [ { "id": "psionic_drained_difficulty_four", "hit_self": true } ], + "shape": "blast", + "min_duration": { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_hide_ugly') * 2250) + 45000) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + "max_duration": { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_hide_ugly') * 5500) + 80000) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + "energy_source": "STAMINA", + "base_energy_cost": { + "math": [ + "u_effect_intensity('effect_photokin_hide_ugly') > -1 ? 0 : max((6500 - (u_val('spell_level', 'spell: photokinetic_hide_ugly') * 150)), 2000)" + ] + }, + "base_casting_time": { + "math": [ + "u_effect_intensity('effect_photokin_hide_ugly') > -1 ? 10 : max((1500 -(u_val('spell_level', 'spell: photokinetic_hide_ugly') * 100)), 150)" + ] + }, + "learn_spells": { "photokinetic_light_image": 6 } }, { "id": "photokinetic_light_image", @@ -475,7 +515,7 @@ "u_effect_intensity('effect_photokinetic_radio') > -1 ? 10 : max((250 -(u_val('spell_level', 'spell: biokin_hammerhand') * 10)), 75)" ] }, - "learn_spells": { "photokinetic_blinding_glare": 8 } + "learn_spells": { "photokinetic_rad_immunity": 6, "photokinetic_blinding_glare": 9 } }, { "id": "photokinetic_invisibility", @@ -496,12 +536,12 @@ "shape": "blast", "min_duration": { "math": [ - "( (u_val('spell_level', 'spell: photokinetic_invisibility') * 2000) + 1500) * (scaling_factor(u_val('intelligence') ) )" + "( (u_val('spell_level', 'spell: photokinetic_invisibility') * 500) + 1500) * (scaling_factor(u_val('intelligence') ) )" ] }, "max_duration": { "math": [ - "( (u_val('spell_level', 'spell: photokinetic_invisibility') * 2000) + 4000) * (scaling_factor(u_val('intelligence') ) )" + "( (u_val('spell_level', 'spell: photokinetic_invisibility') * 1500) + 4000) * (scaling_factor(u_val('intelligence') ) )" ] }, "energy_source": "STAMINA", @@ -617,12 +657,12 @@ "extra_effects": [ { "id": "psionic_drained_difficulty_eight", "hit_self": true } ], "min_damage": { "math": [ - "( (u_val('spell_level', 'spell: photokinetic_light_disintegrate') * 5) + 20) * (scaling_factor(u_val('intelligence') ) )" + "( (u_val('spell_level', 'spell: photokinetic_light_disintegrate') * 5) + 40) * (scaling_factor(u_val('intelligence') ) )" ] }, "max_damage": { "math": [ - "( (u_val('spell_level', 'spell: photokinetic_light_disintegrate') * 7) + 80) * (scaling_factor(u_val('intelligence') ) )" + "( (u_val('spell_level', 'spell: photokinetic_light_disintegrate') * 7) + 120) * (scaling_factor(u_val('intelligence') ) )" ] }, "damage_type": "psi_photokinetic_damage", diff --git a/data/mods/MindOverMatter/powers/photokinesis_concentration_eoc.json b/data/mods/MindOverMatter/powers/photokinesis_concentration_eoc.json new file mode 100644 index 0000000000000..9b23f97e523eb --- /dev/null +++ b/data/mods/MindOverMatter/powers/photokinesis_concentration_eoc.json @@ -0,0 +1,83 @@ +[ + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_HIDE_UGLY_INITIATE", + "condition": { "not": { "u_has_effect": "effect_photokin_hide_ugly" } }, + "effect": [ + { "u_message": "You shroud your true form behind unassuming illusions.", "type": "good" }, + { + "run_eocs": [ "EOC_POWER_MAINTENANCE_PLUS_ONE", "EOC_PHOTOKIN_HIDE_UGLY_SWITCHER", "EOC_PHOTOKIN_HIDE_UGLY_REMOVE_GODCO_VARS" ] + }, + { "u_add_effect": "effect_photokin_hide_ugly", "duration": "PERMANENT" }, + { "u_cast_spell": { "id": "psionic_drained_difficulty_four", "hit_self": true } }, + { + "queue_eocs": "EOC_PHOTOKIN_HIDE_UGLY_DRAIN", + "time_in_future": [ + { + "math": [ "( (u_val('spell_level', 'spell: photokinetic_hide_ugly') * 22) + 450) * (scaling_factor(u_val('intelligence') ) )" ] + }, + { + "math": [ "( (u_val('spell_level', 'spell: photokinetic_hide_ugly') * 55) + 800) * (scaling_factor(u_val('intelligence') ) )" ] + } + ] + } + ], + "false_effect": [ { "run_eocs": "EOC_PHOTOKIN_REMOVE_HIDE_UGLY" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_HIDE_UGLY_SWITCHER", + "effect": { + "switch": { "u_val": "spell_level", "spell": "photokinetic_hide_ugly" }, + "cases": [ + { "case": 0, "effect": { "u_add_trait": "PHOTOKIN_HIDE_UGLY_01" } }, + { "case": 4, "effect": { "u_add_trait": "PHOTOKIN_HIDE_UGLY_02" } }, + { "case": 8, "effect": { "u_add_trait": "PHOTOKIN_HIDE_UGLY_03" } }, + { "case": 12, "effect": { "u_add_trait": "PHOTOKIN_HIDE_UGLY_04" } }, + { "case": 16, "effect": { "u_add_trait": "PHOTOKIN_HIDE_UGLY_05" } }, + { "case": 20, "effect": { "u_add_trait": "PHOTOKIN_HIDE_UGLY_06" } } + ] + } + }, + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_REMOVE_HIDE_UGLY", + "condition": { "u_has_effect": "effect_photokin_hide_ugly" }, + "effect": [ + { "run_eocs": "EOC_POWER_MAINTENANCE_MINUS_ONE" }, + { "u_lose_effect": "effect_photokin_hide_ugly" }, + { "u_lose_trait": "PHOTOKIN_HIDE_UGLY_01" }, + { "u_lose_trait": "PHOTOKIN_HIDE_UGLY_02" }, + { "u_lose_trait": "PHOTOKIN_HIDE_UGLY_03" }, + { "u_lose_trait": "PHOTOKIN_HIDE_UGLY_04" }, + { "u_lose_trait": "PHOTOKIN_HIDE_UGLY_05" }, + { "u_lose_trait": "PHOTOKIN_HIDE_UGLY_06" }, + { "run_eocs": "EOC_PHOTOKIN_HIDE_UGLY_GRANT_GODCO_VARS" } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_HIDE_UGLY_DRAIN", + "condition": { "u_has_effect": "effect_photokin_hide_ugly" }, + "effect": [ + { "u_cast_spell": { "id": "psionic_maintenance_drained_difficulty_four", "hit_self": true } }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_kcal_cost(4)" ] }, + { + "math": [ "u_val('spell_exp', 'spell: photokinetic_hide_ugly')", "+=", "(maintenance_exp_factor(u_val('focus')))" ] + }, + { "run_eocs": "EOC_POWER_MAINTENANCE_CONCENTRATION_CHECK" }, + { + "queue_eocs": "EOC_PHOTOKIN_HIDE_UGLY_DRAIN", + "time_in_future": [ + { + "math": [ "( (u_val('spell_level', 'spell: photokinetic_hide_ugly') * 22) + 450) * (scaling_factor(u_val('intelligence') ) )" ] + }, + { + "math": [ "( (u_val('spell_level', 'spell: photokinetic_hide_ugly') * 55) + 800) * (scaling_factor(u_val('intelligence') ) )" ] + } + ] + } + ], + "false_effect": [ ] + } +] diff --git a/data/mods/MindOverMatter/powers/photokinesis_eocs.json b/data/mods/MindOverMatter/powers/photokinesis_eocs.json index 38b9efae062c8..526da09d8a629 100644 --- a/data/mods/MindOverMatter/powers/photokinesis_eocs.json +++ b/data/mods/MindOverMatter/powers/photokinesis_eocs.json @@ -1,4 +1,70 @@ [ + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_HIDE_UGLY_REMOVE_GODCO_VARS", + "condition": { + "u_has_any_trait": [ + "THRESH_LIZARD", + "THRESH_GASTROPOD", + "THRESH_BIRD", + "THRESH_FISH", + "THRESH_BEAST", + "THRESH_FELINE", + "THRESH_LUPINE", + "THRESH_URSINE", + "THRESH_CATTLE", + "THRESH_INSECT", + "THRESH_PLANT", + "THRESH_SLIME", + "THRESH_TROGLOBITE", + "THRESH_CEPHALOPOD", + "THRESH_SPIDER", + "THRESH_RAT", + "THRESH_ELPHA", + "THRESH_CHIMERA", + "THRESH_RAPTOR", + "THRESH_BATRACHIAN", + "THRESH_MOUSE", + "THRESH_MARLOSS", + "THRESH_MYCUS", + "THRESH_CRUSTACEAN" + ] + }, + "effect": [ { "u_lose_var": "godco_notalk_to_u", "type": "dialogue", "context": "godco" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_HIDE_UGLY_GRANT_GODCO_VARS", + "condition": { + "u_has_any_trait": [ + "THRESH_LIZARD", + "THRESH_GASTROPOD", + "THRESH_BIRD", + "THRESH_FISH", + "THRESH_BEAST", + "THRESH_FELINE", + "THRESH_LUPINE", + "THRESH_URSINE", + "THRESH_CATTLE", + "THRESH_INSECT", + "THRESH_PLANT", + "THRESH_SLIME", + "THRESH_TROGLOBITE", + "THRESH_CEPHALOPOD", + "THRESH_SPIDER", + "THRESH_RAT", + "THRESH_ELPHA", + "THRESH_CHIMERA", + "THRESH_RAPTOR", + "THRESH_BATRACHIAN", + "THRESH_MOUSE", + "THRESH_MARLOSS", + "THRESH_MYCUS", + "THRESH_CRUSTACEAN" + ] + }, + "effect": [ { "u_add_var": "godco_notalk_to_u", "type": "dialogue", "context": "godco", "value": "yes" } ] + }, { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_LIGHT_LOCAL_INITIATE", diff --git a/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json b/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json index afe177496aa12..ca57408f3ae30 100644 --- a/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json @@ -13,13 +13,17 @@ "practice_clair_night_vision", "practice_clair_danger_sense", "practice_clair_speed_reading", + "practice_clair_aura_sight", "practice_clair_sense_rads", "practice_clair_spot_weakness", "practice_clair_ranged_enhance", "practice_clair_voyance", "practice_clair_dodge_power", + "practice_clair_craft_bonus", "practice_clair_see_map", + "practice_clair_perfect_shot", "practice_clair_clear_sight", + "practice_clair_group_tactics", "practice_clair_omniscience" ], "difficulty": 1 @@ -279,6 +283,57 @@ } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "name": "contemplation: aura sight", + "id": "practice_clair_aura_sight", + "description": "Contemplate your powers and improve your ability to see others' emotional states.", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "metaphysics", + "difficulty": 2, + "time": "30 m", + "autolearn": false, + "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], + "flags": [ "SECRET", "BLIND_HARD" ], + "result_eocs": [ + { + "id": "EOC_PRACTICE_CLAIR_SEE_AURAS", + "condition": { + "and": [ + { "math": [ "u_val('spell_level', 'spell: clair_see_auras')", ">=", "1" ] }, + { + "math": [ "u_val('spell_exp', 'spell: clair_see_auras')", "<=", "(difficulty_three_contemplation(1))" ] + } + ] + }, + "effect": [ + { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, + { "math": [ "u_val('spell_exp', 'spell: clair_see_auras')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(3)" ] }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": { + "run_eocs": [ + { + "id": "EOC_PRACTICE_CLAIR_SEE_AURAS_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: clair_see_auras')", ">=", "1" ] }, + "effect": [ + { "u_message": "Your knowledge of your powers is so deep that mere contemplation is of no further use to you." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": [ + { "u_message": "Without even a basic understanding of the power, your meditation is nothing but idle musings." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ] + } + ] + } + } + ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -433,6 +488,58 @@ } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "name": "contemplation: intuitive artisan", + "id": "practice_clair_craft_bonus", + "description": "Contemplate your powers and improve your ability to determine exactly how you should build that thing you're working on.", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "metaphysics", + "difficulty": 5, + "time": "30 m", + "autolearn": false, + "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], + "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], + "flags": [ "SECRET", "BLIND_HARD" ], + "result_eocs": [ + { + "id": "EOC_PRACTICE_CLAIR_CRAFT_BONUS", + "condition": { + "and": [ + { "math": [ "u_val('spell_level', 'spell: clair_craft_bonus')", ">=", "1" ] }, + { + "math": [ "u_val('spell_exp', 'spell: clair_craft_bonus')", "<=", "(difficulty_six_contemplation(1))" ] + } + ] + }, + "effect": [ + { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, + { "math": [ "u_val('spell_exp', 'spell: clair_craft_bonus')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(6)" ] }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": { + "run_eocs": [ + { + "id": "EOC_PRACTICE_CLAIR_CRAFT_BONUS_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: clair_craft_bonus')", ">=", "1" ] }, + "effect": [ + { "u_message": "Your knowledge of your powers is so deep that mere contemplation is of no further use to you." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": [ + { "u_message": "Without even a basic understanding of the power, your meditation is nothing but idle musings." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ] + } + ] + } + } + ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -483,6 +590,58 @@ } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "name": "contemplation: one perfect shot", + "id": "practice_clair_perfect_shot", + "description": "Contemplate your powers and improve your ability to only need one shot.", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "metaphysics", + "difficulty": 6, + "time": "30 m", + "autolearn": false, + "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], + "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], + "flags": [ "SECRET", "BLIND_HARD" ], + "result_eocs": [ + { + "id": "EOC_PRACTICE_CLAIR_PERFECT_SHOT", + "condition": { + "and": [ + { "math": [ "u_val('spell_level', 'spell: clair_perfect_shot')", ">=", "1" ] }, + { + "math": [ "u_val('spell_exp', 'spell: clair_perfect_shot')", "<=", "(difficulty_seven_contemplation(1))" ] + } + ] + }, + "effect": [ + { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, + { "math": [ "u_val('spell_exp', 'spell: clair_perfect_shot')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(7)" ] }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": { + "run_eocs": [ + { + "id": "EOC_PRACTICE_CLAIR_PERFECT_SHOT_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: clair_perfect_shot')", ">=", "1" ] }, + "effect": [ + { "u_message": "Your knowledge of your powers is so deep that mere contemplation is of no further use to you." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": [ + { "u_message": "Without even a basic understanding of the power, your meditation is nothing but idle musings." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ] + } + ] + } + } + ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", @@ -535,6 +694,58 @@ } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "name": "contemplation: prescient tactics", + "id": "practice_clair_group_tactics", + "description": "Contemplate your powers and improve your ability to use foresight to advise your allies.", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "metaphysics", + "difficulty": 8, + "time": "30 m", + "autolearn": false, + "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], + "components": [ [ [ "matrix_crystal_clair_dust", 1 ] ] ], + "flags": [ "SECRET", "BLIND_HARD" ], + "result_eocs": [ + { + "id": "EOC_PRACTICE_CLAIR_GROUP_TACTICS", + "condition": { + "and": [ + { "math": [ "u_val('spell_level', 'spell: clair_group_tactics')", ">=", "1" ] }, + { + "math": [ "u_val('spell_exp', 'spell: clair_group_tactics')", "<=", "(difficulty_nine_contemplation(1))" ] + } + ] + }, + "effect": [ + { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, + { "math": [ "u_val('spell_exp', 'spell: clair_group_tactics')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(9)" ] }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": { + "run_eocs": [ + { + "id": "EOC_PRACTICE_CLAIR_GROUP_TACTICS_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: clair_group_tactics')", ">=", "1" ] }, + "effect": [ + { "u_message": "Your knowledge of your powers is so deep that mere contemplation is of no further use to you." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": [ + { "u_message": "Without even a basic understanding of the power, your meditation is nothing but idle musings." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ] + } + ] + } + } + ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", diff --git a/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json index 500b56bd50ff4..04ac028ea230f 100644 --- a/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json @@ -18,6 +18,7 @@ "practice_photokinetic_camouflage", "practice_photokinetic_rad_immunity", "practice_photokinetic_light_arms", + "practice_photokinetic_hide_ugly", "practice_photokinetic_light_image", "practice_photokinetic_radio", "practice_photokinetic_invisibility", @@ -438,6 +439,58 @@ } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "name": "contemplation: mirror-mask", + "id": "practice_photokinetic_hide_ugly", + "description": "Contemplate your powers and improve your ability to create illusions of extra arms.", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "metaphysics", + "difficulty": 3, + "time": "30 m", + "autolearn": false, + "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], + "components": [ [ [ "matrix_crystal_photokin_dust", 1 ] ] ], + "flags": [ "SECRET", "BLIND_HARD" ], + "result_eocs": [ + { + "id": "EOC_PRACTICE_PHOTOKIN_HIDE_UGLY", + "condition": { + "and": [ + { "math": [ "u_val('spell_level', 'spell: photokinetic_hide_ugly')", ">=", "1" ] }, + { + "math": [ "u_val('spell_exp', 'spell: photokinetic_hide_ugly')", "<=", "(difficulty_four_contemplation(1))" ] + } + ] + }, + "effect": [ + { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, + { "math": [ "u_val('spell_exp', 'spell: photokinetic_hide_ugly')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(4)" ] }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": { + "run_eocs": [ + { + "id": "EOC_PRACTICE_PHOTOKIN_HIDE_UGLY_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_hide_ugly')", ">=", "1" ] }, + "effect": [ + { "u_message": "Your knowledge of your powers is so deep that mere contemplation is of no further use to you." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": [ + { "u_message": "Without even a basic understanding of the power, your meditation is nothing but idle musings." }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ] + } + ] + } + } + ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE",