diff --git a/data/core/game_balance.json b/data/core/game_balance.json index ba76a2f980809..5c0bc23c61535 100644 --- a/data/core/game_balance.json +++ b/data/core/game_balance.json @@ -104,6 +104,34 @@ "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_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": "float", + "value": 80.0 + }, { "type": "EXTERNAL_OPTION", "name": "SPAWN_ANIMAL_DENSITY", 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", 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", 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 90f9b7c99129e..94287278aa237 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -5273,8 +5273,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, max_city_size ); @@ -6661,6 +6660,102 @@ void overmap::place_specials( overmap_special_batch &enabled_specials ) void overmap::place_mongroups() { + // Cities can be full of zombies + 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; + + 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( city_effective_radius ), 0 ) ) { + + // 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. + std::vector local_sm_list; + local_sm_list.push_back( this_sm ); + 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. + // 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() ); + } + + } + } + } + + if( submap_list.empty() ) { + // 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_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_writable() ); + + // 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. + m.horde = true; + if( get_option( "WANDER_SPAWNS" ) ) { + m.wander( *this ); + } + add_mon_group( m ); + desired_zombies -= 10; + } + } + } + } + } + if( get_option( "DISABLE_ANIMAL_CLASH" ) ) { // Figure out where swamps are, and place swamp monsters for( int x = 3; x < OMAPX - 3; x += 7 ) { diff --git a/src/overmap_ui.cpp b/src/overmap_ui.cpp index 3737fb96c5f5a..6ae11cfe9f23c 100644 --- a/src/overmap_ui.cpp +++ b/src/overmap_ui.cpp @@ -93,6 +93,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_CLAIRVOYANCE( "DEBUG_CLAIRVOYANCE" ); static const trait_id trait_DEBUG_NIGHTVISION( "DEBUG_NIGHTVISION" ); #if defined(__ANDROID__) @@ -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 || 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 7e3c9d97aa647..f42594d018975 100644 --- a/src/sdltiles.cpp +++ b/src/sdltiles.cpp @@ -99,6 +99,7 @@ static const oter_type_str_id oter_type_forest_trail( "forest_trail" ); +static const trait_id trait_DEBUG_CLAIRVOYANCE( "DEBUG_CLAIRVOYANCE" ); static const trait_id trait_DEBUG_NIGHTVISION( "DEBUG_NIGHTVISION" ); //*********************************** @@ -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 || + you.has_trait( trait_DEBUG_CLAIRVOYANCE ) ); // the full string from the ter_id including _north etc. std::string id; int rotation = 0; @@ -937,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 ) {