diff --git a/data/json/artifact/artifact_item_types.json b/data/json/artifact/artifact_item_types.json index 48e8073194ff8..219d31ffdca30 100644 --- a/data/json/artifact/artifact_item_types.json +++ b/data/json/artifact/artifact_item_types.json @@ -5,6 +5,7 @@ "category": "artifacts", "name": { "str": "smooth sphere" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "O", "volume": "1 L", "weight": "1 kg", @@ -17,6 +18,7 @@ "category": "artifacts", "name": { "str": "slim rod" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "|", "volume": "235 ml", "weight": "300 g", @@ -30,6 +32,7 @@ "category": "artifacts", "name": { "str": "teardrop-shaped stone" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "O", "volume": "35 ml", "weight": "50 g", @@ -41,6 +44,7 @@ "category": "artifacts", "name": { "str": "hollow, transparent cube" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "[", "volume": "1 L", "weight": "80 g", @@ -52,6 +56,7 @@ "category": "artifacts", "name": { "str": "winding, flexible rod" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "S", "volume": "215 ml", "weight": "300 g", @@ -65,6 +70,7 @@ "category": "artifacts", "name": { "str": "smooth disc" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "O", "volume": "340 ml", "weight": "575 g", @@ -77,6 +83,7 @@ "category": "artifacts", "name": { "str": "string of beads", "str_pl": "strings of beads" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "O", "volume": "76 ml", "weight": "125 g", @@ -88,6 +95,7 @@ "category": "artifacts", "name": { "str": "very thin sheet" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "[", "volume": "2 ml", "weight": "1 g", @@ -99,6 +107,7 @@ "category": "artifacts", "name": { "str": "spiked sphere" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "O", "volume": "1 L", "weight": "800 g", @@ -111,6 +120,7 @@ "category": "artifacts", "name": { "str": "malleable blob" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "O", "volume": "1 L", "weight": "800 g", @@ -122,6 +132,7 @@ "category": "artifacts", "name": { "str": "spiraling rod" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "@", "volume": "3400 ml", "weight": "300 g", @@ -135,6 +146,7 @@ "category": "artifacts", "name": { "str": "small pin" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "|", "volume": "1 ml", "weight": "50 mg", @@ -148,6 +160,7 @@ "category": "artifacts", "name": { "str": "hollow tube" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "|", "volume": "188 ml", "weight": "50 mg", @@ -160,6 +173,7 @@ "category": "artifacts", "name": { "str": "regular tetrahedron" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "A", "volume": "1 L", "weight": "1 kg", @@ -172,6 +186,7 @@ "category": "artifacts", "name": { "str": "translucent crystal" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "A", "volume": "500 ml", "weight": "400 g", @@ -184,6 +199,7 @@ "category": "artifacts", "name": { "str": "twisted, knotted cord" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "b", "volume": "400 ml", "weight": "400 g", @@ -195,6 +211,7 @@ "category": "artifacts", "name": { "str": "crescent-shaped stone" }, "description": "It is the only one of its kind.\nIt may have unknown powers; try activating them.", + "material": [ "anomaly" ], "symbol": "C", "volume": "35 ml", "weight": "50 g", diff --git a/data/json/effects.json b/data/json/effects.json index b828afbdd879c..611e924cc15c4 100644 --- a/data/json/effects.json +++ b/data/json/effects.json @@ -58,6 +58,20 @@ "name": [ "Cornered Fighter Recently Spooked" ], "desc": [ "AI tag to allow CORNERED_FIGHTER monsters to turn and fight. This is a bug if you have it." ] }, + { + "type": "effect_type", + "id": "critter_well_fed", + "name": [ "Well Fed" ], + "show_in_info": true, + "desc": [ "AI tag for when critter has had enough to eat. This is a bug if you have it." ] + }, + { + "type": "effect_type", + "id": "critter_underfed", + "name": [ "Underfed" ], + "show_in_info": true, + "desc": [ "AI tag for when critter has not had enough to eat. This is a bug if you have it." ] + }, { "type": "effect_type", "id": "dragging", diff --git a/data/json/flags.json b/data/json/flags.json index 500272d96b14c..59b239a1fc2dc 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -2347,5 +2347,10 @@ "id": "ROOTS3", "type": "json_flag", "info": "The character has extensive roots, which helps with the TREE_COMMUNION mutation." + }, + { + "id": "UNDERFED", + "type": "json_flag", + "//": "This corpse is from a monster with the CRITTER_UNDERFED flag." } ] diff --git a/data/json/furniture_and_terrain/furniture-flora.json b/data/json/furniture_and_terrain/furniture-flora.json index ae6c69a5c2f7a..be88fbe498085 100644 --- a/data/json/furniture_and_terrain/furniture-flora.json +++ b/data/json/furniture_and_terrain/furniture-flora.json @@ -9,7 +9,7 @@ "looks_like": "f_dandelion", "move_cost_mod": 0, "required_str": -1, - "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER" ], + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER", "GRAZER_INEDIBLE" ], "examine_action": "flower_poppy", "bash": { "str_min": 2, "str_max": 6, "sound": "crunch.", "sound_fail": "whish." } }, @@ -113,13 +113,13 @@ "type": "furniture", "id": "f_flower_tulip", "name": "tulip", - "description": "A bright, colorful flower with petals forming a small cup at its top.", + "description": "A bright, colorful flower with petals forming a small cup at its top. It can be poisonous to livestock.", "symbol": "f", "looks_like": "f_mutpoppy", "color": "light_blue", "move_cost_mod": 0, "required_str": -1, - "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER" ], + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER", "GRAZER_INEDIBLE" ], "examine_action": "harvest_furn_nectar", "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn" ], "id": "generic_flower_harv" } ], "bash": { "str_min": 2, "str_max": 6, "sound": "crunch.", "sound_fail": "whish." } @@ -160,13 +160,13 @@ "type": "furniture", "id": "f_black_eyed_susan", "name": "black eyed susan", - "description": "A yellow flower with a dark ball in the middle. Sometimes known as an ox-eye daisy.", + "description": "A mildly poisonous yellow flower with a dark ball in the middle. Sometimes known as an ox-eye daisy.", "looks_like": "f_dandelion", "symbol": "f", "color": "light_green", "move_cost_mod": 0, "required_str": -1, - "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER" ], + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER", "GRAZER_INEDIBLE" ], "examine_action": "harvest_furn_nectar", "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn" ], "id": "generic_flower_harv" } ], "//": "Add flower and bud spawns once useful.", @@ -182,7 +182,7 @@ "color": "pink", "move_cost_mod": 0, "required_str": -1, - "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER" ], + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER", "GRAZER_INEDIBLE" ], "examine_action": "harvest_furn_nectar", "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn" ], "id": "generic_flower_harv" } ], "//": "Add flower and bud spawns once useful.", @@ -198,7 +198,7 @@ "color": "yellow", "move_cost_mod": 0, "required_str": -1, - "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER" ], + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER", "GRAZER_INEDIBLE" ], "examine_action": "harvest_furn_nectar", "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn" ], "id": "lotus_harv" } ], "//": "Add flower and bud spawns once useful.", @@ -243,7 +243,7 @@ "color": "green", "move_cost_mod": 0, "required_str": -1, - "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER" ], + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER", "GRAZER_INEDIBLE" ], "examine_action": "harvest_furn", "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn" ], "id": "generic_flower_harv" } ], "bash": { "str_min": 2, "str_max": 6, "sound": "crunch.", "sound_fail": "whish." } @@ -258,7 +258,7 @@ "color": "blue", "move_cost_mod": 0, "required_str": -1, - "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER" ], + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "FLOWER", "GRAZER_INEDIBLE" ], "examine_action": "harvest_furn_nectar", "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn" ], "id": "bluebell_harv" } ], "bash": { "str_min": 2, "str_max": 6, "sound": "crunch.", "sound_fail": "whish." } @@ -302,7 +302,7 @@ "looks_like": "f_dandelion", "move_cost_mod": 1, "required_str": -1, - "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "ORGANIC" ], + "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "ORGANIC", "GRAZER_INEDIBLE" ], "examine_action": "harvest_furn_nectar", "harvest_by_season": [ { "seasons": [ "spring", "summer", "autumn" ], "id": "datura_harv" } ], "bash": { "str_min": 2, "str_max": 6, "sound": "crunch.", "sound_fail": "whish." } diff --git a/data/json/furniture_and_terrain/furniture-fungal.json b/data/json/furniture_and_terrain/furniture-fungal.json index 355f0b997497f..9753ae71c553c 100644 --- a/data/json/furniture_and_terrain/furniture-fungal.json +++ b/data/json/furniture_and_terrain/furniture-fungal.json @@ -21,7 +21,7 @@ "color": "dark_gray", "move_cost_mod": 1, "required_str": -1, - "flags": [ "TRANSPARENT", "FLOWER", "FUNGUS", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE" ], + "flags": [ "TRANSPARENT", "FLOWER", "FUNGUS", "TINY", "FLAMMABLE_ASH", "NOCOLLIDE", "GRAZER_INEDIBLE" ], "examine_action": "fungus", "bash": { "str_min": 2, "str_max": 6, "sound": "poof.", "sound_fail": "poof." } }, diff --git a/data/json/furniture_and_terrain/terrain-flora.json b/data/json/furniture_and_terrain/terrain-flora.json index 4353b704615f8..d7fa521abac4c 100644 --- a/data/json/furniture_and_terrain/terrain-flora.json +++ b/data/json/furniture_and_terrain/terrain-flora.json @@ -8,7 +8,7 @@ "color": [ "green", "green", "yellow_yellow", "brown" ], "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_walnut_harvested", "examine_action": "harvest_ter", "looks_like": "t_tree_hickory", @@ -56,7 +56,7 @@ "color": [ "green", "green", "yellow_yellow", "brown" ], "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_walnut_harvested", "examine_action": "harvest_ter", "looks_like": "t_tree_blackjack", @@ -208,7 +208,7 @@ "color": [ "green", "green", "green_yellow", "brown" ], "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_chestnut_harvested", "examine_action": "harvest_ter", "looks_like": "t_tree_hickory", @@ -260,7 +260,7 @@ "color": [ "green", "green", "black_green", "brown" ], "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_beech_harvested", "examine_action": "harvest_ter", "looks_like": "t_tree_hickory", @@ -312,7 +312,7 @@ "color": [ "green", "green", "light_green_yellow", "brown" ], "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_hazelnut_harvested", "examine_action": "harvest_ter", "looks_like": "t_tree_hickory", @@ -365,7 +365,7 @@ "//": "barren in winter", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_harvested", "examine_action": "harvest_ter", "harvest_by_season": [ { "seasons": [ "autumn" ], "id": "oak_harv" } ], @@ -420,7 +420,7 @@ "examine_action": "harvest_ter_nectar", "transforms_into": "t_tree_basswood_harvested", "harvest_by_season": [ { "seasons": [ "spring" ], "id": "young_leaves_harv" } ], - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "bash": { "str_min": 80, "str_max": 180, @@ -649,7 +649,7 @@ "//": "barren in winter, fruits in autumn", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_apple_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "autumn" ], "id": "apple_harv" } ], @@ -704,7 +704,7 @@ "//": "barren in winter, fruits in autumn", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_pear_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "autumn" ], "id": "pear_harv" } ], @@ -814,7 +814,7 @@ "//": "barren in winter, fruits in summer", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_cherry_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "summer" ], "id": "cherry_harv" } ], @@ -869,7 +869,7 @@ "//": "Can be picked at any point in the third year assuming the berries have turned blue. But it takes a long time to regrow.", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_juniper_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "autumn" ], "id": "juniper_harv" } ], @@ -916,7 +916,7 @@ "//": "barren in winter, fruits in summer", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_peach_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "summer" ], "id": "peach_harv" } ], @@ -971,7 +971,7 @@ "//": "barren in winter, fruits in summer", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_apricot_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "summer" ], "id": "apricot_harv" } ], @@ -1026,7 +1026,7 @@ "//": "barren in winter, fruits in summer", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_plum_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "summer" ], "id": "plum_harv" } ], @@ -1080,7 +1080,7 @@ "//": "barren in winter, fruits in summer", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_mulberry_harvested", "examine_action": "harvest_ter_nectar", "looks_like": "t_tree_apple", @@ -1135,7 +1135,7 @@ "//": "barren in winter, fruits in summer", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "transforms_into": "t_tree_elderberry_harvested", "examine_action": "harvest_ter_nectar", "looks_like": "t_tree_plum", @@ -1412,7 +1412,7 @@ "//": "barren in winter, harvestable in autumn", "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "examine_action": "tree_hickory", "harvest_by_season": [ { "seasons": [ "autumn" ], "id": "hickory_harv" } ], "transforms_into": "t_tree_hickory_harvested", @@ -1467,7 +1467,7 @@ "color": [ "light_green", "light_green", "brown_green", "brown" ], "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "examine_action": "harvest_ter", "harvest_by_season": [ { "seasons": [ "autumn" ], "id": "pistachio_harv" } ], "transforms_into": "t_tree_pistachio_harvested", @@ -1521,7 +1521,7 @@ "color": [ "light_green", "light_green", "brown_green", "brown" ], "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "examine_action": "harvest_ter", "harvest_by_season": [ { "seasons": [ "autumn" ], "id": "almond_harv" } ], "transforms_into": "t_tree_almond_harvested", @@ -1575,7 +1575,7 @@ "color": [ "light_green", "light_green", "brown_green", "brown" ], "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "BROWSABLE" ], "examine_action": "harvest_ter", "harvest_by_season": [ { "seasons": [ "autumn" ], "id": "pecan_harv" } ], "transforms_into": "t_tree_pecan_harvested", @@ -1602,7 +1602,7 @@ "color": [ "light_green", "light_green", "light_green", "brown" ], "move_cost": 0, "coverage": 80, - "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "HARVESTED" ], + "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "HARVESTED", "BROWSABLE" ], "examine_action": "harvested_plant", "transforms_into": "t_tree_pecan", "bash": { @@ -1958,7 +1958,7 @@ "color": "brown_green", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SMALL_HIDE" ], + "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SMALL_HIDE", "BROWSABLE" ], "transforms_into": "t_shrub_peanut_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "autumn" ], "id": "shrub_peanut_harv" } ], @@ -2011,7 +2011,7 @@ "color": "light_blue_green", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SMALL_HIDE" ], + "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SMALL_HIDE", "BROWSABLE" ], "transforms_into": "t_shrub_blueberry_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "summer" ], "id": "shrub_blueberry_harv" } ], @@ -2064,7 +2064,7 @@ "color": "light_red_green", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT" ], + "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "BROWSABLE" ], "transforms_into": "t_shrub_strawberry_harvested", "examine_action": "harvest_ter_nectar", "harvest_by_season": [ { "seasons": [ "summer" ], "id": "shrub_strawberry_harv" } ], @@ -2116,7 +2116,7 @@ "color": "black_green", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP" ], + "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP", "BROWSABLE" ], "transforms_into": "t_shrub_blackberry_harvested", "examine_action": "harvest_ter_nectar", "looks_like": "t_shrub_blueberry", @@ -2169,7 +2169,7 @@ "color": "light_blue_green", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SMALL_HIDE" ], + "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SMALL_HIDE", "BROWSABLE" ], "transforms_into": "t_shrub_huckleberry_harvested", "examine_action": "harvest_ter_nectar", "looks_like": "t_shrub_blueberry", @@ -2222,7 +2222,7 @@ "color": "light_red_green", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP" ], + "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP", "BROWSABLE" ], "transforms_into": "t_shrub_raspberry_harvested", "examine_action": "harvest_ter_nectar", "looks_like": "t_shrub_strawberry", @@ -2275,7 +2275,7 @@ "color": "light_green_green", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SMALL_HIDE" ], + "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SMALL_HIDE", "BROWSABLE" ], "transforms_into": "t_shrub_grape_harvested", "examine_action": "harvest_ter_nectar", "looks_like": "t_shrub_blueberry", @@ -2328,7 +2328,7 @@ "color": "light_red_green", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP" ], + "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP", "BROWSABLE" ], "transforms_into": "t_shrub_rose_harvested", "examine_action": "harvest_ter_nectar", "looks_like": "t_shrub_strawberry", @@ -2570,10 +2570,11 @@ "name": "long grass", "description": "An area of long, shaggy grass about shin high.", "looks_like": "t_grass", + "transforms_into": "t_grass", "symbol": ",", "color": "green", "move_cost": 3, - "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT", "PLOWABLE", "SMALL_HIDE" ], + "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT", "PLOWABLE", "SMALL_HIDE", "GRAZABLE" ], "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 40, "str_max": 100, "str_min_supported": 100, "bash_below": true } }, { @@ -2582,11 +2583,12 @@ "name": "tall grass", "description": "An area of tall grass about head high.", "looks_like": "t_shrub", + "transforms_into": "t_grass_long", "symbol": "'", "color": "green", "move_cost": 5, "coverage": 50, - "flags": [ "TRANSPARENT", "DIGGABLE", "PLOWABLE", "SMALL_HIDE" ], + "flags": [ "TRANSPARENT", "DIGGABLE", "PLOWABLE", "SMALL_HIDE", "GRAZABLE" ], "bash": { "sound": "thump", "ter_set": "t_null", "str_min": 40, "str_max": 100, "str_min_supported": 100, "bash_below": true } }, { @@ -2645,7 +2647,7 @@ "symbol": ".", "color": "green", "move_cost": 2, - "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT", "PLOWABLE" ], + "flags": [ "TRANSPARENT", "DIGGABLE", "FLAT", "PLOWABLE", "GRAZABLE" ], "transforms_into": "t_bamboo_harvested", "examine_action": "harvest_ter", "harvest_by_season": [ { "seasons": [ "spring" ], "id": "bamboo_harv" } ], diff --git a/data/json/furniture_and_terrain/terrain-fungal.json b/data/json/furniture_and_terrain/terrain-fungal.json index b75960ffd6a92..fb6ab56070739 100644 --- a/data/json/furniture_and_terrain/terrain-fungal.json +++ b/data/json/furniture_and_terrain/terrain-fungal.json @@ -8,7 +8,7 @@ "color": "pink", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "FUNGUS", "SHRUB", "SHORT" ], + "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "FUNGUS", "SHRUB", "SHORT", "GRAZER_INEDIBLE" ], "examine_action": "shrub_marloss", "bash": { "str_min": 4, "str_max": 60, "sound": "crunch.", "sound_fail": "poof!", "ter_set": "t_fungus" } }, @@ -111,7 +111,17 @@ "color": "dark_gray", "move_cost": 8, "coverage": 40, - "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "PLACE_ITEM", "SHRUB", "FUNGUS", "SHORT" ], + "flags": [ + "TRANSPARENT", + "CONTAINER", + "FLAMMABLE_ASH", + "THIN_OBSTACLE", + "PLACE_ITEM", + "SHRUB", + "FUNGUS", + "SHORT", + "GRAZER_INEDIBLE" + ], "bash": { "str_min": 4, "str_max": 60, "sound": "crunch.", "sound_fail": "poof!", "ter_set": "t_fungus" } }, { diff --git a/data/json/itemgroups/Clothing_Gear/clothing.json b/data/json/itemgroups/Clothing_Gear/clothing.json index 50d8610d45c43..3b020aa938674 100644 --- a/data/json/itemgroups/Clothing_Gear/clothing.json +++ b/data/json/itemgroups/Clothing_Gear/clothing.json @@ -2802,7 +2802,10 @@ ], "prob": 100 }, - { "collection": [ { "item": "jacket_eod_light" }, { "item": "trousers_eod_light" } ], "prob": 20 } + { + "collection": [ { "item": "jacket_eod_light" }, { "item": "face_shield_eod" }, { "item": "trousers_eod_light" } ], + "prob": 20 + } ] }, { diff --git a/data/json/itemgroups/Clothing_Gear/gear.json b/data/json/itemgroups/Clothing_Gear/gear.json index 79c0d9017728d..80bb0da00598e 100644 --- a/data/json/itemgroups/Clothing_Gear/gear.json +++ b/data/json/itemgroups/Clothing_Gear/gear.json @@ -80,6 +80,64 @@ { "item": "teargas_sprayer", "prob": 25, "charges": [ 9, 10 ] } ] }, + { + "id": "gear_eod", + "type": "item_group", + "//": "gear needed for bomb defusal. Based on ATP 4-32. Intentionally stripped of more military items for placement in civilian locations.", + "subtype": "collection", + "items": [ + { "item": "EOD_hotstick", "prob": 50 }, + { "item": "multitool", "container-item": "sheath", "prob": 30 }, + { "item": "light_disposable_cell", "prob": 30, "count": [ 1, 8 ] }, + { "item": "light_minus_disposable_cell", "prob": 20, "count": [ 1, 6 ] }, + { "item": "cordless_drill", "prob": 30 }, + { "item": "rope_30", "prob": 50 }, + { "item": "pliers", "prob": 50 }, + { "item": "laptop", "prob": 70 }, + { "item": "cable", "prob": 40 }, + { "item": "manual_traps_mil", "prob": 80 }, + { "group": "gear_eod_light_or_heavy", "prob": 100 } + ] + }, + { + "id": "gear_eod_light_or_heavy", + "type": "item_group", + "container-item": "duffelbag", + "on_overflow": "spill", + "subtype": "distribution", + "items": [ { "group": "eod_duffle", "prob": 90 }, { "group": "eod_duffle_light", "prob": 10 } ] + }, + { + "id": "eod_duffle", + "type": "item_group", + "subtype": "collection", + "items": [ + { "item": "trousers_eod", "prob": 100 }, + { "item": "eod_plate", "container-item": "jacket_eod", "prob": 100 }, + { "item": "helmet_eod", "prob": 100 }, + { "item": "foot_protectors_eod", "prob": 80 }, + { "item": "gloves_eod", "prob": 20 }, + { "item": "eod_plate", "prob": 5 } + ] + }, + { + "id": "eod_duffle_light", + "type": "item_group", + "subtype": "collection", + "items": [ + { "item": "jacket_eod_light", "contents-group": "eod_tactical_plates_set", "prob": 100 }, + { "item": "trousers_eod_light", "prob": 100 }, + { "item": "face_shield_eod", "prob": 100 }, + { "item": "eod_plate", "prob": 5 } + ] + }, + { + "id": "eod_tactical_plates_set", + "type": "item_group", + "//": "complete EOD plate set for the tactical EOD jacket", + "subtype": "collection", + "entries": [ { "item": "eod_plate" }, { "item": "deltoid_plates" } ] + }, { "type": "item_group", "id": "fireman_gear", diff --git a/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json b/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json index c8cdd576793bf..ba1e72df40e59 100644 --- a/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json +++ b/data/json/itemgroups/Drugs_Tobacco_Alcohol/drugs.json @@ -219,7 +219,7 @@ { "group": "cotton_ball_bag_full", "prob": 5 }, { "group": "used_1st_aid", "prob": 35 }, { "item": "saline", "prob": 25, "charges": [ 1, 5 ] }, - [ "contacts", 10 ], + { "item": "contacts", "prob": 10, "count": 6 }, { "prob": 75, "group": "vitamins_bottle_plastic_pill_supplement_1_20" }, { "item": "gummy_vitamins", "prob": 25, "count": [ 1, 10 ] }, { "prob": 75, "group": "calcium_tablet_bottle_plastic_pill_supplement_1_20" }, diff --git a/data/json/itemgroups/Locations_MapExtras/locations.json b/data/json/itemgroups/Locations_MapExtras/locations.json index b7e7deee89998..24c47742bd4ae 100644 --- a/data/json/itemgroups/Locations_MapExtras/locations.json +++ b/data/json/itemgroups/Locations_MapExtras/locations.json @@ -26,7 +26,7 @@ { "item": "gasbomb", "prob": 1 }, { "group": "guns_swat", "prob": 20 }, { "group": "mags_swat", "prob": 20 }, - { "group": "eod_armor", "prob": 20 }, + { "group": "gear_eod", "prob": 20 }, { "item": "survnote", "prob": 1 } ] }, @@ -228,7 +228,7 @@ { "item": "game_watch", "prob": 2, "charges": [ 0, 100 ] }, { "item": "laptop", "prob": 5, "charges": [ 0, 500 ] }, [ "fish_bowl", 1 ], - [ "contacts", 15 ], + { "item": "contacts", "prob": 15, "count": 6 }, { "group": "clothing_glasses", "prob": 40 }, { "item": "shavingkit", "prob": 20, "charges": [ 0, 10 ] }, { "item": "elec_hairtrimmer", "prob": 10, "charges": [ 0, 50 ] }, @@ -2207,7 +2207,7 @@ { "prob": 85, "group": "aspirin_bottle_plastic_pill_painkiller_1_20" }, [ "junk_burrito", 25 ], { "group": "tobacco_products", "prob": 31 }, - [ "contacts", 15 ], + { "item": "contacts", "prob": 15, "count": 6 }, { "group": "clothing_glasses", "prob": 80 }, [ "briefcase", 40 ], [ "purse", 40 ], @@ -2342,7 +2342,7 @@ { "item": "ref_matches", "prob": 50, "charges": [ 1, 32 ] }, { "item": "lighter", "prob": 50, "charges": [ 0, 100 ] }, { "group": "clothing_glasses", "prob": 30 }, - [ "contacts", 30 ], + { "item": "contacts", "prob": 30, "count": 6 }, { "item": "radio", "prob": 100, "charges": [ 0, 100 ] }, { "group": "ammo_pocket_batteries_full", "prob": 50 }, [ "umbrella", 50 ], diff --git a/data/json/itemgroups/Locations_MapExtras/mansion.json b/data/json/itemgroups/Locations_MapExtras/mansion.json index 25dd1ca2fd7aa..99d0925611eaf 100644 --- a/data/json/itemgroups/Locations_MapExtras/mansion.json +++ b/data/json/itemgroups/Locations_MapExtras/mansion.json @@ -936,7 +936,7 @@ [ "fanny", 20 ], [ "straw_fedora", 10 ], [ "barrette", 10 ], - [ "contacts", 10 ], + { "item": "contacts", "prob": 10, "count": 6 }, [ "fedora", 10 ], [ "firecracker", 5 ], [ "fc_hairpin", 5 ], @@ -1293,7 +1293,7 @@ "items": [ [ "mirror", 50 ], { "group": "softdrugs", "prob": 50 }, - [ "contacts", 40 ], + { "item": "contacts", "prob": 40, "count": 6 }, [ "hairpin", 40 ], [ "fc_hairpin", 30 ], { "group": "jewelry_front", "prob": 30 }, diff --git a/data/json/itemgroups/Weapons_Mods_Ammo/ammo.json b/data/json/itemgroups/Weapons_Mods_Ammo/ammo.json index 3a547d8945cd9..1f83a53c41a22 100644 --- a/data/json/itemgroups/Weapons_Mods_Ammo/ammo.json +++ b/data/json/itemgroups/Weapons_Mods_Ammo/ammo.json @@ -528,13 +528,7 @@ "id": "ammo_shotgun_milspec", "//": "Military specification shotgun ammo found at military sites.", "subtype": "distribution", - "entries": [ - { "item": "20x66_exp", "prob": 10 }, - { "item": "20x66_flechette", "prob": 60 }, - { "item": "20x66_inc", "prob": 20 }, - { "item": "shot_flechette", "prob": 100 }, - { "item": "shot_he", "prob": 10 } - ] + "entries": [ { "item": "shot_he", "prob": 10 } ] }, { "type": "item_group", diff --git a/data/json/itemgroups/collections_domestic.json b/data/json/itemgroups/collections_domestic.json index 03512ba0a76fc..7940a65ced2fe 100644 --- a/data/json/itemgroups/collections_domestic.json +++ b/data/json/itemgroups/collections_domestic.json @@ -260,7 +260,7 @@ [ "glasses_bifocal", 20 ], { "group": "cotton_ball_bag_used", "prob": 20 }, { "group": "cotton_ball_bag_full", "prob": 3 }, - [ "contacts", 20 ], + { "item": "contacts", "prob": 20, "count": 6 }, { "item": "pride_flag", "prob": 5 }, { "item": "national_flag", "prob": 1 }, { "prob": 20, "group": "vitamins_bottle_plastic_pill_supplement_1_20" }, @@ -1372,6 +1372,24 @@ { "group": "SUS_junk_drawer", "prob": 1 } ] }, + { + "id": "cat_hoarder", + "type": "item_group", + "subtype": "distribution", + "entries": [ + { "item": "pet_carrier", "prob": 30 }, + { "item": "petpack", "prob": 15 }, + { "item": "catfood", "prob": 30, "container-item": "can_food" }, + { "prob": 10, "group": "catfood_dry_bag_plastic_18" }, + { "item": "towel", "prob": 20 }, + { "item": "soap", "prob": 10 }, + { "item": "gloves_medical", "prob": 20 }, + { "item": "cotton_patchwork", "prob": 15 }, + { "item": "bag_plastic", "prob": 20 }, + { "item": "missing_poster_cat", "prob": 40 }, + { "item": "rope_6", "prob": 15 } + ] + }, { "id": "untidy_floor_clutter", "//": "Items you might find on the floor in a disorganised house.", diff --git a/data/json/itemgroups/science_and_tech.json b/data/json/itemgroups/science_and_tech.json index b07ae5be76122..f53180e1608fe 100644 --- a/data/json/itemgroups/science_and_tech.json +++ b/data/json/itemgroups/science_and_tech.json @@ -47,7 +47,7 @@ [ "pouch_autoclave", 10 ], [ "mask_dust", 65 ], { "item": "mask_filter", "prob": 30, "charges": [ 0, 100 ] }, - [ "contacts", 30 ], + { "item": "contacts", "prob": 30, "count": 6 }, { "group": "clothing_glasses", "prob": 30 }, [ "file", 10 ], [ "textbook_computer", 8 ], diff --git a/data/json/items/ammo/20x66mm.json b/data/json/items/ammo/20x66mm.json index 2e070d15b6045..139fb6e2e7124 100644 --- a/data/json/items/ammo/20x66mm.json +++ b/data/json/items/ammo/20x66mm.json @@ -30,36 +30,6 @@ "damage": { "damage_type": "bullet", "amount": 6 }, "recoil": 1000 }, - { - "id": "20x66_bootleg_flechette", - "copy-from": "20x66_flechette", - "type": "AMMO", - "name": { "str": "20x66mm flechette, handmade", "str_pl": "20x66mm flechettes, handmade" }, - "description": "A handcrafted bootleg duplicate of the Rivtech 20x66mm caseless flechette round.", - "proportional": { "price": 0.7, "shot_damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ], "flags": [ "CASELESS_ROUNDS" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] } - }, - { - "id": "20x66_bootleg_shot", - "copy-from": "20x66_shot", - "type": "AMMO", - "name": { "str_sp": "20x66mm buckshot, handmade" }, - "description": "A handcrafted bootleg duplicate of the Rivtech 20x66mm caseless buckshot round.", - "proportional": { "price": 0.7, "shot_damage": { "damage_type": "bullet", "amount": 0.9 }, "shot_spread": 1.1 }, - "extend": { "effects": [ "RECYCLED" ], "flags": [ "CASELESS_ROUNDS" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] } - }, - { - "id": "20x66_bootleg_slug", - "copy-from": "20x66_slug", - "type": "AMMO", - "name": { "str": "20x66mm slug, handmade", "str_pl": "20x66mm slugs, handmade" }, - "description": "A handcrafted bootleg duplicate of the Rivtech 20x66mm caseless solid projectile round.", - "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ], "flags": [ "CASELESS_ROUNDS" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] } - }, { "id": "20x66_exp", "copy-from": "20x66_abstract", @@ -91,20 +61,6 @@ "effects": [ "NO_EMBED" ], "extend": { "flags": [ "CASELESS_ROUNDS" ] } }, - { - "id": "20x66_flechette", - "copy-from": "20x66_shot", - "type": "AMMO", - "name": { "str": "20x66mm flechette" }, - "description": "A 20x66mm caseless shotgun round, flechette type. Proprietary ammunition for Rivtech shotguns.", - "price": 4000, - "price_postapoc": 4000, - "count": 10, - "shot_spread": 5, - "shot_damage": { "damage_type": "bullet", "amount": 8, "armor_penetration": 12 }, - "damage": { "damage_type": "bullet", "amount": 50 }, - "extend": { "flags": [ "CASELESS_ROUNDS" ] } - }, { "id": "20x66_frag", "copy-from": "20x66_slug", @@ -117,18 +73,6 @@ "extend": { "effects": [ "FRAG_20x66" ], "flags": [ "CASELESS_ROUNDS" ] }, "proportional": { "damage": { "damage_type": "bullet", "amount": 0.25, "armor_penetration": 0.25 } } }, - { - "id": "20x66_inc", - "copy-from": "20x66_slug", - "type": "AMMO", - "name": { "str_sp": "20x66mm incendiary" }, - "description": "A 20x66mm caseless shotgun round, incendiary type. Proprietary ammunition for Rivtech shotguns.", - "ascii_picture": "20x66_inc", - "price": 10500, - "price_postapoc": 5000, - "count": 10, - "extend": { "effects": [ "INCENDIARY" ], "flags": [ "CASELESS_ROUNDS" ] } - }, { "id": "20x66_shot", "copy-from": "20x66_abstract", diff --git a/data/json/items/armor/ballistic_armor.json b/data/json/items/armor/ballistic_armor.json index 4fa3267f1891c..e9fb6afc8bdeb 100644 --- a/data/json/items/armor/ballistic_armor.json +++ b/data/json/items/armor/ballistic_armor.json @@ -93,6 +93,143 @@ } ] }, + { + "id": "jacket_eod", + "type": "TOOL_ARMOR", + "category": "armor", + "name": { "str": "EOD jacket" }, + "description": "A thick armored jacket constructed from Kevlar, Nomex, and foam padding, for use by explosive ordnance disposal technicians. It features a central pocket for a large plate, and near complete coverage in fragmentation resistant materials. Aside from the plate, it offers insufficient protection from ballistic threats.", + "//": "Based on the Med-Eng EOD 9 and EOD 10 suits.", + "weight": "13500 g", + "volume": "15 L", + "price": 1509000, + "price_postapoc": 18000, + "warmth": 65, + "material": [ "kevlar", "plastic_pad", "nomex" ], + "symbol": "[", + "color": "light_green", + "environmental_protection": 2, + "material_thickness": 15, + "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ], + "use_action": [ { "type": "attach_molle", "size": 15 }, { "type": "detach_molle" } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "ablative": true, + "volume_encumber_modifier": 0, + "max_contains_volume": "3000 ml", + "max_contains_weight": "7 kg", + "max_item_length": "46 cm", + "moves": 1100, + "description": "Pocket for a huge armor plate.", + "flag_restriction": [ "ABLATIVE_LARGE" ] + } + ], + "armor": [ + { + "material": [ + { "type": "nylon", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "kevlar", "covered_by_mat": 100, "thickness": 7.4 }, + { "type": "plastic_pad", "covered_by_mat": 100, "thickness": 2.0 } + ], + "coverage": 100, + "cover_vitals": 100, + "covers": [ "torso", "arm_l", "arm_r" ], + "encumbrance": [ 71, 80 ] + } + ] + }, + { + "id": "jacket_eod_light", + "type": "TOOL_ARMOR", + "category": "armor", + "name": { "str": "tactical EOD jacket" }, + "description": "An armored jacket constructed from Kevlar, Nomex, and foam padding, for use by explosive ordnance disposal technicians in 'non-permissive environments'. It is lighter than normal EOD armor to allow for wearing a plate carrier beneath it. It features two pockets in the arms covering the deltoids for additional optional protection.", + "weight": "7000 g", + "volume": "15 L", + "price": 410160, + "price_postapoc": 5900, + "warmth": 40, + "material": [ "kevlar", "plastic_pad", "nomex" ], + "symbol": "[", + "color": "light_gray", + "environmental_protection": 2, + "material_thickness": 7, + "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ], + "use_action": [ { "type": "attach_molle", "size": 15 }, { "type": "detach_molle" } ], + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "ablative": true, + "volume_encumber_modifier": 0, + "max_contains_volume": "3000 ml", + "max_contains_weight": "7 kg", + "max_item_length": "46 cm", + "moves": 1100, + "description": "Pocket for a huge armor plate.", + "flag_restriction": [ "ABLATIVE_LARGE" ] + }, + { + "pocket_type": "CONTAINER", + "ablative": true, + "volume_encumber_modifier": 0, + "max_contains_volume": "1558 ml", + "max_contains_weight": "1600 kg", + "max_item_length": "21 cm", + "min_item_length": "21 cm", + "//": "min. length really just a hack to avoid adding a flag.", + "moves": 800, + "description": "Pockets for deltoid armor plates.", + "flag_restriction": [ "ABLATIVE_MEDIUM" ] + } + ], + "armor": [ + { + "material": [ + { "type": "nylon", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "kevlar", "covered_by_mat": 100, "thickness": 4.4 }, + { "type": "plastic_pad", "covered_by_mat": 100, "thickness": 2 } + ], + "coverage": 100, + "cover_vitals": 100, + "covers": [ "torso", "arm_l", "arm_r" ], + "encumbrance": [ 31, 55 ] + } + ] + }, + { + "id": "eod_plate", + "type": "ARMOR", + "category": "armor", + "name": { "str": "EOD fragmentation plate" }, + "description": "A polygonal fragmentation plate with a slightly concave profile, made of thin layers of steel, UHMW polyethylene, foam, and Kevlar. Though certified to provide protection from fragmentation, it will not provide much protection from firearms. This is intended to be inserted into an EOD suit, and can't be worn on its own.", + "weight": "2800 g", + "volume": "2950 ml", + "longest_side": "46 cm", + "//": "Based on the plate from the MED-ENG EOD 9N. People don't seem willing to buy the EOD 10 to shoot at and MED-ENG ain't telling us how not-bullet proof the suit is.", + "price": 361300, + "price_postapoc": 2000, + "material": [ "kevlar", "plastic_pad", "thermo_resin", "qt_steel" ], + "symbol": ",", + "color": "dark_gray", + "material_thickness": 5, + "flags": [ "ABLATIVE_LARGE", "CANT_WEAR" ], + "armor": [ + { + "material": [ + { "type": "qt_steel", "covered_by_mat": 100, "thickness": 0.3 }, + { "type": "kevlar", "covered_by_mat": 100, "thickness": 3.6 }, + { "type": "plastic_pad", "covered_by_mat": 100, "thickness": 3.0 }, + { "type": "thermo_resin", "covered_by_mat": 100, "thickness": 2.4 } + ], + "encumbrance": 0, + "coverage": 45, + "cover_vitals": 100, + "covers": [ "torso" ], + "specifically_covers": [ "torso_upper", "torso_lower" ] + } + ] + }, { "id": "esapi_plate", "type": "ARMOR", @@ -239,6 +376,33 @@ } ] }, + { + "id": "deltoid_plates", + "type": "ARMOR", + "category": "armor", + "name": { "str_sp": "deltoid ballistic plates" }, + "//": "2x 20.5cm x 13.0cm x 3.0cm", + "description": "A pair of NIJ Level III ballistic plates with a concave profile, made of UHMW polyethylene. \"STRIKE FACE\" is printed on its outer surface. These plates are designed to be worn in the shoulder pockets of suitable plate carriers or combat shirts, and can resist several high-energy rifle rounds before breaking. Deltoid plates such as these are very infrequently worn due to their marginal utility in improving survivability.", + "weight": "1551 g", + "volume": "1599 ml", + "longest_side": "21 cm", + "price": 94400, + "price_postapoc": 800, + "material": [ "thermo_resin" ], + "symbol": ",", + "color": "light_gray", + "material_thickness": 14, + "damage_verb": "makes a crunch, something has shifted", + "flags": [ "ABLATIVE_MEDIUM", "CANT_WEAR" ], + "armor": [ + { + "encumbrance": 8, + "coverage": 35, + "covers": [ "arm_l", "arm_r" ], + "specifically_covers": [ "arm_shoulder_l", "arm_shoulder_r" ] + } + ] + }, { "id": "esbi_plate", "type": "ARMOR", diff --git a/data/json/items/armor/boots.json b/data/json/items/armor/boots.json index 7195cbdcb3282..dfd0cb077c9ce 100644 --- a/data/json/items/armor/boots.json +++ b/data/json/items/armor/boots.json @@ -344,13 +344,32 @@ "price": 50000, "price_postapoc": 7000, "warmth": 10, - "material": [ "steel", "nomex" ], + "material": [ "plastic_pad", "nomex" ], "symbol": "[", "color": "light_gray", - "environmental_protection": 2, - "material_thickness": 7, + "material_thickness": 14, "flags": [ "STURDY", "OUTER" ], - "armor": [ { "encumbrance": 40, "coverage": 100, "covers": [ "foot_l", "foot_r" ] } ] + "armor": [ + { + "covers": [ "foot_l", "foot_r" ], + "encumbrance": 34, + "material": [ + { "type": "nomex", "covered_by_mat": 100, "thickness": 1 }, + { "type": "plastic_pad", "covered_by_mat": 100, "thickness": 15 } + ], + "specifically_covers": [ + "foot_toes_r", + "foot_toes_l", + "foot_ankle_l", + "foot_heel_l", + "foot_ankle_r", + "foot_heel_r", + "foot_arch_r", + "foot_arch_l" + ], + "coverage": 100 + } + ] }, { "id": "toecaps", diff --git a/data/json/items/armor/head_attachments.json b/data/json/items/armor/head_attachments.json index aa841ac878488..359148bd13e8f 100644 --- a/data/json/items/armor/head_attachments.json +++ b/data/json/items/armor/head_attachments.json @@ -172,6 +172,23 @@ "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR", "OUTER" ], "armor": [ { "encumbrance": 4, "coverage": 100, "covers": [ "eyes", "mouth" ] } ] }, + { + "id": "face_shield_eod", + "type": "ARMOR", + "category": "armor", + "name": { "str": "EOD face shield" }, + "description": "A thick polycarbonate and plexiglass face shield with a mounting bracket intended to be attached to a ballistic helmet for protection from blast and fragmentation in 'non-permissive environments'.", + "weight": "229 g", + "volume": "250 ml", + "price": 83600, + "price_postapoc": 2400, + "material": [ "thermo_resin" ], + "symbol": "[", + "color": "light_gray", + "material_thickness": 4.5, + "flags": [ "HELMET_FACE_SHIELD", "CANT_WEAR", "OUTER" ], + "armor": [ { "encumbrance": 14, "coverage": 100, "covers": [ "eyes", "mouth" ] } ] + }, { "id": "face_shield_plastic", "type": "ARMOR", diff --git a/data/json/items/armor/legs_armor.json b/data/json/items/armor/legs_armor.json index fc9b039c4c7c2..fd5e641a4a2ed 100644 --- a/data/json/items/armor/legs_armor.json +++ b/data/json/items/armor/legs_armor.json @@ -1834,38 +1834,64 @@ "type": "ARMOR", "category": "armor", "name": { "str_sp": "EOD trousers" }, - "description": "Thick armored trousers constructed from Kevlar and Nomex, for use by explosive ordnance disposal technicians.", + "description": "This is a heavy pair of trousers armored in Kevlar, Nomex, and foam padding, for use by explosive ordnance disposal technicians. While it offers near complete coverage in fragmentation resistant materials, it still offers insufficient protection from ballistic threats.", "weight": "6400 g", - "volume": "12 L", - "price": 200000, + "volume": "7 L", + "price": 1006000, "price_postapoc": 12000, "warmth": 65, - "material": [ "kevlar_layered", "nomex" ], + "material": [ "kevlar", "nomex" ], "symbol": "[", - "color": "light_gray", + "color": "light_green", "environmental_protection": 2, "material_thickness": 15, "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ], - "armor": [ { "encumbrance": 80, "coverage": 100, "covers": [ "leg_l", "leg_r" ] } ] + "use_action": [ { "type": "attach_molle", "size": 4 }, { "type": "detach_molle" } ], + "armor": [ + { + "material": [ + { "type": "nylon", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "kevlar", "covered_by_mat": 100, "thickness": 7.4 }, + { "type": "plastic_pad", "covered_by_mat": 100, "thickness": 2.0 } + ], + "coverage": 100, + "cover_vitals": 100, + "covers": [ "leg_l", "leg_r" ], + "encumbrance": 80 + } + ] }, { "id": "trousers_eod_light", "type": "ARMOR", "category": "armor", - "name": { "str_sp": "light EOD trousers" }, - "description": "Armored trousers constructed from Kevlar and Nomex, for use by explosive ordnance disposal technicians. They are lighter than normal EOD armor to provide more maneuverability.", + "name": { "str_sp": "tactical EOD trousers" }, + "description": "This is a heavy pair of trousers armored in Kevlar, Nomex, and foam padding, for use by explosive ordnance disposal technicians in 'non-permissive environments'. While it offers near complete coverage in fragmentation resistant materials, it still offers insufficient protection from ballistic threats. These trousers are lighter than normal EOD armor to provide more maneuverability.", "weight": "3000 g", - "volume": "12 L", - "price": 200000, - "price_postapoc": 12000, + "volume": "7 L", + "price": 273440, + "price_postapoc": 3300, "warmth": 40, - "material": [ "kevlar_layered", "nomex" ], + "material": [ "kevlar", "nomex" ], "symbol": "[", "color": "light_gray", "environmental_protection": 2, "material_thickness": 7, "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ], - "armor": [ { "encumbrance": 40, "coverage": 100, "covers": [ "leg_l", "leg_r" ] } ] + "use_action": [ { "type": "attach_molle", "size": 6 }, { "type": "detach_molle" } ], + "armor": [ + { + "material": [ + { "type": "nylon", "covered_by_mat": 100, "thickness": 1.0 }, + { "type": "kevlar", "covered_by_mat": 100, "thickness": 4.4 }, + { "type": "plastic_pad", "covered_by_mat": 100, "thickness": 2 } + ], + "encumbrance": 40, + "coverage": 100, + "cover_vitals": 100, + "covers": [ "leg_l", "leg_r" ] + } + ] }, { "id": "armor_lc_light_leg_guard", diff --git a/data/json/items/armor/suits_protection.json b/data/json/items/armor/suits_protection.json index de9968ba33bb4..2f515a392cad7 100644 --- a/data/json/items/armor/suits_protection.json +++ b/data/json/items/armor/suits_protection.json @@ -1060,7 +1060,7 @@ "volume_encumber_modifier": 0.3, "material": [ { "type": "plastic_pad", "covered_by_mat": 100, "thickness": 7 }, - { "type": "thermo_resin", "covered_by_mat": 90, "thickness": 1.75 } + { "type": "thermo_resin", "covered_by_mat": 90, "thickness": 2 } ] }, { diff --git a/data/json/items/armor/torso_armor.json b/data/json/items/armor/torso_armor.json index c0bbbf277fa69..619f4c9837947 100644 --- a/data/json/items/armor/torso_armor.json +++ b/data/json/items/armor/torso_armor.json @@ -518,79 +518,28 @@ "armor": [ { "encumbrance": 20, "coverage": 80, "covers": [ "torso" ] } ] }, { - "id": "chainmail_junk_vest", - "type": "ARMOR", - "category": "armor", - "name": { "str": "chainmail vest" }, - "description": "A customized chainmail vest. The metal shows signs of rust and corrosion. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", - "weight": "6200 g", - "volume": "1 L", - "price": 10000, - "price_postapoc": 2000, - "to_hit": -1, - "material": [ "budget_steel_chain" ], - "symbol": "[", - "looks_like": "vest_leather", - "color": "light_red", - "flags": [ "VARSIZE", "STURDY", "OUTER" ], - "pocket_data": [ - { - "pocket_type": "CONTAINER", - "volume_encumber_modifier": 0, - "ablative": true, - "max_contains_volume": "7500 ml", - "max_contains_weight": "20 kg", - "max_item_length": "65 cm", - "moves": 1500, - "description": "You can wear some armor over chainmail without penalty.", - "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] - } - ], - "armor": [ - { - "material": [ { "type": "budget_steel_chain", "covered_by_mat": 100, "thickness": 1.2 } ], - "covers": [ "torso" ], - "coverage": 95, - "encumbrance": 14 - }, - { - "material": [ { "type": "budget_steel_chain", "covered_by_mat": 100, "thickness": 1.2 } ], - "covers": [ "leg_l", "leg_r" ], - "specifically_covers": [ "leg_hip_l", "leg_hip_r" ], - "coverage": 50, - "encumbrance": 0 - }, - { - "material": [ { "type": "budget_steel_chain", "covered_by_mat": 100, "thickness": 1.2 } ], - "covers": [ "arm_l", "arm_r" ], - "specifically_covers": [ "arm_shoulder_l", "arm_shoulder_r" ], - "coverage": 50, - "encumbrance": 0 - } - ] - }, - { - "id": "lc_chainmail_vest", + "abstract": "base_chainmail_vest", "type": "ARMOR", "category": "armor", - "name": { "str": "mild steel chainmail vest" }, - "description": "A customized mild steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", + "name": { "str": "base chainmail vest" }, "weight": "6894 g", "volume": "1 L", + "longest_side": "10 cm", "price": 10000, "price_postapoc": 2000, "to_hit": -1, - "material": [ "lc_steel_chain" ], + "material": [ "steel" ], "symbol": "[", "looks_like": "vest_leather", "color": "light_red", + "warmth": 0, "flags": [ "VARSIZE", "STURDY", "OUTER" ], "pocket_data": [ { "pocket_type": "CONTAINER", "volume_encumber_modifier": 0, "ablative": true, - "max_contains_volume": "7500 ml", + "max_contains_volume": "9350 ml", "max_contains_weight": "20 kg", "max_item_length": "65 cm", "moves": 1500, @@ -600,20 +549,20 @@ ], "armor": [ { - "material": [ { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 } ], + "material": [ { "type": "steel", "covered_by_mat": 100, "thickness": 1.2 } ], "covers": [ "torso" ], "coverage": 100, "encumbrance": 14 }, { - "material": [ { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 } ], + "material": [ { "type": "steel", "covered_by_mat": 100, "thickness": 1.2 } ], "covers": [ "leg_l", "leg_r" ], "specifically_covers": [ "leg_hip_l", "leg_hip_r" ], "coverage": 50, "encumbrance": 0 }, { - "material": [ { "type": "lc_steel_chain", "covered_by_mat": 100, "thickness": 1.2 } ], + "material": [ { "type": "steel", "covered_by_mat": 100, "thickness": 1.2 } ], "covers": [ "arm_l", "arm_r" ], "specifically_covers": [ "arm_shoulder_l", "arm_shoulder_r" ], "coverage": 50, @@ -622,17 +571,17 @@ ] }, { - "id": "xl_lc_chainmail_vest", + "abstract": "xl_chainmail_vest", "type": "ARMOR", - "name": { "str": "XL mild steel chainmail vest" }, - "copy-from": "lc_chainmail_vest", + "name": { "str": "XL chainmail vest" }, + "copy-from": "base_chainmail_vest", "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, "pocket_data": [ { "pocket_type": "CONTAINER", "volume_encumber_modifier": 0, "ablative": true, - "max_contains_volume": "8500 ml", + "max_contains_volume": "10500 ml", "max_contains_weight": "20 kg", "max_item_length": "65 cm", "moves": 1500, @@ -643,17 +592,17 @@ "extend": { "flags": [ "OVERSIZE" ] } }, { - "id": "xs_lc_chainmail_vest", + "abstract": "xs_chainmail_vest", "type": "ARMOR", - "copy-from": "lc_chainmail_vest", - "name": { "str": "XS mild steel chainmail vest" }, + "copy-from": "base_chainmail_vest", + "name": { "str": "XS chainmail vest" }, "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, "pocket_data": [ { "pocket_type": "CONTAINER", "volume_encumber_modifier": 0, "ablative": true, - "max_contains_volume": "6000 ml", + "max_contains_volume": "7000 ml", "max_contains_weight": "20 kg", "max_item_length": "65 cm", "moves": 1500, @@ -663,206 +612,133 @@ ], "extend": { "flags": [ "UNDERSIZE" ] } }, + { + "id": "chainmail_junk_vest", + "copy-from": "base_chainmail_vest", + "replace_materials": { "steel": "budget_steel_chain" }, + "type": "ARMOR", + "name": { "str": "chainmail vest" }, + "description": "A customized chainmail vest. The metal shows signs of rust and corrosion. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." + }, + { + "id": "lc_chainmail_vest", + "copy-from": "base_chainmail_vest", + "replace_materials": { "steel": "lc_steel_chain" }, + "type": "ARMOR", + "name": { "str": "mild steel chainmail vest" }, + "description": "A customized mild steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." + }, + { + "id": "xl_lc_chainmail_vest", + "copy-from": "xl_chainmail_vest", + "replace_materials": { "steel": "lc_steel_chain" }, + "type": "ARMOR", + "name": { "str": "XL mild steel chainmail vest" }, + "description": "A customized XL mild steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." + }, + { + "id": "xs_lc_chainmail_vest", + "copy-from": "xs_chainmail_vest", + "replace_materials": { "steel": "lc_steel_chain" }, + "type": "ARMOR", + "name": { "str": "XS mild steel chainmail vest" }, + "description": "A customized XS mild steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." + }, { "id": "mc_chainmail_vest", + "copy-from": "base_chainmail_vest", + "replace_materials": { "steel": "mc_steel_chain" }, "type": "ARMOR", - "copy-from": "lc_chainmail_vest", - "material": [ "mc_steel_chain" ], "name": { "str": "medium steel chainmail vest" }, - "description": "A customized medium steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", - "replace_materials": { "lc_steel_chain": "mc_steel_chain" } + "description": "A customized medium steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "xl_mc_chainmail_vest", + "copy-from": "xl_chainmail_vest", + "replace_materials": { "steel": "mc_steel_chain" }, "type": "ARMOR", "name": { "str": "XL medium steel chainmail vest" }, - "copy-from": "mc_chainmail_vest", - "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "pocket_data": [ - { - "pocket_type": "CONTAINER", - "volume_encumber_modifier": 0, - "ablative": true, - "max_contains_volume": "8500 ml", - "max_contains_weight": "20 kg", - "max_item_length": "65 cm", - "moves": 1500, - "description": "You can wear some armor over chainmail without penalty.", - "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] - } - ], - "extend": { "flags": [ "OVERSIZE" ] } + "description": "A customized XL medium steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "xs_mc_chainmail_vest", + "copy-from": "xs_chainmail_vest", + "replace_materials": { "steel": "mc_steel_chain" }, "type": "ARMOR", - "copy-from": "mc_chainmail_vest", "name": { "str": "XS medium steel chainmail vest" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "pocket_data": [ - { - "pocket_type": "CONTAINER", - "volume_encumber_modifier": 0, - "ablative": true, - "max_contains_volume": "6000 ml", - "max_contains_weight": "20 kg", - "max_item_length": "65 cm", - "moves": 1500, - "description": "You can wear some armor over chainmail without penalty.", - "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] - } - ], - "extend": { "flags": [ "UNDERSIZE" ] } + "description": "A customized XS medium steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "hc_chainmail_vest", + "copy-from": "base_chainmail_vest", + "replace_materials": { "steel": "hc_steel_chain" }, "type": "ARMOR", - "copy-from": "lc_chainmail_vest", "name": { "str": "high steel chainmail vest" }, - "description": "A customized high steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", - "replace_materials": { "lc_steel_chain": "hc_steel_chain" } + "description": "A customized high steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "xl_hc_chainmail_vest", + "copy-from": "xl_chainmail_vest", + "replace_materials": { "steel": "hc_steel_chain" }, "type": "ARMOR", "name": { "str": "XL high steel chainmail vest" }, - "copy-from": "hc_chainmail_vest", - "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "pocket_data": [ - { - "pocket_type": "CONTAINER", - "volume_encumber_modifier": 0, - "ablative": true, - "max_contains_volume": "8500 ml", - "max_contains_weight": "20 kg", - "max_item_length": "65 cm", - "moves": 1500, - "description": "You can wear some armor over chainmail without penalty.", - "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] - } - ], - "extend": { "flags": [ "OVERSIZE" ] } + "description": "A customized XL high steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "xs_hc_chainmail_vest", + "copy-from": "xs_chainmail_vest", + "replace_materials": { "steel": "hc_steel_chain" }, "type": "ARMOR", - "copy-from": "hc_chainmail_vest", "name": { "str": "XS high steel chainmail vest" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "pocket_data": [ - { - "pocket_type": "CONTAINER", - "volume_encumber_modifier": 0, - "ablative": true, - "max_contains_volume": "6000 ml", - "max_contains_weight": "20 kg", - "max_item_length": "65 cm", - "moves": 1500, - "description": "You can wear some armor over chainmail without penalty.", - "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] - } - ], - "extend": { "flags": [ "UNDERSIZE" ] } + "description": "A customized XS high steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "ch_chainmail_vest", + "copy-from": "base_chainmail_vest", + "replace_materials": { "steel": "ch_steel_chain" }, "type": "ARMOR", - "copy-from": "lc_chainmail_vest", "name": { "str": "hardened steel chainmail vest" }, - "description": "A customized high steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", - "replace_materials": { "lc_steel_chain": "ch_steel_chain" } + "description": "A customized high steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "xl_ch_chainmail_vest", + "copy-from": "xl_chainmail_vest", + "replace_materials": { "steel": "ch_steel_chain" }, "type": "ARMOR", "name": { "str": "XL hardened steel chainmail vest" }, - "copy-from": "ch_chainmail_vest", - "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "pocket_data": [ - { - "pocket_type": "CONTAINER", - "volume_encumber_modifier": 0, - "ablative": true, - "max_contains_volume": "8500 ml", - "max_contains_weight": "20 kg", - "max_item_length": "65 cm", - "moves": 1500, - "description": "You can wear some armor over chainmail without penalty.", - "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] - } - ], - "extend": { "flags": [ "OVERSIZE" ] } + "description": "A customized XL hardened steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "xs_ch_chainmail_vest", + "copy-from": "xs_chainmail_vest", + "replace_materials": { "steel": "ch_steel_chain" }, "type": "ARMOR", - "copy-from": "ch_chainmail_vest", "name": { "str": "XS hardened steel chainmail vest" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "pocket_data": [ - { - "pocket_type": "CONTAINER", - "volume_encumber_modifier": 0, - "ablative": true, - "max_contains_volume": "6000 ml", - "max_contains_weight": "20 kg", - "max_item_length": "65 cm", - "moves": 1500, - "description": "You can wear some armor over chainmail without penalty.", - "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] - } - ], - "extend": { "flags": [ "UNDERSIZE" ] } + "description": "A customized XS hardened steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "qt_chainmail_vest", + "copy-from": "base_chainmail_vest", + "replace_materials": { "steel": "qt_steel_chain" }, "type": "ARMOR", - "copy-from": "lc_chainmail_vest", "name": { "str": "tempered steel chainmail vest" }, - "description": "A customized tempered steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight.", - "replace_materials": { "lc_steel_chain": "qt_steel_chain" } + "description": "A customized tempered steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "xl_qt_chainmail_vest", + "copy-from": "xl_chainmail_vest", + "replace_materials": { "steel": "qt_steel_chain" }, "type": "ARMOR", "name": { "str": "XL tempered steel chainmail vest" }, - "copy-from": "qt_chainmail_vest", - "proportional": { "weight": 1.125, "volume": 1.13, "price": 1.25 }, - "pocket_data": [ - { - "pocket_type": "CONTAINER", - "volume_encumber_modifier": 0, - "ablative": true, - "max_contains_volume": "8500 ml", - "max_contains_weight": "20 kg", - "max_item_length": "65 cm", - "moves": 1500, - "description": "You can wear some armor over chainmail without penalty.", - "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] - } - ], - "extend": { "flags": [ "OVERSIZE" ] } + "description": "A customized XL tempered steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "xs_qt_chainmail_vest", + "copy-from": "xs_chainmail_vest", + "replace_materials": { "steel": "qt_steel_chain" }, "type": "ARMOR", - "copy-from": "qt_chainmail_vest", "name": { "str": "XS tempered steel chainmail vest" }, - "proportional": { "weight": 0.75, "volume": 0.75, "price": 0.5 }, - "pocket_data": [ - { - "pocket_type": "CONTAINER", - "volume_encumber_modifier": 0, - "ablative": true, - "max_contains_volume": "6000 ml", - "max_contains_weight": "20 kg", - "max_item_length": "65 cm", - "moves": 1500, - "description": "You can wear some armor over chainmail without penalty.", - "flag_restriction": [ "ABLATIVE_CHAINMAIL_TORSO" ] - } - ], - "extend": { "flags": [ "UNDERSIZE" ] } + "description": "A customized XS tempered steel chainmail vest. It's a sleeveless piece of chainmail with small straps designed to better distribute the weight." }, { "id": "cloth_shirt_padded", @@ -1515,44 +1391,6 @@ "looks_like": "vest_leather_mod", "replace_materials": { "lc_steel": "ch_steel" } }, - { - "id": "jacket_eod", - "type": "TOOL_ARMOR", - "category": "armor", - "name": { "str": "EOD jacket" }, - "description": "A thick armored jacket constructed from Kevlar and Nomex for use by explosive ordnance disposal technicians.", - "weight": "16300 g", - "volume": "15 L", - "price": 200000, - "price_postapoc": 12000, - "warmth": 65, - "material": [ "kevlar_layered", "kevlar_rigid", "nomex" ], - "symbol": "[", - "color": "light_gray", - "environmental_protection": 2, - "material_thickness": 15, - "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ], - "armor": [ { "encumbrance": 80, "coverage": 100, "covers": [ "torso", "arm_l", "arm_r" ] } ] - }, - { - "id": "jacket_eod_light", - "type": "TOOL_ARMOR", - "category": "armor", - "name": { "str": "light EOD jacket" }, - "description": "An armored jacket constructed from Kevlar and Nomex for use by explosive ordnance disposal technicians. It is lighter than normal EOD armor to provide more maneuverability and can be worn over ballistic armor.", - "weight": "7000 g", - "volume": "15 L", - "price": 200000, - "price_postapoc": 12000, - "warmth": 40, - "material": [ "kevlar_layered", "kevlar_rigid", "nomex" ], - "symbol": "[", - "color": "light_gray", - "environmental_protection": 2, - "material_thickness": 7, - "flags": [ "STURDY", "OUTER", "RAINPROOF", "ONLY_ONE" ], - "armor": [ { "encumbrance": 40, "coverage": 100, "covers": [ "torso", "arm_l", "arm_r" ] } ] - }, { "id": "armor_lc_light_chestplate", "type": "ARMOR", diff --git a/data/json/items/book/electronics.json b/data/json/items/book/electronics.json index 8b6a38ee497e8..f4e7623f96442 100644 --- a/data/json/items/book/electronics.json +++ b/data/json/items/book/electronics.json @@ -264,7 +264,7 @@ "category": "manuals", "name": { "str_sp": "trifacet handling procedures" }, "description": "A heavy and disparate binder detailing the deactivation, storage and transport procedures for a so called \"Trifacet\" UGV. The pages and schematics within have been compiled from the internal reports of a vast array of governmental agencies, many of which you had never heard of before.", - "weight": "1409 g", + "weight": "550 g", "volume": "500 ml", "price": 84000, "price_postapoc": 2500, diff --git a/data/json/items/book/fabrication.json b/data/json/items/book/fabrication.json index 8279cceeda5bc..8f8fbb8b9262a 100644 --- a/data/json/items/book/fabrication.json +++ b/data/json/items/book/fabrication.json @@ -286,7 +286,7 @@ "category": "manuals", "name": { "str": "lab journal-Gustav", "str_pl": "lab journals-Gustav" }, "description": "This paper notebook is mostly full of boring logs, experimental observations and notes. Mixed in, however, are musings on how to use the lab's vapor deposition machine to deposit amorphous carbon in a diamond-like form onto common metals. The author's intended goal was a better non-stick frying pan, but you can think of a couple of better uses for it.", - "weight": "2000 g", + "weight": "600 g", "volume": "500 ml", "price": 50000, "price_postapoc": 2000, diff --git a/data/json/items/book/misc.json b/data/json/items/book/misc.json index 2fb2bc17508ed..895e03d495261 100644 --- a/data/json/items/book/misc.json +++ b/data/json/items/book/misc.json @@ -95,7 +95,7 @@ "type": "BOOK", "name": { "str": "The Hitchhiker's Guide to the Cataclysm", "str_pl": "copies of The Hitchhiker's Guide to the Cataclysm" }, "description": "Inscribed on the cover in large, friendly letters, is the message \"Don't Panic\".", - "weight": "1764 g", + "weight": "1178 g", "volume": "1 L", "price": 88200, "price_postapoc": 50, @@ -831,7 +831,7 @@ "type": "BOOK", "name": { "str": "big book of short stories", "str_pl": "big books of short stories" }, "description": "This humongous volume contains a vast collection of short stories by different authors, spanning a wide variety of topics and genres.", - "weight": "1720 g", + "weight": "1200 g", "volume": "1 L", "price": 1400, "price_postapoc": 50, diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json index d4d91210f6865..a126c427eb251 100644 --- a/data/json/items/chemicals_and_resources.json +++ b/data/json/items/chemicals_and_resources.json @@ -243,7 +243,7 @@ "symbol": "*", "color": "red", "description": "A chunk of rhodonite. It has manganese dioxide covering and going through it in veins, which can be obtained using a chisel.", - "material": [ "stone" ], + "material": [ "rhodonite" ], "volume": "250 ml", "weight": "915 g", "//": "density: 3.57–3.76 g/cm3", diff --git a/data/json/items/comestibles/alcohol.json b/data/json/items/comestibles/alcohol.json index b46db557ff8e4..b8e15b5753496 100644 --- a/data/json/items/comestibles/alcohol.json +++ b/data/json/items/comestibles/alcohol.json @@ -34,7 +34,7 @@ "name": { "str_sp": "Marloss wine" }, "weight": "50 g", "color": "pink", - "addiction_type": "marloss_r", + "addiction_type": [ "marloss_r", { "addiction": "alcohol", "potential": 5 } ], "use_action": [ "MARLOSS" ], "stim": -12, "container": "bottle_glass", @@ -659,7 +659,7 @@ "name": { "str_sp": "Irish coffee" }, "weight": "252 g", "color": "brown", - "addiction_type": "alcohol", + "addiction_type": [ "alcohol", { "addiction": "caffeine", "potential": 3 } ], "use_action": [ "ALCOHOL" ], "stim": 12, "container": "bottle_glass", @@ -687,7 +687,7 @@ "name": { "str_sp": "karsk" }, "weight": "252 g", "color": "brown", - "addiction_type": "alcohol", + "addiction_type": [ "alcohol", { "addiction": "caffeine", "potential": 3 } ], "use_action": [ "ALCOHOL" ], "stim": 12, "container": "bottle_glass", diff --git a/data/json/items/comestibles/fruit_dishes.json b/data/json/items/comestibles/fruit_dishes.json index 9bf81ab2d57e0..f6b053120dc4a 100644 --- a/data/json/items/comestibles/fruit_dishes.json +++ b/data/json/items/comestibles/fruit_dishes.json @@ -563,6 +563,7 @@ "material": [ "fruit", "veggy" ], "volume": "80 ml", "flags": [ "USE_EAT_VERB", "NUTRIENT_OVERRIDE" ], + "fun": 4, "vitamins": [ [ "vitC", 2 ], [ "iron", 15 ] ] }, { diff --git a/data/json/items/comestibles/other.json b/data/json/items/comestibles/other.json index a28f01ef16ab7..8d3707d423c1f 100644 --- a/data/json/items/comestibles/other.json +++ b/data/json/items/comestibles/other.json @@ -899,6 +899,23 @@ "flags": [ "TRADER_AVOID" ], "volume": "250 ml" }, + { + "type": "COMESTIBLE", + "id": "small_plant", + "name": { "str": "small plant" }, + "weight": "100 g", + "color": "green", + "comestible_type": "FOOD", + "symbol": "%", + "calories": 50, + "vitamins": [ ], + "description": "A small plant or flower, edible by grazers and ruminants only. Seeing this item is a bug.", + "price": 0, + "price_postapoc": 0, + "material": [ "veggy" ], + "flags": [ "TRADER_AVOID" ], + "volume": "250 ml" + }, { "type": "COMESTIBLE", "id": "underbrush", diff --git a/data/json/items/comestibles/spice.json b/data/json/items/comestibles/spice.json index 698ec44d1bbb6..61253f02a812b 100644 --- a/data/json/items/comestibles/spice.json +++ b/data/json/items/comestibles/spice.json @@ -179,7 +179,7 @@ "type": "COMESTIBLE", "name": { "str_sp": "mustard powder" }, "description": "A fragrant yellow powder. Not edible in this form.", - "color": "red" + "color": "yellow" }, { "id": "artificial_sweetener", diff --git a/data/json/items/containers/containers.json b/data/json/items/containers/containers.json index 597ff126d39aa..239a74cfa5322 100644 --- a/data/json/items/containers/containers.json +++ b/data/json/items/containers/containers.json @@ -3627,7 +3627,7 @@ "pocket_data": [ { "pocket_type": "CONTAINER", - "max_contains_volume": "1769 ml", + "max_contains_volume": "1255 ml", "max_contains_weight": "4 kg", "airtight": true, "moves": 50, diff --git a/data/json/items/containers/generic.json b/data/json/items/containers/generic.json index e9680738746b8..ff0d11da6da17 100644 --- a/data/json/items/containers/generic.json +++ b/data/json/items/containers/generic.json @@ -43,5 +43,34 @@ "use_action": { "type": "deploy_furn", "furn_type": "f_trashcan" }, "symbol": ")", "color": "light_gray" + }, + { + "id": "trashcan_large", + "type": "GENERIC", + "category": "container", + "name": { "str": "industrial trash can" }, + "looks_like": "f_trashcan", + "description": "A really big trashcan in which you can store, you guessed it, trash, ready for the garbage truck to pick up. Made out of thick plastic, this can was meant for household or industrial use, something you roll up to the curb once a week.", + "weight": "15 kg", + "//1": "Weight taken from https://www.uline.com/Product/Detail/H-7938BL/Trash-Cans-with-Wheels/Uline-Trash-Can-with-Wheels-95-Gallon-Black?pricode=WB3072&utm_source=Bing&utm_medium=pla&utm_term=H-7938BL&utm_campaign=Facilities%2BMaintenance&utm_source=Bing&utm_medium=pla&utm_term=H-7938BL&utm_campaign=Facilities%2BMaintenance&msclkid=d3c8827d02691eb87066e72c65ff5790", + "volume": "400 L", + "longest_side": "114 cm", + "price": "150 USD", + "price_postapoc": 7500, + "//2": "Based on above link.", + "pocket_data": [ + { + "pocket_type": "CONTAINER", + "max_contains_volume": "360 L", + "max_contains_weight": "149 kg", + "open_container": true, + "rigid": true, + "watertight": true + } + ], + "qualities": [ [ "CONTAIN", 2 ] ], + "material": [ "plastic" ], + "symbol": ")", + "color": "light_gray" } ] diff --git a/data/json/items/corpses/inactive_bots.json b/data/json/items/corpses/inactive_bots.json index 3aa8dc5007bfd..f2705da7c69cc 100644 --- a/data/json/items/corpses/inactive_bots.json +++ b/data/json/items/corpses/inactive_bots.json @@ -178,32 +178,6 @@ "flags": [ "SINGLE_USE", "NO_SALVAGE", "ROBOFAC_ROBOT_SMALL" ], "melee_damage": { "bash": 6, "cut": 6 } }, - { - "id": "bot_mininuke_hack", - "type": "TOOL", - "name": { "str": "inactive mininuke hack" }, - "description": "An inactive mininuke hack. Many times as large as a normal manhack, a mininuke hack contains a mininuke and attacks by flying at its target and detonating. Use this item to reprogram and activate the mininuke hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": "25000 g", - "volume": "18750 ml", - "price": 2677500, - "price_postapoc": 10000, - "to_hit": -3, - "material": [ "aluminum", "plastic" ], - "symbol": ",", - "color": "magenta", - "use_action": { - "type": "place_monster", - "monster_id": "mon_mininuke_hack", - "friendly_msg": "The mininuke hack floats from your hand and surveys the area!", - "hostile_msg": "You misprogram the mininuke hack. Pray.", - "difficulty": 5, - "moves": 60, - "place_randomly": true, - "skills": [ "electronics", "computer" ] - }, - "flags": [ "SINGLE_USE", "NO_SALVAGE" ], - "melee_damage": { "bash": 6, "cut": 6 } - }, { "id": "bot_rifleturret", "type": "TOOL", diff --git a/data/json/items/generic.json b/data/json/items/generic.json index 52ed177b51810..95369e48052db 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -691,7 +691,7 @@ "price": 200000, "price_postapoc": 1000, "material": [ "stone" ], - "weight": "907 g", + "weight": "700 g", "volume": "250 ml", "to_hit": -1, "qualities": [ [ "HAMMER", 1 ] ], @@ -1730,23 +1730,6 @@ "flags": [ "TRADER_AVOID", "NO_REPAIR" ], "melee_damage": { "bash": 6, "cut": 6 } }, - { - "type": "GENERIC", - "id": "broken_mininuke_hack", - "symbol": ",", - "color": "magenta", - "name": { "str": "broken mininuke hack" }, - "category": "other", - "description": "A broken mininuke hack. Just looking at the wreck makes you shiver. Could be gutted for parts.", - "price": 18000, - "price_postapoc": 10, - "material": [ "aluminum", "plastic" ], - "weight": "25000 g", - "volume": "18750 ml", - "to_hit": -3, - "flags": [ "TRADER_AVOID", "NO_REPAIR" ], - "melee_damage": { "bash": 6, "cut": 6 } - }, { "type": "GENERIC", "id": "broken_gasbomb_hack", @@ -1857,9 +1840,9 @@ "price": 9000, "price_postapoc": 10, "material": [ "plastic" ], - "weight": "30 g", + "weight": "18 g", "//": "A stick of DDR4 SRAM is 133.35 x 31.25 x 4.2mm, or 17.5ml. We round up a touch.", - "volume": "20 ml", + "volume": "18 ml", "to_hit": -1 }, { @@ -1981,7 +1964,7 @@ "price": 6000, "price_postapoc": 50, "material": [ "glass" ], - "weight": "15 g", + "weight": "1 g", "volume": "1 ml" }, { @@ -2135,7 +2118,7 @@ "price": 25000, "price_postapoc": 50, "material": [ "aluminum", "plastic" ], - "weight": "21000 g", + "weight": "2100 g", "volume": "2 L", "to_hit": 1, "melee_damage": { "bash": 4 } diff --git a/data/json/items/generic/music.json b/data/json/items/generic/music.json index c373739d4a8f1..bd1fe99feba22 100644 --- a/data/json/items/generic/music.json +++ b/data/json/items/generic/music.json @@ -4,6 +4,7 @@ "id": "cable_xlr", "name": { "str": "XLR cable" }, "description": "A balanced cable used for sending audio signal. The connectors have three prongs.", + "material": [ "copper", "plastic" ], "symbol": "o", "color": "dark_gray", "volume": "325 ml", @@ -14,6 +15,7 @@ "id": "cable_speaker", "name": { "str": "speaker cable" }, "description": "This audio cable connects one speaker to a powered head, or one speaker to another.", + "material": [ "copper", "plastic" ], "symbol": "o", "color": "dark_gray", "volume": "400 ml", @@ -31,6 +33,7 @@ "id": "headphones_circumaural", "name": { "str_sp": "headphones" }, "description": "A pair of headphones that cover your ears for improved sound quality and private listening. This pair is from a well-known brand that is very high quality, with a detachable 1/8\" cable. Comes with a 1/8\" to 1/4\" adaptor.", + "material": [ "plastic", "copper" ], "symbol": "Ω", "volume": "400 ml", "weight": "100 g" @@ -40,6 +43,7 @@ "id": "microphone_xlr_generic", "name": { "str": "XLR microphone" }, "description": "A microphone used to record or amplify sound. Comes with a clip. Has a 3-pin XLR connector on the bottom in order to connect to an amp.", + "material": [ "plastic", "copper" ], "symbol": "i", "color": "dark_gray", "volume": "550 ml", @@ -76,13 +80,14 @@ "symbol": ",", "color": "red", "volume": "2 ml", - "weight": "1 g" + "weight": "2 g" }, { "type": "GENERIC", "id": "mixer_music", "name": { "str": "mixer" }, "description": "A device with faders, switches, and knobs that mixes input signal and sends it to two output XLR cables, a left one and a right one.", + "material": [ "steel", "copper", "plastic" ], "symbol": "□", "color": "light_gray", "volume": "8 L", diff --git a/data/json/items/gun/223.json b/data/json/items/gun/223.json index 5f6b2d4f4e259..9dee8952ad2a4 100644 --- a/data/json/items/gun/223.json +++ b/data/json/items/gun/223.json @@ -3,6 +3,7 @@ "id": "modular_ar15", "type": "GUN", "name": { "str": "AR-15" }, + "copy-from": "rifle_auto", "//": "This is assumed to be the standard model matching the (currently not in-game) M16. Tileset whitelist for rifles", "description": "This ubiquitous rifle is the forefather of the M16 rifle series. It is lightweight and accurate, but will malfunction if not properly maintained. This one is a semi-automatic civilian version.", "weight": "902 g", @@ -12,7 +13,6 @@ "price": 125000, "price_postapoc": 4000, "to_hit": -1, - "skill": "rifle", "material": [ "aluminum", "steel", "plastic" ], "symbol": "(", "color": "black", @@ -274,6 +274,7 @@ "id": "modular_m27_assault_rifle", "looks_like": "modular_ar15", "type": "GUN", + "copy-from": "rifle_auto", "name": { "str": "M27 assault rifle" }, "description": "Designed to replace the M4 Carbine, the M27 assault rifle features most of the former's strengths, while being considerably more durable. It is chambered in 5.56x45mm and accepts STANAG magazines.", "weight": "1222 g", @@ -302,7 +303,6 @@ } ], "to_hit": -1, - "skill": "rifle", "material": [ "aluminum", "steel", "plastic" ], "symbol": "(", "color": "dark_gray", @@ -526,6 +526,7 @@ "id": "modular_m4_carbine", "looks_like": "modular_ar15", "type": "GUN", + "copy-from": "rifle_auto", "name": { "str": "M4 carbine" }, "description": "A popular carbine, long used by the US military. Though accurate, small, and lightweight, it is infamous for its unreliability when not properly maintained. It is chambered in 5.56x45mm and accepts STANAG magazines.", "ascii_picture": "modular_m4a1", @@ -545,7 +546,6 @@ } ], "to_hit": -1, - "skill": "rifle", "material": [ "aluminum", "steel", "plastic" ], "symbol": "(", "color": "dark_gray", @@ -600,6 +600,7 @@ "id": "m4_cqbr", "looks_like": "modular_ar15", "type": "GUN", + "copy-from": "modular_m4_carbine", "name": { "str": "special duty carbine" }, "description": "A rugged military carbine that has been outfitted with various accessories, such as an adjustable buttstock, suppressor, and shortened barrel, to improve its close-quarter battle effectiveness. Most commonly deployed with special forces units and marines before the Cataclysm, its handy size lends itself well to room clearing and fighting within tight spaces.", "weight": "1316 g", @@ -616,15 +617,10 @@ "description": "This is a shorter M4 carbine with a 10.3 inch barrel, intended for confined spaces and close quarters battle situations." } ], - "to_hit": -1, - "skill": "rifle", "material": [ "aluminum", "steel", "plastic" ], "symbol": "(", "color": "dark_gray", "ammo": [ "NULL" ], - "dispersion": 180, - "durability": 6, - "min_cycle_recoil": 1350, "weapon_category": [ "AUTOMATIC_RIFLES" ], "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ], "default_mods": [ "pistol_grip", "retool_ar15_223rem_short", "suppressor", "adjustable_stock" ], @@ -672,6 +668,7 @@ "id": "modular_m16a4", "looks_like": "modular_ar15", "type": "GUN", + "copy-from": "modular_m4_carbine", "name": { "str": "M16 burst rifle" }, "description": "The M16 is a common assault rifle descended from the AR-15, used by militaries across the world for over 50 years. It fires in three round bursts, ensuring the rifle is more accurate, but at the cost of being slower than other assault rifles. It is chambered in 5.56x45mm rounds, and accepts STANAG magazines.", "weight": "992 g", @@ -688,16 +685,13 @@ "description": "The M16 is a very common assault rifle descended from the AR-15, used by militaries across the world for over 50 years. It is a gas-operated, rotating bolt rifle known for its accuracy and controllable recoil." } ], - "to_hit": -1, "symbol": "(", "color": "dark_gray", - "skill": "rifle", "material": [ "aluminum", "steel", "plastic" ], "ammo": [ "NULL" ], "default_mods": [ "retool_ar15_223rem_extended" ], "dispersion": 150, "durability": 7, - "min_cycle_recoil": 1350, "weapon_category": [ "AUTOMATIC_RIFLES" ], "modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "BURST", "3 rd.", 3 ] ], "valid_mod_locations": [ [ "bore", 1 ], [ "grip", 1 ], [ "mechanism", 4 ], [ "sling", 1 ], [ "stock accessory", 2 ], [ "stock", 1 ] ], @@ -767,6 +761,7 @@ { "id": "m231pfw", "type": "GUN", + "copy-from": "modular_m4_carbine", "name": { "str": "M16 firing port gun" }, "description": "The M16 firing port gun is an M16 rifle modified to fire with an open-bolt design at ludicrous speeds, without sights. It has a threaded handguard to screw into an armored vehicle's firing ports. It is chambered in 5.56x45mm and accepts STANAG magazines.", "weight": "3330 g", @@ -783,16 +778,13 @@ "description": "The M231 PFW is an adaptation of the M16 assault rifle, designed to be used in the firing ports of the M2 Bradley Infantry Fighting Vehicle. It does not have a buttstock or front sight post, and the smooth front hand guard does nothing to protect you from the potentially scorching hot barrel collar, making it slightly less than ergonomic. You could screw it into a firing port if you were so inclined. The fire selector says only 'SAFE' and 'AUTO'. You can't help but wonder which one is preferable." } ], - "to_hit": -1, "symbol": "(", "color": "dark_gray", - "skill": "rifle", "material": [ "aluminum", "steel", "plastic" ], "ammo": [ "223" ], "dispersion": 350, "sight_dispersion": 500, "durability": 7, - "min_cycle_recoil": 1350, "valid_mod_locations": [ [ "barrel", 1 ], [ "bore", 1 ], diff --git a/data/json/items/gun/ups.json b/data/json/items/gun/ups.json index 1ad49e1e4caad..278c1564b8d4c 100644 --- a/data/json/items/gun/ups.json +++ b/data/json/items/gun/ups.json @@ -54,7 +54,7 @@ "price_postapoc": 8000, "longest_side": "1086 mm", "to_hit": -4, - "material": [ "superalloy", "plastic" ], + "material": [ "steel", "plastic" ], "symbol": "(", "color": "blue", "skill": "rifle", @@ -86,7 +86,7 @@ "price_postapoc": 8000, "longest_side": "1228 mm", "to_hit": -2, - "material": [ "superalloy", "plastic" ], + "material": [ "steel", "plastic" ], "symbol": "(", "color": "blue", "skill": "rifle", diff --git a/data/json/items/melee/bludgeons.json b/data/json/items/melee/bludgeons.json index 2711ff0187ba3..5491fdbf33813 100644 --- a/data/json/items/melee/bludgeons.json +++ b/data/json/items/melee/bludgeons.json @@ -1094,6 +1094,7 @@ { "type": "GENERIC", "id": "lc_mace", + "looks_like": "mace", "name": { "str": "mild carbon steel mace" }, "description": "A medieval weapon consisting of a wood handle with a heavy metal head. It is heavy and slow to swing, but its crushing damage is devastating. This one is custom-made with low carbon steel, which technically still works fine but tends to blunt more easily, and the grip is kind of bad.", "weight": "1400 g", @@ -1116,6 +1117,7 @@ { "type": "GENERIC", "id": "mc_mace", + "looks_like": "mace", "name": { "str": "medium steel mace" }, "description": "A medieval weapon consisting of a wood handle with a heavy metal head. It is heavy and slow to swing, but its crushing damage is devastating. This one is custom-made with medium carbon steel which is passable, but hardly the pinnacle of weapon making.", "weight": "1500 g", @@ -1138,6 +1140,7 @@ { "type": "GENERIC", "id": "hc_mace", + "looks_like": "mace", "name": { "str": "high steel mace" }, "description": "A medieval weapon consisting of a wood handle with a heavy metal head. It is heavy and slow to swing, but its crushing damage is devastating. This one is custom-made with high carbon steel and is a solid, dependable weapon.", "weight": "1500 g", @@ -1160,6 +1163,7 @@ { "type": "GENERIC", "id": "ch_mace", + "looks_like": "mace", "name": { "str": "case hardened steel mace" }, "description": "A medieval weapon consisting of a wood handle with a heavy metal head. It is heavy and slow to swing, but its crushing damage is devastating. This one is custom-made with case hardened steel and can pulverize bones.", "weight": "1500 g", @@ -1182,6 +1186,7 @@ { "type": "GENERIC", "id": "qt_mace", + "looks_like": "mace", "name": { "str": "tempered steel mace" }, "description": "A medieval weapon consisting of a wood handle with a heavy metal head. It is heavy and slow to swing, but its crushing damage is devastating. This one is custom-made with tempered steel and will crack skulls like watermelons.", "weight": "1500 g", diff --git a/data/json/items/melee/spears_and_polearms.json b/data/json/items/melee/spears_and_polearms.json index 3f3d59f16e258..3a9a5651b87d7 100644 --- a/data/json/items/melee/spears_and_polearms.json +++ b/data/json/items/melee/spears_and_polearms.json @@ -34,7 +34,6 @@ "to_hit": { "grip": "solid", "length": "short", "surface": "point", "balance": "neutral" }, "price_postapoc": 10, "flags": [ "SPEAR" ], - "weapon_category": [ "POLEARMS", "FENCING_WEAPONRY" ], "techniques": [ "WBLOCK_1" ], "qualities": [ [ "COOK", 1 ] ], "melee_damage": { "bash": 5, "stab": 9 } diff --git a/data/json/items/melee/swords_and_blades.json b/data/json/items/melee/swords_and_blades.json index 25dde6ca0ef16..5e5e4ea858a76 100644 --- a/data/json/items/melee/swords_and_blades.json +++ b/data/json/items/melee/swords_and_blades.json @@ -460,6 +460,7 @@ { "id": "lc_knife_rambo", "copy-from": "mc_knife_rambo", + "looks_like": "knife_rambo", "type": "GENERIC", "name": { "str": "mild steel survival knife", "str_pl": "mild steel survival knives" }, "description": "This massive knife features a hollow handle with a compass built into the pommel and a row of fearsome-looking saw teeth along the back of its blade. It's custom-made of mild steel, you could probably find better in a hunting store.", @@ -471,6 +472,7 @@ }, { "id": "mc_knife_rambo", + "looks_like": "knife_rambo", "type": "GENERIC", "category": "weapons", "name": { "str": "medium steel survival knife", "str_pl": "medium steel survival knives" }, @@ -506,6 +508,7 @@ { "id": "hc_knife_rambo", "copy-from": "mc_knife_rambo", + "looks_like": "knife_rambo", "type": "GENERIC", "name": { "str": "high steel survival knife", "str_pl": "high steel survival knives" }, "description": "This massive knife features a hollow handle with a compass built into the pommel and a row of fearsome-looking saw teeth along the back of its blade. A competent weapon and tool, if not the best at any of them.", @@ -516,6 +519,7 @@ { "id": "ch_knife_rambo", "copy-from": "mc_knife_rambo", + "looks_like": "knife_rambo", "type": "GENERIC", "name": { "str": "hardened steel survival knife", "str_pl": "hardened steel survival knives" }, "description": "This massive knife features a hollow handle with a compass built into the pommel and a row of fearsome-looking saw teeth along the back of its blade. Now this, this is a knife.", @@ -526,6 +530,7 @@ { "id": "qt_knife_rambo", "copy-from": "mc_knife_rambo", + "looks_like": "knife_rambo", "type": "GENERIC", "name": { "str": "tempered steel survival knife", "str_pl": "tempered steel survival knives" }, "description": "This massive knife features a hollow handle with a compass built into the pommel and a row of fearsome-looking saw teeth along the back of its blade. Time to go Rambo on this apocalypse.", @@ -587,6 +592,7 @@ { "id": "lc_knife_trench", "copy-from": "mc_knife_trench", + "looks_like": "knife_trench", "type": "TOOL", "name": { "str": "mild steel trench knife", "str_pl": "mild steel trench knives" }, "description": "This stout combat knife features a steel guard to protect the user's knuckles. The guard can also be used for striking or blocking. This one is poorly made of mild steel with barely a proper grip.", @@ -600,6 +606,7 @@ "id": "mc_knife_trench", "type": "TOOL", "category": "weapons", + "looks_like": "knife_trench", "name": { "str": "medium steel trench knife", "str_pl": "medium steel trench knives" }, "description": "This stout combat knife features a steel guard to protect the user's knuckles. The guard can also be used for striking or blocking. This one is made of medium steel and is about shop quality.", "weight": "530 g", @@ -621,6 +628,7 @@ { "id": "hc_knife_trench", "copy-from": "mc_knife_trench", + "looks_like": "knife_trench", "type": "TOOL", "name": { "str": "high steel trench knife", "str_pl": "high steel trench knives" }, "description": "This stout combat knife features a steel guard to protect the user's knuckles. The guard can also be used for striking or blocking. This one is made of high steel and is probably as good as a WWI trench knife.", @@ -631,6 +639,7 @@ { "id": "ch_knife_trench", "copy-from": "mc_knife_trench", + "looks_like": "knife_trench", "type": "TOOL", "name": { "str": "hardened steel trench knife", "str_pl": "hardened steel trench knives" }, "description": "This stout combat knife features a steel guard to protect the user's knuckles. The guard can also be used for striking or blocking. This one is made of hardened steel, an officer's weapon if ever there was one.", @@ -641,6 +650,7 @@ { "id": "qt_knife_trench", "copy-from": "mc_knife_trench", + "looks_like": "knife_trench", "type": "TOOL", "name": { "str": "tempered steel trench knife", "str_pl": "tempered steel trench knives" }, "description": "This stout combat knife features a steel guard to protect the user's knuckles. The guard can also be used for striking or blocking. This one is made of tempered steel, and you feel you could hold a trench against an army of zombies with it.", @@ -1003,6 +1013,7 @@ { "id": "jian", "copy-from": "mc_jian", + "looks_like": "arming_sword", "type": "TOOL", "name": { "str_sp": "jian" }, "description": "An ancient Chinese doubled-edged straight sword, with an ornate guard and a tassel attached to the pommel. One of the four major weapons in folklore, alongside the dao sabre, qiang spear, and gun staff.", @@ -1011,6 +1022,7 @@ { "id": "lc_jian", "copy-from": "mc_jian", + "looks_like": "jian", "type": "TOOL", "name": { "str_sp": "mild steel jian" }, "description": "An ancient Chinese doubled-edged straight sword, with an ornate guard and a tassel attached to the pommel. One of the four major weapons in folklore, alongside the dao sabre, qiang spear, and gun staff.\n\nMade with mild steel and lacking a proper grip, this is better than the sticks you swung around as a kid, but you know you can do better.", @@ -1045,6 +1057,7 @@ }, { "id": "hc_jian", + "looks_like": "jian", "type": "TOOL", "copy-from": "mc_jian", "name": { "str_sp": "high steel jian" }, @@ -1055,6 +1068,7 @@ }, { "id": "ch_jian", + "looks_like": "jian", "type": "TOOL", "copy-from": "mc_jian", "name": { "str_sp": "hardened steel jian" }, @@ -1065,6 +1079,7 @@ }, { "id": "qt_jian", + "looks_like": "jian", "type": "TOOL", "copy-from": "mc_jian", "name": { "str_sp": "tempered steel jian" }, @@ -1075,6 +1090,7 @@ }, { "id": "jian_inferior", + "looks_like": "jian", "copy-from": "mc_jian", "type": "TOOL", "name": { "str_sp": "jian" }, @@ -1085,6 +1101,7 @@ }, { "id": "jian_fake", + "looks_like": "jian", "copy-from": "mc_jian", "type": "GENERIC", "name": { "str_sp": "jian" }, @@ -1097,6 +1114,7 @@ { "id": "scimitar", "copy-from": "mc_scimitar", + "looks_like": "katana", "type": "TOOL", "name": { "str": "shamshir" }, "description": "A curved sword associated with various Middle Eastern and Central Asian countries. Designed for slashing, and quite deadly against unarmored targets.", diff --git a/data/json/items/ranged/crossbows.json b/data/json/items/ranged/crossbows.json index 9035175f81498..2b677964cb1f9 100644 --- a/data/json/items/ranged/crossbows.json +++ b/data/json/items/ranged/crossbows.json @@ -295,8 +295,9 @@ "longest_side": "86 cm", "ammo": [ "bolt" ], "weight": "2728 g", - "volume": "1500 ml", - "to_hit": 1, + "volume": "6450 ml", + "//volume": "L 86 * W 25 * H 6 cm, volume is calculated as area of triangle multiplied by height", + "to_hit": { "grip": "none", "length": "short", "surface": "any", "balance": "uneven" }, "loudness": 10, "ranged_damage": { "damage_type": "stab", "amount": 4 }, "range": 9, diff --git a/data/json/items/tool/cables.json b/data/json/items/tool/cables.json index e0f2c06f852da..238fcb7a645bd 100644 --- a/data/json/items/tool/cables.json +++ b/data/json/items/tool/cables.json @@ -103,10 +103,11 @@ "color": "light_blue", "symbol": "&", "material": [ "steel", "plastic" ], - "volume": "3000 ml", - "weight": "24000 g", + "volume": "749 ml", + "weight": "3252 g", + "//": "volume is cylinder with length 9m and diameter 5 mm, stats are calculated using as an example, and resized", "category": "tools", - "price": 80, + "price": 9999, "price_postapoc": 500, "max_charges": 8, "initial_charges": 8, diff --git a/data/json/items/tool/explosives.json b/data/json/items/tool/explosives.json index a924f39e08ebd..82ca751fb73a3 100644 --- a/data/json/items/tool/explosives.json +++ b/data/json/items/tool/explosives.json @@ -664,38 +664,41 @@ }, { "id": "mininuke", - "type": "TOOL", + "type": "TOOL_ARMOR", "category": "weapons", - "name": { "str": "mininuke" }, - "//": "This is based on the Davy Crockett nuclear artillery shell, all other man-portable nuclear weapons have far too high a yield.", - "description": "An extremely powerful weapon, a portable nuclear bomb. Use it to activate the timer. You guess that the explosion would be large enough to take out a small house.", - "weight": "23000 g", - "volume": "16 L", + "name": { "str": "SADM mininuke" }, + "//": "This is based on the B54 Mod 1, all other man-portable nuclear weapons have far too high a yield.", + "description": "The B54 Special Atomic Demolition Munition is an extremely powerful weapon, a portable nuclear bomb, using the smallest nuclear warhead in US inventory. It is housed inside a extremely sturdy transit container. Use it to activate the timer. You guess that the explosion would be large enough to take out a small house.", + "weight": "26500 g", + "volume": "33389 ml", + "longest_side": "46 cm", "price": 180000, "price_postapoc": 10000, - "to_hit": -2, - "material": [ "steel", "plastic" ], + "to_hit": -4, + "material": [ "aluminum", "nylon" ], "symbol": "*", "color": "light_green", "use_action": [ "MININUKE" ], - "flags": [ "LEAK_DAM", "RADIOACTIVE", "RADIO_MODABLE", "RADIO_INVOKE_PROC", "BOMB" ], + "sided": true, + "armor": [ + { + "material": [ { "type": "nylon", "covered_by_mat": 100, "thickness": 2.0 } ], + "encumbrance": 90, + "coverage": 10, + "covers": [ "hand_l", "hand_r" ] + } + ], + "flags": [ "STURDY", "LEAK_DAM", "BELTED", "RADIOACTIVE", "RADIO_MODABLE", "RADIO_INVOKE_PROC", "BOMB" ], "melee_damage": { "bash": 8 } }, { "id": "mininuke_act", - "type": "TOOL", - "category": "weapons", - "name": { "str": "mininuke" }, - "//": "This is based on the Davy Crockett nuclear artillery shell, all other man-portable nuclear weapons have far too high a yield.", - "description": "This miniature nuclear bomb has a light blinking on the side, showing that it will soon explode. You should probably get far, far away from it.", - "weight": "23000 g", - "volume": "16 L", + "copy-from": "mininuke", + "type": "TOOL_ARMOR", + "name": { "str": "active SADM mininuke" }, + "description": "The nuclear bomb looks no different from the outside, yet you know that the device is armed and counting down. You should probably get far, far away from it.", "price": 0, "price_postapoc": 0, - "to_hit": -2, - "material": [ "steel", "plastic" ], - "symbol": "*", - "color": "light_green", "use_action": { "type": "message", "message": "You've already set the %s's timer, you might want to get away from it." }, "countdown_action": { "type": "explosion", @@ -705,8 +708,7 @@ "fields_max_intensity": 3, "explosion": { "power": 9000000 } }, - "flags": [ "LEAK_DAM", "RADIOACTIVE", "TRADER_AVOID" ], - "melee_damage": { "bash": 8 } + "flags": [ "LEAK_DAM", "RADIOACTIVE", "TRADER_AVOID" ] }, { "id": "molotov", diff --git a/data/json/items/tool/firefighting.json b/data/json/items/tool/firefighting.json index b1fae255565ae..7c14abfa7c93b 100644 --- a/data/json/items/tool/firefighting.json +++ b/data/json/items/tool/firefighting.json @@ -193,6 +193,15 @@ "qualities": [ [ "COOK", 1 ] ], "melee_damage": { "bash": 20, "cut": 6 } }, + { + "id": "EOD_hotstick", + "type": "GENERIC", + "symbol": "/", + "color": "yellow", + "copy-from": "pike_pole", + "name": { "str": "EOD hot stick" }, + "description": "A durable tool consisting of a sturdy fiberglass shaft tipped with a set of 3 hooks, one large opposed by two small. Hot sticks are used to maintain some standoff distance when manual manipulation of explosives is necessary, and robot assistance is unavailable." + }, { "id": "ny_hook", "type": "TOOL", diff --git a/data/json/items/tool/misc.json b/data/json/items/tool/misc.json index 6bfe10cf7b311..4118297e97972 100644 --- a/data/json/items/tool/misc.json +++ b/data/json/items/tool/misc.json @@ -720,17 +720,6 @@ "use_action": { "target": "c4armed", "target_timer": "10 seconds", "type": "transform" }, "flags": [ "TRADER_AVOID", "BOMB", "GRENADE", "ZERO_WEIGHT" ] }, - { - "id": "mininuke_payload", - "type": "TOOL", - "category": "weapons", - "name": { "str": "mininuke payload" }, - "description": "This is a dummy item used by mininuke hacks. You should never see it outside of debug.", - "symbol": "*", - "color": "dark_gray", - "use_action": { "target": "mininuke_act", "target_timer": "20 seconds", "type": "transform" }, - "flags": [ "TRADER_AVOID", "BOMB", "GRENADE", "ZERO_WEIGHT" ] - }, { "id": "tear_gas_payload", "type": "TOOL", diff --git a/data/json/items/tool_armor.json b/data/json/items/tool_armor.json index 0efd399b33640..007f4caecbeed 100644 --- a/data/json/items/tool_armor.json +++ b/data/json/items/tool_armor.json @@ -1214,7 +1214,8 @@ "description": "An armored, electronically-shielded helmet containing a camera, a two-way radio, and a headlamp, all of which can be voice-activated for redundancy. It is designed to protect against overpressure, fragmentation, impact, and heat.", "weight": "3600 g", "volume": "4 L", - "price": 150000, + "price": 1613900, + "//": "Based on the EOD 10 and EOD 9 helmets.", "price_postapoc": 10000, "armor": [ { @@ -1247,7 +1248,7 @@ "warmth": 65, "material": [ "kevlar_rigid", "plastic", "plastic_pad" ], "symbol": "[", - "color": "light_gray", + "color": "light_green", "environmental_protection": 3, "ammo": "battery", "pocket_data": [ @@ -1267,7 +1268,7 @@ "need_charges": 1, "need_charges_msg": "\"Illumination disabled, low power.\"" }, - "flags": [ "STURDY", "OUTER", "RAINPROOF", "TWO_WAY_RADIO", "WATCH", "ALARMCLOCK" ] + "flags": [ "STURDY", "OUTER", "RAINPROOF", "PADDED", "TWO_WAY_RADIO", "WATCH", "ALARMCLOCK" ] }, { "id": "helmet_eod_on", diff --git a/data/json/mapgen/house/2storymodern01.json b/data/json/mapgen/house/2storymodern01.json index 3155454bc1800..435680c58eb6f 100644 --- a/data/json/mapgen/house/2storymodern01.json +++ b/data/json/mapgen/house/2storymodern01.json @@ -229,7 +229,10 @@ "furniture": { "!": "f_region_flower_decorative", "$": "f_table" }, "items": { "$": { "item": "table_foyer", "chance": 30 } }, "place_loot": [ { "item": "television", "x": 11, "y": 10, "chance": 100 } ], - "place_vehicles": [ { "vehicle": "suv", "x": 3, "y": 18, "chance": 20, "status": 50, "rotation": 270 } ], + "place_vehicles": [ + { "vehicle": "suv", "x": 3, "y": 18, "chance": 20, "status": 50, "rotation": 270 }, + { "vehicle": "rolling_trash_can", "x": 5, "y": 4, "chance": 80, "status": 0 } + ], "rotation": [ 2 ] } }, @@ -287,7 +290,10 @@ }, "furniture": { "$": "f_table", ",": "f_chair" }, "items": { "$": { "item": "table_foyer", "chance": 30 } }, - "place_vehicles": [ { "vehicle": "bicycle", "x": 21, "y": 3, "chance": 30, "status": 100, "rotation": 180 } ], + "place_vehicles": [ + { "vehicle": "bicycle", "x": 21, "y": 3, "chance": 30, "status": 100, "rotation": 180 }, + { "vehicle": "rolling_trash_can", "x": 17, "y": 4, "chance": 80, "status": 0 } + ], "rotation": [ 2 ] } }, @@ -340,6 +346,7 @@ }, "furniture": { "$": "f_table", ",": "f_chair", "(": "f_piano", "[": "f_region_flower_decorative" }, "items": { "$": { "item": "table_foyer", "chance": 30 } }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 17, "y": 4, "chance": 80, "status": 0 } ], "rotation": [ 2 ] } }, diff --git a/data/json/mapgen/house/2storymodern02.json b/data/json/mapgen/house/2storymodern02.json index a3d7893841975..18208acf9629c 100644 --- a/data/json/mapgen/house/2storymodern02.json +++ b/data/json/mapgen/house/2storymodern02.json @@ -110,6 +110,7 @@ "$": "t_floor_noroof" }, "furniture": { "$": "f_table" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 8, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 15, "y": 2 } ] } }, diff --git a/data/json/mapgen/house/2storymodern03.json b/data/json/mapgen/house/2storymodern03.json index 9d9a6f44d9b26..163d82258f896 100644 --- a/data/json/mapgen/house/2storymodern03.json +++ b/data/json/mapgen/house/2storymodern03.json @@ -87,6 +87,7 @@ "........................" ], "terrain": { + "#": "t_concrete_wall", "_": "t_linoleum_gray", "%": [ [ "t_shrub", 2 ], "t_shrub_strawberry", "t_shrub_blueberry" ], "[": [ [ "t_region_tree_nut", 5 ], [ "t_region_tree_shade", 4 ], [ "t_region_tree_fruit", 2 ] ], @@ -101,6 +102,7 @@ "G": "t_sidewalk" }, "furniture": { "≠": "f_piano", "$": "f_stool", "&": "f_table" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 17, "y": 4, "chance": 80, "status": 0 } ], "items": { "&": { "item": "table_foyer", "chance": 50 } } } }, @@ -139,6 +141,7 @@ "........................" ], "terrain": { + "#": "t_concrete_wall", ".": "t_open_air", "_": "t_linoleum_gray", "(": "t_shingle_flat_roof", diff --git a/data/json/mapgen/house/2storymodern04.json b/data/json/mapgen/house/2storymodern04.json index 1c042e52b9c64..86ee1403a5077 100644 --- a/data/json/mapgen/house/2storymodern04.json +++ b/data/json/mapgen/house/2storymodern04.json @@ -114,7 +114,8 @@ "items": { "֎": { "item": "liquor_and_spirits", "chance": 30 } }, "place_vehicles": [ { "vehicle": "suburban_home", "x": 12, "y": 7, "chance": 20, "status": 80, "rotation": 90 }, - { "vehicle": "suv_electric", "x": 6, "y": 8, "chance": 20, "status": 80, "rotation": 90 } + { "vehicle": "suv_electric", "x": 6, "y": 8, "chance": 20, "status": 80, "rotation": 90 }, + { "vehicle": "rolling_trash_can", "x": 17, "y": 4, "chance": 80, "status": 0 } ] } }, diff --git a/data/json/mapgen/house/bungalow01.json b/data/json/mapgen/house/bungalow01.json index a6ba1155e3d3b..d77ae2fcde217 100644 --- a/data/json/mapgen/house/bungalow01.json +++ b/data/json/mapgen/house/bungalow01.json @@ -39,6 +39,7 @@ "..................---..." ], "terrain": { + "#": "t_wall_p", "_": "t_linoleum_gray", "{": "t_railing_v", ",": "t_floor_noroof", @@ -51,6 +52,7 @@ "w": "t_null", "q": "t_floor_noroof" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 17, "y": 4, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 20, "y": 10 } ] } }, diff --git a/data/json/mapgen/house/bungalow02.json b/data/json/mapgen/house/bungalow02.json index 035d0c7705873..c63dc85f57988 100644 --- a/data/json/mapgen/house/bungalow02.json +++ b/data/json/mapgen/house/bungalow02.json @@ -39,6 +39,7 @@ "........................" ], "terrain": { + "#": "t_wall_b", "_": "t_linoleum_gray", "~": "t_floor_noroof", "!": "t_railing_v", @@ -62,7 +63,10 @@ "furniture": { "$": "f_rack", "&": "f_treadmill", "?": "f_exercise", "/": "f_region_flower", "¤": "f_table" }, "items": { "$": { "item": "clothing_outdoor_shoes", "chance": 50 }, "¤": { "item": "nightstand", "chance": 30 } }, "place_loot": [ { "item": "television", "x": 13, "y": 19 } ], - "place_vehicles": [ { "vehicle": "car", "x": 5, "y": 6, "chance": 20, "rotation": 90 } ] + "place_vehicles": [ + { "vehicle": "car", "x": 5, "y": 6, "chance": 20, "rotation": 90 }, + { "vehicle": "rolling_trash_can", "x": 17, "y": 1, "chance": 80, "status": 0 } + ] } }, { diff --git a/data/json/mapgen/house/bungalow03.json b/data/json/mapgen/house/bungalow03.json index f9affa5869d92..581a77a7ac785 100644 --- a/data/json/mapgen/house/bungalow03.json +++ b/data/json/mapgen/house/bungalow03.json @@ -39,6 +39,7 @@ "........................" ], "terrain": { + "#": "t_wall_r", "_": "t_linoleum_gray", ",": "t_floor_noroof", "~": "t_shrub_lilac", @@ -49,6 +50,7 @@ }, "furniture": { "$": "f_rack", "&": "f_table" }, "items": { "$": { "item": "clothing_outdoor_shoes", "chance": 50 }, "&": { "item": "table_foyer", "chance": 50 } }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "laptop", "x": 5, "y": 21, "chance": 50 } ] } }, diff --git a/data/json/mapgen/house/bungalow04.json b/data/json/mapgen/house/bungalow04.json index 62467a8a14260..10756071b27a0 100644 --- a/data/json/mapgen/house/bungalow04.json +++ b/data/json/mapgen/house/bungalow04.json @@ -39,6 +39,7 @@ "........................" ], "terrain": { + "#": "t_adobe_brick_wall", "0": [ [ "t_shrub", 2 ], "t_shrub_strawberry", "t_shrub_blueberry" ], "=": "t_shrub_lilac", "_": "t_linoleum_gray", @@ -63,6 +64,7 @@ }, "furniture": { "!": [ "f_indoor_plant", "f_indoor_plant_y" ], "$": "f_table", "&": "f_region_flower" }, "items": { "$": { "item": "table_foyer", "chance": 50 }, "/": { "item": "hydro", "chance": 40 } }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 6, "y": 9 }, { "group": "tools_earthworking", "x": [ 18, 20 ], "y": [ 10, 10 ], "chance": 50, "repeat": [ 1, 2 ] } diff --git a/data/json/mapgen/house/bungalow05.json b/data/json/mapgen/house/bungalow05.json index 7317519d41520..66da324e19635 100644 --- a/data/json/mapgen/house/bungalow05.json +++ b/data/json/mapgen/house/bungalow05.json @@ -34,6 +34,7 @@ ".,......................" ], "terrain": { + "#": "t_adobe_brick_wall", "|": "t_wall", "~": "t_door_glass_c", "_": "t_linoleum_gray", @@ -53,6 +54,7 @@ "&": { "item": "clothing_outdoor_shoes", "chance": 40, "repeat": [ 1, 2 ] }, "$": [ { "item": "sports", "chance": 30 }, { "item": "camping", "chance": 30 } ] }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 12, "y": 11 } ] } }, diff --git a/data/json/mapgen/house/bungalow06.json b/data/json/mapgen/house/bungalow06.json index 27d5b4cd2c1c2..8b493e2945d9d 100644 --- a/data/json/mapgen/house/bungalow06.json +++ b/data/json/mapgen/house/bungalow06.json @@ -39,6 +39,7 @@ "........................" ], "terrain": { + "#": "t_rock_wall", "_": "t_linoleum_gray", ",": "t_floor_noroof", ")": "t_railing_v", @@ -52,6 +53,7 @@ }, "furniture": { "$": "f_exercise", "&": "f_table" }, "items": { "&": { "item": "table_foyer", "chance": 50 } }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 6, "y": 17 } ] } }, diff --git a/data/json/mapgen/house/bungalow07.json b/data/json/mapgen/house/bungalow07.json index f414c866a8b27..d077d2212e1e4 100644 --- a/data/json/mapgen/house/bungalow07.json +++ b/data/json/mapgen/house/bungalow07.json @@ -42,6 +42,7 @@ "$": "t_carpet_green" }, "furniture": { ")": "f_treadmill", "$": "f_chair" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 9, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 19, "y": 7 } ] } }, diff --git a/data/json/mapgen/house/bungalow08.json b/data/json/mapgen/house/bungalow08.json index 8e96bfb34bba3..55245bc60ad9b 100644 --- a/data/json/mapgen/house/bungalow08.json +++ b/data/json/mapgen/house/bungalow08.json @@ -34,6 +34,7 @@ ".................[......" ], "terrain": { + "#": "t_wall_p", "`": "t_carpet_red", "_": "t_linoleum_gray", "|": "t_wall", @@ -48,6 +49,7 @@ }, "furniture": { "(": "f_table", "$": "f_piano", "&": "f_chair", "=": "f_rack" }, "items": { "(": { "item": "table_foyer", "chance": 50 }, "=": { "item": "clothing_outdoor_shoes", "chance": 50 } }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 4, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "laptop", "x": 14, "y": 6 } ] } }, diff --git a/data/json/mapgen/house/bungalow09.json b/data/json/mapgen/house/bungalow09.json index c8c6a68440506..fea011d827b07 100644 --- a/data/json/mapgen/house/bungalow09.json +++ b/data/json/mapgen/house/bungalow09.json @@ -50,6 +50,7 @@ "l": "t_carpet_yellow", "s": "t_carpet_yellow" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 9, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "laptop", "x": 17, "y": 5, "chance": 100 }, { "item": "television", "x": 9, "y": 7, "chance": 100 } ] } }, diff --git a/data/json/mapgen/house/bungalow10.json b/data/json/mapgen/house/bungalow10.json index f38fa09d6f547..c9ee321f4786f 100644 --- a/data/json/mapgen/house/bungalow10.json +++ b/data/json/mapgen/house/bungalow10.json @@ -47,6 +47,7 @@ ")": "t_dirtmound" }, "furniture": { "?": "f_locker", "$": "f_treadmill", "&": "f_chair" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ], "items": { ")": { "item": "hydro", "chance": 35 }, "?": { "item": "tools_earthworking", "chance": 30 } }, "place_loot": [ { "item": "television", "x": 6, "y": 16 } ] } diff --git a/data/json/mapgen/house/bungalow11.json b/data/json/mapgen/house/bungalow11.json index 8963b0c1e1afa..92bd3046b16d9 100644 --- a/data/json/mapgen/house/bungalow11.json +++ b/data/json/mapgen/house/bungalow11.json @@ -39,6 +39,7 @@ "........................" ], "terrain": { + "#": "t_adobe_brick_wall", "_": "t_linoleum_gray", "?": "t_floor_noroof", "]": "t_railing_v", @@ -55,6 +56,7 @@ "/": { "item": "clothing_outdoor_shoes", "chance": 40, "repeat": [ 1, 2 ] }, "&": { "item": "table_foyer", "chance": 40 } }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 18, "y": 5 }, { "group": "child_items", "x": [ 2, 6 ], "y": [ 7, 8 ], "chance": 60, "repeat": [ 3, 4 ] } diff --git a/data/json/mapgen/house/bungalow12.json b/data/json/mapgen/house/bungalow12.json index d02f2f3911db2..df134896da4b7 100644 --- a/data/json/mapgen/house/bungalow12.json +++ b/data/json/mapgen/house/bungalow12.json @@ -66,6 +66,7 @@ { "item": "television", "x": 19, "y": 17, "chance": 100 }, { "item": "television", "x": 11, "y": 15, "chance": 100 } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 17, "y": 1, "chance": 80, "status": 0 } ], "vehicles": { ")": { "vehicle": "swivel_chair", "chance": 100, "status": 1 } } } }, diff --git a/data/json/mapgen/house/bungalow13.json b/data/json/mapgen/house/bungalow13.json index 69cb6b4412221..2177ff1dc6b49 100644 --- a/data/json/mapgen/house/bungalow13.json +++ b/data/json/mapgen/house/bungalow13.json @@ -55,6 +55,7 @@ "=": "f_counter", "/": "f_shredder" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "items": { "R": [ { "item": "exotic_books", "chance": 10 }, diff --git a/data/json/mapgen/house/bungalow14.json b/data/json/mapgen/house/bungalow14.json index 157252b630f63..7a1269a5e5cee 100644 --- a/data/json/mapgen/house/bungalow14.json +++ b/data/json/mapgen/house/bungalow14.json @@ -83,6 +83,7 @@ "(": { "item": "table_foyer", "chance": 30 }, "]": [ { "item": "SUS_wardrobe_mens", "chance": 50 }, { "item": "SUS_wardrobe_womens", "chance": 50 } ] }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 4, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 5, "y": 17, "chance": 100 }, { "item": "television", "x": 19, "y": 8, "chance": 100 }, diff --git a/data/json/mapgen/house/bungalow15.json b/data/json/mapgen/house/bungalow15.json index 9a34e2b278775..2b60593366d41 100644 --- a/data/json/mapgen/house/bungalow15.json +++ b/data/json/mapgen/house/bungalow15.json @@ -63,7 +63,10 @@ "$": { "item": "clothing_outdoor_shoes", "chance": 100, "repeat": [ 1, 3 ] } }, "place_loot": [ { "item": "lawnmower", "x": 3, "y": 21, "chance": 25 }, { "item": "television", "x": 10, "y": 9, "chance": 100 } ], - "place_vehicles": [ { "vehicle": "car", "x": 3, "y": 4, "chance": 30, "fuel": 80, "rotation": 90 } ] + "place_vehicles": [ + { "vehicle": "car", "x": 3, "y": 4, "chance": 30, "fuel": 80, "rotation": 90 }, + { "vehicle": "rolling_trash_can", "x": 17, "y": 1, "chance": 80, "status": 0 } + ] } }, { diff --git a/data/json/mapgen/house/bungalow16.json b/data/json/mapgen/house/bungalow16.json index 53962f9d0d944..dd68c5d2a5142 100644 --- a/data/json/mapgen/house/bungalow16.json +++ b/data/json/mapgen/house/bungalow16.json @@ -82,6 +82,7 @@ "c": { "item": "guns_pistol_common", "chance": 50 }, "(": { "item": "table_foyer", "chance": 50, "repeat": [ 1, 2 ] } }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 4, "y": 6, "chance": 100 } ] } }, diff --git a/data/json/mapgen/house/bungalow17.json b/data/json/mapgen/house/bungalow17.json index aa9d91ae39624..823d1270453e9 100644 --- a/data/json/mapgen/house/bungalow17.json +++ b/data/json/mapgen/house/bungalow17.json @@ -46,6 +46,7 @@ "&": "t_region_groundcover_urban", "Q": "t_floor_waxed" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "&": "f_boulder_large", "/": [ [ "f_null", 4 ], "f_ladder" ] } } }, diff --git a/data/json/mapgen/house/bungalow18.json b/data/json/mapgen/house/bungalow18.json index a68d6d8a86b89..627d19f5f6115 100644 --- a/data/json/mapgen/house/bungalow18.json +++ b/data/json/mapgen/house/bungalow18.json @@ -33,11 +33,14 @@ ".##oo#######oo#:¶:#####.", "...............---......" ], - "terrain": { "/": "t_linoleum_gray", "Z": "t_linoleum_gray", "W": "t_linoleum_gray" }, + "terrain": { "/": "t_linoleum_gray", "Z": "t_linoleum_gray", "W": "t_linoleum_gray", "#": "t_adobe_brick_wall" }, "furniture": { "&": "f_bookcase", "?": "f_rack" }, "items": { "?": { "item": "clothing_outdoor_shoes", "chance": 50, "repeat": [ 1, 3 ] } }, "place_loot": [ { "item": "television", "x": [ 4, 5 ], "y": 18 }, { "group": "SUS_cooking_bookcase", "x": 17, "y": 18 } ], - "place_vehicles": [ { "vehicle": "car", "x": 18, "y": 2, "chance": 15, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "car", "x": 18, "y": 2, "chance": 15, "rotation": 270 }, + { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } + ] } }, { diff --git a/data/json/mapgen/house/bungalow19.json b/data/json/mapgen/house/bungalow19.json index 6bc57a93f6978..26231065c95aa 100644 --- a/data/json/mapgen/house/bungalow19.json +++ b/data/json/mapgen/house/bungalow19.json @@ -68,6 +68,7 @@ "?": [ "f_indoor_plant", "f_indoor_plant_y" ], "/": "f_rack" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 4, "y": 1, "chance": 80, "status": 0 } ], "items": { "$": { "item": "table_foyer", "chance": 50, "repeat": [ 2, 3 ] }, "/": { "item": "clothing_outdoor_shoes", "chance": 50, "repeat": [ 2, 3 ] } diff --git a/data/json/mapgen/house/bungalow20.json b/data/json/mapgen/house/bungalow20.json index 346000f140071..bbddadaffb4c5 100644 --- a/data/json/mapgen/house/bungalow20.json +++ b/data/json/mapgen/house/bungalow20.json @@ -50,6 +50,7 @@ "=": "t_carpet_red", "L": "t_carpet_red" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "£": "f_exercise", "$": "f_treadmill", "?": "f_bookcase" }, "place_loot": [ { "item": "television", "x": 10, "y": 3 }, { "group": "SUS_cooking_bookcase", "x": 16, "y": 8 } ] } diff --git a/data/json/mapgen/house/bungalow21.json b/data/json/mapgen/house/bungalow21.json index 9583588a2eddb..194d207856673 100644 --- a/data/json/mapgen/house/bungalow21.json +++ b/data/json/mapgen/house/bungalow21.json @@ -55,7 +55,10 @@ { "item": "backpack", "x": 7, "y": 5, "chance": 60 }, { "item": "talking_doll", "x": 5, "y": 8, "chance": 60 } ], - "place_vehicles": [ { "vehicle": "car", "x": 19, "y": 7, "chance": 30, "rotation": 90 } ] + "place_vehicles": [ + { "vehicle": "car", "x": 19, "y": 7, "chance": 30, "rotation": 90 }, + { "vehicle": "rolling_trash_can", "x": 8, "y": 1, "chance": 80, "status": 0 } + ] } }, { diff --git a/data/json/mapgen/house/bungalow22.json b/data/json/mapgen/house/bungalow22.json index 16a0ef351872d..7eda70b079fb5 100644 --- a/data/json/mapgen/house/bungalow22.json +++ b/data/json/mapgen/house/bungalow22.json @@ -63,6 +63,7 @@ "(": { "item": "clothing_outdoor_shoes", "chance": 50, "repeat": [ 1, 2 ] }, "?": { "item": "table_foyer", "chance": 60 } }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 9, "y": 1, "chance": 80, "status": 0 } ], "vehicles": { "&": { "vehicle": "swivel_chair", "chance": 100, "status": 1 } }, "place_loot": [ { "item": "2x4", "x": 5, "y": 10, "chance": 80, "repeat": [ 2, 3 ] }, diff --git a/data/json/mapgen/house/bungalow23.json b/data/json/mapgen/house/bungalow23.json new file mode 100644 index 0000000000000..9c0452166c8b7 --- /dev/null +++ b/data/json/mapgen/house/bungalow23.json @@ -0,0 +1,110 @@ +[ + { + "type": "mapgen", + "om_terrain": "bungalow23", + "method": "json", + "object": { + "palettes": [ + "standard_domestic_palette", + "standard_domestic_lino_kitchen", + "standard_domestic_lino_bathroom", + "standard_domestic_landscaping_palette" + ], + "fill_ter": "t_floor", + "rows": [ + "...---p...............[.", + "...---###oo#####^....ʭ..", + ".00---#y¤@@¤ |D###oo###.", + ".0#o*o#d @@ + |d II P#.", + ".0#& |d |||d h ¤#.", + ".0#~ L| b y|z+ @@#.", + "..o |+||||||D|T @@#.", + "..o xxRRR||||+||||#.", + "..#$sE +__o.", + "..#s]]]]] VV ~y |ZW#.", + "..#H]]l]] ||+||| |||#.", + "..#H]]l]] a|S__B| +Q#.", + "..#H]]l]] a|88tB|+|||#.", + "..os]]]]] |||||| bdd#.", + "..o$sE 1O523| ¤#.", + "..#y 4| @@o.", + "..#?A yyy JJJ F| @@o.", + "..###o*o## 6|D ¤#.", + "..`,,,,,i#y h h 6||+||#.", + ".-,,,,,,io fff |___8#.", + ".-,₸,₸,,i# hfffh |9St8#.", + "..```````###o#o####o###.", + ".[..u.....^.............", + "........................" + ], + "terrain": { + "_": "t_linoleum_gray", + ",": "t_floor_noroof", + "6": "t_null", + "F": "t_null", + "4": "t_null", + "3": "t_null", + "2": "t_null", + "5": "t_null", + "O": "t_null", + "1": "t_null", + "J": "t_null", + "0": "t_shrub_lilac", + "`": "t_railing_v", + "]": "t_carpet_purple", + "i": "t_floor_noroof", + "W": "t_linoleum_gray", + "Z": "t_linoleum_gray", + "₸": "t_floor_noroof", + "l": "t_carpet_purple", + "Q": "t_null", + "ʭ": "t_region_groundcover_urban" + }, + "furniture": { + "~": "f_table", + "$": "f_speaker_cabinet", + "?": "f_piano", + "&": "f_rack", + "ʭ": [ [ "f_ladder", 1 ], [ "f_null", 5 ] ] + }, + "items": { "~": { "item": "table_foyer", "chance": 50 }, "&": { "item": "clothing_outdoor_shoes", "chance": 50 } }, + "place_loot": [ { "item": "stereo", "x": 9, "y": 7, "chance": 100 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "bungalow23_roof", + "method": "json", + "object": { + "palettes": [ "roof_palette" ], + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ---------- ", + " -........-5------ ", + " -----...............- ", + " -...................- ", + " -...................- ", + " -...................- ", + " -...................- ", + " -...................- ", + " -...................- ", + " -.............A.....- ", + " -........~..........- ", + " -........~..........- ", + " -...................- ", + " -...................- ", + " -...................- ", + " -............=......- ", + " --------............- ", + " -............- ", + " -............- ", + " -............- ", + " -5------------ ", + " ", + " " + ], + "terrain": { ".": "t_shingle_flat_roof" } + } + } +] diff --git a/data/json/mapgen/house/bungalow24.json b/data/json/mapgen/house/bungalow24.json new file mode 100644 index 0000000000000..645d53654bbda --- /dev/null +++ b/data/json/mapgen/house/bungalow24.json @@ -0,0 +1,101 @@ +[ + { + "type": "mapgen", + "om_terrain": "bungalow24", + "method": "json", + "object": { + "palettes": [ + "standard_domestic_palette", + "standard_domestic_lino_kitchen", + "standard_domestic_lino_bathroom", + "standard_domestic_landscaping_palette" + ], + "fill_ter": "t_floor", + "rows": [ + "....---------p..........", + "..###oo###---%.[.....[..", + "..# ¤@@¤y#---%..........", + "..o @@ #o*#^%%%%##o##.", + "..o |L ##ooo##NNq#.", + ".%# T |$ ,sHHHs| h #.", + ".%#Ddd||+| ,,,,,,| o.", + ".##||||R ,,lll,| qq#.", + ".#88ZW|R ,,,,,,|+||#.", + ".oS___+ ,,xxx,, R#.", + ".#t_BB| VV ||||||| R#.", + ".##||||+||| 662FJJ|``r#.", + ".%# Ddy |U+ _____O|`!ro.", + ".%o@ |z+ Y13754|``ro.", + ".%o@ I||| A y P#.", + "..#¤ hI|y h P#.", + "..######| hff ||+|||##.", + "....-==¶ ffh|y dd #^.", + "....-==: y h y| ¤#%.", + "....-==###oooo## @@o%.", + ".u..-===== * @@o%.", + "....-===== iiii#Db ¤#%.", + ".[..-=₸=₸=&????###o###%.", + "........................" + ], + "terrain": { + "~": "t_door_glass_c", + "_": "t_linoleum_gray", + "?": "t_railing_v", + "=": "t_floor_noroof", + ",": "t_carpet_red", + "`": "t_carpet_purple", + "!": "t_carpet_purple", + "Y": "t_linoleum_gray", + "r": "t_carpet_purple", + "₸": "t_floor_noroof", + "&": "t_column", + "W": "t_linoleum_gray", + "Z": "t_linoleum_gray", + "l": "t_carpet_red", + "x": "t_carpet_red", + "H": "t_carpet_red", + "s": "t_carpet_red" + }, + "furniture": { "!": "f_chair", "$": "f_table" }, + "items": { "$": { "item": "table_foyer", "chance": 50, "repeat": [ 1, 2 ] } }, + "place_loot": [ { "item": "television", "x": 15, "y": 9 }, { "item": "laptop", "x": 21, "y": 12 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "bungalow24_roof", + "method": "json", + "object": { + "palettes": [ "roof_palette" ], + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " -------- ", + " -......- ", + " -......---- ----- ", + " -.........-5-----...- ", + " -...................- ", + " -...................- ", + " --...................- ", + " -....................- ", + " -..............YYY...- ", + " -..............YYY...- ", + " --.....X.......YYY...- ", + " -.............YYY...- ", + " -...................- ", + " -...................- ", + " -...................- ", + " ------........=....-- ", + " -.............5 ", + " -.............- ", + " ----..........- ", + " -..........- ", + " -..........- ", + " ------------ ", + " " + ], + "terrain": { ".": "t_shingle_flat_roof" }, + "furniture": { "Y": "f_solar_unit" } + } + } +] diff --git a/data/json/mapgen/house/bungalow25.json b/data/json/mapgen/house/bungalow25.json new file mode 100644 index 0000000000000..c0c51c538ce1a --- /dev/null +++ b/data/json/mapgen/house/bungalow25.json @@ -0,0 +1,105 @@ +[ + { + "type": "mapgen", + "om_terrain": "bungalow25", + "weight": 250, + "method": "json", + "object": { + "palettes": [ + "standard_domestic_palette", + "standard_domestic_lino_kitchen", + "standard_domestic_lino_bathroom", + "standard_domestic_landscaping_palette" + ], + "fill_ter": "t_floor", + "rows": [ + ".?---------p............", + ".#{{{{{##*o###%%^##o##..", + ".#-----|$ L|q#%%##8_t#..", + ".#-----|R b|+#oo#Q__So%.", + ".#-----|R +__BB#%.", + ".#-----|R ||+|||||||#..", + ".#-----|R y|b zz|D dd#..", + ".#-----+ V| | ¤#..", + ".#-----| V|& /| @@o%.", + ".#|||||| |||||| @@o%.", + ".#1_4_y + ¤#..", + ".o5_7_ s`l`H|+|#oo##..", + ".oO_JA x`l`H| Z#=,,(..", + ".#F_J_ s`l`H| Wo=,,(..", + "^#3___ ```T|UU#=,,(..", + ".#2_66 E |####,,G(..", + ".#|||| y#,,,,,K(..", + ".#v d|+| `h`` ¶,,,,,K(..", + ".#|+|| | hffh o,,,,,G(..", + ".# | `ff` #((,,(((..", + ".# @@ | hffh #%........", + ".#¤@@¤D|y``h`y#%........", + ".##oo#####oo###%........", + "........................" + ], + "terrain": { + "_": "t_linoleum_gray", + "A": "t_linoleum_gray", + "-": "t_concrete", + ",": "t_floor_noroof", + "0": [ [ "t_shrub", 2 ], "t_shrub_strawberry", "t_shrub_blueberry" ], + "(": "t_railing_v", + "{": "t_door_metal_locked", + "?": "t_gates_mech_control", + "`": "t_carpet_green", + "h": "t_carpet_green", + "f": "t_carpet_green", + "T": "t_carpet_green", + "H": "t_carpet_green", + "l": "t_carpet_green", + "K": "t_floor_noroof", + "G": "t_floor_noroof" + }, + "furniture": { "$": "f_rack", "&": "f_ergometer", "/": "f_treadmill", "=": "f_rack" }, + "items": { + "=": [ { "item": "sports", "chance": 30 }, { "item": "camping", "chance": 30 } ], + "$": { "item": "clothing_outdoor_shoes", "chance": 50 } + }, + "place_loot": [ { "item": "television", "x": 9, "y": 12 } ], + "place_vehicles": [ { "vehicle": "car", "x": 4, "y": 5, "chance": 15, "status": 80, "rotation": 90 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "bungalow25_roof", + "weight": 250, + "method": "json", + "object": { + "palettes": [ "roof_palette" ], + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ------------- ----- ", + " -...........- 5-...- ", + " -...........----....- ", + " -...................- ", + " -...................- ", + " -...................- ", + " -....X..............- ", + " -...................- ", + " -...................- ", + " -...................- ", + " -...............----- ", + " -.&.............- ", + " -...............- ", + " 5...............- ", + " -............---- ", + " -............- ", + " -.......oooo.- ", + " -.......oooo.- ", + " -.......oooo.- ", + " -.......oooo.- ", + " -............- ", + " -------------- ", + " " + ], + "terrain": { ".": "t_shingle_flat_roof" } + } + } +] diff --git a/data/json/mapgen/house/crack_house.json b/data/json/mapgen/house/crack_house.json index 7719626a89bd9..6a3a4fc756bae 100644 --- a/data/json/mapgen/house/crack_house.json +++ b/data/json/mapgen/house/crack_house.json @@ -58,6 +58,7 @@ "_": "t_region_soil", ";": "t_chainfence_posts" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 50, "status": -1 } ], "furniture": { "&": "f_wreckage", "=": "f_toilet", "{": "f_dumpster", "?": "f_beaded_door", "!": "f_region_flower" }, "place_items": [ { "chance": 35, "item": "harddrugs", "x": 9, "y": 6 }, @@ -247,6 +248,7 @@ "{": "t_region_groundcover_urban", "W": "t_region_groundcover_urban", "&": "t_region_groundcover_urban", + "#": "t_adobe_brick_wall", "`": "t_concrete", "F": "t_linoleum_white", "J": "t_linoleum_white", diff --git a/data/json/mapgen/house/garden_house_1.json b/data/json/mapgen/house/garden_house_1.json index 52db2469b1687..410602556fb61 100644 --- a/data/json/mapgen/house/garden_house_1.json +++ b/data/json/mapgen/house/garden_house_1.json @@ -72,6 +72,7 @@ "7": "f_cupboard", "8": "f_counter" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 10, "y": 2, "chance": 80, "status": 0 } ], "items": { "c": { "item": "kitchen_counters", "chance": 10 }, "1": [ { "item": "SUS_dishes", "chance": 100 }, { "item": "SUS_silverware", "chance": 100 } ], diff --git a/data/json/mapgen/house/house01.json b/data/json/mapgen/house/house01.json index 3566fe043c1f6..90fca4c01b71d 100644 --- a/data/json/mapgen/house/house01.json +++ b/data/json/mapgen/house/house01.json @@ -41,6 +41,7 @@ "`": "t_concrete", "$": "t_privacy_fence", ";": "t_privacy_fencegate_c", + "#": "t_wall_wood", "-": "t_linoleum_white", "Q": "t_linoleum_white", "8": "t_linoleum_white", @@ -54,6 +55,7 @@ "A": "t_thconc_floor", "~": "t_thconc_floor" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" }, "place_loot": [ { "item": "television", "x": 11, "y": 9 }, { "item": "stereo", "x": 10, "y": 9 } ], "place_nested": [ diff --git a/data/json/mapgen/house/house02.json b/data/json/mapgen/house/house02.json index a105f69c3a19a..c01a553c12f1d 100644 --- a/data/json/mapgen/house/house02.json +++ b/data/json/mapgen/house/house02.json @@ -43,6 +43,7 @@ ";": "t_fencegate_c", "/": "t_screened_porch_wall", "=": "t_screen_door_c", + "#": "t_wall_wood", "-": "t_linoleum_white", "Q": "t_linoleum_white", "8": "t_linoleum_white", @@ -55,6 +56,7 @@ "K": "t_thconc_floor", "~": "t_thconc_floor" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" }, "place_loot": [ { "item": "television", "x": 11, "y": 9 }, { "item": "stereo", "x": 10, "y": 9 } ], "place_nested": [ diff --git a/data/json/mapgen/house/house03.json b/data/json/mapgen/house/house03.json index c6fca863b5f9f..e157e42ddacc7 100644 --- a/data/json/mapgen/house/house03.json +++ b/data/json/mapgen/house/house03.json @@ -50,6 +50,7 @@ "k": "t_thconc_floor", "~": "t_thconc_floor" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" }, "place_items": [ { "item": "stash_wood", "x": 12, "y": 11, "chance": 100, "repeat": [ 2, 6 ] } ], "place_nested": [ diff --git a/data/json/mapgen/house/house04.json b/data/json/mapgen/house/house04.json index 7cbf98a031d9b..0d1b06b57519a 100644 --- a/data/json/mapgen/house/house04.json +++ b/data/json/mapgen/house/house04.json @@ -39,6 +39,7 @@ { "point": "terrain", "id": "t_tree_young", "x": [ 0, 14 ], "y": 0, "chance": 5 }, { "point": "terrain", "id": "t_tree_apple", "x": [ 0, 14 ], "y": 0, "chance": 10, "repeat": [ 1, 2 ] } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "group": "cleaning", "x": 13, "y": 6, "chance": 90, "repeat": [ 1, 2 ] }, { "group": "guns_pistol_common", "x": 2, "y": 13, "chance": 5, "ammo": 90, "magazine": 100 }, diff --git a/data/json/mapgen/house/house05.json b/data/json/mapgen/house/house05.json index 988d09999f87d..c4a0b764e32ea 100644 --- a/data/json/mapgen/house/house05.json +++ b/data/json/mapgen/house/house05.json @@ -33,6 +33,7 @@ "...........^............" ], "palettes": [ "domestic_general_and_variant_palette" ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "group": "guns_pistol_common", "x": 2, "y": 13, "chance": 5, "ammo": 90, "magazine": 100 }, { "item": "television", "x": 2, "y": 3, "chance": 85 }, diff --git a/data/json/mapgen/house/house06.json b/data/json/mapgen/house/house06.json index 0a095c712df9c..e71ccf890cd2b 100644 --- a/data/json/mapgen/house/house06.json +++ b/data/json/mapgen/house/house06.json @@ -35,6 +35,7 @@ "palettes": [ "domestic_general_and_variant_palette" ], "set": [ { "point": "terrain", "id": "t_tree_apple", "x": [ 0, 14 ], "y": [ 0, 0 ], "chance": 40, "repeat": [ 1, 2 ] } ], "terrain": { "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ] }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "group": "livingroom", "x": [ 1, 10 ], "y": [ 8, 13 ], "chance": 90, "repeat": [ 1, 5 ] }, { "group": "consumer_electronics", "x": [ 1, 6 ], "y": [ 15, 21 ], "chance": 50, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house07.json b/data/json/mapgen/house/house07.json index d7e33cac62ad0..1c8f3ffc5237b 100644 --- a/data/json/mapgen/house/house07.json +++ b/data/json/mapgen/house/house07.json @@ -35,9 +35,11 @@ "palettes": [ "domestic_general_and_variant_palette" ], "set": [ { "point": "terrain", "id": "t_tree_apple", "x": [ 0, 14 ], "y": [ 0, 0 ], "chance": 40, "repeat": [ 1, 2 ] } ], "terrain": { + "#": "t_rock_wall", "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "$": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ] }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "group": "livingroom", "x": [ 1, 10 ], "y": [ 1, 13 ], "chance": 90, "repeat": [ 1, 5 ] } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ] } diff --git a/data/json/mapgen/house/house08.json b/data/json/mapgen/house/house08.json index bd6b9d556f407..4b317b09d6f35 100644 --- a/data/json/mapgen/house/house08.json +++ b/data/json/mapgen/house/house08.json @@ -42,6 +42,7 @@ { "point": "terrain", "id": "t_tree", "x": [ 2, 11 ], "y": [ 16, 21 ], "repeat": [ 2, 6 ] }, { "point": "terrain", "id": "t_tree_young", "x": [ 2, 11 ], "y": [ 16, 21 ], "repeat": [ 3, 5 ] } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "group": "guns_pistol_common", "x": 4, "y": 10, "chance": 10, "ammo": 90, "magazine": 100 } ], "place_nested": [ { diff --git a/data/json/mapgen/house/house09.json b/data/json/mapgen/house/house09.json index 4f1dd2b183a64..7439387d46385 100644 --- a/data/json/mapgen/house/house09.json +++ b/data/json/mapgen/house/house09.json @@ -34,7 +34,8 @@ "...................^...." ], "palettes": [ "domestic_general_and_variant_palette" ], - "terrain": { "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ] }, + "terrain": { "#": "t_adobe_brick_wall", "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ] }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 }, { "monster": "GROUP_PLAGUE_ROACH", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 6 }, diff --git a/data/json/mapgen/house/house10.json b/data/json/mapgen/house/house10.json index 1993fe4ddd466..a08e14f15e42c 100644 --- a/data/json/mapgen/house/house10.json +++ b/data/json/mapgen/house/house10.json @@ -33,11 +33,12 @@ "........................" ], "palettes": [ "domestic_general_and_variant_palette" ], - "terrain": { "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ] }, + "terrain": { "#": "t_adobe_brick_wall", "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ] }, "place_loot": [ { "group": "guns_pistol_common", "x": [ 20, 20 ], "y": [ 8, 8 ], "chance": 4, "ammo": 90, "magazine": 100 }, { "group": "guns_pistol_common", "x": [ 18, 18 ], "y": [ 20, 20 ], "chance": 3, "ammo": 90, "magazine": 100 } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ] } }, diff --git a/data/json/mapgen/house/house11.json b/data/json/mapgen/house/house11.json index a14d672a8a440..26227a872ca8e 100644 --- a/data/json/mapgen/house/house11.json +++ b/data/json/mapgen/house/house11.json @@ -39,6 +39,7 @@ "!": "t_wall_glass", "_": "t_pavement", "&": "t_gates_control_brick", + "#": "t_brick_wall", "$": "t_fence", "G": "t_sidewalk", "K": "t_sidewalk", @@ -51,7 +52,10 @@ { "group": "guns_pistol_common", "x": [ 3, 3 ], "y": [ 8, 8 ], "chance": 5, "ammo": 90, "magazine": 100 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 17, "y": 10, "chance": 15, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 5, "y": 2, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 17, "y": 10, "chance": 15, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/house12.json b/data/json/mapgen/house/house12.json index 63e7b7fb80e2b..891a0622ead29 100644 --- a/data/json/mapgen/house/house12.json +++ b/data/json/mapgen/house/house12.json @@ -34,6 +34,7 @@ ], "palettes": [ "domestic_general_and_variant_palette" ], "terrain": { "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "$": "t_fence" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "group": "livingroom", "x": [ 3, 7 ], "y": [ 13, 19 ], "chance": 90, "repeat": [ 1, 4 ] } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 10 } ] } diff --git a/data/json/mapgen/house/house13.json b/data/json/mapgen/house/house13.json index bf112f7877f83..7eec46f22099e 100644 --- a/data/json/mapgen/house/house13.json +++ b/data/json/mapgen/house/house13.json @@ -42,6 +42,7 @@ "j": "t_concrete" }, "place_loot": [ { "group": "livingroom", "x": [ 2, 8 ], "y": [ 10, 14 ], "chance": 90, "repeat": [ 1, 6 ] } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 5 }, { "monster": "GROUP_PLAGUE_ROACH", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 5 }, diff --git a/data/json/mapgen/house/house14.json b/data/json/mapgen/house/house14.json index 5cc08b623721f..a9919436a7c9c 100644 --- a/data/json/mapgen/house/house14.json +++ b/data/json/mapgen/house/house14.json @@ -38,6 +38,7 @@ "=": "t_door_metal_locked", "_": "t_pavement", "&": "t_gates_control_brick", + "#": "t_brick_wall", "$": "t_fence", "~": "t_thconc_floor", "q": "t_thconc_floor", @@ -46,7 +47,10 @@ "'": "t_concrete" }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 10 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 5, "y": 9, "chance": 10, "fuel": 30, "status": 0, "rotation": 90 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 5, "y": 9, "chance": 10, "fuel": 30, "status": 0, "rotation": 90 } + ] } }, { diff --git a/data/json/mapgen/house/house15.json b/data/json/mapgen/house/house15.json index 1821dd3f1ce1a..478c0268e8531 100644 --- a/data/json/mapgen/house/house15.json +++ b/data/json/mapgen/house/house15.json @@ -36,6 +36,7 @@ "terrain": { "%": "t_region_shrub_fruit", "!": "t_region_groundcover_urban", "'": "t_concrete" }, "furniture": { "!": "f_bluebell", "$": [ "f_treadmill", "f_treadmill_mechanical" ] }, "place_loot": [ { "group": "livingroom", "x": [ 7, 16 ], "y": [ 7, 9 ], "chance": 90, "repeat": [ 1, 6 ] } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 1, 22 ], "y": [ 2, 21 ], "chance": 5 } ] } }, diff --git a/data/json/mapgen/house/house16.json b/data/json/mapgen/house/house16.json index b908666cb9954..0c493d187aaa4 100644 --- a/data/json/mapgen/house/house16.json +++ b/data/json/mapgen/house/house16.json @@ -33,7 +33,8 @@ "........................" ], "palettes": [ "domestic_general_and_variant_palette" ], - "terrain": { "%": "t_region_shrub_decorative" }, + "terrain": { "%": "t_region_shrub_decorative", "#": "t_rock_wall" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 8, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 5 } ] } }, diff --git a/data/json/mapgen/house/house17.json b/data/json/mapgen/house/house17.json index 1e6df34f3f145..256105ee9590b 100644 --- a/data/json/mapgen/house/house17.json +++ b/data/json/mapgen/house/house17.json @@ -33,7 +33,8 @@ "........................" ], "palettes": [ "domestic_general_and_variant_palette" ], - "terrain": { "%": "t_region_shrub_decorative" }, + "terrain": { "%": "t_region_shrub_decorative", "#": "t_adobe_brick_wall" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 6 } ] } }, diff --git a/data/json/mapgen/house/house18.json b/data/json/mapgen/house/house18.json index 1165f0f5bd032..4874a2e4eab9b 100644 --- a/data/json/mapgen/house/house18.json +++ b/data/json/mapgen/house/house18.json @@ -34,6 +34,7 @@ ], "palettes": [ "domestic_general_and_variant_palette" ], "terrain": { + "#": "t_adobe_brick_wall", "p": "t_sidewalk", "X": "t_sidewalk", "B": "t_linoleum_gray", @@ -42,6 +43,7 @@ "t": "t_linoleum_gray" }, "place_loot": [ { "item": "television", "x": 4, "y": 2, "chance": 70 }, { "item": "television", "x": 15, "y": 7, "chance": 70 } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 8 } ] } }, diff --git a/data/json/mapgen/house/house19.json b/data/json/mapgen/house/house19.json index cc6517f04eb71..2492db13e7856 100644 --- a/data/json/mapgen/house/house19.json +++ b/data/json/mapgen/house/house19.json @@ -34,6 +34,7 @@ ], "palettes": [ "domestic_general_and_variant_palette" ], "terrain": { + "#": "t_rock_wall", "%": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "B": "t_linoleum_gray", "S": "t_linoleum_gray", @@ -46,6 +47,7 @@ { "group": "guns_pistol_common", "x": [ 15, 15 ], "y": [ 7, 8 ], "chance": 5, "ammo": 95, "magazine": 100 }, { "item": "television", "x": [ 4, 4 ], "y": [ 16, 17 ], "chance": 75 } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 2, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 6 } ] } }, diff --git a/data/json/mapgen/house/house20.json b/data/json/mapgen/house/house20.json index 330d02c47d218..e1369275b1277 100644 --- a/data/json/mapgen/house/house20.json +++ b/data/json/mapgen/house/house20.json @@ -38,6 +38,7 @@ "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", + "#": "t_wall_wood", "`": "t_concrete", "K": "t_concrete", "G": "t_concrete", @@ -54,6 +55,7 @@ "N": "t_thconc_floor", "~": "t_thconc_floor" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" } } }, diff --git a/data/json/mapgen/house/house21.json b/data/json/mapgen/house/house21.json index 0d5e62c822f16..18ed9b8a18589 100644 --- a/data/json/mapgen/house/house21.json +++ b/data/json/mapgen/house/house21.json @@ -34,6 +34,7 @@ "palettes": [ "domestic_general_and_variant_palette", "standard_domestic_lino_bathroom", "standard_domestic_landscaping_palette" ], "terrain": { "j": "t_concrete", "'": "t_linoleum_gray", "~": "t_thconc_floor" }, "place_item": [ { "item": "stereo", "x": 4, "y": 11, "chance": 100 } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_nested": [ { "chunks": [ [ "null", 25 ], [ "playset_4x4_2", 25 ], [ "firepit_5x5_1", 25 ], [ "firepit_5x5_2", 25 ], [ "playset_4x4_1", 25 ] ], diff --git a/data/json/mapgen/house/house22.json b/data/json/mapgen/house/house22.json index 90eb3dfb86e2b..2b7bd510f8057 100644 --- a/data/json/mapgen/house/house22.json +++ b/data/json/mapgen/house/house22.json @@ -49,7 +49,8 @@ "b": "t_linoleum_white", "t": "t_linoleum_white" }, - "furniture": { "!": "f_region_flower" } + "furniture": { "!": "f_region_flower" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ] } }, { diff --git a/data/json/mapgen/house/house23.json b/data/json/mapgen/house/house23.json index 2eb161b773246..344f9bd324aa8 100644 --- a/data/json/mapgen/house/house23.json +++ b/data/json/mapgen/house/house23.json @@ -33,6 +33,7 @@ ], "palettes": [ "domestic_general_and_variant_palette", "standard_domestic_lino_bathroom", "standard_domestic_landscaping_palette" ], "terrain": { "'": "t_linoleum_gray", "$": "t_screened_porch_wall", "=": "t_screen_door_c" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_item": [ { "item": "stereo", "x": 4, "y": 10, "chance": 100 }, { "item": "television", "x": 5, "y": 10, "chance": 100 } ], "place_nested": [ { diff --git a/data/json/mapgen/house/house24.json b/data/json/mapgen/house/house24.json index 1f0168235eacd..df880e089b301 100644 --- a/data/json/mapgen/house/house24.json +++ b/data/json/mapgen/house/house24.json @@ -39,6 +39,7 @@ "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", "`": "t_concrete", + "#": "t_adobe_brick_wall", "-": "t_linoleum_white", "Q": "t_linoleum_white", "8": "t_linoleum_white", @@ -53,6 +54,7 @@ "~": "t_thconc_floor" }, "furniture": { "!": "f_region_flower" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 } ], "place_item": [ { "item": "stereo", "x": 15, "y": 20, "chance": 100 }, { "item": "television", "x": 10, "y": 15, "chance": 100 } ] } }, diff --git a/data/json/mapgen/house/house25.json b/data/json/mapgen/house/house25.json index 539eb4b435464..47f6bcbfdd4fa 100644 --- a/data/json/mapgen/house/house25.json +++ b/data/json/mapgen/house/house25.json @@ -39,8 +39,10 @@ "_": "t_window_boarded", "=": "t_door_metal_c_peep", "/": "t_door_boarded_peep", - ",": "t_thconc_floor" + ",": "t_thconc_floor", + "#": "t_wall_log" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "%": "f_safe_o" }, "place_items": [ { "chance": 10, "item": "ammo_rifle_common", "x": 9, "y": 17 }, diff --git a/data/json/mapgen/house/house26.json b/data/json/mapgen/house/house26.json index 51671476353a4..e827c01121903 100644 --- a/data/json/mapgen/house/house26.json +++ b/data/json/mapgen/house/house26.json @@ -48,6 +48,7 @@ "9": "t_linoleum_white", "t": "t_linoleum_white" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" } } }, diff --git a/data/json/mapgen/house/house27.json b/data/json/mapgen/house/house27.json index 01639fb84298f..af4e38e88b3fd 100644 --- a/data/json/mapgen/house/house27.json +++ b/data/json/mapgen/house/house27.json @@ -48,7 +48,8 @@ "9": "t_linoleum_white", "t": "t_linoleum_white" }, - "furniture": { "!": "f_region_flower" } + "furniture": { "!": "f_region_flower" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ] } }, { diff --git a/data/json/mapgen/house/house28.json b/data/json/mapgen/house/house28.json index 8e0980a68bf99..2a4a77a729409 100644 --- a/data/json/mapgen/house/house28.json +++ b/data/json/mapgen/house/house28.json @@ -51,7 +51,8 @@ "9": "t_linoleum_white", "t": "t_linoleum_white" }, - "furniture": { "!": "f_region_flower" } + "furniture": { "!": "f_region_flower" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 15, "y": 1, "chance": 80, "status": 0 } ] } }, { diff --git a/data/json/mapgen/house/house29.json b/data/json/mapgen/house/house29.json index 3bf9a5a731ff1..7f3f06ffe511e 100644 --- a/data/json/mapgen/house/house29.json +++ b/data/json/mapgen/house/house29.json @@ -51,7 +51,8 @@ "9": "t_linoleum_white", "t": "t_linoleum_white" }, - "furniture": { "!": "f_region_flower" } + "furniture": { "!": "f_region_flower" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 8, "y": 1, "chance": 80, "status": 0 } ] } }, { diff --git a/data/json/mapgen/house/house30.json b/data/json/mapgen/house/house30.json index 6772ff81bf9eb..7c6fba7f42c28 100644 --- a/data/json/mapgen/house/house30.json +++ b/data/json/mapgen/house/house30.json @@ -47,7 +47,8 @@ "9": "t_linoleum_white", "t": "t_linoleum_white" }, - "furniture": { "!": "f_region_flower" } + "furniture": { "!": "f_region_flower" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 8, "y": 1, "chance": 80, "status": 0 } ] } }, { diff --git a/data/json/mapgen/house/house31.json b/data/json/mapgen/house/house31.json index 9b7fa7aeb7d1f..8c3cbe531ac89 100644 --- a/data/json/mapgen/house/house31.json +++ b/data/json/mapgen/house/house31.json @@ -52,12 +52,14 @@ "t": "t_linoleum_white", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "U": "t_thconc_floor", "q": "t_thconc_floor", "N": "t_thconc_floor", "~": "t_thconc_floor" }, - "furniture": { "!": "f_region_flower" } + "furniture": { "!": "f_region_flower" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 10, "y": 1, "chance": 80, "status": 0 } ] } }, { diff --git a/data/json/mapgen/house/house32.json b/data/json/mapgen/house/house32.json index 202a04e86c641..c0cc0cd1aa77c 100644 --- a/data/json/mapgen/house/house32.json +++ b/data/json/mapgen/house/house32.json @@ -41,7 +41,8 @@ "q": "t_thconc_floor", "N": "t_thconc_floor", "~": "t_thconc_floor" - } + }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 17, "y": 1, "chance": 80, "status": 0 } ] } }, { diff --git a/data/json/mapgen/house/house33.json b/data/json/mapgen/house/house33.json index 43d3e6c2253cd..c031181d0b86f 100644 --- a/data/json/mapgen/house/house33.json +++ b/data/json/mapgen/house/house33.json @@ -37,6 +37,7 @@ "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "~": "t_thconc_floor", "A": "t_thconc_floor", "N": "t_thconc_floor", @@ -67,7 +68,8 @@ ], "place_vehicles": [ { "vehicle": "car", "x": 4, "y": 4, "chance": 35, "rotation": 270 }, - { "vehicle": "tricycle", "x": 6, "y": 22, "chance": 40, "status": 0 } + { "vehicle": "tricycle", "x": 6, "y": 22, "chance": 40, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 22, "y": 1, "chance": 80, "status": 0 } ] } }, diff --git a/data/json/mapgen/house/house34.json b/data/json/mapgen/house/house34.json index 48a33fe1ad1f3..0f795ec3951db 100644 --- a/data/json/mapgen/house/house34.json +++ b/data/json/mapgen/house/house34.json @@ -38,6 +38,7 @@ "!": "t_region_groundcover_urban", "$": "t_screened_porch_wall", "=": "t_screen_door_c", + "#": "t_adobe_brick_wall", ";": "t_carpet_green", "~": "t_thconc_floor", "A": "t_thconc_floor", @@ -64,6 +65,7 @@ "t": "t_linoleum_white" }, "furniture": { "!": "f_region_flower", ":": [ "f_indoor_plant", "f_indoor_plant_y" ] }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "hose", "x": 10, "y": 1 }, { "item": "television", "x": 16, "y": 3 }, diff --git a/data/json/mapgen/house/house35.json b/data/json/mapgen/house/house35.json index f3d712e81f786..98fc1e3c44fe0 100644 --- a/data/json/mapgen/house/house35.json +++ b/data/json/mapgen/house/house35.json @@ -50,6 +50,7 @@ "'": "t_linoleum_gray" }, "furniture": { ":": [ "f_indoor_plant", "f_indoor_plant_y" ] }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "hose", "x": 9, "y": 22 }, { "item": "television", "x": 16, "y": 14 }, diff --git a/data/json/mapgen/house/house36.json b/data/json/mapgen/house/house36.json index 15982fdb4148b..be6970703d162 100644 --- a/data/json/mapgen/house/house36.json +++ b/data/json/mapgen/house/house36.json @@ -38,6 +38,7 @@ "!": "t_region_groundcover_urban", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "~": "t_thconc_floor", "q": "t_thconc_floor", "U": "t_thconc_floor", @@ -69,6 +70,7 @@ ], "place_vehicles": [ { "vehicle": "car", "x": 3, "y": 14, "chance": 60, "rotation": 270 }, + { "vehicle": "rolling_trash_can", "x": 11, "y": 1, "chance": 80, "status": 0 }, { "vehicle": "tricycle", "x": 4, "y": 7, "chance": 40, "status": 0 } ] } diff --git a/data/json/mapgen/house/house37.json b/data/json/mapgen/house/house37.json index 96db92084b0ed..24f97ac63114f 100644 --- a/data/json/mapgen/house/house37.json +++ b/data/json/mapgen/house/house37.json @@ -38,6 +38,7 @@ "!": "t_region_groundcover_urban", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "~": "t_thconc_floor", "q": "t_thconc_floor", "U": "t_thconc_floor", @@ -72,7 +73,10 @@ { "item": "television", "x": 12, "y": 18 }, { "item": "stereo", "x": 13, "y": 18, "chance": 35 } ], - "place_vehicles": [ { "vehicle": "car", "x": 4, "y": 4, "chance": 35, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 11, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "car", "x": 4, "y": 4, "chance": 35, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/house38.json b/data/json/mapgen/house/house38.json index d0553b25aee29..2637059523c0c 100644 --- a/data/json/mapgen/house/house38.json +++ b/data/json/mapgen/house/house38.json @@ -58,7 +58,10 @@ { "item": "television", "x": 14, "y": 16 }, { "item": "stereo", "x": 14, "y": 18, "chance": 35 } ], - "place_vehicles": [ { "vehicle": "car", "x": 18, "y": 6, "chance": 35, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "car", "x": 18, "y": 6, "chance": 35, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/house39.json b/data/json/mapgen/house/house39.json index 959dc8004a7db..db8eab5f139b0 100644 --- a/data/json/mapgen/house/house39.json +++ b/data/json/mapgen/house/house39.json @@ -39,6 +39,7 @@ "]": "t_door_glass_c", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "~": "t_thconc_floor", "q": "t_thconc_floor", "U": "t_thconc_floor", @@ -67,7 +68,10 @@ }, "furniture": { "!": "f_region_flower", ":": [ "f_indoor_plant", "f_indoor_plant_y" ] }, "place_loot": [ { "item": "hose", "x": 19, "y": 18, "chance": 35 } ], - "place_vehicles": [ { "vehicle": "car", "x": 4, "y": 6, "chance": 35, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "car", "x": 4, "y": 6, "chance": 35, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/house40.json b/data/json/mapgen/house/house40.json index b094e11da8752..bf7d7d1c4af7a 100644 --- a/data/json/mapgen/house/house40.json +++ b/data/json/mapgen/house/house40.json @@ -44,7 +44,8 @@ "U": "t_linoleum_gray", "Z": "t_linoleum_gray", "W": "t_linoleum_gray" - } + }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 } ] } }, { diff --git a/data/json/mapgen/house/house41.json b/data/json/mapgen/house/house41.json index f3cd0a2eb70c7..01673cbc3a0cf 100644 --- a/data/json/mapgen/house/house41.json +++ b/data/json/mapgen/house/house41.json @@ -36,6 +36,7 @@ "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", + "#": "t_adobe_brick_wall", "`": "t_concrete", "K": "t_concrete", "G": "t_concrete", @@ -60,6 +61,7 @@ "furniture": { "!": "f_region_flower" }, "place_loot": [ { "item": "television", "x": 10, "y": 9 }, { "item": "television", "x": 18, "y": 12 } ], "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 }, { "vehicle": "car", "x": 8, "y": 3, "chance": 35, "rotation": 270 }, { "vehicle": "motorcycle_sidecart", "x": 14, "y": 2, "chance": 35, "rotation": 270 } ] diff --git a/data/json/mapgen/house/house42.json b/data/json/mapgen/house/house42.json index 46262e79b04c5..aa41669df0fc8 100644 --- a/data/json/mapgen/house/house42.json +++ b/data/json/mapgen/house/house42.json @@ -54,7 +54,10 @@ { "item": "television", "x": 16, "y": 5, "chance": 35 }, { "item": "stereo", "x": 16, "y": 6, "chance": 35 } ], - "place_vehicles": [ { "vehicle": "tricycle", "x": 13, "y": 14, "chance": 35, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "tricycle", "x": 13, "y": 14, "chance": 35, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/house_2story.json b/data/json/mapgen/house/house_2story.json index 350307163d2c5..5223f0aba74b1 100644 --- a/data/json/mapgen/house/house_2story.json +++ b/data/json/mapgen/house/house_2story.json @@ -37,6 +37,7 @@ "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", "`": "t_concrete", + "#": "t_adobe_brick_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "b": "t_linoleum_gray", @@ -47,6 +48,7 @@ "]": "t_wall_glass", ")": "t_door_glass_c" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" }, "place_loot": [ { "item": "stereo", "x": 12, "y": 19 } ] } @@ -86,6 +88,7 @@ "palettes": [ "domestic_general_and_variant_palette" ], "terrain": { "_": "t_open_air", + "#": "t_adobe_brick_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "Q": "t_linoleum_gray", diff --git a/data/json/mapgen/house/house_detatched1.json b/data/json/mapgen/house/house_detatched1.json index 111f8a0cccc6f..4c14e4729d3f3 100644 --- a/data/json/mapgen/house/house_detatched1.json +++ b/data/json/mapgen/house/house_detatched1.json @@ -56,6 +56,7 @@ ";": "t_privacy_fencegate_c", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "~": "t_thconc_floor", "A": "t_thconc_floor", "N": "t_thconc_floor", @@ -79,7 +80,10 @@ { "chance": 35, "item": "alcohol", "x": 10, "y": 13 } ], "place_monsters": [ { "chance": 5, "density": 1, "monster": "GROUP_ZOMBIE", "x": 7, "y": 10 } ], - "place_vehicles": [ { "vehicle": "bikeshop", "x": 19, "y": 14, "rotation": 270, "chance": 20 } ] + "place_vehicles": [ + { "vehicle": "bikeshop", "x": 19, "y": 14, "rotation": 270, "chance": 20 }, + { "vehicle": "rolling_trash_can", "x": 15, "y": 1, "chance": 80, "status": 0 } + ] } }, { diff --git a/data/json/mapgen/house/house_detatched10.json b/data/json/mapgen/house/house_detatched10.json index 7ea9b79880d1d..1d30c6590aba7 100644 --- a/data/json/mapgen/house/house_detatched10.json +++ b/data/json/mapgen/house/house_detatched10.json @@ -48,6 +48,7 @@ "/": "t_door_boarded_damaged", "=": "t_window_boarded_noglass" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "?": "f_beaded_door", "!": "f_region_flower" }, "place_item": [ { "item": "splinter", "repeat": 1, "x": 2, "y": 4 }, diff --git a/data/json/mapgen/house/house_detatched2.json b/data/json/mapgen/house/house_detatched2.json index 50f86d93bf721..4d9432380f7fa 100644 --- a/data/json/mapgen/house/house_detatched2.json +++ b/data/json/mapgen/house/house_detatched2.json @@ -33,12 +33,16 @@ "$$$$$$$$$$$$$$$$$$$$$$$$" ], "palettes": [ "domestic_general_and_variant_palette" ], - "place_vehicles": [ { "vehicle": "bikeshop", "x": 3, "y": 16, "rotation": 270, "chance": 100 } ], + "place_vehicles": [ + { "vehicle": "bikeshop", "x": 3, "y": 16, "rotation": 270, "chance": 100 }, + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } + ], "terrain": { "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", "`": "t_concrete", + "#": "t_adobe_brick_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "Q": "t_linoleum_gray", diff --git a/data/json/mapgen/house/house_detatched3.json b/data/json/mapgen/house/house_detatched3.json index c7968e96d18d5..0acd58351ee5c 100644 --- a/data/json/mapgen/house/house_detatched3.json +++ b/data/json/mapgen/house/house_detatched3.json @@ -38,6 +38,7 @@ "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", "`": "t_concrete", + "#": "t_rock_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "Q": "t_linoleum_gray", @@ -53,6 +54,7 @@ ")": "t_wall_glass", "]": "t_door_glass_c" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 6, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "?": "f_beaded_door", "!": "f_region_flower", "(": "f_chair" }, "place_item": [ { "item": "television", "repeat": 1, "x": 2, "y": 12 }, { "item": "lawnmower", "repeat": 1, "x": 7, "y": 20 } ], "place_items": [ diff --git a/data/json/mapgen/house/house_detatched4.json b/data/json/mapgen/house/house_detatched4.json index f095449b5ce62..7e3c53630211d 100644 --- a/data/json/mapgen/house/house_detatched4.json +++ b/data/json/mapgen/house/house_detatched4.json @@ -40,6 +40,7 @@ "`": "t_concrete", "K": "t_concrete", "G": "t_concrete", + "#": "t_rock_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "Q": "t_linoleum_gray", @@ -63,6 +64,7 @@ "=": "t_water_pool_outdoors", "/": "t_water_pool_shallow_outdoors" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "?": "f_beaded_door", "!": "f_region_flower" }, "place_item": [ { "item": "television", "repeat": 1, "x": 5, "y": 3 } ], "place_items": [ @@ -116,6 +118,7 @@ "`": "t_concrete", "K": "t_concrete", "G": "t_concrete", + "#": "t_rock_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "Q": "t_linoleum_gray", diff --git a/data/json/mapgen/house/house_detatched5.json b/data/json/mapgen/house/house_detatched5.json index ffe25a2080827..2d12213dfca5f 100644 --- a/data/json/mapgen/house/house_detatched5.json +++ b/data/json/mapgen/house/house_detatched5.json @@ -41,6 +41,7 @@ "K": "t_region_groundcover_urban", "G": "t_region_groundcover_urban", "`": "t_concrete", + "#": "t_rock_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "Q": "t_linoleum_gray", @@ -69,6 +70,7 @@ "]": "t_door_glass_c", "&": "t_sandbox" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "?": "f_beaded_door", "!": "f_region_flower", ",": "f_brazier", "(": "f_camp_chair" }, "place_item": [ { "item": "television", "repeat": 1, "x": 14, "y": 7 }, { "item": "lawnmower", "repeat": 1, "x": 12, "y": 12 } ], "place_items": [ diff --git a/data/json/mapgen/house/house_detatched6.json b/data/json/mapgen/house/house_detatched6.json index fb6a6c8e9e103..5a86ba9fb6226 100644 --- a/data/json/mapgen/house/house_detatched6.json +++ b/data/json/mapgen/house/house_detatched6.json @@ -45,6 +45,7 @@ "~": "t_dirtmoundfloor", "&": "t_dirtmound", "(": "t_region_soil", + "#": "t_adobe_brick_wall", "'": "t_linoleum_gray", "Ŧ": "t_privacy_fence", "ɤ": "t_privacy_fencegate_c", @@ -53,6 +54,7 @@ "*": "t_door_metal_pickable", "§": "t_region_groundcover_urban" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "?": "f_beaded_door", ",": "f_pinball_machine", "§": "f_wooden_flagpole" }, "place_item": [ { "item": "television", "repeat": 1, "x": 2, "y": 4 }, diff --git a/data/json/mapgen/house/house_detatched7.json b/data/json/mapgen/house/house_detatched7.json index 109bc4fa0dbc6..45f0e2508c8d8 100644 --- a/data/json/mapgen/house/house_detatched7.json +++ b/data/json/mapgen/house/house_detatched7.json @@ -54,6 +54,7 @@ "=": "t_screen_door_c", "&": "t_sandbox" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" }, "place_item": [ { "item": "television", "repeat": 1, "x": 7, "y": 8 }, diff --git a/data/json/mapgen/house/house_detatched8.json b/data/json/mapgen/house/house_detatched8.json index 2f0dad8155d35..41adb02ae4a94 100644 --- a/data/json/mapgen/house/house_detatched8.json +++ b/data/json/mapgen/house/house_detatched8.json @@ -52,6 +52,7 @@ ",": "t_door_metal_corrugated_c", ";": "t_privacy_fencegate_c" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 11, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" }, "place_item": [ { "item": "television", "repeat": 1, "x": 13, "y": 8 }, diff --git a/data/json/mapgen/house/house_detatched9.json b/data/json/mapgen/house/house_detatched9.json index 1e43b489bc9f8..7a8e1247adbc2 100644 --- a/data/json/mapgen/house/house_detatched9.json +++ b/data/json/mapgen/house/house_detatched9.json @@ -53,6 +53,7 @@ ")": "t_wall_glass", "]": "t_door_glass_c" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 7, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" }, "place_item": [ { "item": "cig_butt", "repeat": 1, "x": 9, "y": 8 }, diff --git a/data/json/mapgen/house/house_dogs.json b/data/json/mapgen/house/house_dogs.json index 6dfa31ee15849..e10db994454c8 100644 --- a/data/json/mapgen/house/house_dogs.json +++ b/data/json/mapgen/house/house_dogs.json @@ -47,6 +47,7 @@ ".ŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦŦ.", "........................" ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 6, "y": 1, "chance": 80, "status": 0 } ], "palettes": [ { "distribution": [ [ "standard_domestic_palette", 10 ], [ "standard_domestic_abandoned_palette", 2 ] ] }, "standard_domestic_landscaping_palette" diff --git a/data/json/mapgen/house/house_duplex.json b/data/json/mapgen/house/house_duplex.json index 97ffe9f27a110..64ff742689c13 100644 --- a/data/json/mapgen/house/house_duplex.json +++ b/data/json/mapgen/house/house_duplex.json @@ -45,6 +45,10 @@ "9": "t_linoleum_gray", "-": "t_linoleum_gray" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 6, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } + ], "furniture": { "!": "f_region_flower" }, "place_item": [ { "item": "television", "x": 9, "y": 7 }, { "item": "stereo", "x": 12, "y": 8 } ], "place_items": [ diff --git a/data/json/mapgen/house/house_duplex10.json b/data/json/mapgen/house/house_duplex10.json index 1dc8f74b8c9e3..4270e2fa2f4f7 100644 --- a/data/json/mapgen/house/house_duplex10.json +++ b/data/json/mapgen/house/house_duplex10.json @@ -42,6 +42,7 @@ "9": "t_linoleum_gray", "-": "t_linoleum_gray", "&": "t_gates_control_brick", + "#": "t_brick_wall", "~": "t_thconc_floor", "N": "t_thconc_floor", "q": "t_thconc_floor", @@ -51,7 +52,9 @@ "furniture": { "!": "f_region_flower" }, "place_vehicles": [ { "chance": 30, "fuel": 10, "rotation": 90, "status": -1, "vehicle": "car_sports", "x": 9, "y": 7 }, - { "chance": 35, "fuel": 10, "rotation": 90, "status": -1, "vehicle": "car", "x": 16, "y": 7 } + { "chance": 35, "fuel": 10, "rotation": 90, "status": -1, "vehicle": "car", "x": 16, "y": 7 }, + { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 21, "y": 1, "chance": 80, "status": 0 } ] }, "om_terrain": "house_duplex10", diff --git a/data/json/mapgen/house/house_duplex11.json b/data/json/mapgen/house/house_duplex11.json index 18186903330a2..4b85fe38008e4 100644 --- a/data/json/mapgen/house/house_duplex11.json +++ b/data/json/mapgen/house/house_duplex11.json @@ -38,6 +38,7 @@ "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", "`": "t_concrete", + "#": "t_adobe_brick_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "Q": "t_linoleum_gray", @@ -48,6 +49,10 @@ "=": "t_screen_door_c", "/": "t_water_pool_shallow" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 4, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 20, "y": 1, "chance": 80, "status": 0 } + ], "furniture": { "!": "f_region_flower" }, "place_loot": [ { "item": "television", "x": 8, "y": 6 }, diff --git a/data/json/mapgen/house/house_duplex2.json b/data/json/mapgen/house/house_duplex2.json index 3939381d4a3c7..6b66e654faf22 100644 --- a/data/json/mapgen/house/house_duplex2.json +++ b/data/json/mapgen/house/house_duplex2.json @@ -45,6 +45,10 @@ "9": "t_linoleum_gray", "-": "t_linoleum_gray" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 6, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } + ], "furniture": { "!": "f_region_flower" }, "place_item": [ { "item": "television", "repeat": 1, "x": 5, "y": 10 }, diff --git a/data/json/mapgen/house/house_duplex3.json b/data/json/mapgen/house/house_duplex3.json index b3213263c64d1..59f7882c79655 100644 --- a/data/json/mapgen/house/house_duplex3.json +++ b/data/json/mapgen/house/house_duplex3.json @@ -45,6 +45,10 @@ "9": "t_linoleum_gray", "-": "t_linoleum_gray" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 5, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 13, "y": 1, "chance": 80, "status": 0 } + ], "furniture": { "!": "f_region_flower" }, "place_item": [ { "item": "television", "x": 10, "y": 7 }, { "item": "television", "x": 18, "y": 4 } ] } diff --git a/data/json/mapgen/house/house_duplex4.json b/data/json/mapgen/house/house_duplex4.json index 4f88fd3aeea81..7eaed77b15320 100644 --- a/data/json/mapgen/house/house_duplex4.json +++ b/data/json/mapgen/house/house_duplex4.json @@ -45,6 +45,10 @@ "9": "t_linoleum_gray", "-": "t_linoleum_gray" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 6, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } + ], "furniture": { "!": "f_region_flower" }, "place_item": [ { "item": "television", "x": 11, "y": 13 }, { "item": "television", "x": 13, "y": 13 } ] } diff --git a/data/json/mapgen/house/house_duplex5.json b/data/json/mapgen/house/house_duplex5.json index 858cf4818e9f3..e6fe258a79a0a 100644 --- a/data/json/mapgen/house/house_duplex5.json +++ b/data/json/mapgen/house/house_duplex5.json @@ -47,6 +47,10 @@ "9": "t_linoleum_gray", "-": "t_linoleum_gray" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 4, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } + ], "furniture": { "!": "f_region_flower" }, "place_item": [ { "item": "television", "x": 5, "y": 10 }, diff --git a/data/json/mapgen/house/house_duplex6.json b/data/json/mapgen/house/house_duplex6.json index a25248d20700e..4ad22ed38ece1 100644 --- a/data/json/mapgen/house/house_duplex6.json +++ b/data/json/mapgen/house/house_duplex6.json @@ -39,6 +39,7 @@ "!": "t_region_groundcover_urban", "`": "t_concrete", "j": "t_concrete", + "#": "t_adobe_brick_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "Q": "t_linoleum_gray", @@ -58,6 +59,10 @@ "A": "t_linoleum_gray", "-": "t_linoleum_gray" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 4, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } + ], "furniture": { "!": "f_region_flower" }, "place_items": [ { "chance": 40, "item": "bags_trip", "x": 6, "y": 20 } ], "place_item": [ diff --git a/data/json/mapgen/house/house_duplex7.json b/data/json/mapgen/house/house_duplex7.json index d0f84c98d022d..9e55241956bdd 100644 --- a/data/json/mapgen/house/house_duplex7.json +++ b/data/json/mapgen/house/house_duplex7.json @@ -58,6 +58,10 @@ "h": "t_linoleum_gray", "-": "t_linoleum_gray" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 4, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } + ], "furniture": { "?": "f_beaded_door", "!": "f_region_flower" }, "place_item": [ { "item": "television", "x": 16, "y": 13 }, diff --git a/data/json/mapgen/house/house_duplex8.json b/data/json/mapgen/house/house_duplex8.json index 35629abaff3aa..05849a86970f2 100644 --- a/data/json/mapgen/house/house_duplex8.json +++ b/data/json/mapgen/house/house_duplex8.json @@ -47,6 +47,10 @@ "$": "t_screened_porch_wall", "=": "t_screen_door_c" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 4, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } + ], "furniture": { "!": "f_region_flower" } } }, diff --git a/data/json/mapgen/house/house_duplex9.json b/data/json/mapgen/house/house_duplex9.json index edd96547e001a..faa6cf16b5498 100644 --- a/data/json/mapgen/house/house_duplex9.json +++ b/data/json/mapgen/house/house_duplex9.json @@ -45,6 +45,7 @@ "9": "t_linoleum_gray", "-": "t_linoleum_gray", "&": "t_gates_control_brick", + "#": "t_brick_wall", "~": "t_thconc_floor", "N": "t_thconc_floor", "q": "t_thconc_floor" @@ -56,7 +57,9 @@ ], "place_vehicles": [ { "chance": 35, "fuel": 10, "rotation": 90, "status": -1, "vehicle": "car", "x": 8, "y": 7 }, - { "chance": 30, "fuel": 10, "rotation": 90, "status": -1, "vehicle": "car_sports", "x": 16, "y": 7 } + { "chance": 30, "fuel": 10, "rotation": 90, "status": -1, "vehicle": "car_sports", "x": 16, "y": 7 }, + { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 21, "y": 1, "chance": 80, "status": 0 } ] } }, diff --git a/data/json/mapgen/house/house_fence01.json b/data/json/mapgen/house/house_fence01.json new file mode 100644 index 0000000000000..6ab6206804d6c --- /dev/null +++ b/data/json/mapgen/house/house_fence01.json @@ -0,0 +1,232 @@ +[ + { + "type": "mapgen", + "om_terrain": "house_fence01_basement", + "weight": 20, + "method": "json", + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^############^^^", + "^^^^^^^^^# ______#^^^", + "^^^####### _c__X_#^^^", + "^^^#zzz ______#^^^", + "^^^#zzz ____u_#^^^", + "^^^# ______#^^^", + "^^^# b#^^^", + "^^^#|||| ||+||#^^^", + "^^^#|! | | #^^^", + "^^^#| + | U#^^^", + "^^^#|ZW| zz |g U#^^^", + "^^^########### ######^^^", + "^^^^^^^^^^^^^#<#^^^^^^^^", + "^^^^^^^^^^^^^###^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^" + ], + "palettes": [ "standard_domestic_palette", "standard_domestic_basement_palette" ], + "terrain": { "u": "t_carpet_purple", "X": "t_carpet_purple", "c": "t_carpet_purple", "_": "t_carpet_purple" }, + "furniture": { "!": "f_sink" } + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence01_basement", + "weight": 20, + "method": "json", + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^############^^^", + "^^^^^^^^^#!!$% #^^^", + "^^^####### #^^^", + "^^^#&& | | #^^^", + "^^^# z#^^^", + "^^^# zz#^^^", + "^^^# zz#^^^", + "^^^# T #^^^", + "^^^# |N | g#^^^", + "^^^# N #^^^", + "^^^# qqqqY ZW ~#^^^", + "^^^########### ######^^^", + "^^^^^^^^^^^^^#<#^^^^^^^^", + "^^^^^^^^^^^^^###^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^" + ], + "palettes": [ "standard_domestic_palette", "standard_domestic_basement_palette" ], + "furniture": { "!": "f_desk", "$": "f_wardrobe", "%": "f_dresser", "&": "f_mannequin", "~": "f_sink" } + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence01_basement", + "weight": 20, + "method": "json", + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^############^^^", + "^^^^^^^^^#zz|qqqNN Z#^^^", + "^^^####### | W#^^^", + "^^^#zz + g#^^^", + "^^^#z c ||||||||#^^^", + "^^^#/ ~~~~!!!~#^^^", + "^^^#/ X ~~~~~~~~#^^^", + "^^^#? ~~~~lll~#^^^", + "^^^#? ~~~~~~~~#^^^", + "^^^# ~~~~~~~E#^^^", + "^^^#b LLA~~THHH~#^^^", + "^^^########### ######^^^", + "^^^^^^^^^^^^^#<#^^^^^^^^", + "^^^^^^^^^^^^^###^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^" + ], + "palettes": [ "standard_domestic_palette", "standard_domestic_basement_palette" ], + "terrain": { + "~": "t_carpet_purple", + "H": "t_carpet_purple", + "E": "t_carpet_purple", + "T": "t_carpet_purple", + "l": "t_carpet_purple", + "!": "t_carpet_purple", + "A": "t_carpet_purple" + }, + "furniture": { "!": "f_table", "?": "f_filing_cabinet", "/": "f_bookcase" }, + "place_loot": [ { "item": "television", "x": 17, "y": 12, "chance": 100 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence01", + "method": "json", + "object": { + "fill_ter": "t_floor", + "rows": [ + "}...,,,,,...p}}}}}}}}}}}", + "}./#?????#.............}", + "}..#$$$$$#....[........}", + "}..#$$$$$#.............}", + "}..#$$$$$#.............}", + "}..#$$$$$#---.......[..}", + "}..#$$$$$#---0000......}", + "}..#$$$$$#o*o#####o##..}", + "}..#U$qqq(L ii(T©©@#..}", + "}..#(+((((y +©©©@#..}", + "}.^#6_7O51x l H(R©©©o..}", + "}..#6____2x l H(R©Dd#..}", + "}..#F_JJJ3x l H(((((#..}", + "}..#Y A +©DRR#..}", + "}..o (((+(((©©©©#..}", + "}..o h(88)(II©©©©o..}", + "}..#y hff()))(k©©©@@#..}", + "}..#y hff(tS9(©©d¤@@#..}", + "}..##*oo###o######o##..}", + "}..~~~~₸K₸~~~*>#^......}", + "}..~~~~~~~~~~###...[...}", + "}................u.....}", + "}......................}", + "}}}}}}}}}}}}}}}}}}}}}}}}" + ], + "palettes": [ + "standard_domestic_palette", + "standard_domestic_lino_bathroom", + "standard_domestic_lino_kitchen", + "standard_domestic_landscaping_palette" + ], + "terrain": { + "?": "t_door_metal_locked", + ",": "t_pavement", + "/": "t_gates_mech_control", + "_": "t_linoleum_gray", + ")": "t_linoleum_gray", + "}": "t_fence_v", + "©": "t_carpet_yellow", + "-": "t_concrete", + "$": "t_thconc_floor", + "q": "t_thconc_floor", + "U": "t_thconc_floor", + "(": "t_wall_r", + "0": "t_region_groundcover_urban", + "~": "t_floor_noroof", + "₸": "t_floor_noroof", + "K": "t_floor_noroof", + "¤": "t_carpet_yellow", + "@": "t_carpet_yellow", + "D": "t_carpet_yellow", + "&": "t_carpet_yellow", + "d": "t_carpet_yellow", + "k": "t_carpet_yellow", + "I": "t_carpet_yellow", + "R": "t_carpet_yellow", + "]": "t_carpet_yellow", + "T": "t_carpet_yellow" + }, + "furniture": { "k": "f_chair", "0": "f_region_flower" }, + "items": { "~": { "item": "trash", "chance": 3 }, ")": { "item": "clutter_bathroom", "chance": 5 } }, + "place_loot": [ { "item": "television", "x": 10, "y": 11, "chance": 100 }, { "item": "lawnmower", "x": 2, "y": 3, "chance": 15 } ], + "place_vehicles": [ { "vehicle": "beetle", "x": 6, "y": 4, "chance": 20, "fuel": 30, "rotation": 90 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence01_roof", + "method": "json", + "object": { + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ------- ", + " -.....- ", + " -.....- ", + " -.....- ", + " -.....- ", + " -.....- ", + " -..=..------------ ", + " -................- ", + " -................- ", + " -................- ", + " -............N...- ", + " -................- ", + " -................- ", + " -.X..............- ", + " -................- ", + " -................- ", + " -................- ", + " -----------.------ ", + " -.5 ", + " --- ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { ".": "t_shingle_flat_roof" } + } + } +] diff --git a/data/json/mapgen/house/house_fence02.json b/data/json/mapgen/house/house_fence02.json new file mode 100644 index 0000000000000..44738c126ffdf --- /dev/null +++ b/data/json/mapgen/house/house_fence02.json @@ -0,0 +1,151 @@ +[ + { + "type": "mapgen", + "om_terrain": "house_fence02_1", + "weight": 250, + "method": "json", + "object": { + "palettes": [ + "standard_domestic_palette", + "standard_domestic_lino_kitchen", + "standard_domestic_lino_bathroom", + "standard_domestic_landscaping_palette" + ], + "fill_ter": "t_floor", + "rows": [ + "}.........)))))))p.....}", + "}.......[.))))))).$$$$.}", + "}.?...?...))))))).$$$$.}", + "}.........)))))))....?.}", + "}.--------)))))))-----.}", + "}.-.../...)))))))./..-.}", + "}.-.......)))))))....-.}", + "}.-(((###o###o####o##-.}", + "}.-/((#JJ5F3hff|D¤@@#-.}", + "}.-(((oO____ h| @@#-.}", + "}.-(((#6612_ + o-.}", + "}.-(((#|||| |||++#-.}", + "}.-(((#t__+ |Q|dd#-.}", + "}.-(((o8S9|RR |+|||#-.}", + "}.-/((#|||||| b=&o-.}", + "}.-(((#¤yrrD| *-.}", + "}.-(((o@ h + L#-.}", + "}.-(((#@ d|y x V#-.}", + "}.-(((#|||||| so-.}", + "}.-/((oZ__` E#..}", + "}.--<-#W_<|RRRlHHHly#^.}", + "}.----##o#######o####..}", + "}...........^..........}", + "}}}}}}}}}}}}}}}}}}}}}}}}" + ], + "terrain": { + "}": "t_privacy_fence", + "/": "t_column", + ")": "t_pavement", + "W": "t_linoleum_gray", + "Z": "t_linoleum_gray", + "`": "t_door_locked", + "(": "t_dirt", + "$": "t_dirtmound", + "%": [ [ "t_region_tree_nut", 5 ], [ "t_region_tree_shade", 4 ], [ "t_region_tree_fruit", 2 ] ], + "_": "t_linoleum_gray", + "Q": "t_null", + "?": "t_region_groundcover_urban" + }, + "furniture": { "?": [ "f_boulder_medium", "f_boulder_large" ], "$": "f_region_flower", "&": "f_rack", "=": "f_table" }, + "items": { + "=": { "item": "table_foyer", "chance": 50 }, + "&": { "item": "clothing_outdoor_shoes", "chance": 40, "repeat": [ 1, 2 ] } + }, + "place_loot": [ { "item": "television", "x": 16, "y": 17 } ], + "place_vehicles": [ { "vehicle": "car", "x": 14, "y": 3, "chance": 20, "rotation": 90 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence02_2", + "weight": 250, + "method": "json", + "object": { + "palettes": [ "standard_domestic_palette", "standard_domestic_lino_kitchen", "standard_domestic_lino_bathroom" ], + "fill_ter": "t_floor", + "rows": [ + "........................", + "........................", + "........................", + "........................", + "...))))))))))))))))))...", + "...),,,,,,,,,,,,,,,,)...", + "...),,,,,qqq,,,,₸$₸,)...", + "...),,###o##o¶###oo##...", + "...),,#xRdd|= Rs l H#...", + "...),,# |b RE l H#...", + "...),,#¤ + RT l Ho...", + "...),,o@@ y|i y#...", + "...),,#@@ D|i A__5#...", + "...),,#|||||i h6__O#...", + "...),,#8S|RR ff4__Jo...", + "...),,o__+ hff31FJ#...", + "...),,#t9|y ||||||#...", + "...),,#|||L |T rrr#...", + "...),,* + h o...", + "...),,#|`|||+|| @@#^..", + "...)>,#z >|zzz|dd¤@@#...", + "...)))##o########o###...", + ".............^..........", + "........................" + ], + "terrain": { + "_": "t_linoleum_gray", + ")": "t_railing_v", + ",": "t_floor_noroof", + "`": "t_door_locked", + "₸": "t_floor_noroof", + "$": "t_floor_noroof", + ".": "t_open_air", + "q": "t_floor_noroof", + "A": "t_linoleum_gray" + }, + "furniture": { "$": "f_tourist_table", "=": "f_table" }, + "items": { "=": { "item": "table_foyer", "chance": 50 } }, + "place_loot": [ { "item": "television", "x": 7, "y": 8 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence02_roof", + "weight": 250, + "method": "json", + "object": { + "palettes": [ "roof_palette" ], + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " --------------- ", + " -.............- ", + " -.............- ", + " -.............- ", + " -..........X..- ", + " -.............- ", + " -.............- ", + " -.............- ", + " -.N...........- ", + " -.........=...- ", + " -.............- ", + " -.............- ", + " -.............5 ", + " -.............- ", + " ------5-------- ", + " ", + " " + ], + "terrain": { ".": "t_shingle_flat_roof" } + } + } +] diff --git a/data/json/mapgen/house/house_fence03.json b/data/json/mapgen/house/house_fence03.json new file mode 100644 index 0000000000000..c0a3951492b9f --- /dev/null +++ b/data/json/mapgen/house/house_fence03.json @@ -0,0 +1,138 @@ +[ + { + "type": "mapgen", + "om_terrain": "house_fence03_basement", + "method": "json", + "object": { + "palettes": [ "standard_domestic_palette", "standard_domestic_basement_palette", "standard_domestic_lino_bathroom" ], + "fill_ter": "t_floor", + "rows": [ + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^||||||||||||||||^^^^", + "^^^^|qq|<|BBSt|d,,?|^^^^", + "^^^^|++|+|____|,,,¤|^^^^", + "^^^^| |_w88|,~,d|^^^^", + "^^^^| |+||||+||||^^^^", + "^^^^|R iii |zz|^^^^", + "^^^^|R + z|^^^^", + "^^^^|R T |zz|^^^^", + "^^^^||+|||+||+||||||^^^^", + "^^^^#$==|R P| sHHHs|^^^^", + "^^^^#===|R P| }}}}}|^^^^", + "^^^^#%=&| r| }}}}}|^^^^", + "^^^^#Z==| hr| }}}}}|^^^^", + "^^^^#W=g| r|T xxx |^^^^", + "^^^^####||||||||||||^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^" + ], + "terrain": { + ",": "t_carpet_green", + "?": "t_carpet_green", + "}": "t_carpet_purple", + "d": "t_carpet_green", + "¤": "t_carpet_green", + "~": "t_carpet_green", + "=": "t_thconc_floor", + "W": "t_thconc_floor", + "Z": "t_thconc_floor", + "%": "t_thconc_floor", + "&": "t_thconc_floor", + "$": "t_thconc_floor", + "g": "t_thconc_floor", + "_": "t_linoleum_gray" + }, + "furniture": { "?": "f_bunkbed", "$": "f_home_furnace", "%": "f_table", "&": "f_sink", "~": "f_floor_lamp" }, + "items": { "!": { "item": "bed", "chance": 50 } }, + "place_loot": [ { "item": "laptop", "x": 11, "y": 17 }, { "item": "television", "x": 16, "y": 18 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence03", + "method": "json", + "object": { + "palettes": [ "standard_domestic_palette", "standard_domestic_lino_bathroom", "standard_domestic_landscaping_palette" ], + "fill_ter": "t_floor", + "rows": [ + "...........---.p........", + "{{{{{{{{{{{{){{{{{{{{{{{", + "{.....[....---.........{", + "{..........---.........{", + "{..........---.........{", + "{...%%%####o*o###......{", + "{...%%%#>+ L $xx#%%..[.{", + "{...##o#|| lllo%%....{", + "{...#D v|( o%%..u.{", + "{...#|+|||| HHH####...{", + "{...#¤ hI| sssyUU#...{", + "{...o@@ I| ==== o-..{", + "{...o@@ + =``= ¶-..{", + "{...#b dd|R=``=y$ #j..{", + "{..^#||||||R====||+#j..{", + "{...#A h|8_#j..{", + "{...o 2514 ff|S_#...{", + "{...o ff|__o...{", + "{...#6JJOF66y h|t9#...{", + "{...###oo####oo#####...{", + "{.........^............{", + "{...[..................{", + "{......................{", + "{{{{{{{{{{{{{{{{{{{{{{{{" + ], + "terrain": { + "~": "t_door_glass_c", + "_": "t_linoleum_gray", + "{": "t_chainfence", + ")": "t_chaingate_c", + "=": "t_carpet_purple", + "`": "t_carpet_yellow" + }, + "furniture": { "(": "f_rack", "$": "f_table" }, + "items": { "$": { "item": "table_foyer", "chance": 50 }, "(": { "item": "clothing_outdoor_shoes", "chance": 50 } }, + "place_loot": [ { "item": "television", "x": 14, "y": 6 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence03_roof", + "method": "json", + "object": { + "palettes": [ "roof_palette" ], + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ---------- ", + " -........- ", + " ----........- ", + " -...........- ", + " -...........---- ", + " -..............- ", + " -..............- ", + " -..............- ", + " -..............- ", + " -..........=...- ", + " -...X..........- ", + " -..............- ", + " -..............- ", + " -..............- ", + " ------5--------- ", + " ", + " ", + " ", + " " + ], + "terrain": { ".": "t_shingle_flat_roof" } + } + } +] diff --git a/data/json/mapgen/house/house_fence04.json b/data/json/mapgen/house/house_fence04.json new file mode 100644 index 0000000000000..43e39b72f306c --- /dev/null +++ b/data/json/mapgen/house/house_fence04.json @@ -0,0 +1,233 @@ +[ + { + "//": "variant: normal ", + "type": "mapgen", + "om_terrain": "house_fence04", + "weight": 25, + "method": "json", + "object": { + "palettes": [ "standard_domestic_palette", "standard_domestic_lino_bathroom", "standard_domestic_landscaping_palette" ], + "fill_ter": "t_floor", + "rows": [ + "{{{{{{{{{{{,,{{{{{{{{{{{", + "{........p----.........{", + "{.[.......----.........{", + "{..///////0000///////..{", + "{../0000000000000000/..{", + "{../₸&&₸000000000000/..{", + "{..##oo###o#*o##ooo##..{", + "{..#Ty I| yL y|sss??#..{", + "{..o@@ I|h |=====o..{", + "{..# |ff =H==xo..{", + "{..#dd |ffh =H==x#..{", + "{.%#||+|||| ||=H===#..{", + "{.%#w+ b =l=ER#%.{", + "{.^#w+ ====R#^.{", + "{.%#||| ||+|| || |#%.{", + "{..#Dd|+|t_|F 6|y y#%.{", + "{..# |8_|2 3|Z io%.{", + "{..o @@ |S_|1 |W io..{", + "{..#T@@¤|BB|J5O|q i#..{", + "{..##oo###o#oo###o¶##..{", + "{................--....{", + "{..........[...........{", + "{......................{", + "{{{{{{{{{{{{{{{{{{{{{{{{" + ], + "terrain": { + "{": "t_chainfence", + ",": "t_chaingate_c", + "/": "t_railing_h", + "_": "t_linoleum_gray", + "=": "t_carpet_green", + "0": "t_floor_noroof", + "H": "t_carpet_green", + "E": "t_carpet_green", + "R": "t_carpet_green", + "?": "t_carpet_green", + "l": "t_carpet_green", + "s": "t_carpet_green", + "x": "t_carpet_green", + "w": "t_null", + "₸": "t_floor_noroof", + "&": "t_floor_noroof" + }, + "furniture": { "&": "f_table", "?": [ "f_indoor_plant", "f_indoor_plant_y" ] }, + "place_loot": [ { "item": "television", "x": 19, "y": 10 } ] + } + }, + { + "//": "variant: cat hoarder ", + "type": "mapgen", + "om_terrain": "house_fence04", + "weight": 15, + "method": "json", + "object": { + "palettes": [ "standard_domestic_palette", "standard_domestic_lino_bathroom", "standard_domestic_landscaping_palette" ], + "fill_ter": "t_floor", + "rows": [ + "{{{{{{{{{{{,,{{{{{{{{{{{", + "{........p----.........{", + "{.[.......----.........{", + "{..///////0000///////..{", + "{../0000000000000000/..{", + "{../₸&&₸000000000000/..{", + "{..##oo###o#*o##ooo##..{", + "{..#Ty I| yL y|sss??#..{", + "{..o@@ I|h |=====o..{", + "{..# |ff =H==xo..{", + "{..#dd |ffh =H==x#..{", + "{.%#||}|||| ||=H===#..{", + "{.%#w+ b =l=ER#%.{", + "{.^#w+ ====R#^.{", + "{.%#||| ||}|| || |#%.{", + "{..#Dd|}|t_|F 6|y y#%.{", + "{..# |8_|2 3|Z io%.{", + "{..o @@ |S_|1 |W io..{", + "{..#T@@¤|BB|J5O|q i#..{", + "{..##oo###o#oo###o¶##..{", + "{................--....{", + "{....................[.{", + "{......................{", + "{{{{{{{{{{{{{{{{{{{{{{{{" + ], + "terrain": { + "{": "t_chainfence", + ",": "t_chaingate_c", + "`": "t_null", + "/": "t_railing_h", + "_": "t_linoleum_gray", + "=": "t_carpet_purple", + "0": "t_floor_noroof", + "H": "t_carpet_purple", + "E": "t_carpet_purple", + "R": "t_carpet_purple", + "?": "t_carpet_purple", + "l": "t_carpet_purple", + "s": "t_carpet_purple", + "x": "t_carpet_purple", + "w": "t_null", + "₸": "t_floor_noroof", + "&": "t_floor_noroof", + "}": "t_door_o", + "]": "t_chaingate_o" + }, + "furniture": { "&": "f_table", "?": [ "f_indoor_plant", "f_indoor_plant_y" ] }, + "place_loot": [ { "item": "television", "x": 19, "y": 10 } ], + "items": { + "_": { "item": "cat_hoarder", "chance": 10, "repeat": 5 }, + "=": { "item": "cat_hoarder", "chance": 10, "repeat": 3 }, + "H": { "item": "cat_hoarder", "chance": 10, "repeat": 2 }, + "E": { "item": "cat_hoarder", "chance": 10, "repeat": 5 }, + "R": { "item": "cat_hoarder", "chance": 10, "repeat": 3 }, + "?": { "item": "cat_hoarder", "chance": 10, "repeat": 4 }, + "l": { "item": "cat_hoarder", "chance": 10, "repeat": 1 }, + "s": { "item": "cat_hoarder", "chance": 10, "repeat": 3 }, + "x": { "item": "cat_hoarder", "chance": 10, "repeat": 2 } + }, + "place_monsters": [ { "density": 0.1, "monster": "GROUP_PET_CATS", "x": [ 5, 19 ], "y": [ 5, 19 ] } ] + } + }, + { + "//": "variant: garden ", + "type": "mapgen", + "om_terrain": "house_fence04", + "weight": 25, + "method": "json", + "object": { + "palettes": [ "standard_domestic_palette", "standard_domestic_lino_bathroom", "standard_domestic_landscaping_palette" ], + "fill_ter": "t_floor", + "rows": [ + "{{{{{{{{{{{,,{{{{{{{{{{{", + "{..........--..........{", + "{..00000...--...00000..{", + "{..00000...--...00000..{", + "{..00000..----..00000..{", + "{.........----.........{", + "{..||oo|||o|*o||ooo||..{", + "{..|Ty I| L y|sss??|..{", + "{..o@@ I|h &|=====o..{", + "{..| |ff =H==xo..{", + "{..|dd |ffh =H==x|..{", + "{.%|||+|||| ||=H===|..{", + "{.%|w+ b =l=ER|%.{", + "{.^|w+ ====R|^.{", + "{.%|||| ||+|| || ||%.{", + "{..|Dd|+|t_|F 6|y y|%.{", + "{..| |8_|2 3|Z io%.{", + "{..o @@ |S_|1 |W io..{", + "{..|T@@¤|BB|J5O|q i|..{", + "{..||oo|||o|oo|||o¶||..{", + "{...............----...{", + "{.....[.........----...{", + "{......................{", + "{{{{{{{{{{{{{{{{{{{{{{{{" + ], + "terrain": { + "`": "t_region_groundcover_urban", + "{": "t_chainfence", + ",": "t_chaingate_c", + "_": "t_linoleum_gray", + "=": "t_carpet_yellow", + "0": "t_dirtmound", + "H": "t_carpet_yellow", + "E": "t_carpet_yellow", + "R": "t_carpet_yellow", + "?": "t_carpet_yellow", + "l": "t_carpet_yellow", + "s": "t_carpet_yellow", + "x": "t_carpet_yellow", + "w": "t_null" + }, + "furniture": { "&": "f_rack", "?": [ "f_indoor_plant", "f_indoor_plant_y" ] }, + "items": { + "0": { "item": "hydro", "chance": 50 }, + "&": [ { "item": "farming_seeds", "chance": 35 }, { "item": "farming_tools", "chance": 50 } ] + }, + "place_loot": [ + { "item": "television", "x": 19, "y": 10 }, + { "item": "straw_hat", "x": [ 4, 10 ], "y": 5 }, + { "item": "g_shovel", "x": [ 7, 8 ], "y": 5 }, + { "item": "hoe", "x": [ 7, 8 ], "y": 5 }, + { "item": "shovel", "x": [ 4, 10 ], "y": 5 } + ] + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence04_roof", + "weight": 250, + "method": "json", + "object": { + "palettes": [ "roof_palette" ], + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ------------------ ", + " -................- ", + " -................- ", + " -................- ", + " -...............N- ", + " -................- ", + " -...............X- ", + " 5................5 ", + " -................- ", + " -................- ", + " -................- ", + " -.=..............- ", + " -................- ", + " ------------------ ", + " ", + " ", + " ", + " " + ], + "terrain": { ".": "t_shingle_flat_roof", "=": "t_shingle_flat_roof", "X": "t_shingle_flat_roof", "N": "t_shingle_flat_roof" } + } + } +] diff --git a/data/json/mapgen/house/house_fence05.json b/data/json/mapgen/house/house_fence05.json new file mode 100644 index 0000000000000..56530b3a62d8c --- /dev/null +++ b/data/json/mapgen/house/house_fence05.json @@ -0,0 +1,181 @@ +[ + { + "type": "mapgen", + "om_terrain": "house_fence05_basement", + "weight": 250, + "method": "json", + "object": { + "palettes": [ "standard_domestic_palette", "standard_domestic_basement_palette" ], + "fill_ter": "t_thconc_floor", + "rows": [ + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^#############^^^^^", + "^^^^^^# hhhh g !#^^^^^", + "^^^^^^# #^^^^^", + "^^^^^^# #^^^^^", + "^^^^^^#z # UU# Y#^^^^^", + "^^^^^^#z q#^^^^^", + "^^^^^^#z q#^^^^^", + "^^^^^^#z AN#^^^^^", + "^^^^^^#b N#^^^^^", + "^^^^^^# && z T#^^^^^", + "^^^^^^# #& # #^^^^^", + "^^^^^^# #^^^^^", + "^^^^^^# #^^^^^", + "^^^^^^#% $ ZW <#^^^^^", + "^^^^^^#############^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^", + "^^^^^^^^^^^^^^^^^^^^^^^^" + ], + "furniture": { "!": "f_home_furnace", "$": "f_sink", "%": "f_treadmill", "&": "f_clothing_rail" } + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence05_1", + "weight": 250, + "method": "json", + "object": { + "palettes": [ + "standard_domestic_palette", + "standard_domestic_lino_kitchen", + "standard_domestic_lino_bathroom", + "standard_domestic_landscaping_palette" + ], + "fill_ter": "t_floor", + "rows": [ + "{_____{{{{{{{{{{{{{{{{{{", + "{_____{..jjj...........{", + "{_____{.[..............{", + "{_____{.........₸.K.₸[.{", + "{_____(------..........{", + "{_____{&&&&&-&&&.0000..{", + "{_____$$o#?o*?##o#o##..{", + "{_____$JJ2|y=|sE y#..{", + "{_____o5/1|L |H l yo..{", + "{_____$O/F|) |H l x#0.{", + "{_____$6/4| |H l #0.{", + "{_____$y |s a#0.{", + "{_____# h || |||#0.{", + "{_____o ff |) +//o..{", + "{...p-o hffh V|St#^.{", + "{...#`# h V|||#..{", + "{[..o *= yb| yRRR#..{", + "{...#o#|||+||| o..{", + "{.-...#R h P|++||+|#..{", + "{#*##.#RRrrrP|qQ|> <#..{", + "{#,U#.###oo#######o##..{", + "{#,Uo.......^..........{", + "{####..................{", + "{{{{{{{{{{{{{{{{{{{{{{{{" + ], + "terrain": { + "?": "t_wall_r", + "$": "t_concrete_wall", + "{": "t_privacy_fence", + "(": "t_privacy_fencegate_c", + "/": "t_linoleum_gray", + ",": "t_concrete", + "U": "t_concrete", + "&": "t_dirtmound", + "0": "t_shrub_lilac", + "=": "t_carpet_yellow", + "₸": "t_region_groundcover_urban", + "K": "t_region_groundcover_urban", + "Q": "t_null", + "`": "t_screen_door_c" + }, + "furniture": { ")": "f_table", "&": "f_region_flower" }, + "items": { ")": { "item": "table_foyer", "chance": 50 } }, + "place_loot": [ { "item": "television", "x": 19, "y": 9 } ], + "place_vehicles": [ { "vehicle": "pickup", "x": 3, "y": 9, "chance": 15, "rotation": 90 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence05_2", + "weight": 250, + "method": "json", + "object": { + "palettes": [ "standard_domestic_palette", "standard_domestic_lino_bathroom" ], + "fill_ter": "t_floor", + "rows": [ + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "......,,,,,,,,,,,,,,,...", + "......,,,,,,,,,,,,,,,...", + "......,,,,,,,,,,,,,,,...", + "......##oo#######oo##...", + "......#¤ y|dd|!|sETy#...", + "......o@@ |++|+|H #...", + "......o@@ + |H x#...", + "......#¤ Db| |H so...", + "......#||||||| |||+|#...", + "....,,#y + $#^..", + "....,,#¤ Db|RR #...", + "....,,o@@ |||||+||| o...", + "......o@@ +d|____B| o...", + ".,,,,.#¤ +d|tS88B|>#...", + ".,,,,.##oo###########...", + ".,,,,........^..........", + ".,,,,...................", + "........................" + ], + "terrain": { "_": "t_linoleum_gray", ",": "t_shingle_flat_roof", ".": "t_open_air" }, + "furniture": { "!": "f_clothing_rail", "$": "f_table" }, + "items": { + "$": { "item": "table_foyer", "chance": 50 }, + "!": [ { "item": "dress_shop", "chance": 50, "repeat": [ 1, 2 ] }, { "item": "jackets", "chance": 30, "repeat": [ 1, 2 ] } ] + }, + "place_loot": [ { "item": "television", "x": 19, "y": 12 } ] + } + }, + { + "type": "mapgen", + "om_terrain": "house_fence05_roof", + "weight": 250, + "method": "json", + "object": { + "palettes": [ "roof_palette" ], + "fill_ter": "t_shingle_flat_roof", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " --------------- ", + " -.............- ", + " -.bbb........~- ", + " -.bbb.........- ", + " -.............- ", + " -...X.........- ", + " -.............5 ", + " -.............- ", + " -.............- ", + " -...N......=..- ", + " -.............- ", + " ------5-------- ", + " ", + " ", + " " + ], + "furniture": { "b": "f_solar_unit" }, + "terrain": { ".": "t_shingle_flat_roof" } + } + } +] diff --git a/data/json/mapgen/house/house_fortified.json b/data/json/mapgen/house/house_fortified.json index b109f13997a41..2be1a2b284cf5 100644 --- a/data/json/mapgen/house/house_fortified.json +++ b/data/json/mapgen/house/house_fortified.json @@ -49,6 +49,7 @@ "$": "t_window_boarded", "=": "t_door_locked" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" }, "set": [ { "point": "trap", "id": "tr_funnel", "x": [ 3, 9 ], "y": 19, "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/house/house_garage.json b/data/json/mapgen/house/house_garage.json index 80b619520ac62..a7dd83be9e061 100644 --- a/data/json/mapgen/house/house_garage.json +++ b/data/json/mapgen/house/house_garage.json @@ -39,6 +39,7 @@ "=": "t_door_metal_locked", "_": "t_pavement", "&": "t_gates_control_brick", + "#": "t_brick_wall", "G": "t_sidewalk", "K": "t_sidewalk", "~": "t_thconc_floor", @@ -50,7 +51,10 @@ { "item": "television", "x": 10, "y": 19, "chance": 100 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 17, "y": 6, "chance": 15, "fuel": 70, "status": 0, "rotation": 90 } ] + "place_vehicles": [ + { "vehicle": "suburban_home", "x": 17, "y": 6, "chance": 15, "fuel": 70, "status": 0, "rotation": 90 }, + { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 } + ] } }, { diff --git a/data/json/mapgen/house/house_garage2.json b/data/json/mapgen/house/house_garage2.json index a09962d29f3a2..223d8a2d2ce25 100644 --- a/data/json/mapgen/house/house_garage2.json +++ b/data/json/mapgen/house/house_garage2.json @@ -40,6 +40,7 @@ "=": "t_door_metal_locked", "_": "t_pavement", "&": "t_gates_control_brick", + "#": "t_brick_wall", "G": "t_sidewalk", "K": "t_sidewalk", "~": "t_thconc_floor", @@ -59,7 +60,10 @@ { "group": "home_hw", "x": [ 21, 21 ], "y": [ 9, 11 ], "chance": 85, "repeat": [ 1, 2 ] } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 17, "y": 6, "chance": 15, "fuel": 80, "status": 0, "rotation": 90 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 3, "y": 3, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 17, "y": 6, "chance": 15, "fuel": 80, "status": 0, "rotation": 90 } + ] } }, { diff --git a/data/json/mapgen/house/house_garage3.json b/data/json/mapgen/house/house_garage3.json index b14cf7a334290..80d8064744128 100644 --- a/data/json/mapgen/house/house_garage3.json +++ b/data/json/mapgen/house/house_garage3.json @@ -51,7 +51,10 @@ { "item": "american_flag", "x": [ 4, 4 ], "y": [ 5, 5 ], "chance": 2 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 17, "y": 6, "chance": 10, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 17, "y": 6, "chance": 10, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/house_garage4.json b/data/json/mapgen/house/house_garage4.json index 3b7cc08a1a6d9..06c2e9664a078 100644 --- a/data/json/mapgen/house/house_garage4.json +++ b/data/json/mapgen/house/house_garage4.json @@ -47,7 +47,10 @@ "furniture": { "!": "f_region_flower" }, "place_loot": [ { "group": "guns_pistol_common", "x": [ 21, 21 ], "y": [ 21, 21 ], "chance": 5, "ammo": 90, "magazine": 100 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 11, "y": 8, "chance": 10, "rotation": 0 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 4, "y": 3, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 11, "y": 8, "chance": 10, "rotation": 0 } + ] } }, { diff --git a/data/json/mapgen/house/house_garage5.json b/data/json/mapgen/house/house_garage5.json index 40253ffbf52d2..99ba8047d0bc6 100644 --- a/data/json/mapgen/house/house_garage5.json +++ b/data/json/mapgen/house/house_garage5.json @@ -38,12 +38,16 @@ "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", "`": "t_concrete", + "#": "t_adobe_brick_wall", "$": "t_screened_porch_wall", "]": "t_screen_door_c" }, "furniture": { "!": "f_region_flower" }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 5, "y": 5, "chance": 10, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 5, "y": 5, "chance": 10, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/house_garage6.json b/data/json/mapgen/house/house_garage6.json index eb8c726802abc..0d8e5d3acd54d 100644 --- a/data/json/mapgen/house/house_garage6.json +++ b/data/json/mapgen/house/house_garage6.json @@ -41,6 +41,7 @@ "M": "t_region_groundcover_urban", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "~": "t_thconc_floor", "q": "t_thconc_floor", "W": "t_thconc_floor", @@ -78,7 +79,10 @@ { "item": "hose", "x": [ 12, 12 ], "y": [ 22, 22 ], "chance": 75 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 17, "y": 7, "chance": 10, "rotation": 90 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 17, "y": 7, "chance": 10, "rotation": 90 } + ] } }, { diff --git a/data/json/mapgen/house/house_garage7.json b/data/json/mapgen/house/house_garage7.json index 462b29df92d70..2e8f9542f44a5 100644 --- a/data/json/mapgen/house/house_garage7.json +++ b/data/json/mapgen/house/house_garage7.json @@ -40,6 +40,7 @@ "/": "t_region_groundcover_urban", "`": "t_concrete", "?": "t_fencegate_c", + "#": "t_rock_wall", "$": "t_fence", "_": "t_linoleum_white", "Q": "t_linoleum_white", @@ -56,7 +57,10 @@ { "item": "television", "x": 13, "y": 7, "chance": 75 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 6 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 4, "y": 4, "chance": 15, "fuel": 80, "status": 50, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 4, "y": 4, "chance": 15, "fuel": 80, "status": 50, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/house_garage8.json b/data/json/mapgen/house/house_garage8.json index 8f01a351d2eef..55268ac75f351 100644 --- a/data/json/mapgen/house/house_garage8.json +++ b/data/json/mapgen/house/house_garage8.json @@ -39,6 +39,7 @@ "!": "t_region_groundcover_urban", "`": "t_concrete", "?": "t_fencegate_c", + "#": "t_rock_wall", "$": "t_fence", "_": "t_linoleum_white", "Q": "t_linoleum_white", @@ -72,7 +73,18 @@ "♣": { "item": { "item": "seed_carrot", "chance": 100 }, "furniture": "f_plant_seedling" } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 4, 5 ], "y": [ 12, 13 ], "chance": 6 } ], - "place_vehicles": [ { "vehicle": "suburban_home_compact", "x": 4, "y": 2, "chance": 15, "fuel": 80, "status": 50, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 }, + { + "vehicle": "suburban_home_compact", + "x": 4, + "y": 2, + "chance": 15, + "fuel": 80, + "status": 50, + "rotation": 270 + } + ] } }, { diff --git a/data/json/mapgen/house/house_garage_prepper.json b/data/json/mapgen/house/house_garage_prepper.json index eb9f35ea4ead2..70e40d757796c 100644 --- a/data/json/mapgen/house/house_garage_prepper.json +++ b/data/json/mapgen/house/house_garage_prepper.json @@ -64,6 +64,7 @@ ",": "t_door_boarded", "(": "t_door_metal_pickable" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower", ";": "f_console_broken", "{": "f_table", "}": "f_chair", ")": "f_locker" }, "set": [ { "point": "trap", "id": "tr_beartrap", "x": [ 10, 11 ], "y": 2, "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/house/house_gardener.json b/data/json/mapgen/house/house_gardener.json index 8bddf7ea0f8f6..d6ea6c5175242 100644 --- a/data/json/mapgen/house/house_gardener.json +++ b/data/json/mapgen/house/house_gardener.json @@ -36,6 +36,7 @@ "terrain": { "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "$": "t_fence", + "#": "t_adobe_brick_wall", "=": "t_shrub_blueberry", "!": "t_dirtmound", "&": "t_shrub_strawberry" @@ -46,6 +47,7 @@ { "group": "farming_tools", "x": [ 16, 20 ], "y": 11, "chance": 65, "repeat": [ 1, 2 ] }, { "group": "farming_seeds", "x": [ 16, 20 ], "y": 13, "chance": 85, "repeat": [ 1, 5 ] } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 10, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ] } }, diff --git a/data/json/mapgen/house/house_inner_garden.json b/data/json/mapgen/house/house_inner_garden.json index c009726fc5959..326ef7f4b11f6 100644 --- a/data/json/mapgen/house/house_inner_garden.json +++ b/data/json/mapgen/house/house_inner_garden.json @@ -43,6 +43,7 @@ }, "furniture": { "a": "f_displaycase" }, "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 }, { "vehicle": "showroom_small_vehicles", "x": 17, "y": 5, "rotation": 270, "chance": 20, "status": 0 }, { "vehicle": "showroom_small_vehicles", "x": 19, "y": 5, "rotation": 270, "chance": 20, "status": 0 } ], diff --git a/data/json/mapgen/house/house_library.json b/data/json/mapgen/house/house_library.json index 21d6350382af4..493423e86a5ab 100644 --- a/data/json/mapgen/house/house_library.json +++ b/data/json/mapgen/house/house_library.json @@ -41,6 +41,7 @@ "S": "t_linoleum_gray", "Q": "t_linoleum_gray" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ] } } diff --git a/data/json/mapgen/house/house_modern_lx.json b/data/json/mapgen/house/house_modern_lx.json index 792b3fad4a2e2..60fd69de57d61 100644 --- a/data/json/mapgen/house/house_modern_lx.json +++ b/data/json/mapgen/house/house_modern_lx.json @@ -38,6 +38,7 @@ ":": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "&": "t_region_groundcover_urban", "j": "t_region_groundcover_urban", + "#": "t_rock_wall", "_": "t_concrete", "~": "t_water_pool_shallow_outdoors", "!": "t_linoleum_gray", @@ -58,6 +59,7 @@ { "item": "katana_inferior", "x": [ 12, 12 ], "y": [ 10, 10 ], "chance": 8 }, { "item": "spiral_stone", "x": [ 12, 12 ], "y": [ 10, 10 ], "chance": 25 } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 13, "y": 1, "chance": 80, "status": 0 } ], "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 2 } ] } }, diff --git a/data/json/mapgen/house/house_patio.json b/data/json/mapgen/house/house_patio.json index 53f33ec06e3ac..364ffa658bf4f 100644 --- a/data/json/mapgen/house/house_patio.json +++ b/data/json/mapgen/house/house_patio.json @@ -76,7 +76,10 @@ "y": 17 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 5, "y": 4, "chance": 10, "rotation": 90 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 15, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 5, "y": 4, "chance": 10, "rotation": 90 } + ] } }, { diff --git a/data/json/mapgen/house/house_porch.json b/data/json/mapgen/house/house_porch.json index 8c0af257f763f..a2c8879ba7237 100644 --- a/data/json/mapgen/house/house_porch.json +++ b/data/json/mapgen/house/house_porch.json @@ -51,6 +51,7 @@ "f": "t_carpet_red", "h": "t_carpet_red" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 4, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "%": "f_region_flower" }, "place_loot": [ { "group": "alcohol", "x": [ 2, 2 ], "y": [ 8, 8 ], "chance": 15 }, diff --git a/data/json/mapgen/house/house_prepper.json b/data/json/mapgen/house/house_prepper.json index 9446b358c603b..34f321d623507 100644 --- a/data/json/mapgen/house/house_prepper.json +++ b/data/json/mapgen/house/house_prepper.json @@ -38,6 +38,7 @@ "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "!": "t_region_groundcover_urban", "`": "t_concrete", + "#": "t_adobe_brick_wall", "t": "t_linoleum_gray", "S": "t_linoleum_gray", "Q": "t_linoleum_gray", @@ -49,6 +50,7 @@ "=": "t_door_locked", "/": "t_door_metal_pickable" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower" }, "place_loot": [ { "item": "television", "x": 5, "y": 6 }, { "item": "stereo", "x": 6, "y": 6 } ], "place_items": [ @@ -103,6 +105,7 @@ ".######################.", "............^..........." ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 } ], "palettes": [ "standard_domestic_palette" ], "place_npcs": [ { "class": "prepper_survivor", "x": 13, "y": 20 } ], "place_zones": [ { "type": "LOOT_UNSORTED", "faction": "no_faction", "x": [ 11, 15 ], "y": 21 } ], diff --git a/data/json/mapgen/house/house_quiverfull.json b/data/json/mapgen/house/house_quiverfull.json index 384b307019c8f..4282d77c1b96b 100644 --- a/data/json/mapgen/house/house_quiverfull.json +++ b/data/json/mapgen/house/house_quiverfull.json @@ -47,7 +47,11 @@ "...%%%%%.....^.........." ], "palettes": [ "domestic_general_and_variant_palette" ], - "terrain": { "Y": "t_region_groundcover_urban", "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ] }, + "terrain": { + "Y": "t_region_groundcover_urban", + "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], + "#": "t_rock_wall" + }, "place_loot": [ { "item": "american_flag", "x": [ 2, 2 ], "y": [ 5, 5 ], "chance": 100 }, { "group": "book_house_quiverfull_bible", "x": [ 2, 2 ], "y": [ 6, 6 ], "chance": 100 }, @@ -58,6 +62,8 @@ { "monster": "GROUP_QUIVERFULL", "x": [ 2, 14 ], "y": [ 15, 21 ], "chance": 1 } ], "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 }, { "vehicle": "tricycle", "x": 10, "y": 8, "chance": 50, "status": 0 }, { "vehicle": "tricycle", "x": 4, "y": 21, "chance": 50, "status": 0 } ] diff --git a/data/json/mapgen/house/house_rural.json b/data/json/mapgen/house/house_rural.json index 9176915ee21e8..42d3ff7e843da 100644 --- a/data/json/mapgen/house/house_rural.json +++ b/data/json/mapgen/house/house_rural.json @@ -38,6 +38,7 @@ "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", "`": "t_concrete", + "#": "t_rock_wall", "_": "t_region_soil" }, "furniture": { "!": "f_region_flower" } diff --git a/data/json/mapgen/house/house_suicide.json b/data/json/mapgen/house/house_suicide.json index a77c6d449e24d..800371b02dfd3 100644 --- a/data/json/mapgen/house/house_suicide.json +++ b/data/json/mapgen/house/house_suicide.json @@ -34,7 +34,12 @@ "........................" ], "palettes": [ "standard_domestic_palette" ], - "terrain": { "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "!": "t_door_locked_interior" }, + "terrain": { + "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], + "#": "t_rock_wall", + "!": "t_door_locked_interior" + }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 3, "y": 1, "chance": 80, "status": 0 } ], "place_nested": [ { "chunks": [ [ "bathroom_suicide", 100 ] ], "x": 18, "y": 13 } ] } }, diff --git a/data/json/mapgen/house/house_tool_shed.json b/data/json/mapgen/house/house_tool_shed.json index 7daa12b0818d2..1749e82ae4177 100644 --- a/data/json/mapgen/house/house_tool_shed.json +++ b/data/json/mapgen/house/house_tool_shed.json @@ -36,6 +36,7 @@ "terrain": { "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "$": "t_fence", + "#": "t_adobe_brick_wall", "[": "t_door_glass_c", "G": "t_concrete", "K": "t_concrete", @@ -43,6 +44,7 @@ "q": "t_thconc_floor", "!": "t_thconc_floor" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 6, "y": 1, "chance": 80, "status": 0 } ], "set": [ { "point": "terrain", "id": "t_tree_apple", "x": [ 0, 14 ], "y": [ 0, 0 ], "repeat": [ 1, 2 ] }, { "point": "terrain", "id": "t_tree", "x": [ 2, 14 ], "y": [ 17, 21 ], "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house_wooded.json b/data/json/mapgen/house/house_wooded.json index ff087bb2dbb2a..cf0fc8261a25a 100644 --- a/data/json/mapgen/house/house_wooded.json +++ b/data/json/mapgen/house/house_wooded.json @@ -44,6 +44,7 @@ "_": "t_concrete", "/": "t_screened_porch_wall", "=": "t_screen_door_c", + "#": "t_wall_wood", "-": "t_linoleum_white", "Q": "t_linoleum_white", "8": "t_linoleum_white", @@ -53,6 +54,7 @@ ")": "t_wall_glass", "]": "t_door_glass_c" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 2, "y": 1, "chance": 80, "status": 0 } ], "furniture": { "!": "f_region_flower", "}": [ "f_indoor_plant", "f_indoor_plant_y" ] }, "place_loot": [ { "item": "television", "x": 3, "y": 18 }, { "item": "stereo", "x": 5, "y": 15 } ] } diff --git a/data/json/mapgen/house/multi_unit_housing.json b/data/json/mapgen/house/multi_unit_housing.json index 6e44229945edc..8f846bcec5be4 100644 --- a/data/json/mapgen/house/multi_unit_housing.json +++ b/data/json/mapgen/house/multi_unit_housing.json @@ -33,7 +33,13 @@ ], "palettes": [ "domestic_general_and_variant_palette", "apt_complex_ground" ], "place_nested": [ { "chunks": [ "multi_unit_home" ], "x": 2, "y": 2 } ], - "terrain": { "-": "t_concrete" } + "terrain": { "-": "t_concrete" }, + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 10, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 11, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "rolling_trash_can", "x": 13, "y": 1, "chance": 80, "status": 0 } + ] } }, { diff --git a/data/json/mapgen/house/urban_10_house_brick_pool.json b/data/json/mapgen/house/urban_10_house_brick_pool.json index e8f1a6242a33c..2133c55241251 100644 --- a/data/json/mapgen/house/urban_10_house_brick_pool.json +++ b/data/json/mapgen/house/urban_10_house_brick_pool.json @@ -47,6 +47,7 @@ "~": "t_water_pool_outdoors", "ƃ": "t_privacy_fencegate_c" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 39, "y": 7, "chance": 100 }, { "item": "stereo", "x": 39, "y": 8, "chance": 50 } ] } }, diff --git a/data/json/mapgen/house/urban_11_house_brick.json b/data/json/mapgen/house/urban_11_house_brick.json index 2238cd2476e91..1ff8437e37546 100644 --- a/data/json/mapgen/house/urban_11_house_brick.json +++ b/data/json/mapgen/house/urban_11_house_brick.json @@ -52,7 +52,10 @@ "Y": "t_linoleum_gray" }, "place_loot": [ { "item": "television", "x": 12, "y": 11, "chance": 100 }, { "item": "stereo", "x": 12, "y": 12, "chance": 50 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 35, "y": 13, "chance": 100, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 35, "y": 13, "chance": 100, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/urban_12_house.json b/data/json/mapgen/house/urban_12_house.json index 949e90dd0cb48..ecb6b05af8865 100644 --- a/data/json/mapgen/house/urban_12_house.json +++ b/data/json/mapgen/house/urban_12_house.json @@ -53,12 +53,16 @@ "q": "t_thconc_floor", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "ƃ": "t_screen_door_c", "$": "t_screened_porch_wall", "Y": "t_linoleum_gray" }, "place_loot": [ { "item": "television", "x": 40, "y": 5, "chance": 100 }, { "item": "stereo", "x": 41, "y": 5, "chance": 50 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 11, "y": 9, "chance": 100, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 11, "y": 9, "chance": 100, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/urban_15_house.json b/data/json/mapgen/house/urban_15_house.json index 53cf4d4c37f31..1bee650fd2097 100644 --- a/data/json/mapgen/house/urban_15_house.json +++ b/data/json/mapgen/house/urban_15_house.json @@ -45,6 +45,7 @@ "q": "t_thconc_floor", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "ƃ": "t_privacy_fencegate_c", "$": "t_privacy_fence", "Y": "t_linoleum_gray", @@ -52,7 +53,10 @@ }, "furniture": { "0": "f_counter" }, "place_loot": [ { "item": "television", "x": 16, "y": 14, "chance": 100 }, { "item": "stereo", "x": 16, "y": 15, "chance": 50 } ], - "place_vehicles": [ { "vehicle": "suburban_home_compact", "x": 37, "y": 9, "chance": 50, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 40, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home_compact", "x": 37, "y": 9, "chance": 50, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/urban_16_house_ranch.json b/data/json/mapgen/house/urban_16_house_ranch.json index 700020a2595ef..651ddfea5c502 100644 --- a/data/json/mapgen/house/urban_16_house_ranch.json +++ b/data/json/mapgen/house/urban_16_house_ranch.json @@ -50,6 +50,7 @@ "q": "t_thconc_floor", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "ƃ": "t_screen_door_c", "$": "t_screened_porch_wall", "Y": "t_linoleum_gray" diff --git a/data/json/mapgen/house/urban_17_house_ranch.json b/data/json/mapgen/house/urban_17_house_ranch.json index b3ec76368770d..5be9aeb61d250 100644 --- a/data/json/mapgen/house/urban_17_house_ranch.json +++ b/data/json/mapgen/house/urban_17_house_ranch.json @@ -53,6 +53,7 @@ "q": "t_thconc_floor", "=": "t_door_metal_locked", "&": "t_gates_control_brick", + "#": "t_brick_wall", "ƃ": "t_screen_door_c", ";": "t_door_glass_c", "$": "t_screened_porch_wall", diff --git a/data/json/mapgen/house/urban_1_house.json b/data/json/mapgen/house/urban_1_house.json index 70aebfa22bf7b..ae41a123a5c94 100644 --- a/data/json/mapgen/house/urban_1_house.json +++ b/data/json/mapgen/house/urban_1_house.json @@ -40,6 +40,7 @@ "=": "t_door_metal_locked", "_": "t_pavement", "&": "t_gates_control_brick", + "#": "t_brick_wall", "~": "t_thconc_floor", "q": "t_thconc_floor", "A": "t_thconc_floor", @@ -71,7 +72,10 @@ }, "furniture": { "!": "f_region_flower", "$": "f_sofa", "0": "f_stool", ")": "f_table" }, "place_loot": [ { "item": "television", "x": 14, "y": 9, "chance": 100 }, { "item": "stereo", "x": 14, "y": 10, "chance": 60 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 39, "y": 12, "chance": 30, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 23, "y": 23, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 39, "y": 12, "chance": 30, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/urban_20_house.json b/data/json/mapgen/house/urban_20_house.json index 191db07d6d043..576fa53163462 100644 --- a/data/json/mapgen/house/urban_20_house.json +++ b/data/json/mapgen/house/urban_20_house.json @@ -74,7 +74,10 @@ "Z": "f_floor_lamp" }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.03 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 15, "y": 14, "chance": 40, "rotation": 0 } ], + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 12, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 15, "y": 14, "chance": 40, "rotation": 0 } + ], "place_item": [ { "item": "television", "x": 18, "y": 3 } ] } }, diff --git a/data/json/mapgen/house/urban_2_house.json b/data/json/mapgen/house/urban_2_house.json index 11bf8293d7fec..d6a24cf562098 100644 --- a/data/json/mapgen/house/urban_2_house.json +++ b/data/json/mapgen/house/urban_2_house.json @@ -40,6 +40,7 @@ "=": "t_door_metal_locked", "_": "t_pavement", "&": "t_gates_control_brick", + "#": "t_brick_wall", "'": "t_thconc_floor", "q": "t_thconc_floor", "A": "t_thconc_floor", @@ -72,6 +73,7 @@ { "item": "stepladder", "x": 10, "y": 7, "chance": 100 } ], "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 23, "y": 23, "chance": 80, "status": 0 }, { "vehicle": "suburban_home", "x": 33, "y": 11, "chance": 30, "rotation": 270 }, { "vehicle": "suburban_home", "x": 40, "y": 11, "chance": 30, "rotation": 270 } ] diff --git a/data/json/mapgen/house/urban_2_house_dd.json b/data/json/mapgen/house/urban_2_house_dd.json index b30be0fd1ea5a..d4f992f6071f7 100644 --- a/data/json/mapgen/house/urban_2_house_dd.json +++ b/data/json/mapgen/house/urban_2_house_dd.json @@ -42,6 +42,7 @@ "=": "t_door_metal_locked", "_": "t_pavement", "&": "t_gates_control_brick", + "#": "t_brick_wall", "'": "t_thconc_floor", "q": "t_thconc_floor", "A": "t_thconc_floor", @@ -77,6 +78,7 @@ ], "place_fields": [ { "field": "fd_blood", "x": 24, "y": 3, "intensity": 2, "age": 20 } ], "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 23, "y": 23, "chance": 80, "status": 0 }, { "vehicle": "suburban_home", "x": 33, "y": 11, "chance": 30, "rotation": 270 }, { "vehicle": "suburban_home", "x": 40, "y": 11, "chance": 30, "rotation": 270 } ] diff --git a/data/json/mapgen/house/urban_3_house.json b/data/json/mapgen/house/urban_3_house.json index 36bd66ac3166d..f3a43fd62e83b 100644 --- a/data/json/mapgen/house/urban_3_house.json +++ b/data/json/mapgen/house/urban_3_house.json @@ -40,6 +40,7 @@ "=": "t_door_metal_locked", "_": "t_pavement", "&": "t_gates_control_brick", + "#": "t_brick_wall", "'": "t_thconc_floor", "q": "t_thconc_floor", "A": "t_thconc_floor", @@ -73,7 +74,10 @@ { "item": "lawnmower", "x": 41, "y": 14, "chance": 100 }, { "item": "stepladder", "x": 41, "y": 15, "chance": 100 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 36, "y": 11, "chance": 30, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 23, "y": 23, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 36, "y": 11, "chance": 30, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/urban_4_house_basement.json b/data/json/mapgen/house/urban_4_house_basement.json index 076000df6c518..9f7fd198d0869 100644 --- a/data/json/mapgen/house/urban_4_house_basement.json +++ b/data/json/mapgen/house/urban_4_house_basement.json @@ -90,6 +90,7 @@ "=": "t_door_metal_locked", "_": "t_pavement", "&": "t_gates_control_brick", + "#": "t_brick_wall", "'": "t_thconc_floor", "q": "t_thconc_floor", "Q": "t_thconc_floor", @@ -118,7 +119,10 @@ }, "furniture": { "!": "f_region_flower", "0": "f_stool", "]": "f_sofa", "}": "f_table" }, "place_loot": [ { "item": "television", "x": 8, "y": 5, "chance": 100 }, { "item": "stereo", "x": 9, "y": 5, "chance": 100 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 36, "y": 12, "chance": 30, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 16, "y": 23, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 36, "y": 12, "chance": 30, "rotation": 270 } + ] } }, { @@ -157,6 +161,7 @@ "palettes": [ "domestic_general_and_variant_palette" ], "terrain": { "~": "t_open_air", + "#": "t_brick_wall", "=": "t_shingle_flat_roof", "&": "t_shingle_flat_roof", "%": "t_gutter_drop", diff --git a/data/json/mapgen/house/urban_5_house.json b/data/json/mapgen/house/urban_5_house.json index 985d7929ca2c2..d723ac935cf49 100644 --- a/data/json/mapgen/house/urban_5_house.json +++ b/data/json/mapgen/house/urban_5_house.json @@ -37,6 +37,7 @@ "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", + "#": "t_brick_wall", "=": "t_door_metal_locked", "_": "t_pavement", "&": "t_gates_control_brick", @@ -70,7 +71,10 @@ }, "furniture": { "!": "f_region_flower", "0": "f_stool", "]": "f_sofa", "}": "f_table" }, "place_loot": [ { "item": "television", "x": 28, "y": 14, "chance": 100 }, { "item": "stereo", "x": 28, "y": 15, "chance": 100 } ], - "place_vehicles": [ { "vehicle": "suburban_home", "x": 37, "y": 12, "chance": 30, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 17, "y": 23, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home", "x": 37, "y": 12, "chance": 30, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/house/urban_6_house.json b/data/json/mapgen/house/urban_6_house.json index 8773499c46032..4e2b38c56d983 100644 --- a/data/json/mapgen/house/urban_6_house.json +++ b/data/json/mapgen/house/urban_6_house.json @@ -36,6 +36,7 @@ "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], "[": [ [ "t_region_tree_fruit", 2 ], [ "t_region_tree_nut", 2 ], "t_region_tree_shade" ], "!": "t_region_groundcover_urban", + "#": "t_adobe_brick_wall", "_": "t_pavement", "'": "t_thconc_floor", "q": "t_thconc_floor", @@ -71,6 +72,7 @@ { "item": "lawnmower", "x": 38, "y": 5, "chance": 100 } ], "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 16, "y": 23, "chance": 80, "status": 0 }, { "vehicle": "suburban_home", "x": 31, "y": 12, "chance": 30, "rotation": 270 }, { "vehicle": "suburban_home", "x": 39, "y": 12, "chance": 30, "rotation": 270 } ] @@ -111,6 +113,7 @@ "palettes": [ "domestic_general_and_variant_palette" ], "terrain": { "~": "t_open_air", + "#": "t_adobe_brick_wall", "=": "t_shingle_flat_roof", "&": "t_shingle_flat_roof", "%": "t_gutter_drop", diff --git a/data/json/mapgen/house/urban_7_house_garden.json b/data/json/mapgen/house/urban_7_house_garden.json index 8711a615e1f61..e872dbbc97be7 100644 --- a/data/json/mapgen/house/urban_7_house_garden.json +++ b/data/json/mapgen/house/urban_7_house_garden.json @@ -68,6 +68,7 @@ "t": "t_linoleum_gray" }, "furniture": { "!": "f_region_flower", "0": "f_stool", "}": "f_counter" }, + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 12, "y": 22, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 15, "y": 18, "chance": 100 }, { "item": "stereo", "x": 16, "y": 18, "chance": 100 }, diff --git a/data/json/mapgen/house/urban_8_house_brick_garden.json b/data/json/mapgen/house/urban_8_house_brick_garden.json index f24602f233bbf..1931ba8e3f811 100644 --- a/data/json/mapgen/house/urban_8_house_brick_garden.json +++ b/data/json/mapgen/house/urban_8_house_brick_garden.json @@ -59,6 +59,7 @@ { "chunks": [ [ "greenhouse_6x6_herbal", 100 ] ], "x": 8, "y": 8 }, { "chunks": [ [ "greenhouse_6x6_vegetable", 100 ] ], "x": 8, "y": 15 } ], + "place_vehicles": [ { "vehicle": "rolling_trash_can", "x": 31, "y": 1, "chance": 80, "status": 0 } ], "place_loot": [ { "item": "television", "x": 29, "y": 6, "chance": 100 }, { "item": "stereo", "x": 29, "y": 7, "chance": 50 }, diff --git a/data/json/mapgen/house/urban_9_house_garage_loft.json b/data/json/mapgen/house/urban_9_house_garage_loft.json index 171b1950f8606..361219877a681 100644 --- a/data/json/mapgen/house/urban_9_house_garage_loft.json +++ b/data/json/mapgen/house/urban_9_house_garage_loft.json @@ -69,7 +69,8 @@ "9": "t_linoleum_gray", "t": "t_linoleum_gray", "=": "t_door_metal_locked", - "&": "t_gates_control_brick" + "&": "t_gates_control_brick", + "#": "t_brick_wall" }, "furniture": { "!": "f_region_flower", "0": "f_stool" }, "place_loot": [ @@ -79,7 +80,10 @@ { "item": "lawnmower", "x": 33, "y": 18, "chance": 100 }, { "item": "basket_laundry", "x": 31, "y": 18, "chance": 100 } ], - "place_vehicles": [ { "vehicle": "suburban_home_compact", "x": 39, "y": 19, "chance": 100, "rotation": 270 } ] + "place_vehicles": [ + { "vehicle": "rolling_trash_can", "x": 9, "y": 1, "chance": 80, "status": 0 }, + { "vehicle": "suburban_home_compact", "x": 39, "y": 19, "chance": 100, "rotation": 270 } + ] } }, { diff --git a/data/json/mapgen/police_department.json b/data/json/mapgen/police_department.json index 13a7918b2c001..5c6dfebb37d97 100644 --- a/data/json/mapgen/police_department.json +++ b/data/json/mapgen/police_department.json @@ -127,7 +127,7 @@ "|!|!|_______|_..h|4::4444::4|{:::::|::|_.._|___|", "|||||yyyyyyy|_..h|4::::::::4|]:ppp:|x:|_..i|+|+|", "|||||yyyyyyy|_..h|4::::::::4|]:::::≈::|_..i|_|_|", - "|!|!|_______|_..h|4444444444|333333|::|_..i|T|T|", + "|!|!|_______|_..h|4444444444|333335|::|_..i|T|T|", "|___+_qqqqq_+_.._||||||||||||||||||||L|_.._|||||", "|___|_______|_.._L::/|2:222222222:2|i___.._|___|", "|!|!|yyyyyyy|_.._|||||2:::::::::::2|i___.._|_>_|", diff --git a/data/json/mapgen/police_station.json b/data/json/mapgen/police_station.json index 05229d2e400ae..4dda60e22a6d0 100644 --- a/data/json/mapgen/police_station.json +++ b/data/json/mapgen/police_station.json @@ -19,7 +19,7 @@ "|.....|#α#|#α#|#α#|----|", "|5.....................|", "|-=-|..|+-|-+|-+--|-+--|", - "|[.1|..|.S|S.|t..c|....|", + "|[.l|..|.S|S.|t..c|....|", "|[.1|..|.t|t.|...c|Ccc.|", "|[.1|..|+-|-+|...c|.cc.|", "|{}]|..|.&|&.|cccc|.C..|", @@ -272,8 +272,8 @@ " ", "|-----------W----------|", "|{111391[13]23|b..#.#.b|", - "|1............|b..4.4.b|", - "|1..bb|---|---|---|.|--|", + "|l............|b..4.4.b|", + "|l..bb|---|---|---|.|--|", "|--=--|bbb|bbb|bbb|.|bb|", "|5...2|...|...|...|.|..|", "|.d.$$|#4#|#4#|#4#|.|4#|", @@ -436,7 +436,7 @@ "|#α#|#α#|.|#α#|#α#|,,,,,", "|.................|,,,,,", "|--------*------*-|,,,,,", - "|{}[[|5......+$|.<|,,,,,", + "|{}[l|5......+$|.<|,,,,,", "|]...=..|----|----|%%%%^", "|1111|..|tccf|4,,,,,,,,^", "|----|..|C...|,,,,,,,,,^", diff --git a/data/json/materials.json b/data/json/materials.json index cb1d14529c1ea..984bd6d91f85d 100644 --- a/data/json/materials.json +++ b/data/json/materials.json @@ -2049,6 +2049,13 @@ "burn_products": [ [ "pebble", 0.5 ] ], "resist": { "bash": 6, "cut": 6, "acid": 8, "heat": 3, "bullet": 3 } }, + { + "type": "material", + "id": "rhodonite", + "name": "Rhodonite", + "copy-from": "stone", + "density": 3.7 + }, { "type": "material", "id": "monolith", @@ -2078,6 +2085,13 @@ "burn_products": [ [ "pebble", 1 ] ], "resist": { "bash": 160, "cut": 200, "acid": 100, "heat": 100, "bullet": 160 } }, + { + "type": "material", + "id": "anomaly", + "name": "Anomalous Material", + "copy-from": "monolith", + "density": 10000 + }, { "type": "material", "id": "superalloy", diff --git a/data/json/monster_special_attacks/feral_weapon_attacks.json b/data/json/monster_special_attacks/feral_weapon_attacks.json index 33044cbfb503b..5643d7c4cb473 100644 --- a/data/json/monster_special_attacks/feral_weapon_attacks.json +++ b/data/json/monster_special_attacks/feral_weapon_attacks.json @@ -467,7 +467,6 @@ "cooldown": 1, "move_cost": 196, "accuracy": 3, - "range": 2, "//1": "Feral melee skill + weapon's to hit, so 4-1=3", "damage_max_instance": [ { "damage_type": "bash", "amount": 12 }, { "damage_type": "stab", "amount": 22 } ], "condition": { "and": [ { "not": { "u_has_effect": "maimed_arm" } }, { "not": { "u_has_effect": "disarmed" } } ] }, diff --git a/data/json/monster_special_attacks/monster_attacks.json b/data/json/monster_special_attacks/monster_attacks.json index 582c1de91de19..275cbfb9aa658 100644 --- a/data/json/monster_special_attacks/monster_attacks.json +++ b/data/json/monster_special_attacks/monster_attacks.json @@ -23,7 +23,7 @@ "move_cost": 100, "damage_max_instance": [ { "damage_type": "cut", "amount": 15 }, { "damage_type": "acid", "amount": 16 } ], "effects": [ { "id": "corroding", "duration": [ 10, 30 ], "affect_hit_bp": true } ], - "effects_require_dmg": false, + "effects_require_dmg": true, "self_effects_always": [ { "id": "maimed_acid_gland", "duration": 5 } ], "condition": { "and": [ diff --git a/data/json/monsterdrops/feral_humans.json b/data/json/monsterdrops/feral_humans.json index 6d81b2d7371cd..942e275b8f4d5 100644 --- a/data/json/monsterdrops/feral_humans.json +++ b/data/json/monsterdrops/feral_humans.json @@ -796,17 +796,11 @@ { "item": "pants_army", "variant": "apants_MARPAT", "damage": [ 0, 4 ] }, { "item": "boots_combat", "damage": [ 0, 4 ] }, { - "distribution": [ - { - "group": "military_standard_assault_rifles", - "contents-item": "knife_combat_marine", - "prob": 75, - "damage": [ 0, 4 ], - "dirt": [ 0, 6000 ] - }, - { "group": "military_standard_lmgs", "prob": 10, "damage": [ 0, 4 ], "dirt": [ 0, 6000 ] } - ], - "prob": 100 + "group": "military_standard_assault_rifles", + "contents-item": "knife_combat_marine", + "prob": 100, + "damage": [ 0, 4 ], + "dirt": [ 0, 6000 ] }, { "group": "military_standard_grenades", "count": [ 1, 3 ], "prob": 20 }, { "group": "military_patrol_food" }, diff --git a/data/json/monsters/bird.json b/data/json/monsters/bird.json index 7b03ed8d0459f..9310ad6b4557d 100644 --- a/data/json/monsters/bird.json +++ b/data/json/monsters/bird.json @@ -74,6 +74,8 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 4, + "stomach_size": 30, + "special_attacks": [ [ "EAT_CARRION", 40 ], [ "EAT_FOOD", 120 ] ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_flying", "prof_wp_basic_bird" ], "weakpoint_sets": [ "wps_bird_body" ], "harvest": "bird_tiny", @@ -82,7 +84,7 @@ "reproduction": { "baby_egg": "egg_crow", "baby_count": 4, "baby_timer": 18 }, "baby_flags": [ "SPRING" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 8 }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CANPLAY", "FLIES", "SWARMS" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CANPLAY", "FLIES", "SWARMS", "EATS" ] }, { "id": "mon_raven", @@ -106,6 +108,8 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 4, + "stomach_size": 50, + "special_attacks": [ [ "EAT_CARRION", 40 ], [ "EAT_FOOD", 120 ] ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_flying", "prof_wp_basic_bird" ], "weakpoint_sets": [ "wps_bird_body" ], "harvest": "bird_tiny", @@ -114,7 +118,7 @@ "reproduction": { "baby_egg": "egg_raven", "baby_count": 5, "baby_timer": 18 }, "baby_flags": [ "SPRING" ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 8 }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CANPLAY", "FLIES", "SWARMS" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CANPLAY", "FLIES", "SWARMS", "EATS" ] }, { "id": "mon_bluejay", @@ -518,15 +522,16 @@ "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "melee_skill": 2, "dodge": 1, + "stomach_size": 200, "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_flying", "prof_wp_basic_bird" ], "weakpoint_sets": [ "wps_bird_body" ], "harvest": "mutant_bird", "dissect": "dissect_bird_sample_single", "fear_triggers": [ "PLAYER_CLOSE" ], - "special_attacks": [ [ "SHRIEK", 10 ] ], + "special_attacks": [ [ "SHRIEK", 10 ], [ "EAT_CARRION", 40 ], [ "EAT_FOOD", 120 ] ], "biosignature": { "biosig_item": "feces_bird", "biosig_timer": 8 }, "upgrades": { "half_life": 21, "into_group": "GROUP_CROW_MUTANT" }, - "flags": [ "SEES", "HEARS", "SMELLS", "PATH_AVOID_DANGER_1", "WARM", "FLIES" ] + "flags": [ "SEES", "HEARS", "SMELLS", "PATH_AVOID_DANGER_1", "WARM", "FLIES", "EATS" ] }, { "id": "mon_crow_mutant", @@ -551,14 +556,21 @@ "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "vision_night": 4, + "stomach_size": 800, "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bird" ], "weakpoint_sets": [ "wps_bird_body" ], "harvest": "mutant_bird_flightless", "dissect": "dissect_bird_sample_small", "fear_triggers": [ "FIRE" ], - "special_attacks": [ [ "SHRIEK", 10 ], [ "LUNGE", 8 ], { "type": "leap", "cooldown": 10, "max_range": 3 } ], + "special_attacks": [ + [ "SHRIEK", 10 ], + [ "LUNGE", 8 ], + { "type": "leap", "cooldown": 10, "max_range": 3 }, + [ "EAT_CARRION", 40 ], + [ "EAT_FOOD", 120 ] + ], "zombify_into": "mon_meat_cocoon_small", - "flags": [ "SEES", "HEARS", "SMELLS", "PATH_AVOID_DANGER_1", "STUMBLES", "WARM" ] + "flags": [ "SEES", "HEARS", "SMELLS", "PATH_AVOID_DANGER_1", "STUMBLES", "WARM", "EATS" ] }, { "id": "mon_pigeon", diff --git a/data/json/monsters/drones.json b/data/json/monsters/drones.json index 9e8b44e0073b3..0c478749c6200 100644 --- a/data/json/monsters/drones.json +++ b/data/json/monsters/drones.json @@ -105,21 +105,6 @@ "delete": { "flags": [ "PACIFIST" ] }, "armor": { "bash": 2, "cut": 8, "bullet": 6 } }, - { - "id": "mon_mininuke_hack", - "copy-from": "base_drone", - "type": "MONSTER", - "name": { "str": "mininuke hack" }, - "description": "Many times as large as a normal manhack, this flying quadcopter drone appears to have a mininuke inside. If this is targeting you… run.", - "diff": 40, - "hp": 20, - "speed": 150, - "color": "light_green_magenta", - "revert_to_itype": "bot_mininuke_hack", - "starting_ammo": { "mininuke_payload": 1 }, - "special_attacks": [ [ "KAMIKAZE", 0 ] ], - "armor": { "bash": 1, "cut": 6, "bullet": 5 } - }, { "abstract": "exodii_sniper_drone", "type": "MONSTER", diff --git a/data/json/monsters/feral_humans.json b/data/json/monsters/feral_humans.json index 3ef5130e5f3d8..216265c28b31d 100644 --- a/data/json/monsters/feral_humans.json +++ b/data/json/monsters/feral_humans.json @@ -27,6 +27,7 @@ "dissect": "dissect_human_sample_single", "vision_day": 45, "vision_night": 3, + "stomach_size": 700, "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "starting_ammo": { "rock": 6 }, "special_attacks": [ @@ -44,7 +45,9 @@ "ranges": [ [ 2, 5, "DEFAULT" ] ], "description": "The feral human throws a rock!" }, - { "id": "feral_weapon_pipe" } + { "id": "feral_weapon_pipe" }, + [ "BROWSE", 100 ], + [ "EAT_FOOD", 100 ] ], "death_drops": "feral_humans_death_drops_pipe", "upgrades": { "half_life": 90, "into_group": "GROUP_ZOMBIE_UPGRADE" }, @@ -62,7 +65,8 @@ "CAN_OPEN_DOORS", "PATH_AVOID_DANGER_1", "DROPS_AMMO", - "WIELDED_WEAPON" + "WIELDED_WEAPON", + "EATS" ] }, { diff --git a/data/json/monsters/fish.json b/data/json/monsters/fish.json index 3949597258d0e..d204a49465bb5 100644 --- a/data/json/monsters/fish.json +++ b/data/json/monsters/fish.json @@ -29,14 +29,15 @@ "path_settings": { "max_dist": 50, "avoid_traps": true, "avoid_sharp": true }, "harvest": "mutant_shellfish", "dissect": "dissect_crustacean_large", + "stomach_size": 1200, "weakpoint_sets": [ "wps_arthropod" ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug", "prof_wp_nat_armored" ], "grab_strength": 50, - "special_attacks": [ { "id": "grab", "cooldown": 5 }, [ "SHRIEK_ALERT", 6 ], [ "SHRIEK_STUN", 1 ] ], + "special_attacks": [ { "id": "grab", "cooldown": 5 }, [ "SHRIEK_ALERT", 6 ], [ "SHRIEK_STUN", 1 ], [ "EAT_CARRION", 120 ] ], "anger_triggers": [ "PLAYER_CLOSE", "HURT" ], "fear_triggers": [ "FIRE" ], "zombify_into": "mon_meat_cocoon_med", - "flags": [ "SMELLS", "HEARS", "SEES", "SWIMS", "GRABS", "ARTHROPOD_BLOOD", "QUEEN", "PATH_AVOID_DANGER_1" ], + "flags": [ "SMELLS", "HEARS", "SEES", "SWIMS", "GRABS", "ARTHROPOD_BLOOD", "QUEEN", "PATH_AVOID_DANGER_1", "EATS" ], "armor": { "bash": 20, "cut": 30, "bullet": 24 } }, { @@ -1130,14 +1131,15 @@ "path_settings": { "max_dist": 50, "avoid_traps": true, "avoid_sharp": true }, "harvest": "mutant_shellfish", "dissect": "dissect_crustacean_small", + "stomach_size": 900, "weakpoint_sets": [ "wps_arthropod" ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_nat_armored", "prof_wp_basic_bug" ], "grab_strength": 30, - "special_attacks": [ { "id": "grab", "cooldown": 5 }, [ "SHRIEK_ALERT", 6 ], [ "SHRIEK_STUN", 1 ] ], + "special_attacks": [ { "id": "grab", "cooldown": 5 }, [ "SHRIEK_ALERT", 6 ], [ "SHRIEK_STUN", 1 ], [ "EAT_CARRION", 120 ] ], "anger_triggers": [ "PLAYER_CLOSE", "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "fear_triggers": [ "FIRE" ], "zombify_into": "mon_meat_cocoon_small", - "flags": [ "SMELLS", "HEARS", "SEES", "SWIMS", "GRABS", "ARTHROPOD_BLOOD", "PATH_AVOID_DANGER_1" ], + "flags": [ "SMELLS", "HEARS", "SEES", "SWIMS", "GRABS", "ARTHROPOD_BLOOD", "PATH_AVOID_DANGER_1", "EATS" ], "armor": { "bash": 10, "cut": 18, "bullet": 14 } }, { diff --git a/data/json/monsters/insect_spider.json b/data/json/monsters/insect_spider.json index b335655b590b1..21e221e232227 100644 --- a/data/json/monsters/insect_spider.json +++ b/data/json/monsters/insect_spider.json @@ -256,7 +256,7 @@ "hp": 3, "speed": 100, "color": "brown", - "stomach_size": 1, + "stomach_size": 15, "dodge": 3, "harvest": "arachnid_tainted", "upgrades": { "age_grow": 30, "into": "mon_skittering_plague" }, @@ -285,7 +285,7 @@ "melee_skill": 5, "melee_dice": 2, "melee_dice_sides": 6, - "stomach_size": 5, + "stomach_size": 300, "melee_damage": [ { "damage_type": "cut", "amount": 7 } ], "dodge": 1, "weakpoint_sets": [ "wps_arthropod" ], @@ -319,7 +319,7 @@ "color": "brown", "aggression": 35, "morale": 60, - "stomach_size": 3, + "stomach_size": 250, "melee_skill": 5, "melee_dice": 1, "melee_dice_sides": 6, @@ -338,7 +338,7 @@ "special_attacks": [ [ "EAT_FOOD", 60 ], [ "EAT_CARRION", 60 ] ], "zombify_into": "mon_meat_cocoon_small", "fear_triggers": [ "BRIGHT_LIGHT" ], - "flags": [ "SEES", "HEARS", "SMELLS", "CLIMBS", "EATS", "PATH_AVOID_FIRE", "SMALL_HIDER", "CORNERED_FIGHTER" ], + "flags": [ "SEES", "HEARS", "SMELLS", "CLIMBS", "EATS", "PATH_AVOID_FIRE", "SMALL_HIDER", "CORNERED_FIGHTER", "EATS" ], "armor": { "bash": 5, "cut": 10, "bullet": 8 } }, { @@ -349,7 +349,7 @@ "copy-from": "mon_larva_abstract", "default_faction": "roach", "color": "brown", - "stomach_size": 1, + "stomach_size": 80, "fear_triggers": [ "BRIGHT_LIGHT" ], "upgrades": { "age_grow": 30, "into": "mon_giant_cockroach" }, "extend": { "flags": [ "EATS", "SMALL_HIDER" ] }, @@ -362,6 +362,7 @@ "description": "A mutant cockroach the size of a small dog. Its abdomen is heavily swollen with eggs.", "copy-from": "mon_giant_cockroach", "diff": 2, + "stomach_size": 300, "anger_triggers": [ "HURT", "PLAYER_CLOSE" ], "fear_triggers": [ "BRIGHT_LIGHT" ], "reproduction": { "baby_egg": "egg_roach", "baby_count": 3, "baby_timer": 7 }, @@ -719,17 +720,19 @@ "miss_msg_u": "%s thrusts its mouthpart at you, but you dodge!", "miss_msg_npc": "%s thrusts its mouthpart at , but they dodge!", "condition": { "not": { "u_has_effect": "maimed_mandible" } } - } + }, + [ "EAT_CARRION", 100 ] ], "dodge": 3, "weakpoint_sets": [ "wps_arthropod" ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug" ], "vision_day": 10, "vision_night": 5, + "stomach_size": 40, "harvest": "arachnid", "anger_triggers": [ "PLAYER_CLOSE" ], "fear_triggers": [ "HURT" ], - "flags": [ "AQUATIC", "SEES", "WATER_CAMOUFLAGE" ], + "flags": [ "AQUATIC", "SEES", "WATER_CAMOUFLAGE", "EATS" ], "upgrades": { "age_grow": 42, "into": "mon_dragonfly_giant" } }, { @@ -770,20 +773,22 @@ "min_mul": 1, "max_mul": 2, "condition": { "not": { "u_has_effect": "maimed_mandible" } } - } + }, + [ "EAT_CARRION", 100 ] ], "dodge": 2, "weakpoint_sets": [ "wps_arthropod", "wps_arthropod_flying" ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug", "prof_wp_flying" ], "vision_day": 45, "vision_night": 5, + "stomach_size": 200, "harvest": "arachnid_flying", "dissect": "dissect_insect_sample_single", "anger_triggers": [ "PLAYER_WEAK", "STALK" ], "fear_triggers": [ "HURT", "FIRE" ], "upgrades": { "age_grow": 60, "into": "mon_dragonfly_mega" }, "zombify_into": "mon_meat_cocoon_small", - "flags": [ "SWARMS", "HEARS", "SEES", "FLIES", "GRABS", "PATH_AVOID_FIRE" ] + "flags": [ "SWARMS", "HEARS", "SEES", "FLIES", "GRABS", "PATH_AVOID_FIRE", "EATS" ] }, { "id": "mon_dragonfly_mega", @@ -811,7 +816,8 @@ "type": "bite", "cooldown": 6, "damage_max_instance": [ { "damage_type": "cut", "amount": 40, "armor_penetration": 20 } ] - } + }, + [ "EAT_CARRION", 100 ] ], "weakpoint_sets": [ "wps_arthropod" ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug", "prof_wp_flying" ], @@ -819,11 +825,12 @@ "vision_night": 5, "harvest": "arachnid_dragonfly_mega", "dissect": "dissect_insect_sample_large", + "stomach_size": 1000, "anger_triggers": [ "PLAYER_WEAK", "STALK" ], "reproduction": { "baby_egg": "egg_dragonfly", "baby_count": 3, "baby_timer": 1 }, "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ], "zombify_into": "mon_meat_cocoon_large", - "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "SWIMS", "BASHES", "PUSH_MON", "PUSH_VEH" ], + "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "SWIMS", "BASHES", "PUSH_MON", "PUSH_VEH", "EATS" ], "armor": { "electric": 2 } }, { @@ -878,6 +885,7 @@ "weight": "20 kg", "zombify_into": "mon_meat_cocoon_tiny", "upgrades": { "half_life": 30, "into": "mon_fly" }, + "stomach_size": 100, "delete": { "reproduction": { "baby_egg": "egg_fly", "baby_count": 3, "baby_timer": 15 }, "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ] @@ -911,12 +919,14 @@ "vision_night": 5, "harvest": "arachnid_flying", "dissect": "dissect_insect_sample_single", + "stomach_size": 200, "reproduction": { "baby_egg": "egg_fly", "baby_count": 3, "baby_timer": 15 }, + "special_attacks": [ [ "EAT_CARRION", 100 ] ], "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ], "fear_triggers": [ "PLAYER_CLOSE", "HURT", "FIRE" ], "upgrades": { "half_life": 42, "into": "mon_fly_mega" }, "zombify_into": "mon_meat_cocoon_small", - "flags": [ "SEES", "SMELLS", "FLIES", "STUMBLES", "HIT_AND_RUN", "CANPLAY", "PATH_AVOID_FIRE" ] + "flags": [ "SEES", "SMELLS", "FLIES", "STUMBLES", "HIT_AND_RUN", "CANPLAY", "PATH_AVOID_FIRE", "EATS" ] }, { "id": "mon_fly_larva", @@ -929,8 +939,11 @@ "weight": "20 kg", "hp": 15, "speed": 15, + "stomach_size": 150, "color": "light_green", + "special_attacks": [ [ "EAT_CARRION", 100 ] ], "dissect": "dissect_insect_sample_single", + "extend": { "flags": [ "EATS" ] }, "upgrades": { "age_grow": 30, "into": "mon_fly" } }, { @@ -945,6 +958,7 @@ "weight": "815 kg", "melee_dice": 2, "dodge": 2, + "stomach_size": 3000, "dissect": "dissect_insect_sample_small", "special_attacks": [ [ "ACID", 10 ] ], "zombify_into": "mon_meat_cocoon_large", @@ -1817,7 +1831,9 @@ "min_mul": 0.2, "max_mul": 0.5, "condition": { "not": { "u_has_effect": "maimed_mandible" } } - } + }, + [ "EAT_CARRION", 100 ], + [ "EAT_FOOD", 100 ] ], "//": "sting 3-5 dmg, 40 hits to max intensity, 50 to max duration", "dodge": 8, @@ -1825,13 +1841,14 @@ "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug", "prof_wp_hymenoptera", "prof_wp_flying" ], "vision_day": 15, "vision_night": 5, + "stomach_size": 60, "harvest": "arachnid_wasp", "dissect": "dissect_insect_sample_single", "anger_triggers": [ "FRIEND_ATTACKED", "PLAYER_CLOSE", "PLAYER_WEAK", "HOSTILE_SEEN" ], "fear_triggers": [ "HURT", "FIRE" ], "upgrades": { "half_life": 30, "into": "mon_wasp" }, "zombify_into": "mon_meat_cocoon_tiny", - "flags": [ "SEES", "SMELLS", "HEARS", "FLIES", "SWARMS", "GROUP_MORALE", "CANPLAY", "PATH_AVOID_FIRE", "HARDTOSHOOT" ], + "flags": [ "SEES", "SMELLS", "HEARS", "FLIES", "SWARMS", "GROUP_MORALE", "CANPLAY", "PATH_AVOID_FIRE", "HARDTOSHOOT", "EATS" ], "armor": { "bash": 1, "cut": 6, "stab": 4 } }, { @@ -1842,6 +1859,7 @@ "copy-from": "mon_wasp_small", "aggression": 0, "melee_skill": 6, + "stomach_size": 180, "extend": { "anger_triggers": [ "HURT", "FIRE", "STALK" ] }, "delete": { "fear_triggers": [ "HURT", "FIRE" ] }, "upgrades": { "half_life": 30, "into": "mon_wasp_guard" } @@ -1854,6 +1872,7 @@ "copy-from": "mon_wasp_guard", "harvest": "arachnid_wasp_queen", "dissect": "dissect_insect_sample_large", + "stomach_size": 800, "reproduction": { "baby_egg": "egg_wasp", "baby_count": 2, "baby_timer": 5 }, "upgrades": { "half_life": 30, "into": "mon_wasp_mega" }, "armor": { "bash": 5, "cut": 14, "stab": 12, "bullet": 12, "electric": 3 } @@ -1898,7 +1917,9 @@ "min_mul": 0.5, "max_mul": 1.5, "condition": { "not": { "u_has_effect": "maimed_mandible" } } - } + }, + [ "EAT_CARRION", 100 ], + [ "EAT_FOOD", 100 ] ], "//": "sting 5-15 damage, 8 hits to max intensity, 9 to max duration", "dodge": 7, @@ -1907,12 +1928,13 @@ "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug", "prof_wp_hymenoptera", "prof_wp_flying" ], "vision_day": 17, "vision_night": 7, + "stomach_size": 800, "harvest": "arachnid_wasp", "dissect": "dissect_insect_sample_single", "anger_triggers": [ "FRIEND_ATTACKED", "PLAYER_CLOSE", "PLAYER_WEAK", "HOSTILE_SEEN" ], "fear_triggers": [ "HURT", "FIRE" ], "zombify_into": "mon_meat_cocoon_small", - "flags": [ "SEES", "SMELLS", "HEARS", "FLIES", "SWARMS", "GROUP_MORALE", "CANPLAY", "HARDTOSHOOT", "PATH_AVOID_FIRE" ], + "flags": [ "SEES", "SMELLS", "HEARS", "FLIES", "SWARMS", "GROUP_MORALE", "CANPLAY", "HARDTOSHOOT", "PATH_AVOID_FIRE", "EATS" ], "armor": { "bash": 5, "cut": 14, "stab": 12, "bullet": 12 } }, { @@ -1923,6 +1945,7 @@ "copy-from": "mon_wasp", "aggression": 4, "melee_skill": 8, + "stomach_size": 1200, "dissect": "dissect_insect_sample_small", "extend": { "anger_triggers": [ "HURT", "FIRE" ], "flags": [ "BASHES" ] }, "delete": { "fear_triggers": [ "HURT", "FIRE" ] }, @@ -1942,6 +1965,7 @@ "melee_skill": 7, "melee_dice": 4, "melee_dice_sides": 5, + "stomach_size": 8000, "special_attacks": [ { "id": "sting", @@ -2151,13 +2175,14 @@ "vision_day": 10, "vision_night": 5, "harvest": "arachnid", + "stomach_size": 300, "dissect": "dissect_insect_sample_single", "upgrades": { "half_life": 30, "into": "mon_ant_soldier" }, "anger_triggers": [ "FRIEND_ATTACKED", "FRIEND_DIED", "HURT", "PLAYER_WEAK" ], - "special_attacks": [ [ "EAT_FOOD", 30 ] ], + "special_attacks": [ [ "EAT_FOOD", 30 ], [ "BROWSE", 90 ], [ "EAT_CARRION", 90 ] ], "fungalize_into": "mon_ant_fungus", "zombify_into": "mon_meat_cocoon_small", - "flags": [ "SEES", "HEARS", "SMELLS", "CLIMBS", "PATH_AVOID_FIRE", "PATH_AVOID_FALL" ], + "flags": [ "SEES", "HEARS", "SMELLS", "CLIMBS", "PATH_AVOID_FIRE", "PATH_AVOID_FALL", "EATS" ], "armor": { "bash": 5, "cut": 10, "bullet": 8, "electric": 1 } }, { @@ -2202,14 +2227,15 @@ "delete": { "weakpoints": [ { "id": "stinger" } ] }, "vision_day": 10, "vision_night": 5, + "stomach_size": 300, "upgrades": { "half_life": 30, "into": "mon_ant_acid_soldier" }, - "special_attacks": [ [ "ACID", 23 ], [ "EAT_FOOD", 30 ] ], + "special_attacks": [ [ "ACID", 23 ], [ "EAT_FOOD", 30 ], [ "BROWSE", 90 ], [ "EAT_CARRION", 90 ] ], "anger_triggers": [ "FRIEND_ATTACKED", "FRIEND_DIED", "HURT", "PLAYER_CLOSE" ], "death_function": { "message": "The %s's body leaks acid.", "effect": { "id": "death_acid", "hit_self": true } }, "harvest": "arachnid_acid", "dissect": "dissect_insect_sample_single", "zombify_into": "mon_meat_cocoon_small", - "flags": [ "ACIDPROOF", "CLIMBS", "HEARS", "POISON", "SEES", "SMELLS", "PATH_AVOID_FIRE", "PATH_AVOID_FALL" ], + "flags": [ "ACIDPROOF", "CLIMBS", "HEARS", "POISON", "SEES", "SMELLS", "PATH_AVOID_FIRE", "PATH_AVOID_FALL", "EATS" ], "armor": { "bash": 6, "cut": 10, "bullet": 8, "electric": 2 } }, { @@ -2480,6 +2506,7 @@ "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "volume": "15 L", "weight": "20 kg", + "stomach_size": 200, "zombify_into": "mon_meat_cocoon_tiny", "upgrades": { "half_life": 30, "into": "mon_locust" } }, @@ -2503,6 +2530,7 @@ "melee_skill": 3, "melee_dice": 1, "melee_dice_sides": 6, + "stomach_size": 500, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "dodge": 2, "weakpoint_sets": [ "wps_arthropod", "wps_arthropod_flying" ], @@ -2524,10 +2552,12 @@ "allow_no_target": true, "condition": { "not": { "u_has_effect": "maimed_leg" } } }, - [ "EAT_CROP", 60 ] + [ "EAT_CROP", 60 ], + [ "BROWSE", 60 ], + [ "GRAZE", 120 ] ], "zombify_into": "mon_meat_cocoon_small", - "flags": [ "SEES", "HEARS", "SMELLS", "CLIMBS", "STUMBLES", "PATH_AVOID_FIRE" ], + "flags": [ "SEES", "HEARS", "SMELLS", "CLIMBS", "STUMBLES", "PATH_AVOID_FIRE", "EATS" ], "armor": { "bash": 3, "cut": 4, "bullet": 3, "electric": 1 } }, { @@ -2539,6 +2569,7 @@ "proportional": { "hp": 20, "speed": 0.25, "morale": 4, "dodge": 0.5, "vision_day": 2 }, "volume": "625 L", "weight": "815 kg", + "stomach_size": 18000, "melee_dice": 2, "dissect": "dissect_insect_sample_large", "special_attacks": [ @@ -2549,7 +2580,9 @@ "allow_no_target": true, "condition": { "not": { "u_has_effect": "maimed_leg" } } }, - [ "EAT_CROP", 3 ], + [ "EAT_CROP", 30 ], + [ "BROWSE", 30 ], + [ "GRAZE", 90 ], { "id": "smash", "throw_strength": 36, "cooldown": 30 } ], "zombify_into": "mon_meat_cocoon_large", @@ -2576,7 +2609,9 @@ "allow_no_target": true, "condition": { "not": { "u_has_effect": "maimed_leg" } } }, - [ "EAT_CROP", 120 ] + [ "EAT_CROP", 60 ], + [ "BROWSE", 60 ], + [ "GRAZE", 800 ] ] }, { @@ -2588,7 +2623,8 @@ "proportional": { "hp": 0.5, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.5 }, "volume": "96 ml", "weight": "96 g", - "special_attacks": [ [ "EAT_CROP", 600 ] ], + "stomach_size": 50, + "special_attacks": [ [ "EAT_CROP", 80 ], [ "GRAZE", 800 ] ], "delete": { "reproduction": { "baby_monster": "mon_aphid", "baby_count": 1, "baby_timer": 20 }, "baby_flags": [ "SPRING", "SUMMER" ] @@ -2617,6 +2653,7 @@ "melee_skill": 1, "melee_dice": 1, "melee_dice_sides": 2, + "stomach_size": 150, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 3, "weakpoint_sets": [ "wps_arthropod" ], @@ -2627,7 +2664,7 @@ "dissect": "dissect_insect_sample_single", "regen_morale": true, "fear_triggers": [ "FRIEND_ATTACKED", "FRIEND_DIED", "HURT", "FIRE", "PLAYER_CLOSE" ], - "special_attacks": [ [ "EAT_CROP", 80 ] ], + "special_attacks": [ [ "EAT_CROP", 80 ], [ "GRAZE", 800 ] ], "reproduction": { "baby_monster": "mon_aphid_small", "baby_count": 1, "baby_timer": 20 }, "baby_flags": [ "SPRING", "SUMMER" ], "biosignature": { "biosig_item": "honeydew", "biosig_timer": 600 }, @@ -2957,6 +2994,7 @@ "proportional": { "hp": 0.5, "speed": 1.1 }, "volume": "750 ml", "weight": "1 kg", + "stomach_size": 30, "delete": { "reproduction": { "baby_egg": "egg_grasshopper", "baby_count": 3, "baby_timer": 15 }, "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ] @@ -2990,14 +3028,16 @@ "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug" ], "vision_day": 20, "vision_night": 20, + "stomach_size": 600, "harvest": "arachnid", "dissect": "dissect_insect_sample_single", "reproduction": { "baby_egg": "egg_grasshopper", "baby_count": 3, "baby_timer": 15 }, "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ], "fear_triggers": [ "FIRE", "PLAYER_CLOSE" ], "special_attacks": [ - [ "EAT_FOOD", 60 ], [ "EAT_CROP", 80 ], + [ "GRAZE", 300 ], + [ "BROWSE", 80 ], { "type": "leap", "cooldown": 3, @@ -3007,7 +3047,7 @@ } ], "zombify_into": "mon_meat_cocoon_tiny", - "flags": [ "SEES", "HEARS", "SMELLS", "CLIMBS", "PATH_AVOID_FALL", "PATH_AVOID_FIRE" ], + "flags": [ "SEES", "HEARS", "SMELLS", "CLIMBS", "PATH_AVOID_FALL", "PATH_AVOID_FIRE", "EATS" ], "armor": { "bash": 5, "cut": 10 } }, { @@ -3027,8 +3067,9 @@ "allow_no_target": true, "condition": { "not": { "u_has_effect": "maimed_leg" } } }, - [ "EAT_FOOD", 100 ], - [ "EAT_CROP", 133 ] + [ "EAT_CROP", 100 ], + [ "GRAZE", 133 ], + [ "BROWSE", 133 ] ] }, { @@ -3048,8 +3089,9 @@ "color": "white", "aggression": -99, "morale": -10, - "special_attacks": [ [ "EAT_CROP", 30 ] ], + "stomach_size": 4000, "weakpoint_sets": [ "wps_arthropod" ], + "special_attacks": [ [ "EAT_CROP", 30 ], [ "GRAZE", 130 ], [ "EAT_FOOD", 30 ] ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug" ], "harvest": "arachnid", "dissect": "dissect_subterranean_insect_large", @@ -3057,7 +3099,7 @@ "fear_triggers": [ "FIRE", "HURT" ], "upgrades": { "age_grow": 288, "into": "mon_stag_beetle_small" }, "zombify_into": "mon_meat_cocoon_large", - "flags": [ "PATH_AVOID_FIRE", "PET_WONT_FOLLOW" ], + "flags": [ "PATH_AVOID_FIRE", "PET_WONT_FOLLOW", "EATS" ], "armor": { "bash": 5, "cut": 6, "acid": 6, "bullet": 3 } }, { @@ -3107,6 +3149,7 @@ "melee_skill": 5, "melee_dice": 6, "melee_dice_sides": 6, + "stomach_size": 4000, "melee_damage": [ { "damage_type": "cut", "amount": 9 } ], "dodge": 1, "weakpoint_sets": [ "wps_arthropod", "wps_arthropod_beetle" ], @@ -3132,7 +3175,10 @@ "no_dmg_msg_npc": "%1$s rams 's %2$s, but they hold steady!", "miss_msg_u": "%s flicks its horns at you, but you dodge!", "miss_msg_npc": "%s flicks its horns at , but they dodge!" - } + }, + [ "EAT_CROP", 30 ], + [ "EAT_FOOD", 30 ], + [ "BROWSE", 60 ] ], "upgrades": { "half_life": 60, "into": "mon_stag_beetle_mega" }, "reproduction": { "baby_egg": "egg_stag_beetle", "baby_count": 1, "baby_timer": 32 }, @@ -3148,7 +3194,8 @@ "PUSH_MON", "PUSH_VEH", "PET_WONT_FOLLOW", - "PET_MOUNTABLE" + "PET_MOUNTABLE", + "EATS" ], "armor": { "bash": 60, "cut": 72, "acid": 18, "heat": 8, "bullet": 50 } }, @@ -3160,6 +3207,7 @@ "copy-from": "mon_stag_beetle_giant", "proportional": { "hp": 4, "speed": 0.75, "morale": 3, "melee_dice_sides": 2 }, "volume": "950 L", + "stomach_size": 8000, "weight": "1000 kg", "diff": 4, "special_attacks": [ @@ -3507,6 +3555,9 @@ "speed": 30, "dissect": "dissect_insect_sample_large", "upgrades": { "age_grow": 20, "into": "mon_butterfly_cocoon" }, + "stomach_size": 600, + "special_attacks": [ [ "EAT_CROP", 100 ], [ "GRAZE", 1000 ] ], + "extend": { "flags": [ "EATS" ] }, "zombify_into": "mon_meat_cocoon_small" }, { @@ -3544,8 +3595,11 @@ "symbol": "C", "color": "green", "speed": 30, + "stomach_size": 600, "dissect": "dissect_insect_sample_large", + "special_attacks": [ [ "EAT_CROP", 100 ], [ "GRAZE", 1000 ] ], "upgrades": { "age_grow": 30, "into": "mon_moth_cocoon" }, + "extend": { "flags": [ "EATS" ] }, "zombify_into": "mon_meat_cocoon_small" }, { @@ -3649,6 +3703,7 @@ "symbol": "w", "color": "brown", "vision_day": 10, + "stomach_size": 100, "vision_night": 15, "harvest": "mutant_shellfish", "dissect": "dissect_crustacean_single", @@ -3657,7 +3712,8 @@ "reproduction": { "baby_monster": "mon_woodlouse_manca", "baby_count": 5, "baby_timer": 210 }, "fear_triggers": [ "FIRE", "HURT" ], "zombify_into": "mon_meat_cocoon_small", - "flags": [ "SEES", "HEARS", "KEENNOSE", "PATH_AVOID_DANGER_1", "SMELLS" ], + "special_attacks": [ [ "GRAZE", 100 ] ], + "flags": [ "SEES", "HEARS", "KEENNOSE", "PATH_AVOID_DANGER_1", "SMELLS", "EATS" ], "armor": { "bash": 15, "cut": 18, "bullet": 20, "electric": 2 } }, { @@ -3667,6 +3723,7 @@ "description": "Woodlice reproduce by carrying their eggs in a pouch and releasing them as juveniles. Their mancae look like small adults except for their pale color.", "copy-from": "mon_larva_abstract", "symbol": "w", + "stomach_size": 60, "color": "white", "harvest": "mutant_shellfish", "upgrades": { "age_grow": 21, "into": "mon_woodlouse" } diff --git a/data/json/monsters/kraken_spawn.json b/data/json/monsters/kraken_spawn.json index 6c1b51b29f123..cefe58b2b7d85 100644 --- a/data/json/monsters/kraken_spawn.json +++ b/data/json/monsters/kraken_spawn.json @@ -23,9 +23,10 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "stab", "amount": 4, "armor_penetration": 4 } ], "dodge": 3, - "special_attacks": [ { "id": "barbed_tentacle" } ], + "special_attacks": [ { "id": "barbed_tentacle" }, [ "EAT_FOOD", 60 ] ], "vision_day": 30, "vision_night": 7, + "stomach_size": 800, "path_settings": { "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "max_dist": 10 }, "anger_triggers": [ "HURT", "PLAYER_WEAK", "FRIEND_ATTACKED", "FRIEND_DIED", "SOUND", "HURT" ], "families": [ "prof_intro_biology", "prof_physiology" ], @@ -34,7 +35,7 @@ "reproduction": { "baby_monster": "mon_octupus_stalker_spawn", "baby_count": 1, "baby_timer": 700 }, "baby_flags": [ "SPRING" ], "zombify_into": "mon_meat_cocoon_med", - "flags": [ "SEES", "HEARS", "SMELLS", "SWIMS", "PATH_AVOID_DANGER_1", "WATER_CAMOUFLAGE", "WARM" ], + "flags": [ "SEES", "HEARS", "SMELLS", "SWIMS", "PATH_AVOID_DANGER_1", "WATER_CAMOUFLAGE", "WARM", "EATS" ], "armor": { "bash": 2, "cut": 8, "bullet": 12 } }, { @@ -52,6 +53,7 @@ "morale": 30, "melee_dice": 2, "melee_dice_sides": 2, + "stomach_size": 400, "melee_damage": [ { "damage_type": "stab", "amount": 6, "armor_penetration": 8 } ], "dodge": 2, "dissect": "dissect_cephalopod_sample_single", diff --git a/data/json/monsters/mammal.json b/data/json/monsters/mammal.json index 451c714e64a31..a4530cb8249e6 100644 --- a/data/json/monsters/mammal.json +++ b/data/json/monsters/mammal.json @@ -80,6 +80,7 @@ "melee_skill": 2, "melee_dice": 2, "melee_dice_sides": 3, + "stomach_size": 500, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 2, "harvest": "mammal_fur", @@ -112,6 +113,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 4 } ], "dodge": 3, "vision_day": 30, + "stomach_size": 3000, "vision_night": 10, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "HURT", "PLAYER_NEAR_BABY" ], @@ -123,8 +125,8 @@ "reproduction": { "baby_monster": "mon_bear_cub", "baby_count": 1, "baby_timer": 700 }, "//": "220 days gestation period, the mother and cubs remain together for 16-17 months.", "baby_flags": [ "SPRING" ], - "special_attacks": [ [ "EAT_FOOD", 20 ], { "type": "bite", "cooldown": 15, "infection_chance": 44 } ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "BASHES", "PUSH_MON", "CORNERED_FIGHTER" ], + "special_attacks": [ [ "EAT_FOOD", 20 ], { "type": "bite", "cooldown": 15, "infection_chance": 44 }, [ "BROWSE", 40 ] ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "BASHES", "PUSH_MON", "CORNERED_FIGHTER", "EATS" ], "armor": { "bash": 2, "electric": 1 } }, { @@ -180,6 +182,7 @@ "aggro_character": false, "melee_skill": 5, "melee_dice": 1, + "stomach_size": 30, "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 2, @@ -191,8 +194,8 @@ "path_settings": { "max_dist": 10 }, "anger_triggers": [ "PLAYER_WEAK" ], "fear_triggers": [ "PLAYER_CLOSE" ], - "special_attacks": [ [ "EAT_FOOD", 120 ] ], - "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ANIMAL", "STUMBLES", "PATH_AVOID_DANGER_1" ] + "special_attacks": [ [ "EAT_FOOD", 120 ], [ "BROWSE", 120 ] ], + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ANIMAL", "STUMBLES", "PATH_AVOID_DANGER_1", "EATS" ] }, { "id": "mon_lab_rat", @@ -218,6 +221,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 2, + "stomach_size": 30, "vision_day": 30, "vision_night": 15, "harvest": "rat_with_skull", @@ -225,13 +229,25 @@ "families": [ "prof_intro_biology", "prof_physiology" ], "path_settings": { "max_dist": 10 }, "fear_triggers": [ "PLAYER_CLOSE", "SOUND" ], - "special_attacks": [ [ "EAT_FOOD", 120 ] ], + "special_attacks": [ [ "EAT_FOOD", 120 ], [ "BROWSE", 120 ] ], "petfood": { "food": [ "DOGFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly.", "pet": "The %s lets out a happy squeak as you give its head a small scritch." }, - "flags": [ "SEES", "SMELLS", "HEARS", "KEENNOSE", "CANPLAY", "WARM", "SWIMS", "ANIMAL", "PATH_AVOID_DANGER_1", "CAN_BE_CULLED" ] + "flags": [ + "SEES", + "SMELLS", + "HEARS", + "KEENNOSE", + "CANPLAY", + "WARM", + "SWIMS", + "ANIMAL", + "PATH_AVOID_DANGER_1", + "CAN_BE_CULLED", + "EATS" + ] }, { "id": "mon_boar_wild_piglet", @@ -258,14 +274,15 @@ "melee_dice_sides": 2, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 4, + "stomach_size": 300, "harvest": "mammal_small_boar", "families": [ "prof_intro_biology", "prof_physiology" ], "path_settings": { "max_dist": 10 }, "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], "upgrades": { "age_grow": 38, "into": "mon_boar_wild" }, "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 7 }, - "special_attacks": [ [ "EAT_FOOD", 40 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] + "special_attacks": [ [ "EAT_FOOD", 40 ], [ "EAT_CARRION", 60 ] ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "EATS" ] }, { "id": "mon_boar_wild", @@ -292,6 +309,7 @@ "melee_dice_sides": 8, "melee_damage": [ { "damage_type": "cut", "amount": 5 } ], "dodge": 2, + "stomach_size": 1700, "harvest": "boar_with_skull", "families": [ "prof_intro_biology", "prof_physiology" ], "reproduction": { "baby_monster": "mon_boar_wild_piglet", "baby_count": 8, "baby_timer": 154 }, @@ -301,8 +319,19 @@ "anger_triggers": [ "PLAYER_WEAK", "FRIEND_ATTACKED", "HURT" ], "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], "zombify_into": "mon_zpig_brute", - "special_attacks": [ [ "EAT_FOOD", 20 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "PET_MOUNTABLE", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "CORNERED_FIGHTER" ], + "special_attacks": [ [ "EAT_FOOD", 20 ], [ "EAT_CARRION", 60 ] ], + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "PET_MOUNTABLE", + "ANIMAL", + "PATH_AVOID_DANGER_1", + "WARM", + "KEENNOSE", + "CORNERED_FIGHTER", + "EATS" + ], "armor": { "bash": 2, "cut": 1 } }, { @@ -370,7 +399,7 @@ "id": "mon_cat", "type": "MONSTER", "name": { "str": "shorthair cat" }, - "description": "A small domesticated predator gone feral in the absence of human stewardship. Harried by the elements and the rigors of survival, it is scruffy and skittish.", + "description": "In the absence of human stewardship, this small, domesticated predator has grown wary of humans. Harried by the elements and the rigors of survival, it has become very skittish but is still motivated by food.", "default_faction": "cat", "bodytype": "dog", "categories": [ "WILDLIFE" ], @@ -735,6 +764,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 2, + "stomach_size": 2000, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "HURT" ], "fear_triggers": [ "PLAYER_CLOSE" ], @@ -746,9 +776,9 @@ "families": [ "prof_intro_biology", "prof_physiology" ], "upgrades": { "age_grow": 180, "into": "mon_cow" }, "biosignature": { "biosig_item": "feces_cow", "biosig_timer": 7 }, - "special_attacks": [ [ "EAT_CROP", 60 ] ], + "special_attacks": [ [ "GRAZE", 20 ], [ "EAT_CROP", 60 ] ], "petfood": { "food": [ "CATTLEFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly." }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "PET_WONT_FOLLOW", "CAN_BE_CULLED" ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "PET_WONT_FOLLOW", "CAN_BE_CULLED", "EATS" ], "armor": { "bash": 2 } }, { @@ -775,6 +805,7 @@ "melee_dice_sides": 10, "melee_damage": [ { "damage_type": "cut", "amount": 6 } ], "dodge": 2, + "stomach_size": 6000, "starting_ammo": { "milk_raw": 40 }, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "HURT", "PLAYER_NEAR_BABY" ], @@ -787,7 +818,7 @@ "reproduction": { "baby_monster": "mon_cow_calf", "baby_count": 1, "baby_timer": 343 }, "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ], "biosignature": { "biosig_item": "feces_cow", "biosig_timer": 1 }, - "special_attacks": [ [ "EAT_CROP", 40 ] ], + "special_attacks": [ [ "GRAZE", 20 ], [ "EAT_CROP", 60 ] ], "petfood": { "food": [ "CATTLEFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly." }, "flags": [ "SEES", @@ -800,7 +831,8 @@ "PET_WONT_FOLLOW", "MILKABLE", "CAN_BE_CULLED", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ], "armor": { "bash": 2, "electric": 1 } }, @@ -824,16 +856,18 @@ "melee_skill": 6, "melee_dice": 2, "melee_dice_sides": 3, + "stomach_size": 250, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 3, "vision_night": 5, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "STALK", "FRIEND_ATTACKED", "PLAYER_WEAK", "HURT" ], + "special_attacks": [ [ "EAT_FOOD", 40 ] ], "fear_triggers": [ "SOUND" ], "harvest": "mammal_fur_canis", "dissect": "dissect_lupine_sample_single", "families": [ "prof_intro_biology", "prof_physiology" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE" ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "HIT_AND_RUN", "KEENNOSE", "EATS" ], "armor": { "bash": 1 } }, { @@ -859,13 +893,15 @@ "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 3, "vision_night": 5, + "stomach_size": 250, "harvest": "mammal_small_fur", "dissect": "dissect_lupine_sample_single", "families": [ "prof_intro_biology", "prof_physiology" ], "path_settings": { "max_dist": 10 }, "anger_triggers": [ "FRIEND_ATTACKED", "PLAYER_WEAK" ], + "special_attacks": [ [ "EAT_FOOD", 40 ] ], "fear_triggers": [ "SOUND" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "EATS" ], "armor": { "bash": 1 } }, { @@ -924,6 +960,7 @@ "melee_dice_sides": 3, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 3, + "stomach_size": 400, "vision_night": 12, "harvest": "deer_with_skull", "dissect": "dissect_cattle_sample_single", @@ -935,8 +972,8 @@ "//": " 201 days gestation period. The fawn will stay with its mother for approximately one year, suckling for three to four months.", "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 12 }, "baby_flags": [ "SPRING", "SUMMER" ], - "special_attacks": [ [ "EAT_CROP", 60 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM" ] + "special_attacks": [ [ "EAT_CROP", 60 ], [ "GRAZE", 60 ] ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "EATS" ] }, { "id": "mon_dog", @@ -964,6 +1001,7 @@ "melee_dice_sides": 3, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "dodge": 3, + "stomach_size": 250, "vision_night": 5, "zombify_into": "mon_zombie_dog", "death_drops": "mon_dog_death_drops", @@ -995,7 +1033,8 @@ "SMELLS", "SWARMS", "WARM", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { @@ -1016,6 +1055,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 1, + "stomach_size": 150, "vision_night": 4, "harvest": "dog_small_with_skull", "upgrades": { "age_grow": 42, "into": "mon_dog" }, @@ -1035,6 +1075,7 @@ "melee_skill": 4, "melee_dice_sides": 2, "melee_damage": [ { "damage_type": "cut", "amount": 6 } ], + "special_attacks": [ [ "EAT_FOOD", 100 ] ], "vision_night": 4, "harvest": "dog_with_skull_leather", "reproduction": { "baby_monster": "mon_dog_bull_pup", "baby_count": 7, "baby_timer": 300 }, @@ -1057,7 +1098,8 @@ "SEES", "SMELLS", "WARM", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { @@ -1082,6 +1124,7 @@ "melee_dice": 1, "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], + "stomach_size": 150, "vision_night": 3, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "dog_small_with_skull", @@ -1104,7 +1147,8 @@ "PATH_AVOID_DANGER_1", "SEES", "SMELLS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1170,6 +1214,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "dodge": 1, + "stomach_size": 150, "vision_night": 4, "families": [ "prof_intro_biology", "prof_physiology" ], "path_settings": { "max_dist": 10 }, @@ -1192,7 +1237,8 @@ "PATH_AVOID_DANGER_1", "SEES", "SMELLS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1208,6 +1254,7 @@ "melee_skill": 2, "melee_dice": 1, "melee_dice_sides": 1, + "stomach_size": 115, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "delete": { "zombify_into": "mon_zombie_dog" }, "fear_triggers": [ "HURT" ], @@ -1234,7 +1281,8 @@ "SMELLS", "SWARMS", "WARM", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { @@ -1260,6 +1308,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 1, + "stomach_size": 100, "vision_night": 4, "harvest": "dog_tiny_with_skull", "families": [ "prof_intro_biology", "prof_physiology" ], @@ -1285,7 +1334,8 @@ "SEES", "SMELLS", "SWARMS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1323,7 +1373,8 @@ "SEES", "SMELLS", "WARM", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { @@ -1349,6 +1400,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 2, + "stomach_size": 100, "vision_night": 4, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "dog_small_with_skull", @@ -1372,7 +1424,8 @@ "PATH_AVOID_DANGER_1", "SEES", "SMELLS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1418,6 +1471,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 1, + "stomach_size": 150, "vision_night": 3, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "dog_small_with_skull", @@ -1444,7 +1498,8 @@ "SEES", "SMELLS", "SWARMS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1462,6 +1517,7 @@ "melee_skill": 3, "melee_dice_sides": 2, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], + "stomach_size": 115, "vision_night": 6, "harvest": "dog_tiny_with_skull", "fear_triggers": [ "HURT" ], @@ -1485,7 +1541,8 @@ "PATH_AVOID_DANGER_1", "SEES", "SMELLS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1511,6 +1568,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 1, + "stomach_size": 100, "vision_night": 5, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "mammal_tiny", @@ -1535,7 +1593,8 @@ "PATH_AVOID_DANGER_1", "SEES", "SMELLS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1551,6 +1610,7 @@ "morale": 10, "melee_skill": 3, "melee_dice_sides": 2, + "stomach_size": 115, "vision_night": 6, "fear_triggers": [ "HURT" ], "harvest": "dog_small_with_skull_leather", @@ -1576,7 +1636,8 @@ "SEES", "SMELLS", "STUMBLES", - "WARM" + "WARM", + "EATS" ] }, { @@ -1602,6 +1663,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 1, + "stomach_size": 100, "vision_night": 5, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "dog_tiny_with_skull", @@ -1627,7 +1689,8 @@ "SEES", "SMELLS", "STUMBLES", - "WARM" + "WARM", + "EATS" ] }, { @@ -1663,7 +1726,8 @@ "SEES", "SMELLS", "WARM", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { @@ -1689,6 +1753,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "dodge": 1, + "stomach_size": 150, "vision_night": 5, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "dog_small_with_skull", @@ -1712,7 +1777,8 @@ "PATH_AVOID_DANGER_1", "SEES", "SMELLS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1733,6 +1799,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 5 } ], "dodge": 2, "vision_night": 6, + "stomach_size": 650, "harvest": "mammal_fur_canis", "reproduction": { "baby_monster": "mon_dog_gpyrenees_pup", "baby_count": 7, "baby_timer": 320 }, "//2": "1-7 puppies & 300-320 days per-litter for size medium canines", @@ -1754,7 +1821,8 @@ "SEES", "SMELLS", "WARM", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { @@ -1780,6 +1848,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "dodge": 1, + "stomach_size": 200, "vision_night": 5, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "dog_small_with_skull", @@ -1804,7 +1873,8 @@ "PATH_AVOID_DANGER_1", "SEES", "SMELLS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1824,6 +1894,7 @@ "melee_dice_sides": 2, "melee_damage": [ { "damage_type": "cut", "amount": 6 } ], "vision_night": 6, + "stomach_size": 650, "harvest": "dog_with_skull_leather", "extend": { "special_attacks": [ [ "LUNGE", 5 ] ] }, "reproduction": { "baby_monster": "mon_dog_rottweiler_pup", "baby_count": 7, "baby_timer": 300 }, @@ -1846,7 +1917,8 @@ "SEES", "SMELLS", "WARM", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { @@ -1872,6 +1944,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "dodge": 1, + "stomach_size": 200, "vision_night": 5, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "dog_small_with_skull", @@ -1895,7 +1968,8 @@ "PATH_AVOID_DANGER_1", "SEES", "SMELLS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1935,7 +2009,8 @@ "SEES", "SMELLS", "WARM", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { @@ -1961,6 +2036,7 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "dodge": 2, + "stomach_size": 150, "vision_night": 5, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "dog_small_with_skull", @@ -1984,7 +2060,8 @@ "PATH_AVOID_DANGER_1", "SEES", "SMELLS", - "WARM" + "WARM", + "EATS" ] }, { @@ -1997,6 +2074,7 @@ "weight": "24 kg", "morale": 10, "aggression": -20, + "stomach_size": 650, "reproduction": { "baby_monster": "mon_dog_samoyed_pup", "baby_count": 4, "baby_timer": 270 }, "//": "1-4 puppies & 270 days per-litter for size small canines", "delete": { "flags": [ "GROUP_MORALE", "SWARMS" ] } @@ -2008,6 +2086,7 @@ "name": { "str": "Samoyed puppy", "str_pl": "Samoyed puppies" }, "description": "An adorable, defenseless Samoyed puppy. Much safer to tame than an adult dog.", "aggression": -30, + "stomach_size": 200, "upgrades": { "age_grow": 42, "into": "mon_dog_samoyed" }, "extend": { "flags": [ "NO_BREED" ] } }, @@ -2100,8 +2179,10 @@ "harvest": "mammal_small_fur", "dissect": "dissect_mouse_sample_single", "families": [ "prof_intro_biology", "prof_physiology" ], + "stomach_size": 30, + "special_attacks": [ [ "GRAZE", 100 ] ], "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], - "flags": [ "SEES", "HEARS", "GOODHEARING", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM" ] + "flags": [ "SEES", "HEARS", "GOODHEARING", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "EATS" ] }, { "id": "mon_hare", @@ -2147,6 +2228,7 @@ "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 2, + "stomach_size": 2750, "anger_triggers": [ "FRIEND_ATTACKED" ], "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], "placate_triggers": [ "PLAYER_WEAK" ], @@ -2154,9 +2236,20 @@ "families": [ "prof_intro_biology", "prof_physiology" ], "upgrades": { "age_grow": 450, "into": "mon_horse" }, "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 10 }, - "special_attacks": [ [ "EAT_CROP", 100 ] ], + "special_attacks": [ [ "EAT_CROP", 100 ], [ "GRAZE", 50 ] ], "petfood": { "food": [ "CATTLEFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly." }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PET_WONT_FOLLOW", "PATH_AVOID_DANGER_1", "WARM", "NO_BREED", "CAN_BE_CULLED" ], + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "ANIMAL", + "PET_WONT_FOLLOW", + "PATH_AVOID_DANGER_1", + "WARM", + "NO_BREED", + "CAN_BE_CULLED", + "EATS" + ], "armor": { "bash": 2, "electric": 1 } }, { @@ -2184,6 +2277,7 @@ "melee_dice_sides": 12, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 2, + "stomach_size": 11000, "anger_triggers": [ "FRIEND_ATTACKED" ], "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], "placate_triggers": [ "PLAYER_WEAK" ], @@ -2193,10 +2287,21 @@ "reproduction": { "baby_monster": "mon_horse_foal", "baby_count": 1, "baby_timer": 360 }, "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ], "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 2 }, - "special_attacks": [ [ "EAT_CROP", 60 ] ], + "special_attacks": [ [ "EAT_CROP", 100 ], [ "GRAZE", 50 ] ], "zombify_into": "mon_zombie_horse", "petfood": { "food": [ "CATTLEFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly." }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PET_WONT_FOLLOW", "PET_MOUNTABLE", "PATH_AVOID_DANGER_1", "WARM", "MILKABLE" ], + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "ANIMAL", + "PET_WONT_FOLLOW", + "PET_MOUNTABLE", + "PATH_AVOID_DANGER_1", + "WARM", + "MILKABLE", + "EATS" + ], "armor": { "bash": 2, "electric": 1 } }, { @@ -2232,9 +2337,10 @@ "dodge": 2, "harvest": "mammal_tiny", "dissect": "dissect_mouse_sample_single", + "special_attacks": [ [ "GRAZE", 50 ] ], "families": [ "prof_intro_biology", "prof_physiology" ], "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], - "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ANIMAL", "PATH_AVOID_DANGER_1" ] + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ANIMAL", "PATH_AVOID_DANGER_1", "EATS" ] }, { "id": "mon_mink", @@ -2288,6 +2394,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 1, + "stomach_size": 8000, "vision_night": 7, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "HURT", "MATING_SEASON" ], @@ -2299,8 +2406,8 @@ "dissect": "dissect_cattle_sample_large", "families": [ "prof_intro_biology", "prof_physiology" ], "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 8 }, - "special_attacks": [ [ "EAT_CROP", 60 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "PET_MOUNTABLE", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CORNERED_FIGHTER" ], + "special_attacks": [ [ "EAT_CROP", 60 ], [ "GRAZE", 50 ] ], + "flags": [ "SEES", "HEARS", "SMELLS", "PET_MOUNTABLE", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CORNERED_FIGHTER", "EATS" ], "armor": { "bash": 4, "cut": 1, "bullet": 1, "electric": 1 } }, { @@ -2327,6 +2434,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 2, + "stomach_size": 2000, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "HURT" ], "fear_triggers": [ "PLAYER_CLOSE" ], @@ -2336,8 +2444,8 @@ "families": [ "prof_intro_biology", "prof_physiology" ], "upgrades": { "age_grow": 180, "into": "mon_moose" }, "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 7 }, - "special_attacks": [ [ "EAT_CROP", 60 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "PET_WONT_FOLLOW" ], + "special_attacks": [ [ "EAT_CROP", 60 ], [ "GRAZE", 50 ] ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "PET_WONT_FOLLOW", "EATS" ], "armor": { "bash": 2 } }, { @@ -2363,8 +2471,9 @@ "melee_dice": 5, "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 5 } ], - "special_attacks": [ { "id": "smash", "throw_strength": 72 } ], + "special_attacks": [ { "id": "smash", "throw_strength": 72 }, [ "EAT_CROP", 60 ], [ "GRAZE", 50 ] ], "dodge": 1, + "stomach_size": 9000, "vision_night": 7, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "HURT", "MATING_SEASON", "PLAYER_CLOSE" ], @@ -2375,7 +2484,7 @@ "dissect": "dissect_cattle_sample_large", "families": [ "prof_intro_biology", "prof_physiology" ], "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 8 }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CORNERED_FIGHTER" ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CORNERED_FIGHTER", "EATS" ], "armor": { "bash": 14, "cut": 1, "bullet": 10, "electric": 1 } }, { @@ -2402,6 +2511,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 2, + "stomach_size": 2500, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "HURT" ], "fear_triggers": [ "PLAYER_CLOSE" ], @@ -2412,8 +2522,8 @@ "upgrades": { "age_grow": 120, "into": "mon_tusked_moose" }, "//": "Baby mutant moose need to grow quicker to be able to survive in the world after the cataclysm.", "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 7 }, - "special_attacks": [ [ "EAT_CROP", 60 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "PET_WONT_FOLLOW" ], + "special_attacks": [ [ "EAT_CROP", 60 ], [ "GRAZE", 50 ] ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "PET_WONT_FOLLOW", "EATS" ], "armor": { "bash": 2 } }, { @@ -2468,11 +2578,13 @@ "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 2, "vision_night": 5, + "stomach_size": 50, + "special_attacks": [ [ "BROWSE", 150 ] ], "harvest": "opossum_with_skull", "families": [ "prof_intro_biology", "prof_physiology" ], "anger_triggers": [ "FRIEND_ATTACKED", "HURT" ], "fear_triggers": [ "PLAYER_CLOSE" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CLIMBS", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CLIMBS", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "EATS" ] }, { "id": "mon_otter", @@ -2525,6 +2637,7 @@ "melee_dice_sides": 2, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 4, + "stomach_size": 300, "harvest": "mammal_small_pig", "families": [ "prof_intro_biology", "prof_physiology" ], "path_settings": { "max_dist": 10 }, @@ -2533,7 +2646,18 @@ "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 7 }, "special_attacks": [ [ "EAT_FOOD", 40 ] ], "petfood": { "food": [ "CATTLEFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly." }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "PET_WONT_FOLLOW", "WARM", "KEENNOSE", "CAN_BE_CULLED" ] + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "ANIMAL", + "PATH_AVOID_DANGER_1", + "PET_WONT_FOLLOW", + "WARM", + "KEENNOSE", + "CAN_BE_CULLED", + "EATS" + ] }, { "id": "mon_pig", @@ -2559,6 +2683,7 @@ "melee_dice_sides": 8, "melee_damage": [ { "damage_type": "cut", "amount": 4 } ], "dodge": 2, + "stomach_size": 1700, "harvest": "pig_with_skull", "families": [ "prof_intro_biology", "prof_physiology" ], "reproduction": { "baby_monster": "mon_pig_piglet", "baby_count": 8, "baby_timer": 154 }, @@ -2580,7 +2705,8 @@ "WARM", "KEENNOSE", "CAN_BE_CULLED", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { @@ -2604,6 +2730,8 @@ "morale": -7, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 6, + "stomach_size": 100, + "special_attacks": [ [ "EAT_CROP", 60 ], [ "GRAZE", 50 ] ], "harvest": "rabbit_with_skull", "dissect": "dissect_rabbit_sample_single", "families": [ "prof_intro_biology", "prof_physiology" ], @@ -2617,7 +2745,8 @@ "PET_WONT_FOLLOW", "WARM", "CAN_BE_CULLED", - "GOODHEARING" + "GOODHEARING", + "EATS" ] }, { @@ -2631,6 +2760,7 @@ "speed": 125, "attack_cost": 125, "dodge": 8, + "stomach_size": 25, "harvest": "mammal_tiny" }, { @@ -2696,8 +2826,10 @@ "harvest": "raccoon_with_skull", "families": [ "prof_intro_biology", "prof_physiology" ], "vision_night": 5, + "stomach_size": 200, + "special_attacks": [ [ "EAT_FOOD", 60 ], [ "BROWSE", 50 ], [ "EAT_CARRION", 60 ] ], "anger_triggers": [ "FRIEND_ATTACKED", "HURT" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CLIMBS", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "CLIMBS", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "EATS" ] }, { "id": "mon_sewer_rat", @@ -2725,13 +2857,15 @@ "dodge": 2, "vision_day": 1, "vision_night": 30, + "stomach_size": 30, "harvest": "rat_with_skull", "dissect": "dissect_rat_sample_single", "families": [ "prof_intro_biology", "prof_physiology" ], + "special_attacks": [ [ "EAT_FOOD", 60 ], [ "BROWSE", 50 ], [ "EAT_CARRION", 60 ] ], "upgrades": { "half_life": 42, "into_group": "GROUP_RATKIN_EVOLVED" }, "path_settings": { "max_dist": 10 }, "anger_triggers": [ "PLAYER_WEAK", "FRIEND_ATTACKED", "FRIEND_DIED" ], - "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ANIMAL", "PATH_AVOID_DANGER_1", "STUMBLES" ] + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ANIMAL", "PATH_AVOID_DANGER_1", "STUMBLES", "EATS" ] }, { "id": "mon_sheep_lamb", @@ -2756,14 +2890,16 @@ "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 2, "anger_triggers": [ ], + "stomach_size": 250, "harvest": "mammal_small_wool", "families": [ "prof_intro_biology", "prof_physiology" ], "fear_triggers": [ "SOUND", "PLAYER_CLOSE", "FRIEND_ATTACKED" ], "placate_triggers": [ "PLAYER_WEAK" ], + "special_attacks": [ [ "GRAZE", 60 ], [ "EAT_CROP", 120 ] ], "upgrades": { "age_grow": 240, "into": "mon_sheep" }, "//": "Puberty reached in 6-9 months.", "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 7 }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CAN_BE_CULLED" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CAN_BE_CULLED", "EATS" ] }, { "id": "mon_sheep", @@ -2786,6 +2922,7 @@ "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 2, + "stomach_size": 550, "starting_ammo": { "milk_raw": 5 }, "anger_triggers": [ ], "shearing": [ { "result": "wool_staple", "amount": 22 } ], @@ -2797,10 +2934,21 @@ "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 3 }, "fear_triggers": [ "SOUND", "PLAYER_CLOSE", "FRIEND_ATTACKED" ], "placate_triggers": [ "PLAYER_WEAK" ], - "special_attacks": [ [ "EAT_CROP", 120 ] ], + "special_attacks": [ [ "EAT_CROP", 120 ], [ "GRAZE", 60 ] ], "zombify_into": "mon_zombie_sheep", "petfood": { "food": [ "CATTLEFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly." }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "PET_WONT_FOLLOW", "MILKABLE", "CAN_BE_CULLED" ] + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "ANIMAL", + "PATH_AVOID_DANGER_1", + "WARM", + "PET_WONT_FOLLOW", + "MILKABLE", + "CAN_BE_CULLED", + "EATS" + ] }, { "id": "mon_goat_kid", @@ -2832,7 +2980,7 @@ "reproduction": { "baby_monster": "mon_goat_kid", "baby_count": 1, "baby_timer": 275 }, "//": "Timer copied from sheep", "baby_flags": [ "SPRING" ], - "special_attacks": [ [ "EAT_CROP", 100 ] ], + "special_attacks": [ [ "EAT_CROP", 100 ], [ "GRAZE", 60 ] ], "zombify_into": "mon_zombie_goat", "flags": [ "SEES", @@ -2844,7 +2992,8 @@ "PET_WONT_FOLLOW", "MILKABLE", "CLIMBS", - "CAN_BE_CULLED" + "CAN_BE_CULLED", + "EATS" ] }, { @@ -2869,11 +3018,13 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 4, + "stomach_size": 30, "harvest": "rat_with_skull", "dissect": "dissect_mouse_sample_single", "families": [ "prof_intro_biology", "prof_physiology" ], + "special_attacks": [ [ "BROWSE", 120 ] ], "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "STUMBLES", "WARM" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "STUMBLES", "WARM", "EATS" ] }, { "id": "mon_squirrel_red", @@ -2898,11 +3049,13 @@ "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 3, + "stomach_size": 30, + "special_attacks": [ [ "BROWSE", 120 ] ], "harvest": "rat_with_skull", "dissect": "dissect_mouse_sample_single", "families": [ "prof_intro_biology", "prof_physiology" ], "fear_triggers": [ "SOUND", "PLAYER_CLOSE" ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "STUMBLES", "WARM" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "STUMBLES", "WARM", "EATS" ] }, { "id": "mon_weasel", @@ -3017,6 +3170,7 @@ "melee_dice_sides": 3, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 5, + "stomach_size": 450, "vision_night": 13, "harvest": "deer_with_skull", "dissect": "dissect_cattle_sample_small", @@ -3028,8 +3182,8 @@ "reproduction": { "baby_monster": "mon_reindeer_fawn", "baby_count": 5, "baby_timer": 340 }, "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 12 }, "baby_flags": [ "WINTER", "AUTUMN" ], - "special_attacks": [ [ "EAT_CROP", 60 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CORNERED_FIGHTER" ], + "special_attacks": [ [ "EAT_CROP", 60 ], [ "GRAZE", 60 ] ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "CORNERED_FIGHTER", "EATS" ], "armor": { "electric": 1 } }, { @@ -3045,11 +3199,12 @@ "symbol": "r", "morale": 42, "melee_dice_sides": 4, + "stomach_size": 200, "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "dodge": 4, "harvest": "mammal_fur", "dissect": "dissect_cattle_sample_single", - "special_attacks": [ [ "EAT_FOOD", 60 ] ], + "special_attacks": [ [ "EAT_CROP", 60 ], [ "GRAZE", 60 ] ], "upgrades": { "age_grow": 500, "into": "mon_reindeer" } }, { @@ -3075,14 +3230,16 @@ "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 2, "anger_triggers": [ ], + "stomach_size": 200, "harvest": "mammal_small_wool", "families": [ "prof_intro_biology", "prof_physiology" ], "fear_triggers": [ "SOUND", "PLAYER_CLOSE", "FRIEND_ATTACKED" ], "placate_triggers": [ "PLAYER_WEAK" ], "upgrades": { "age_grow": 240, "into": "mon_llama" }, + "special_attacks": [ [ "EAT_CROP", 150 ], [ "GRAZE", 150 ] ], "//": "Puberty reached in 6-9 months, copied from lamb but it probably applies the same on llamas.", "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 7 }, - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM" ] + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "EATS" ] }, { "id": "mon_llama", @@ -3106,6 +3263,7 @@ "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 2, + "stomach_size": 400, "starting_ammo": { "milk_raw": 5 }, "anger_triggers": [ ], "shearing": [ { "result": "wool_staple", "amount": 22 } ], @@ -3117,7 +3275,7 @@ "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 3 }, "fear_triggers": [ "SOUND", "PLAYER_CLOSE", "FRIEND_ATTACKED" ], "placate_triggers": [ "PLAYER_WEAK" ], - "special_attacks": [ [ "EAT_CROP", 120 ] ], + "special_attacks": [ [ "EAT_CROP", 120 ], [ "GRAZE", 60 ] ], "petfood": { "food": [ "CATTLEFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly." }, "flags": [ "SEES", @@ -3129,7 +3287,8 @@ "PET_WONT_FOLLOW", "MILKABLE", "CAN_BE_CULLED", - "CORNERED_FIGHTER" + "CORNERED_FIGHTER", + "EATS" ] }, { diff --git a/data/json/monsters/mollusk.json b/data/json/monsters/mollusk.json index 1b47f2ba43fe1..f0d272b4f2a2c 100644 --- a/data/json/monsters/mollusk.json +++ b/data/json/monsters/mollusk.json @@ -53,9 +53,11 @@ "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug" ], "harvest": "mutant_mollusk", "dissect": "dissect_gastropod_sample_single", + "stomach_size": 100, + "special_attacks": [ [ "BROWSE", 130 ], [ "EAT_CROP", 130 ] ], "upgrades": { "half_life": 14, "into": "mon_snail_small" }, "fear_triggers": [ "PLAYER_CLOSE" ], - "flags": [ "SEES", "SMELLS" ] + "flags": [ "SEES", "SMELLS", "EATS" ] }, { "id": "mon_snail_small", @@ -67,6 +69,7 @@ "weight": "81500 g", "harvest": "mutant_mollusk", "dissect": "dissect_gastropod_sample_single", + "stomach_size": 800, "proportional": { "hp": 0.4, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "zombify_into": "mon_meat_cocoon_small", "upgrades": { "half_life": 14, "into": "mon_snail_giant" } @@ -117,10 +120,11 @@ "dissect": "dissect_gastropod_sample_small", "reproduction": { "baby_egg": "egg_snail", "baby_count": 3, "baby_timer": 15 }, "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ], - "special_attacks": [ [ "ACID", 10 ] ], + "stomach_size": 1000, + "special_attacks": [ [ "ACID", 10 ], [ "GRAZE", 130 ], [ "BROWSE", 130 ], [ "EAT_CROP", 130 ] ], "anger_triggers": [ "HURT" ], "zombify_into": "mon_meat_cocoon_med", - "flags": [ "SEES", "SMELLS", "BASHES", "ACIDPROOF", "ACIDTRAIL" ], + "flags": [ "SEES", "SMELLS", "BASHES", "ACIDPROOF", "ACIDTRAIL", "EATS" ], "armor": { "bash": 2, "cut": 8, "bullet": 5, "electric": 3 } }, { @@ -146,11 +150,13 @@ "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "luminance": 0, "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug" ], + "stomach_size": 100, + "special_attacks": [ [ "BROWSE", 130 ], [ "EAT_CROP", 130 ] ], "harvest": "mutant_mollusk", "dissect": "dissect_gastropod_sample_single", "upgrades": { "half_life": 14, "into": "mon_slug_small" }, "fear_triggers": [ "PLAYER_CLOSE" ], - "flags": [ "SEES", "SMELLS" ] + "flags": [ "SEES", "SMELLS", "EATS" ] }, { "id": "mon_slug_small", @@ -162,6 +168,7 @@ "weight": "81500 g", "harvest": "mutant_mollusk", "dissect": "dissect_gastropod_sample_single", + "stomach_size": 700, "proportional": { "hp": 0.4, "speed": 1.1, "morale": 0.67, "melee_dice_sides": 0.67 }, "zombify_into": "mon_meat_cocoon_small", "upgrades": { "half_life": 14, "into": "mon_slug_giant" } @@ -207,15 +214,16 @@ "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "bleed_rate": 60, "vision_day": 30, + "stomach_size": 1000, "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug" ], "harvest": "mutant_mollusk", "dissect": "dissect_gastropod_sample_small", "reproduction": { "baby_egg": "egg_slug", "baby_count": 3, "baby_timer": 15 }, "baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ], - "special_attacks": [ [ "ACID", 10 ] ], + "special_attacks": [ [ "ACID", 10 ], [ "GRAZE", 130 ], [ "BROWSE", 130 ], [ "EAT_CROP", 130 ] ], "anger_triggers": [ "PLAYER_CLOSE" ], "zombify_into": "mon_meat_cocoon_med", - "flags": [ "SEES", "SMELLS", "BASHES", "ACIDPROOF", "ACIDTRAIL" ], + "flags": [ "SEES", "SMELLS", "BASHES", "ACIDPROOF", "ACIDTRAIL", "EATS" ], "armor": { "bash": 8, "cut": 2, "bullet": 2, "electric": 3 } }, { diff --git a/data/json/monsters/mutant.json b/data/json/monsters/mutant.json index 6a5166e99529a..74c3d3937e08a 100644 --- a/data/json/monsters/mutant.json +++ b/data/json/monsters/mutant.json @@ -35,17 +35,21 @@ "cooldown": 10, "damage_max_instance": [ { "damage_type": "stab", "amount": 12, "armor_multiplier": 0.7 } ] }, - { "id": "scratch", "max_mul": 1.5 } + { "id": "scratch", "max_mul": 1.5 }, + [ "EAT_CARRION", 120 ], + [ "EAT_FOOD", 120 ], + [ "BROWSE", 120 ] ], "path_settings": { "max_dist": 50, "avoid_traps": true, "avoid_sharp": true }, "anger_triggers": [ "PLAYER_WEAK", "PLAYER_CLOSE", "HOSTILE_SEEN", "SOUND" ], "fear_triggers": [ "HURT", "FIRE" ], + "stomach_size": 1300, "death_drops": "mon_mutant_experimental_death_drops", "upgrades": { "half_life": 36, "into_group": "GROUP_MUTANT_EVOLVED" }, "regenerates": 1, "regen_morale": true, "zombify_into": "mon_meat_cocoon_small", - "flags": [ "SEES", "HEARS", "SMELLS", "HAS_MIND", "CAN_OPEN_DOORS", "WARM", "BASHES" ], + "flags": [ "SEES", "HEARS", "SMELLS", "HAS_MIND", "CAN_OPEN_DOORS", "WARM", "BASHES", "EATS" ], "armor": { "bash": 5, "cut": 5, "bullet": 4, "electric": 1 } }, { @@ -72,6 +76,7 @@ "bleed_rate": 50, "vision_night": 15, "dissect": "dissect_ursine_sample_large", + "stomach_size": 1800, "special_attacks": [ { "id": "scratch", "move_cost": 110, "cooldown": 4, "min_mul": 1.5, "max_mul": 3.5 }, { "id": "smash", "move_cost": 110, "cooldown": 8, "min_mul": 0.8, "throw_strength": 50 }, @@ -80,7 +85,10 @@ "cooldown": 10, "damage_max_instance": [ { "damage_type": "stab", "amount": 18, "armor_multiplier": 0.7 } ] }, - { "id": "impale", "move_cost": 110, "cooldown": 12, "min_mul": 1.5, "max_mul": 3 } + { "id": "impale", "move_cost": 110, "cooldown": 12, "min_mul": 1.5, "max_mul": 3 }, + [ "EAT_CARRION", 120 ], + [ "EAT_FOOD", 120 ], + [ "BROWSE", 120 ] ], "death_drops": "mon_mutant_evolved_death_drops", "regenerates": 3, @@ -113,11 +121,12 @@ "melee_skill": 6, "melee_dice": 4, "melee_dice_sides": 3, - "special_attacks": [ { "id": "mutant_antler" }, { "id": "mutant_hoof" } ], + "special_attacks": [ { "id": "mutant_antler" }, { "id": "mutant_hoof" }, [ "GRAZE", 120 ], [ "BROWSE", 120 ] ], "dodge": 6, "bleed_rate": 70, "vision_day": 25, "vision_night": 8, + "stomach_size": 1500, "path_settings": { "max_dist": 50, "avoid_traps": true, "avoid_sharp": true }, "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "mutant_human", @@ -136,7 +145,8 @@ "BASHES", "GROUP_BASH", "HIT_AND_RUN", - "PATH_AVOID_DANGER_1" + "PATH_AVOID_DANGER_1", + "EATS" ], "armor": { "bash": 10, "cut": 11, "stab": 8, "bullet": 5, "electric": 2 } }, @@ -169,11 +179,13 @@ "min_mul": 0.8, "max_mul": 1.1, "infection_chance": 2 - } + }, + [ "EAT_CARRION", 120 ] ], "dodge": 7, "bleed_rate": 50, "vision_night": 20, + "stomach_size": 1000, "weakpoint_sets": [ "wps_arthropod" ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug" ], "harvest": "mutant_human", @@ -199,6 +211,7 @@ "attack_cost": 115, "aggression": 35, "morale": 40, + "stomach_size": 1300, "special_attacks": [ { "id": "scratch", "move_cost": 115, "cooldown": 4, "min_mul": 1.5, "max_mul": 2.5 }, { "type": "leap", "move_cost": 0, "cooldown": 5, "min_range": 2, "max_range": 8 }, @@ -210,7 +223,8 @@ "min_mul": 0.8, "max_mul": 1.1, "infection_chance": 10 - } + }, + [ "EAT_FOOD", 120 ] ], "dodge": 9, "vision_night": 15, @@ -251,7 +265,7 @@ "dissect": "dissect_alpha_sample_large", "zombify_into": "mon_zombie_scientist", "extend": { "flags": [ "CAN_OPEN_DOORS", "KEEP_DISTANCE" ], "anger_triggers": [ "PLAYER_WEAK", "HURT", "FRIEND_DIED" ] }, - "delete": { "flags": [ "HIT_AND_RUN", "BASHES", "GROUP_BASH" ] }, + "delete": { "flags": [ "HIT_AND_RUN", "BASHES", "GROUP_BASH", "EATS" ] }, "armor": { "electric": 2, "bash": 3, "cut": 3, "stab": 1, "bullet": 0 } }, { @@ -297,11 +311,13 @@ { "id": "ranged_pull", "range": 4, "cooldown": 10 }, { "id": "tentacle", "move_cost": 60, "range": 4, "no_adjacent": true }, { "id": "grab_drag", "cooldown": 15, "grab_data": { "drag_deviation": 1, "drag_movecost_mod": 0.2 } }, - { "id": "drag_followup", "grab_data": { "drag_deviation": 1, "drag_movecost_mod": 0.2 } } + { "id": "drag_followup", "grab_data": { "drag_deviation": 1, "drag_movecost_mod": 0.2 } }, + [ "EAT_FOOD", 120 ] ], "dodge": 1, "weakpoint_sets": [ "wps_arthropod" ], "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_basic_bug" ], + "stomach_size": 1100, "harvest": "mutant_human", "dissect": "dissect_gastropod_sample_large", "zombify_into": "mon_meat_cocoon_large", diff --git a/data/json/monsters/mutant_mammal.json b/data/json/monsters/mutant_mammal.json index 831813793f81a..2f6b9ffe02c04 100644 --- a/data/json/monsters/mutant_mammal.json +++ b/data/json/monsters/mutant_mammal.json @@ -27,12 +27,15 @@ "vision_day": 30, "vision_night": 10, "path_settings": { "max_dist": 10 }, + "stomach_size": 4000, "special_attacks": [ { "type": "bite", "cooldown": 10, "damage_max_instance": [ { "damage_type": "stab", "amount": 12, "armor_penetration": 8 } ] - } + }, + [ "EAT_FOOD", 60 ], + [ "BROWSE", 60 ] ], "anger_triggers": [ "HURT", "PLAYER_CLOSE" ], "fear_triggers": [ "SOUND" ], @@ -40,7 +43,19 @@ "dissect": "dissect_ursine_sample_small", "families": [ "prof_intro_biology", "prof_physiology" ], "zombify_into": "mon_meat_cocoon_med", - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "BASHES", "PUSH_MON", "STUMBLES", "KEENNOSE" ], + "flags": [ + "SEES", + "HEARS", + "SMELLS", + "ANIMAL", + "PATH_AVOID_DANGER_1", + "WARM", + "BASHES", + "PUSH_MON", + "STUMBLES", + "KEENNOSE", + "EATS" + ], "armor": { "bash": 8, "cut": 12, "electric": 1 } }, { @@ -139,8 +154,10 @@ "attack_upper": false, "cooldown": 5, "damage_max_instance": [ { "damage_type": "stab", "amount": 10, "armor_penetration": 10 } ] - } + }, + [ "EAT_FOOD", 60 ] ], + "stomach_size": 500, "harvest": "mutant_mammal_fur", "dissect": "dissect_lupine_sample_single", "families": [ "prof_intro_biology", "prof_physiology" ], @@ -148,7 +165,7 @@ "anger_triggers": [ "FRIEND_ATTACKED", "PLAYER_WEAK" ], "fear_triggers": [ "SOUND" ], "zombify_into": "mon_meat_cocoon_tiny", - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "GROUP_MORALE" ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "GROUP_MORALE", "EATS" ], "armor": { "bash": 1 } }, { @@ -183,6 +200,7 @@ "dissect": "dissect_lupine_sample_single", "families": [ "prof_intro_biology", "prof_physiology" ], "zombify_into": "mon_meat_cocoon_tiny", + "special_attacks": [ [ "EAT_FOOD", 60 ], [ "EAT_CARRION", 60 ] ], "flags": [ "SEES", "HEARS", @@ -193,7 +211,8 @@ "HIT_AND_RUN", "KEENNOSE", "BADVENOM", - "GROUP_MORALE" + "GROUP_MORALE", + "EATS" ], "armor": { "bash": 1 } }, @@ -224,6 +243,7 @@ "bleed_rate": 60, "vision_day": 50, "vision_night": 5, + "stomach_size": 1500, "harvest": "mutant_mammal_large_fur", "dissect": "dissect_lupine_sample_large", "families": [ "prof_intro_biology", "prof_physiology" ], @@ -233,11 +253,12 @@ "type": "bite", "cooldown": 5, "damage_max_instance": [ { "damage_type": "stab", "amount": 15, "armor_penetration": 10 } ] - } + }, + [ "EAT_FOOD", 60 ] ], "anger_triggers": [ "STALK", "FRIEND_ATTACKED", "FRIEND_DIED", "PLAYER_WEAK", "PLAYER_CLOSE" ], "zombify_into": "mon_meat_cocoon_large", - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE" ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "KEENNOSE", "EATS" ], "armor": { "bash": 8, "cut": 10, "electric": 1 } }, { @@ -275,8 +296,8 @@ "//": " 201 days gestation period. The fawn will stay with its mother for approximately one year, suckling for three to four months.", "biosignature": { "biosig_item": "feces_manure", "biosig_timer": 12 }, "baby_flags": [ "SPRING", "SUMMER" ], - "special_attacks": [ [ "EAT_CROP", 60 ] ], - "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM" ] + "special_attacks": [ [ "EAT_CROP", 60 ], [ "GRAZE", 60 ] ], + "flags": [ "SEES", "HEARS", "SMELLS", "ANIMAL", "PATH_AVOID_DANGER_1", "WARM", "EATS" ] }, { "id": "mon_deer_mutant_spider_fawn", @@ -347,7 +368,8 @@ "baby_flags": [ "SPRING", "SUMMER", "AUTUMN", "WINTER" ], "biosignature": { "biosig_item": "feces_dog", "biosig_timer": 6 }, "anger_triggers": [ "HURT", "FRIEND_ATTACKED", "FRIEND_DIED" ], - "special_attacks": [ [ "EAT_FOOD", 100 ], [ "PARROT_AT_DANGER", 0 ] ], + "special_attacks": [ [ "EAT_FOOD", 100 ], [ "PARROT_AT_DANGER", 0 ], [ "EAT_CARRION", 100 ] ], + "stomach_size": 400, "petfood": { "food": [ "DOGFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly.", @@ -368,7 +390,8 @@ "SEES", "SMELLS", "SWARMS", - "WARM" + "WARM", + "EATS" ] }, { @@ -412,6 +435,7 @@ [ "PARROT_AT_DANGER", 0 ], { "type": "leap", "cooldown": 35, "move_cost": 100, "max_range": 3, "min_consider_range": 2 } ], + "stomach_size": 400, "petfood": { "food": [ "DOGFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly.", @@ -433,7 +457,8 @@ "SMELLS", "SWARMS", "WARM", - "CLIMBS" + "CLIMBS", + "EATS" ], "armor": { "bash": 1, "cut": 1 } }, @@ -456,6 +481,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 1, "vision_night": 4, + "stomach_size": 150, "harvest": "dog_small_with_skull", "upgrades": { "age_grow": 42, "into": "mon_dog_mutant_loper" }, "extend": { "flags": [ "NO_BREED" ] } @@ -503,9 +529,11 @@ "damage_max_instance": [ { "damage_type": "cut", "amount": 5, "armor_penetration": 4 } ] }, [ "EAT_FOOD", 100 ], + [ "EAT_CARRION", 100 ], [ "LUNGE", 6 ], { "id": "grab" } ], + "stomach_size": 500, "petfood": { "food": [ "DOGFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly.", @@ -526,7 +554,8 @@ "SEES", "SMELLS", "SWARMS", - "WARM" + "WARM", + "EATS" ] }, { @@ -546,6 +575,7 @@ "melee_dice": 1, "melee_dice_sides": 1, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], + "stomach_size": 200, "dodge": 1, "vision_night": 4, "harvest": "dog_small_with_skull", @@ -556,7 +586,7 @@ "id": "mon_dog_mutant_thrasher", "type": "MONSTER", "name": { "str": "Thrasher" }, - "description": "This dog has undergone visible mutation. Its paws are larger than normal and have developed long digging nails. Its fur is extremely short barely covering leathery skin.", + "description": "This dog has undergone visible mutation. Its paws are larger than normal and have developed long digging nails. Its fur is extremely short, barely covering its leathery skin.", "default_faction": "dog", "bodytype": "dog", "categories": [ "WILDLIFE" ], @@ -598,6 +628,7 @@ [ "EAT_FOOD", 100 ], { "id": "grab" } ], + "stomach_size": 400, "petfood": { "food": [ "DOGFOOD" ], "feed": "The %s seems to like you! It lets you pat its head and seems friendly.", @@ -618,7 +649,8 @@ "SMELLS", "SWARMS", "CAN_DIG", - "WARM" + "WARM", + "EATS" ], "armor": { "bash": 1, "cut": 1 } }, @@ -627,7 +659,7 @@ "type": "MONSTER", "copy-from": "mon_dog", "name": { "str": "Thrasher puppy", "str_pl": "Thrasher puppies" }, - "description": "An adorable, but unusual puppy. It wags its tail happily but something about it's paws seems off.", + "description": "An adorable, but unusual puppy. It wags its tail happily but something about its paws seems off.", "volume": "750 ml", "weight": "1 kg", "hp": 8, @@ -638,6 +670,7 @@ "melee_skill": 2, "melee_dice": 1, "melee_dice_sides": 1, + "stomach_size": 200, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 1, "vision_night": 4, diff --git a/data/json/monsters/nether.json b/data/json/monsters/nether.json index 636a8c40f786b..bd68d63f222f8 100644 --- a/data/json/monsters/nether.json +++ b/data/json/monsters/nether.json @@ -89,7 +89,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 1, "harvest": "demihuman", - "families": [ "prof_wp_netherium" ], + "families": [ "prof_wp_netherium_abomination" ], "weakpoint_sets": [ "wps_humanoid_body" ], "special_attacks": [ [ "SHRIEK", 10 ] ], "flags": [ "SMELLS", "HEARS", "HAS_MIND", "WARM", "ANIMAL", "PATH_AVOID_DANGER_1", "SUNDEATH", "NO_BREATHE", "HUMAN" ] diff --git a/data/json/monsters/rodentkin.json b/data/json/monsters/rodentkin.json index 2a64b2c1871bf..bd2a6845313c7 100644 --- a/data/json/monsters/rodentkin.json +++ b/data/json/monsters/rodentkin.json @@ -40,9 +40,10 @@ "harvest": "mammal_tiny", "dissect": "dissect_rat_sample_single", "path_settings": { "max_dist": 10 }, + "stomach_size": 30, "fear_triggers": [ "PLAYER_CLOSE", "SOUND" ], "special_attacks": [ [ "EAT_FOOD", 120 ] ], - "flags": [ "SEES", "SMELLS", "HEARS", "KEENNOSE", "CANPLAY", "WARM", "SWIMS", "ANIMAL", "PATH_AVOID_DANGER_1" ] + "flags": [ "SEES", "SMELLS", "HEARS", "KEENNOSE", "CANPLAY", "WARM", "SWIMS", "ANIMAL", "PATH_AVOID_DANGER_1", "EATS" ] }, { "id": "mon_big_rat", @@ -74,16 +75,19 @@ "anger_triggers": [ "PLAYER_WEAK", "PLAYER_CLOSE", "FRIEND_ATTACKED" ], "fear_triggers": [ "HURT", "FIRE" ], "regen_morale": true, + "stomach_size": 60, "special_attacks": [ { "type": "bite", "cooldown": 10, "damage_max_instance": [ { "damage_type": "stab", "amount": 6, "armor_multiplier": 0.7 } ] }, - { "id": "scratch", "max_mul": 1.5 } + { "id": "scratch", "max_mul": 1.5 }, + [ "EAT_FOOD", 120 ], + [ "EAT_CARRION", 120 ] ], "attack_effs": [ { "id": "rat_bite_fever", "duration": 400, "chance": 10 } ], - "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ANIMAL", "PATH_AVOID_DANGER_1" ], + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ANIMAL", "PATH_AVOID_DANGER_1", "EATS" ], "families": [ "prof_intro_biology", "prof_physiology" ], "harvest": "mutant_mammal_small_fur", "dissect": "dissect_rat_sample_single" @@ -102,9 +106,10 @@ "melee_dice": 1, "melee_dice_sides": 1, "special_when_hit": [ "ZAPBACK", 100 ], + "special_attacks": [ [ "EAT_FOOD", 120 ], [ "EAT_CARRION", 120 ] ], "families": [ "prof_intro_biology", "prof_physiology", "prof_electromagnetics" ], "upgrades": { "half_life": 42, "into_group": "GROUP_RATKIN_EVOLVED" }, - "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ELECTRIC", "ANIMAL", "PATH_AVOID_DANGER_1" ], + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ELECTRIC", "ANIMAL", "PATH_AVOID_DANGER_1", "EATS" ], "emit_fields": [ { "emit_id": "emit_shock_burst_rat", "delay": "5 s" } ] }, { @@ -126,6 +131,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 4 } ], "dodge": 3, + "stomach_size": 120, "upgrades": { "half_life": 42, "into_group": "GROUP_RATKIN_EVOLVED" }, "path_settings": { "max_dist": 50, "avoid_traps": true, "avoid_sharp": true }, "special_attacks": [ @@ -138,11 +144,13 @@ "min_mul": 1, "max_mul": 2.1, "infection_chance": 4 - } + }, + [ "EAT_FOOD", 120 ], + [ "EAT_CARRION", 120 ] ], "attack_effs": [ { "id": "rat_bite_fever", "duration": 400, "chance": 20 } ], "zombify_into": "mon_meat_cocoon_tiny", - "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "PATH_AVOID_DANGER_1", "CAN_DIG" ], + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "PATH_AVOID_DANGER_1", "CAN_DIG", "EATS" ], "dissect": "dissect_rat_sample_small", "armor": { "bash": 5, "cut": 6, "bullet": 2 } }, @@ -168,6 +176,7 @@ "anger_triggers": [ "PLAYER_WEAK", "PLAYER_CLOSE", "FRIEND_ATTACKED", "STALK" ], "path_settings": { "max_dist": 50, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "ratkin_death_drops_pack_rat", + "stomach_size": 800, "special_attacks": [ { "id": "scratch", "damage_max_instance": [ { "damage_type": "cut", "amount": 17, "armor_multiplier": 0.8 } ] }, { @@ -178,10 +187,12 @@ "min_mul": 1, "max_mul": 2.1, "infection_chance": 4 - } + }, + [ "EAT_FOOD", 120 ], + [ "EAT_CARRION", 120 ] ], "attack_effs": [ { "id": "rat_bite_fever", "duration": 400, "chance": 20 } ], - "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "PATH_AVOID_DANGER_1", "CAN_DIG" ], + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "PATH_AVOID_DANGER_1", "CAN_DIG", "EATS" ], "armor": { "bash": 5, "cut": 6, "bullet": 2 } }, { @@ -206,13 +217,14 @@ "melee_dice_sides": 2, "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 3, + "stomach_size": 800, "death_drops": "ratkin_death_drops_teke", "dissect": "dissect_alpha_sample_small", "path_settings": { "max_dist": 50, "avoid_traps": true, "avoid_sharp": true }, "special_when_hit": [ "ZAPBACK", 100 ], - "special_attacks": [ { "id": "teke_push" } ], + "special_attacks": [ { "id": "teke_push" }, [ "EAT_FOOD", 120 ], [ "EAT_CARRION", 120 ] ], "zombify_into": "mon_meat_cocoon_tiny", - "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "RANGED_ATTACKER", "ELECTRIC", "PATH_AVOID_DANGER_1" ], + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "RANGED_ATTACKER", "ELECTRIC", "PATH_AVOID_DANGER_1", "EATS" ], "armor": { "bash": 15, "cut": 3, "bullet": 26 } }, { @@ -235,13 +247,20 @@ "aggro_character": false, "melee_dice": 6, "melee_dice_sides": 4, + "stomach_size": 800, "melee_damage": [ { "damage_type": "cut", "amount": 6 } ], "dodge": 4, "path_settings": { "max_dist": 50, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "ratkin_death_drops_mausketeer", - "special_attacks": [ { "id": "impale" }, { "type": "bite", "cooldown": 15 }, { "id": "longswipe" } ], + "special_attacks": [ + { "id": "impale" }, + { "type": "bite", "cooldown": 15 }, + { "id": "longswipe" }, + [ "EAT_FOOD", 120 ], + [ "EAT_CARRION", 120 ] + ], "zombify_into": "mon_meat_cocoon_tiny", - "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ELECTRIC", "PATH_AVOID_DANGER_1" ], + "flags": [ "SEES", "SMELLS", "HEARS", "WARM", "SWIMS", "ELECTRIC", "PATH_AVOID_DANGER_1", "EATS" ], "dissect": "dissect_rat_sample_small", "armor": { "bash": 10, "cut": 10, "bullet": 6 } } diff --git a/data/json/monsters/zanimal_upgrade.json b/data/json/monsters/zanimal_upgrade.json index 68711fc65d81b..baafa704fded1 100644 --- a/data/json/monsters/zanimal_upgrade.json +++ b/data/json/monsters/zanimal_upgrade.json @@ -24,7 +24,7 @@ "grab_strength": 20, "dodge": 3, "weakpoint_sets": [ "wps_bone_armor" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_skeleton" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_skeleton" ], "bleed_rate": 50, "vision_night": 3, "harvest": "doggy_bones", @@ -186,7 +186,7 @@ "special_attacks": [ { "id": "bite_grab", "attack_upper": false, "cooldown": 5 }, { "id": "scratch_grab_required" } ], "dodge": 4, "weakpoint_sets": [ "wps_bone_armor" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_skeleton" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_skeleton" ], "bleed_rate": 50, "vision_night": 3, "harvest": "puppy_bones", @@ -236,7 +236,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 10 } ], "dodge": 4, "weakpoint_sets": [ "wps_bone_armor" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_skeleton" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_skeleton" ], "bleed_rate": 0, "vision_day": 10, "harvest": "puppy_bones", diff --git a/data/json/monsters/zed_acid.json b/data/json/monsters/zed_acid.json index 5e2c5e6fc2a27..26d0768e660c7 100644 --- a/data/json/monsters/zed_acid.json +++ b/data/json/monsters/zed_acid.json @@ -24,7 +24,7 @@ "dodge": 1, "vision_night": 3, "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "harvest": "zombie_humanoid_acid", "grab_strength": 20, "special_attacks": [ { "id": "grab" }, [ "ACID_BARF", 10 ] ], @@ -77,7 +77,7 @@ "bleed_rate": 50, "vision_night": 3, "weakpoint_sets": [ "wps_humanoid_body", "wps_natural_armor" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_nat_armored" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_nat_armored" ], "harvest": "zombie_humanoid_acid", "//grab": "Basic zed grab strength but icky icky acid on the hands", "grab_strength": 20, @@ -151,7 +151,7 @@ "bleed_rate": 50, "vision_night": 3, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_head_big" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "harvest": "zombie_humanoid_acid", "special_attacks": [ [ "ACID", 20 ] ], "death_drops": "default_zombie_death_drops", @@ -203,7 +203,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "vision_day": 14, "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "harvest": "zombie_humanoid_acid", "special_attacks": [ [ "ACID_BARF", 22 ] ], "death_drops": "default_zombie_death_drops", @@ -252,7 +252,7 @@ "melee_dice": 1, "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 2 }, { "damage_type": "acid", "amount": 4 } ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "dodge": 1, "harvest": "zombie_dog_acid", "grab_strength": 20, diff --git a/data/json/monsters/zed_amalgamation.json b/data/json/monsters/zed_amalgamation.json index 06c7b08db01b8..c2e14b5ceb36f 100644 --- a/data/json/monsters/zed_amalgamation.json +++ b/data/json/monsters/zed_amalgamation.json @@ -30,7 +30,7 @@ "default_faction": "zombie", "volume": "75 L", "weight": "75 kg", - "families": [ "prof_intro_biology", "prof_wp_amalgamation" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_amalgamation" ], "hp": 100, "speed": 100, "upgrades": { "age_grow": 1, "into_group": "GROUP_COCOON_SMALL", "multiple_spawns": true, "spawn_range": 5 }, @@ -104,7 +104,7 @@ "aggression": 100, "morale": 100, "weakpoint_sets": [ "wps_amalgamation_base" ], - "families": [ "prof_intro_biology", "prof_wp_amalgamation" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_amalgamation" ], "harvest": "zombie_amalgamation", "//": "TODO: When effects/spells can mess with path settings + flags move smartness to the effect of dedicated coordinatiors", "path_settings": { "avoid_sharp": true, "avoid_traps": true, "max_dist": 400 }, diff --git a/data/json/monsters/zed_burned.json b/data/json/monsters/zed_burned.json index 7c855ca6d295c..3a45dccd6614b 100644 --- a/data/json/monsters/zed_burned.json +++ b/data/json/monsters/zed_burned.json @@ -23,7 +23,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 5 } ], "grab_strength": 10, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_child_body", "wps_humanoid_head_big", "wps_natural_armor" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_child", "prof_burn_care" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_child", "prof_burn_care" ], "bleed_rate": 0, "vision_day": 10, "vision_night": 3, @@ -69,7 +69,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 14 } ], "grab_strength": 20, "weakpoint_sets": [ "wps_humanoid_body", "wps_bone_armor" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_skeleton", "prof_burn_care" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_skeleton", "prof_burn_care" ], "bleed_rate": 0, "vision_day": 10, "vision_night": 3, @@ -102,7 +102,7 @@ "melee_dice_sides": 2, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "weakpoint_sets": [ "wps_humanoid_body", "wps_natural_armor" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_burn_care" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_burn_care" ], "bleed_rate": 0, "vision_day": 10, "vision_night": 3, diff --git a/data/json/monsters/zed_children.json b/data/json/monsters/zed_children.json index 8f5da8bbe995f..5071774e5ee59 100644 --- a/data/json/monsters/zed_children.json +++ b/data/json/monsters/zed_children.json @@ -24,7 +24,7 @@ "bleed_rate": 50, "harvest": "zombie_humanoid", "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_child_body", "wps_humanoid_head_big" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_child" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_child" ], "vision_day": 30, "vision_night": 3, "//grab": "Half as grabby as a base zombie", @@ -61,7 +61,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], "dodge": 2, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_child_body", "wps_humanoid_head_big" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_child" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_child" ], "vision_day": 30, "vision_night": 3, "harvest": "zombie_humanoid", @@ -101,7 +101,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 1 } ], "dodge": 1, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_child_body", "wps_humanoid_head_big", "wps_eyes_big" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_child" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_child" ], "bleed_rate": 50, "vision_day": 10, "vision_night": 10, @@ -139,12 +139,13 @@ "bleed_rate": 50, "dodge": 1, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_child_body", "wps_humanoid_head_big" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_child" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_child" ], "vision_day": 30, "vision_night": 5, "harvest": "zombie_humanoid", "special_attacks": [ [ "SHRIEK", 5 ], { "id": "scratch", "attack_upper": false, "cooldown": 10 } ], "death_drops": { "subtype": "collection", "groups": [ [ "default_zombie_children_clothes", 100 ], [ "child_items_pockets", 65 ] ] }, + "death_function": { "effect": { "id": "death_guilt", "min_level": 6 } }, "burn_into": "mon_zombie_child_scorched", "fungalize_into": "mon_zombie_child_fungus", "flags": [ "SEES", "HEARS", "SMELLS", "STUMBLES", "WARM", "BASHES", "POISON", "NO_BREATHE", "REVIVES", "FILTHY" ], @@ -177,7 +178,7 @@ "vision_day": 30, "vision_night": 5, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_child_body", "wps_humanoid_head_big" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_child" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_child" ], "harvest": "zombie_humanoid", "//grab": "Half as grabby as a base zombie", "grab_strength": 10, @@ -212,7 +213,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 3 } ], "dodge": 2, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_child_body", "wps_humanoid_head_big", "wps_eyes_big" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_child" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_child" ], "bleed_rate": 50, "vision_day": 10, "vision_night": 10, @@ -252,7 +253,7 @@ "vision_day": 30, "vision_night": 5, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_child_body", "wps_humanoid_head_big" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_child" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_child" ], "harvest": "zombie_humanoid", "special_attacks": [ [ "SHRIEK", 15 ], { "id": "scratch", "attack_upper": false, "cooldown": 10 } ], "death_function": { "effect": { "id": "death_guilt", "min_level": 6 } }, @@ -285,7 +286,7 @@ "melee_dice_sides": 2, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_child_body", "wps_humanoid_head_big" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_child" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_child" ], "vision_day": 20, "vision_night": 3, "bleed_rate": 0, diff --git a/data/json/monsters/zed_command.json b/data/json/monsters/zed_command.json index 3b2a64b26825d..d8a65346f74e2 100644 --- a/data/json/monsters/zed_command.json +++ b/data/json/monsters/zed_command.json @@ -24,7 +24,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 4 } ], "dodge": 2, "weakpoint_sets": [ "wps_humanoid_body", "wps_bone_armor" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_skeleton" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_skeleton" ], "bleed_rate": 50, "vision_day": 30, "vision_night": 3, @@ -77,7 +77,7 @@ "melee_damage": [ { "damage_type": "cut", "amount": 4 } ], "dodge": 2, "weakpoint_sets": [ "wps_humanoid_body", "wps_bone_armor" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_wp_skeleton" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_wp_skeleton" ], "bleed_rate": 50, "vision_day": 30, "vision_night": 3, diff --git a/data/json/monsters/zed_electric.json b/data/json/monsters/zed_electric.json index 3b3d6b6a0e90f..f81f1ad53db14 100644 --- a/data/json/monsters/zed_electric.json +++ b/data/json/monsters/zed_electric.json @@ -22,7 +22,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "electric", "amount": 4 }, { "damage_type": "cut", "amount": 2 } ], "weakpoint_sets": [ "wps_humanoid_body", "wps_natural_armor", "wps_humanoid_head_small" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_electromagnetics" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_electromagnetics" ], "bleed_rate": 0, "vision_night": 3, "luminance": 16, @@ -71,7 +71,7 @@ "melee_damage": [ { "damage_type": "electric", "amount": 8 } ], "dodge": 2, "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_electromagnetics" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_electromagnetics" ], "bleed_rate": 50, "luminance": 8, "harvest": "zombie_humanoid_electric", @@ -119,7 +119,7 @@ "melee_dice": 1, "melee_dice_sides": 2, "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_electromagnetics" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_electromagnetics" ], "bleed_rate": 0, "//2": "melee damage is quite weak since the shockfield around it is its most dangerous function", "melee_damage": [ { "damage_type": "electric", "amount": 6 } ], @@ -158,7 +158,7 @@ "special_attacks": [ { "id": "grab" } ], "dodge": 2, "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_intro_biology", "prof_wp_zombie", "prof_electromagnetics" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie", "prof_electromagnetics" ], "luminance": 4, "harvest": "zombie_humanoid_electric", "special_when_hit": [ "ZAPBACK", 100 ], diff --git a/data/json/monsters/zed_explosive.json b/data/json/monsters/zed_explosive.json index 386f609cfc932..428931f3e09fa 100644 --- a/data/json/monsters/zed_explosive.json +++ b/data/json/monsters/zed_explosive.json @@ -22,7 +22,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_head_small" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "vision_night": 3, "harvest": "exempt", "grab_strength": 25, @@ -71,7 +71,7 @@ "melee_dice_sides": 3, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_head_small" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "bleed_rate": 50, "vision_night": 3, "harvest": "zombie", @@ -124,7 +124,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_head_small" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "vision_night": 3, "luminance": 8, "harvest": "exempt", @@ -177,7 +177,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_head_small" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "vision_night": 3, "harvest": "exempt", "emit_fields": [ { "emit_id": "emit_toxic_leak", "delay": "1 s" } ], @@ -211,7 +211,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_head_small" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "vision_night": 3, "harvest": "exempt", "emit_fields": [ { "emit_id": "emit_relax_gas_leak", "delay": "1 s" } ], @@ -245,7 +245,7 @@ "melee_dice_sides": 4, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_head_small" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "vision_night": 2, "harvest": "exempt", "emit_fields": [ { "emit_id": "emit_tear_gas_leak", "delay": "1 s" } ], @@ -276,7 +276,7 @@ "morale": 100, "melee_skill": 4, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_head_small" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "vision_night": 5, "harvest": "zombie_meatslug", "emit_fields": [ { "emit_id": "emit_sludge_puddle", "delay": "1 s" } ], @@ -337,7 +337,7 @@ "morale": 100, "melee_skill": 1, "weakpoint_sets": [ "wps_humanoid_body", "wps_humanoid_head_small" ], - "families": [ "prof_intro_biology", "prof_wp_zombie" ], + "families": [ "prof_intro_biology", "prof_physiology", "prof_wp_zombie" ], "vision_night": 2, "harvest": "zombie_meatslug", "special_attacks": [ diff --git a/data/json/monsters/zed_soldiers.json b/data/json/monsters/zed_soldiers.json index e71ff9f029620..9bb94c397ad3c 100644 --- a/data/json/monsters/zed_soldiers.json +++ b/data/json/monsters/zed_soldiers.json @@ -302,7 +302,7 @@ "id": "mon_zombie_military_pilot", "type": "MONSTER", "name": { "str": "zombie military pilot" }, - "description": "Once a pilot, it is dressed in basic military fatigues, aviator sunglasses, and a sturdy-looking helmet.", + "description": "Once a pilot, it is wearing a flight suit and a sturdy-looking flight helmet. The head twitches and adjusts constantly, following any and every source of movement.", "default_faction": "zombie", "bodytype": "human", "categories": [ "CLASSIC" ], @@ -330,20 +330,7 @@ "special_attacks": [ { "id": "grab", "cooldown": 7 }, { "id": "scratch_humanoid" }, { "id": "bite_humanoid", "cooldown": 5 } ], "death_drops": "mon_zombie_military_pilot_death_drops", "burn_into": "mon_zombie_scorched", - "flags": [ - "SEES", - "HEARS", - "WARM", - "GRABS", - "BASHES", - "GROUP_BASH", - "POISON", - "NO_BREATHE", - "REVIVES", - "PUSH_MON", - "NOHEAD", - "FILTHY" - ], + "flags": [ "SEES", "WARM", "GRABS", "BASHES", "GROUP_BASH", "POISON", "NO_BREATHE", "REVIVES", "PUSH_MON", "NOHEAD", "FILTHY" ], "armor": { "bash": 5, "cut": 5, "bullet": 4, "electric": 2 } }, { diff --git a/data/json/npcs/items_generic.json b/data/json/npcs/items_generic.json index 9d0435f79eb75..ba0d96a76a3e1 100644 --- a/data/json/npcs/items_generic.json +++ b/data/json/npcs/items_generic.json @@ -465,7 +465,7 @@ [ "colamdew", 3 ], [ "computer_science", 1 ], [ "con_milk", 2 ], - [ "contacts", 5 ], + { "item": "contacts", "prob": 5, "count": 6 }, [ "corn", 3 ], [ "cornbread", 1 ], [ "corndogs_frozen", 2 ], diff --git a/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json b/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json index 86026aca2c410..218cd5487493f 100644 --- a/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json +++ b/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json @@ -953,6 +953,7 @@ "W........W ", "WWW....WWW " ], + "flags": [ "DISMANTLE_ALL_BEFORE_PLACING_TERRAIN" ], "terrain": { "W": "t_wall_log", ".": "t_dirtfloor" } } }, diff --git a/data/json/obsoletion/migration_items.json b/data/json/obsoletion/migration_items.json index 8f6676987fa95..1920ab36fbf19 100644 --- a/data/json/obsoletion/migration_items.json +++ b/data/json/obsoletion/migration_items.json @@ -249,5 +249,35 @@ "type": "MIGRATION", "replace": "bag_zipper", "sealed": false + }, + { + "id": "bot_mininuke_hack", + "type": "MIGRATION", + "replace": "broken_mininuke_hack" + }, + { + "id": "20x66_bootleg_flechette", + "type": "MIGRATION", + "replace": "20x66_shot" + }, + { + "id": "20x66_bootleg_shot", + "type": "MIGRATION", + "replace": "20x66_shot" + }, + { + "id": "20x66_bootleg_slug", + "type": "MIGRATION", + "replace": "20x66_shot" + }, + { + "id": "20x66_flechette", + "type": "MIGRATION", + "replace": "20x66_shot" + }, + { + "id": "20x66_inc", + "type": "MIGRATION", + "replace": "20x66_shot" } ] diff --git a/data/json/obsoletion/obsolete_items.json b/data/json/obsoletion/obsolete_items.json index ea9921ed796ed..401d1e9360b1e 100644 --- a/data/json/obsoletion/obsolete_items.json +++ b/data/json/obsoletion/obsolete_items.json @@ -1164,5 +1164,33 @@ "dispersion": 50, "recoil": 350, "effects": [ "COOKOFF", "NEVER_MISFIRES" ] + }, + { + "type": "GENERIC", + "id": "broken_mininuke_hack", + "symbol": ",", + "color": "magenta", + "name": { "str": "broken mininuke hack" }, + "category": "other", + "description": "A broken mininuke hack. Just looking at the wreck makes you shiver. Could be gutted for parts.", + "price": 18000, + "price_postapoc": 10, + "material": [ "aluminum", "plastic" ], + "weight": "25000 g", + "volume": "18750 ml", + "to_hit": -3, + "flags": [ "TRADER_AVOID", "NO_REPAIR" ], + "melee_damage": { "bash": 6, "cut": 6 } + }, + { + "id": "mininuke_payload", + "type": "TOOL", + "category": "weapons", + "name": { "str": "mininuke payload" }, + "description": "This is a dummy item used by mininuke hacks. You should never see it outside of debug.", + "symbol": "*", + "color": "dark_gray", + "use_action": { "target": "mininuke_act", "target_timer": "20 seconds", "type": "transform" }, + "flags": [ "TRADER_AVOID", "BOMB", "GRENADE", "ZERO_WEIGHT" ] } ] diff --git a/data/json/overmap/multitile_city_buildings.json b/data/json/overmap/multitile_city_buildings.json index 767f490c02766..add5b41a6ee2b 100644 --- a/data/json/overmap/multitile_city_buildings.json +++ b/data/json/overmap/multitile_city_buildings.json @@ -263,6 +263,33 @@ { "point": [ 0, 0, 1 ], "overmap": "bungalow22_roof_north" } ] }, + { + "type": "city_building", + "id": "bungalow23", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "bungalow23_north" }, + { "point": [ 0, 0, 1 ], "overmap": "bungalow23_roof_north" } + ] + }, + { + "type": "city_building", + "id": "bungalow24", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "bungalow24_north" }, + { "point": [ 0, 0, 1 ], "overmap": "bungalow24_roof_north" } + ] + }, + { + "type": "city_building", + "id": "bungalow25", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "bungalow25_north" }, + { "point": [ 0, 0, 1 ], "overmap": "bungalow25_roof_north" } + ] + }, { "type": "city_building", "id": "urban_1_house", @@ -1137,6 +1164,56 @@ { "point": [ 0, 0, 1 ], "overmap": "house_inner_garden_roof_north" } ] }, + { + "type": "city_building", + "id": "house_fence01", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, -1 ], "overmap": "house_fence01_basement_north" }, + { "point": [ 0, 0, 0 ], "overmap": "house_fence01_north" }, + { "point": [ 0, 0, 1 ], "overmap": "house_fence01_roof_north" } + ] + }, + { + "type": "city_building", + "id": "house_fence02", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "house_fence02_1_north" }, + { "point": [ 0, 0, 1 ], "overmap": "house_fence02_2_north" }, + { "point": [ 0, 0, 2 ], "overmap": "house_fence02_roof_north" } + ] + }, + { + "type": "city_building", + "id": "house_fence03", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, -1 ], "overmap": "house_fence03_basement_north" }, + { "point": [ 0, 0, 0 ], "overmap": "house_fence03_north" }, + { "point": [ 0, 0, 1 ], "overmap": "house_fence03_roof_north" } + ] + }, + { + "type": "city_building", + "id": "house_fence04", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "house_fence04_north" }, + { "point": [ 0, 0, 1 ], "overmap": "house_fence04_roof_north" } + ] + }, + { + "type": "city_building", + "id": "house_fence05", + "locations": [ "land" ], + "overmaps": [ + { "point": [ 0, 0, -1 ], "overmap": "house_fence05_basement_north" }, + { "point": [ 0, 0, 0 ], "overmap": "house_fence05_1_north" }, + { "point": [ 0, 0, 1 ], "overmap": "house_fence05_2_north" }, + { "point": [ 0, 0, 2 ], "overmap": "house_fence05_roof_north" } + ] + }, { "type": "city_building", "id": "s_electronics", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json index 5cd8e655b707e..4dc1441a32fb3 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_residential.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_residential.json @@ -73,6 +73,9 @@ "bungalow20", "bungalow21", "bungalow22", + "bungalow23", + "bungalow24", + "bungalow25", "duplex", "garden_house_1_floor_1", "garden_house_1_floor_2", @@ -148,6 +151,13 @@ "house_duplex7", "house_duplex8", "house_duplex9", + "house_fence01", + "house_fence02_1", + "house_fence02_2", + "house_fence03", + "house_fence04", + "house_fence05_1", + "house_fence05_2", "house_fortified", "house_garage", "house_garage2", @@ -374,6 +384,9 @@ "bungalow20_roof", "bungalow21_roof", "bungalow22_roof", + "bungalow23_roof", + "bungalow24_roof", + "bungalow25_roof", "duplex_roof", "garden_house_1_roof", "house_01_roof", @@ -440,6 +453,11 @@ "house_duplex7_roof", "house_duplex8_roof", "house_duplex9_roof", + "house_fence01_roof", + "house_fence02_roof", + "house_fence03_roof", + "house_fence04_roof", + "house_fence05_roof", "house_fortified_roof", "house_garage2_roof", "house_garage3_roof", @@ -517,6 +535,9 @@ "house_detatched7_basement", "house_detatched8_basement", "house_detatched9_basement", + "house_fence01_basement", + "house_fence03_basement", + "house_fence05_basement", "house_fortified_basement", "house_garage2_basement", "house_garage3_basement", diff --git a/data/json/professions.json b/data/json/professions.json index d8bf0261a8a94..3bb0da774ae7a 100644 --- a/data/json/professions.json +++ b/data/json/professions.json @@ -1167,7 +1167,7 @@ { "item": "water_clean", "container-item": "canteen" }, { "item": "legpouch_large", "contents-group": "army_mags_m4" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_combat_marine", "container-item": "sheath" }, { "item": "m18", "ammo-item": "9mm", "container-item": "holster", "charges": 17 }, { "item": "p320mag_17rd_9x19mm", "ammo-item": "9mm", "charges": 17, "count": 2 }, { @@ -1529,7 +1529,7 @@ { "group": "us_ballistic_vest_pristine" }, { "item": "water_clean", "container-item": "canteen" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_combat_army", "container-item": "sheath" }, { "item": "shot_00", "count": 2 }, { "item": "mossberg_930", @@ -1592,7 +1592,7 @@ { "item": "water_clean", "container-item": "canteen" }, { "item": "legpouch_large", "contents-group": "army_mags_m4" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_combat_army", "container-item": "sheath" }, { "item": "modular_m4_carbine", "variant": "modular_m4a1", @@ -1654,7 +1654,7 @@ { "item": "pants_army", "variant": "mil_pants_navy" }, { "item": "water_clean", "container-item": "canteen" }, { "item": "legpouch_large", "contents-group": "army_mags_tac338" }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_rm42", "container-item": "sheath" }, { "item": "p226_9mm", "ammo-item": "9mm", "container-item": "holster", "charges": 15 }, { "item": "p226mag_15rd_9x19mm", "ammo-item": "9mm", "charges": 15, "count": 2 }, { "item": "tac338", "ammo-item": "338lapua_fmjbt", "charges": 5, "contents-item": [ "shoulder_strap" ] } @@ -1716,7 +1716,7 @@ { "item": "light_battery_cell", "ammo-item": "battery", "charges": 100, "container-item": "goggles_nv" }, { "item": "water_clean", "container-item": "canteen" }, { "item": "legpouch_large", "contents-group": "army_mags_m4" }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_rm42", "container-item": "sheath" }, { "item": "p226_9mm", "ammo-item": "9mm", "container-item": "holster", "charges": 15 }, { "item": "p226mag_15rd_9x19mm", "ammo-item": "9mm", "charges": 15, "count": 2 }, { @@ -3093,7 +3093,7 @@ "entries": [ { "group": "charged_cell_phone" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_KABAR", "container-item": "sheath" }, { "item": "m9", "ammo-item": "9mm", "charges": 15, "container-item": "holster" }, { "item": "chestrig", "contents-group": "army_mags_m4" }, { "item": "lighter", "charges": 100 }, @@ -3779,7 +3779,7 @@ "both": { "items": [ "striped_shirt", "striped_pants", "sneakers", "socks" ], "entries": [ - { "item": "knife_combat", "container-item": "gartersheath1" }, + { "item": "knife_rm42", "container-item": "gartersheath1" }, { "item": "polaroid_photo", "container-item": "ankle_wallet_pouch" } ] }, @@ -4468,7 +4468,7 @@ "entries": [ { "item": "water_clean", "container-item": "canteen" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_combat_army", "container-item": "sheath" }, { "item": "modular_m4_carbine", "variant": "modular_m4a1", @@ -5400,7 +5400,7 @@ { "item": "water_clean", "container-item": "canteen" }, { "item": "legpouch_large", "contents-group": "army_mags_m110" }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_combat_army", "container-item": "sheath" }, { "item": "m110a1", "ammo-item": "762_51", "charges": 20, "contents-item": [ "shoulder_strap" ] }, { "item": "m17", "ammo-item": "9mmfmj", "charges": 17, "container-item": "holster" }, { "group": "army_mags_m17" } @@ -5449,6 +5449,7 @@ "socks", "boots_combat", "wristwatch", + "pockknife", "molle_pack" ], "entries": [ @@ -5462,7 +5463,6 @@ "contents-item": [ "shoulder_strap", "holo_sight", "bipod" ] }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, { "item": "m17", "ammo-item": "9mm", "charges": 17, "container-item": "holster" } ] }, @@ -5509,6 +5509,7 @@ "gloves_tactical", "socks", "boots_combat", + "pockknife", "wristwatch", "molle_pack" ], @@ -5524,7 +5525,6 @@ }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "grenade_pouch", "contents-group": [ "army_grenades_40x46" ] }, - { "item": "knife_combat", "container-item": "sheath" }, { "item": "m17", "ammo-item": "9mm", "charges": 17, "container-item": "holster" } ] }, @@ -5586,7 +5586,7 @@ { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "grenadebandolier", "contents-item": [ "flashbang", "flashbang" ] }, { "item": "bandolier_shotgun", "contents-group": "bandolier_swat_cqc1" }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_combat_army", "container-item": "sheath" }, { "item": "m17", "ammo-item": "9mm", "charges": 17, "container-item": "holster" } ] }, @@ -5648,7 +5648,7 @@ "contents-item": [ "shoulder_strap", "rifle_scope" ] }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_combat_army", "container-item": "sheath" }, { "item": "m17", "ammo-item": "9mmfmj", "container-item": "holster", "charges": 17 }, { "item": "legpouch_large", "contents-group": "army_mags_m17" } ] @@ -5716,7 +5716,7 @@ "contents-item": [ "shoulder_strap", "holo_sight", "suppressor" ] }, { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_combat_marine", "container-item": "sheath" }, { "item": "XL_holster", "contents-group": "holster_supp_MEU" }, { "item": "legpouch_large", "contents-group": "army_mags_1911" } ] @@ -5959,7 +5959,7 @@ { "item": "ear_plugs", "custom-flags": [ "no_auto_equip" ] }, { "item": "mask_dust", "variant": "camo_mask_dust", "custom-flags": [ "no_auto_equip" ] }, { "item": "stethoscope", "custom-flags": [ "no_auto_equip" ] }, - { "item": "knife_combat", "container-item": "sheath" }, + { "item": "knife_combat_army", "container-item": "sheath" }, { "item": "modular_m4_carbine", "variant": "modular_m4a1", @@ -6741,9 +6741,9 @@ }, { "type": "profession", - "id": "explosive_ordinance_disposal", - "name": "Explosive Ordinance Disposal Technician", - "description": "Ever since you were a child you were fascinated with explosives and all things that go boom. As soon as you turned 18 you joined the army to become an EOD technician. While out on a call about a potential explosive in the neighboring county, your team was overrun by hordes of the undead. You are alone, with nothing but your precious training, gear and love of explosives", + "id": "explosive_ordnance_disposal", + "name": "Explosive Ordnance Disposal Technician", + "description": "Ever since you were a child you were fascinated with explosives and all things that go boom. As soon as you turned 18 you joined the army to become an EOD technician. While out on a call about a potential explosive in the neighboring county, your team was overrun by hordes of the undead. You are alone, with nothing but your precious training, gear and love of explosives.", "points": 5, "proficiencies": [ "prof_elec_circuits", @@ -6761,7 +6761,7 @@ { "level": 6, "name": "traps" }, { "level": 4, "name": "melee" }, { "level": 4, "name": "gun" }, - { "level": 4, "name": "rifle" }, + { "level": 3, "name": "rifle" }, { "level": 3, "name": "pistol" }, { "level": 3, "name": "dodge" }, { "level": 3, "name": "firstaid" }, @@ -6770,19 +6770,28 @@ ], "items": { "both": { - "items": [ "undershirt", "socks", "helmet_eod", "jacket_eod", "gloves_eod", "trousers_eod", "foot_protectors_eod" ], + "items": [ + "undershirt", + "pants_army", + "socks", + "boots_combat", + "attached_ear_plugs_off", + "helmet_eod", + "nomex_gloves", + "gloves_eod", + "trousers_eod", + "foot_protectors_eod" + ], "entries": [ - { - "item": "modular_m4_carbine", - "variant": "modular_m4a1", - "ammo-item": "556_mk318", - "charges": 30, - "contents-item": [ "shoulder_strap", "holo_sight" ] - } + { "item": "eod_plate", "container-item": "jacket_eod" }, + { "item": "EOD_hotstick", "custom-flags": [ "auto_wield" ] }, + { "item": "water_clean", "container-item": "camelbak" }, + { "item": "multitool", "container-item": "sheath" }, + { "item": "m18", "ammo-item": "9mm", "container-item": "holster", "charges": 17 } ] }, "male": [ "boxer_shorts" ], - "female": [ "panties", "bra" ] + "female": [ "sports_bra", "boxer_shorts" ] } } ] diff --git a/data/json/proficiencies/melee_weapons.json b/data/json/proficiencies/melee_weapons.json index 92710d702a2f4..8d293f08c7d8f 100644 --- a/data/json/proficiencies/melee_weapons.json +++ b/data/json/proficiencies/melee_weapons.json @@ -125,7 +125,7 @@ "default_time_multiplier": 1.5, "default_skill_penalty": 0.2, "time_to_learn": "16 h", - "required_proficiencies": [ "prof_knives_familiar" ] + "required_proficiencies": [ "prof_shivs_familiar" ] }, { "type": "proficiency", @@ -137,7 +137,7 @@ "default_time_multiplier": 1.5, "default_skill_penalty": 0.2, "time_to_learn": "32 h", - "required_proficiencies": [ "prof_knives_pro" ] + "required_proficiencies": [ "prof_shivs_pro" ] }, { "type": "proficiency", @@ -207,7 +207,7 @@ "default_time_multiplier": 1.5, "default_skill_penalty": 0.2, "time_to_learn": "32 h", - "required_proficiencies": [ "prof_medium_swords_master" ] + "required_proficiencies": [ "prof_medium_swords_pro" ] }, { "type": "proficiency", @@ -440,7 +440,7 @@ "default_time_multiplier": 1.5, "default_skill_penalty": 0.2, "time_to_learn": "16 h", - "required_proficiencies": [ "prof_claws_familiar" ] + "required_proficiencies": [ "prof_bionics_familiar" ] }, { "type": "proficiency", @@ -452,7 +452,7 @@ "default_time_multiplier": 1.5, "default_skill_penalty": 0.2, "time_to_learn": "32 h", - "required_proficiencies": [ "prof_claws_pro" ] + "required_proficiencies": [ "prof_bionics_pro" ] }, { "type": "proficiency", @@ -475,7 +475,7 @@ "default_time_multiplier": 1.5, "default_skill_penalty": 0.2, "time_to_learn": "16 h", - "required_proficiencies": [ "prof_spear_familiar" ] + "required_proficiencies": [ "prof_spears_familiar" ] }, { "type": "proficiency", @@ -487,7 +487,7 @@ "default_time_multiplier": 1.5, "default_skill_penalty": 0.2, "time_to_learn": "32 h", - "required_proficiencies": [ "prof_spear_pro" ] + "required_proficiencies": [ "prof_spears_pro" ] }, { "type": "proficiency", diff --git a/data/json/recipes/food/bread.json b/data/json/recipes/food/bread.json index f04d4fcef6924..ba1e28fd69980 100644 --- a/data/json/recipes/food/bread.json +++ b/data/json/recipes/food/bread.json @@ -183,7 +183,7 @@ "qualities": [ { "id": "COOK", "level": 1 } ], "tools": [ [ [ "surface_heat", 1, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" } ], - "components": [ [ [ "bread_sandwich", 1, "LIST" ] ] ] + "components": [ [ [ "bread_toastable", 1, "LIST" ] ] ] }, { "type": "recipe", @@ -200,7 +200,7 @@ "qualities": [ { "id": "COOK", "level": 1 } ], "tools": [ [ [ "surface_heat", 1, "LIST" ] ] ], "proficiencies": [ { "proficiency": "prof_food_prep" } ], - "components": [ [ [ "bread_sandwich_wheat_free", 1, "LIST" ] ] ] + "components": [ [ [ "bread_toastable_wheat_free", 1, "LIST" ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/nested.json b/data/json/recipes/nested.json index 44e5f4236f531..ca04e401f674c 100644 --- a/data/json/recipes/nested.json +++ b/data/json/recipes/nested.json @@ -8,7 +8,7 @@ "name": "bows", "description": "Recipes related to constructing bows to launch arrows with.", "skill_used": "fabrication", - "nested_category_data": [ "selfbow", "shortbow", "longbow", "compositebow", "compgreatbow", "woodgreatbow" ], + "nested_category_data": [ "selfbow", "shortbow", "reflexbow", "longbow", "compositebow", "compgreatbow", "woodgreatbow" ], "difficulty": 1 }, { @@ -4524,6 +4524,128 @@ "underbarrel_mount" ] }, + { + "id": "nested_bionic_practice", + "type": "nested_category", + "activity_level": "fake", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_MELEE", + "name": "bionic weaponry", + "description": "Recipes for practice with bionic weaponry for combat.", + "skill_used": "cutting", + "nested_category_data": [ + "prac_cutting_beg_bionics", + "prac_cutting_int_bionics", + "prac_cutting_beg_bionic_sword", + "prac_cutting_int_bionic_sword" + ], + "difficulty": 1 + }, + { + "id": "nested_axes_practice", + "type": "nested_category", + "activity_level": "fake", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_MELEE", + "name": "axes", + "description": "Recipes for combat practice with axes.", + "skill_used": "cutting", + "nested_category_data": [ "prac_cutting_beg_great_axe", "prac_cutting_int_great_axe", "prac_cutting_beg_hand_axe", "prac_cutting_int_hand_axe" ], + "difficulty": 1 + }, + { + "id": "nested_cutting_swords_practice", + "type": "nested_category", + "activity_level": "fake", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_MELEE", + "name": "cutting swords", + "description": "Recipes for combat practice of slashing swords of all sizes.", + "skill_used": "cutting", + "nested_category_data": [ + "prac_cutting_beg_short_sword", + "prac_cutting_int_short_sword", + "prac_cutting_beg_med_sword", + "prac_cutting_int_med_sword", + "prac_cutting_beg_long_sword", + "prac_cutting_int_long_sword", + "prac_cutting_beg_great_sword", + "prac_cutting_int_great_sword" + ], + "difficulty": 1 + }, + { + "id": "nested_stabbing_swords_practice", + "type": "nested_category", + "activity_level": "fake", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_MELEE", + "name": "stabbing swords", + "description": "Recipes for combat practice of thrusting swords, which require a different training from just slashing with your sword.", + "skill_used": "stabbing", + "nested_category_data": [ "prac_stabbing_beg_fencing", "prac_stabbing_int_fencing", "prac_stabbing_beg_thrust", "prac_stabbing_int_thrust" ], + "difficulty": 1 + }, + { + "id": "nested_spears_polearms_practice", + "type": "nested_category", + "activity_level": "fake", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_MELEE", + "name": "spears and polearms", + "description": "Recipes for combat practice with long pointed objects, like spears and polearms.", + "skill_used": "stabbing", + "nested_category_data": [ "prac_stabbing_beg_spear", "prac_stabbing_int_spear", "prac_stabbing_beg_polearm", "prac_stabbing_int_polearm" ], + "difficulty": 1 + }, + { + "id": "nested_knives_shivs_practice", + "type": "nested_category", + "activity_level": "fake", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_MELEE", + "name": "knives and shivs", + "description": "Recipes for combat practice with small pointed objects, like knives and shivs.", + "skill_used": "stabbing", + "nested_category_data": [ "prac_stabbing_beg_knife", "prac_stabbing_int_knife", "prac_stabbing_beg_shiv", "prac_stabbing_int_shiv" ], + "difficulty": 1 + }, + { + "id": "nested_batons_and_staffs_practice", + "type": "nested_category", + "activity_level": "fake", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_MELEE", + "name": "batons and quarterstaves", + "description": "Recipes for combat practice with thin, stick-like bludgeons like batons and quarterstaves.", + "skill_used": "bashing", + "nested_category_data": [ "prac_bashing_beg_baton", "prac_bashing_int_baton", "prac_bashing_beg_staff", "prac_bashing_int_staff" ], + "difficulty": 1 + }, + { + "id": "nested_maces_and_hammers_practice", + "type": "nested_category", + "activity_level": "fake", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_MELEE", + "name": "maces and great hammers", + "description": "Recipes for combat practice with weighty, smashing bludgeons, like maces and great hammers.", + "skill_used": "bashing", + "nested_category_data": [ "prac_bashing_beg_mace", "prac_bashing_int_mace", "prac_bashing_beg_great_hammer", "prac_bashing_int_great_hammer" ], + "difficulty": 1 + }, + { + "id": "nested_firearm_cqc_practice", + "type": "nested_category", + "activity_level": "fake", + "category": "CC_PRACTICE", + "subcategory": "CSC_PRACTICE_MELEE", + "name": "firearms CQC", + "description": "Recipes for CQC practice with firearms.", + "skill_used": "bashing", + "nested_category_data": [ "prac_bashing_beg_rifle", "prac_bashing_int_rifle", "prac_bashing_beg_pistol", "prac_bashing_int_pistol" ], + "difficulty": 1 + }, { "id": "nested_arming_sword", "type": "nested_category", @@ -5188,7 +5310,6 @@ "bot_dispatch_military", "bot_turret_searchlight", "bot_molebot", - "bot_mininuke_hack", "bot_nursebot", "bot_skitterbot", "bot_secubot", diff --git a/data/json/recipes/other/bots.json b/data/json/recipes/other/bots.json index 61f28c00b39b5..e3fbf45c26aee 100644 --- a/data/json/recipes/other/bots.json +++ b/data/json/recipes/other/bots.json @@ -51,32 +51,6 @@ [ [ "identification_module", 1 ] ] ] }, - { - "type": "recipe", - "activity_level": "LIGHT_EXERCISE", - "result": "bot_mininuke_hack", - "category": "CC_*", - "subcategory": "CSC_*_NESTED", - "skill_used": "electronics", - "skills_required": [ [ "mechanics", 6 ], [ "computer", 5 ] ], - "difficulty": 7, - "time": "35 m", - "reversible": true, - "decomp_learn": 8, - "book_learn": [ [ "recipe_lab_elec", 7 ], [ "textbook_robots", 8 ] ], - "using": [ [ "soldering_standard", 20 ] ], - "qualities": [ { "id": "SCREW", "level": 1 } ], - "components": [ - [ [ "mininuke", 1 ] ], - [ [ "ai_module_basic", 1 ] ], - [ [ "RAM", 1 ] ], - [ [ "small_storage_battery", 1 ] ], - [ [ "scrap", 1 ] ], - [ [ "quad_rotors", 1 ] ], - [ [ "sensor_module", 1 ] ], - [ [ "identification_module", 1 ] ] - ] - }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", diff --git a/data/json/recipes/practice/melee.json b/data/json/recipes/practice/melee.json index b2732ec876bc4..24de1757bf856 100644 --- a/data/json/recipes/practice/melee.json +++ b/data/json/recipes/practice/melee.json @@ -213,8 +213,8 @@ "id": "prac_cutting_beg_long_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "long swords (beginner)", "description": "Drill the fundamentals of using a longsword.", "skill_used": "cutting", @@ -230,8 +230,8 @@ "id": "prac_cutting_int_long_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "long swords (intermediate)", "description": "Hone your skills with a longsword against a dummy.", "skill_used": "cutting", @@ -252,8 +252,8 @@ "id": "prac_cutting_beg_great_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "great swords (beginner)", "description": "Practice swinging your great sword against an imaginary opponent.", "skill_used": "cutting", @@ -269,8 +269,8 @@ "id": "prac_cutting_int_great_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "great swords (intermediate)", "description": "Practice using your sword's momentum to your advantage against a dummy.", "skill_used": "cutting", @@ -291,8 +291,8 @@ "id": "prac_cutting_beg_bionic_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "bionic swords (beginner)", "description": "Get a feel for the weight, balance, and length of your bionic sword.", "skill_used": "cutting", @@ -307,8 +307,8 @@ "id": "prac_cutting_int_bionic_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "bionic swords (intermediate)", "description": "Practice fighting with your bionic sword against a dummy.", "skill_used": "cutting", @@ -328,8 +328,8 @@ "id": "prac_cutting_beg_great_axe", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "great axes (beginner)", "description": "Drill keeping the proper form while swinging a heavy axe.", "skill_used": "cutting", @@ -344,8 +344,8 @@ "id": "prac_cutting_int_great_axe", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "great axes (intermediate)", "description": "Engage in advanced exercises and drills using a heavy axe.", "skill_used": "cutting", @@ -364,8 +364,8 @@ "id": "prac_cutting_beg_hand_axe", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "hand axes (beginner)", "description": "Practice your chopping motions against an imaginary assailant.", "skill_used": "cutting", @@ -380,8 +380,8 @@ "id": "prac_cutting_int_hand_axe", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "hand axes (intermediate)", "description": "Practice advanced methods of using a hand axe in combat, such as pommel strikes and backswings.", "skill_used": "cutting", @@ -399,8 +399,8 @@ "id": "prac_bashing_beg_great_hammer", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "great hammers (beginner)", "description": "Work on handling the weight of your great hammer while swinging it.", "skill_used": "bashing", @@ -415,8 +415,8 @@ "id": "prac_bashing_int_great_hammer", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "great hammers (intermediate)", "description": "Practice your strikes with a great hammer, crushing the dummy without throwing yourself off balance.", "skill_used": "bashing", @@ -438,7 +438,7 @@ "category": "CC_PRACTICE", "subcategory": "CSC_PRACTICE_MELEE", "name": "flails (beginner)", - "description": "Practice swinging a flail around and drill your endurance by keeping your flail in motion for long period of time.", + "description": "Practice swinging a flail around and drill your endurance by keeping your flail in motion for long periods of time.", "skill_used": "bashing", "skills_required": [ [ "melee", 1 ] ], "time": "1 h", @@ -471,8 +471,8 @@ "id": "prac_bashing_beg_mace", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "maces (beginner)", "description": "Work at swinging a mace around and making it land where you want.", "skill_used": "bashing", @@ -487,8 +487,8 @@ "id": "prac_bashing_int_mace", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "maces (intermediate)", "description": "Practice advanced skull splitting techniques.", "skill_used": "bashing", @@ -507,8 +507,8 @@ "id": "prac_stabbing_beg_spear", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "spears (beginner)", "description": "Practice the basics of spears, the most popular melee weapon throughout history. Learn the footwork, how to thrust with power, where to place your hands, and the right way to hold the damn thing. Dominant hand back, non-dominant forward!", "skill_used": "stabbing", @@ -525,8 +525,8 @@ "id": "prac_stabbing_int_spear", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "spears (intermediate)", "description": "Practice advanced spear moves and accurate thrusts against a training dummy. It's not glamorous, but spears were the workhorses of armed combat for millenia with good reason.", "skill_used": "stabbing", @@ -548,8 +548,8 @@ "id": "prac_stabbing_beg_thrust", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "long thrusting swords (beginner)", "description": "Practice switching between different ways of gripping your sword.", "skill_used": "stabbing", @@ -564,8 +564,8 @@ "id": "prac_stabbing_int_thrust", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "long thrusting swords (intermediate)", "description": "Drill yourself in using your sword as a thrusting weapon against a dummy.", "skill_used": "stabbing", @@ -583,8 +583,8 @@ "id": "prac_bashing_beg_rifle", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "rifle CQC (beginner)", "description": "Practice striking with your long gun.", "skill_used": "bashing", @@ -599,8 +599,8 @@ "id": "prac_bashing_int_rifle", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "rifle CQC (intermediate)", "description": "Practice your muzzle thump and buttstroke against a dummy.", "skill_used": "bashing", @@ -619,8 +619,8 @@ "id": "prac_bashing_beg_pistol", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "pistol CQC (beginner)", "description": "Practice safely swinging your pistol around like a club.", "skill_used": "bashing", @@ -635,8 +635,8 @@ "id": "prac_bashing_int_pistol", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "pistol CQC (intermediate)", "description": "Pistol whip a dummy repeatedly until you've got it down.", "skill_used": "bashing", @@ -655,8 +655,8 @@ "id": "prac_stabbing_beg_knife", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "knives (beginner)", "description": "Practice the brutal art of shanking the shit out of something until it dies. Learn the form, where and how to stab to avoid your knife glancing off bone, and whether you should actually hold the knife in reverse grip. (It depends.)", "skill_used": "stabbing", @@ -673,8 +673,8 @@ "id": "prac_stabbing_int_knife", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "knives (intermediate)", "description": "Get in touch with your inner commando and practice some advanced knife-fighting techniques on a training dummy.", "skill_used": "stabbing", @@ -696,8 +696,8 @@ "id": "prac_stabbing_beg_shiv", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "shivs (beginner)", "description": "You wouldn't think it, but there is more to stabbing someone with something small and pointy. Practice shanking an imaginary enemy where it hurts most.", "skill_used": "stabbing", @@ -713,8 +713,8 @@ "id": "prac_stabbing_int_shiv", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "shivs (intermediate)", "description": "Practice shanking the ever living hell out of a dummy to hone your accuracy and grip while you gut someone.", "skill_used": "stabbing", @@ -736,8 +736,8 @@ "id": "prac_bashing_beg_baton", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "batons (beginner)", "description": "Practice the basics of using a baton or small club in combat.", "skill_used": "bashing", @@ -753,8 +753,8 @@ "id": "prac_bashing_int_baton", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "batons (intermediate)", "description": "Train your backswing, overhead strike, and up strike against a dummy.", "skill_used": "bashing", @@ -776,8 +776,8 @@ "id": "prac_cutting_beg_med_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "medium swords (beginner)", "description": "Footwork is key, practice dancing around an imaginary opponent with your sword.", "skill_used": "cutting", @@ -793,8 +793,8 @@ "id": "prac_cutting_int_med_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "medium swords (intermediate)", "description": "Perform solo drills to practice advanced techniques, such as feints and moulinet cuts.", "skill_used": "cutting", @@ -815,8 +815,8 @@ "id": "prac_cutting_beg_short_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "short swords (beginner)", "description": "Practice putting your weight behind your strike, cutting through an imaginary enemy.", "skill_used": "cutting", @@ -832,8 +832,8 @@ "id": "prac_cutting_int_short_sword", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "short swords (intermediate)", "description": "Practice drills in delivering quick and precise strikes against a dummy.", "skill_used": "cutting", @@ -854,8 +854,8 @@ "id": "prac_bashing_beg_staff", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "quarterstaves (beginner)", "description": "Practice swinging your staff, getting used to the balance and weight.", "skill_used": "bashing", @@ -871,8 +871,8 @@ "id": "prac_bashing_int_staff", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "quarterstaves (intermediate)", "description": "Practice using your staff against a dummy, familiarizing yourself with its length.", "skill_used": "bashing", @@ -894,8 +894,8 @@ "id": "prac_stabbing_beg_fencing", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "fencing (beginner)", "description": "Practice the basics of the noble art of fencing. Learn how to angle your body, aim your lunges, and parry pretend swords. Not that the undead are using swords. Hopefully.", "skill_used": "stabbing", @@ -912,8 +912,8 @@ "id": "prac_stabbing_int_fencing", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "fencing (intermediate)", "description": "Further develop your footwork and timing by fighting against a dummy. En garde!", "skill_used": "stabbing", @@ -938,7 +938,7 @@ "category": "CC_PRACTICE", "subcategory": "CSC_PRACTICE_MELEE", "name": "claw weapons (beginner)", - "description": "Practice the basics of fighting with claw weapon by shadowboxing while using them.", + "description": "Practice the basics of fighting with a clawed weapon by shadowboxing while using them.", "skill_used": "cutting", "skills_required": [ [ "melee", 1 ] ], "time": "1 h", @@ -973,7 +973,7 @@ "category": "CC_PRACTICE", "subcategory": "CSC_PRACTICE_MELEE", "name": "hooking weapons (beginner)", - "description": "Practice tripping an imaginary with the hook of your weapon in between swings.", + "description": "Practice tripping an imaginary enemy with the hook of your weapon in between swings.", "skill_used": "cutting", "skills_required": [ [ "melee", 1 ] ], "time": "1 h", @@ -1008,8 +1008,8 @@ "id": "prac_stabbing_beg_polearm", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "polearms (beginner)", "description": "Practice slicing and stabbing with your polearm against an imaginary opponent.", "skill_used": "stabbing", @@ -1026,8 +1026,8 @@ "id": "prac_stabbing_int_polearm", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "polearms (intermediate)", "description": "Perform solo exercises against a dummy to train your distance management and endurance with a polearm.", "skill_used": "stabbing", @@ -1046,8 +1046,8 @@ "id": "prac_cutting_beg_bionics", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "bionic weapons (beginner)", "description": "Perform basic fighting drills to learn to fight with your new bionic weapons.", "skill_used": "cutting", @@ -1062,8 +1062,8 @@ "id": "prac_cutting_int_bionics", "type": "practice", "activity_level": "BRISK_EXERCISE", - "category": "CC_PRACTICE", - "subcategory": "CSC_PRACTICE_MELEE", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", "name": "bionic weapons (intermediate)", "description": "Drill advanced methods of using your bionic weapons, with the help of a dummy.", "skill_used": "cutting", diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index aacaba047b39c..12c40e01cb840 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -1098,26 +1098,6 @@ [ [ "identification_module", 1 ] ] ] }, - { - "result": "broken_mininuke_hack", - "type": "uncraft", - "activity_level": "LIGHT_EXERCISE", - "skill_used": "electronics", - "difficulty": 5, - "time": "25 m", - "using": [ [ "soldering_standard", 10 ] ], - "qualities": [ { "id": "SCREW", "level": 1 } ], - "components": [ - [ [ "ai_module_basic", 1 ] ], - [ [ "RAM", 1 ] ], - [ [ "small_storage_battery", 1 ] ], - [ [ "scrap", 1 ] ], - [ [ "e_scrap", 1 ] ], - [ [ "quad_rotors", 1 ] ], - [ [ "sensor_module", 1 ] ], - [ [ "identification_module", 1 ] ] - ] - }, { "result": "broken_molebot", "type": "uncraft", @@ -3238,33 +3218,6 @@ "components": [ [ [ "paper", 10 ] ] ], "flags": [ "BLIND_EASY" ] }, - { - "result": "mininuke", - "type": "uncraft", - "activity_level": "MODERATE_EXERCISE", - "time": "3 h", - "skill_used": "electronics", - "difficulty": 8, - "skills_required": [ [ "fabrication", 4 ], [ "mechanics", 6 ] ], - "using": [ [ "soldering_standard", 150 ], [ "welding_standard", 6 ] ], - "qualities": [ - { "id": "SCREW", "level": 1 }, - { "id": "SCREW_FINE", "level": 1 }, - { "id": "WRENCH", "level": 2 }, - { "id": "WRENCH_FINE", "level": 1 }, - { "id": "SAW_M", "level": 2 }, - { "id": "SAW_M_FINE", "level": 1 } - ], - "components": [ - [ [ "cable", 12 ] ], - [ [ "chem_rdx", 20 ] ], - [ [ "circuit", 6 ] ], - [ [ "plutonium", 6 ] ], - [ [ "power_supply", 1 ] ], - [ [ "scrap", 200 ] ], - [ [ "plut_cell", 1 ] ] - ] - }, { "result": "months_old_newspaper", "type": "uncraft", diff --git a/data/json/recipes/recipe_food.json b/data/json/recipes/recipe_food.json index 7caad8777e6e8..fd4eb57f260d9 100644 --- a/data/json/recipes/recipe_food.json +++ b/data/json/recipes/recipe_food.json @@ -727,12 +727,12 @@ [ "cashews", 20 ], [ "beech_nuts", 20 ], [ "soybean", 10 ], - [ "seed_cotton_boll", 80 ], - [ "seed_pumpkin", 80 ], - [ "seed_sunflower", 80 ], - [ "seed_canola", 80 ], - [ "seed_grapes", 80 ], - [ "seed_weed", 80 ] + [ "seed_cotton_boll", 20 ], + [ "seed_pumpkin", 5 ], + [ "seed_sunflower", 5 ], + [ "seed_canola", 5 ], + [ "seed_grapes", 20 ], + [ "seed_weed", 5 ] ] ] }, @@ -768,12 +768,12 @@ [ "cashews", 20 ], [ "beech_nuts", 20 ], [ "soybean", 10 ], - [ "seed_cotton_boll", 80 ], - [ "seed_pumpkin", 80 ], - [ "seed_sunflower", 80 ], - [ "seed_canola", 80 ], - [ "seed_grapes", 80 ], - [ "seed_weed", 80 ] + [ "seed_cotton_boll", 20 ], + [ "seed_pumpkin", 5 ], + [ "seed_sunflower", 5 ], + [ "seed_canola", 5 ], + [ "seed_grapes", 20 ], + [ "seed_weed", 5 ] ] ] }, @@ -9350,6 +9350,7 @@ [ "seed_thyme", 3 ], [ "seed_canola", 1 ], [ "seed_watermelon", 3 ], + [ "seed_wintergreen", 3 ], [ "seed_pumpkin", 3 ], [ "seed_sunflower", 3 ], [ "seed_dogbane", 3 ], diff --git a/data/json/recipes/weapon/ranged.json b/data/json/recipes/weapon/ranged.json index f13a90431f67d..981efcdb24c2b 100644 --- a/data/json/recipes/weapon/ranged.json +++ b/data/json/recipes/weapon/ranged.json @@ -746,6 +746,23 @@ "proficiencies": [ { "proficiency": "prof_bowyery" }, { "proficiency": "prof_carving" } ], "components": [ [ [ "stick", 1 ], [ "2x4", 1 ] ], [ [ "cordage_superior", 2, "LIST" ] ] ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "reflexbow", + "category": "CC_WEAPON", + "subcategory": "CSC_WEAPON_RANGED", + "skill_used": "fabrication", + "skills_required": [ [ "archery", 2 ] ], + "difficulty": 4, + "time": "8 h", + "autolearn": true, + "book_learn": [ [ "recipe_bows", 4 ], [ "manual_archery", 5 ] ], + "using": [ [ "adhesive", 3 ] ], + "proficiencies": [ { "proficiency": "prof_bowyery" }, { "proficiency": "prof_carving" } ], + "qualities": [ { "id": "CUT", "level": 2 } ], + "components": [ [ [ "stick", 3 ], [ "2x4", 2 ] ], [ [ "bone_sturdy", 3, "LIST" ] ], [ [ "cordage_superior", 2, "LIST" ] ] ] + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index 5bb927b55b738..06cba104c0706 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -920,6 +920,9 @@ "bungalow20": 50, "bungalow21": 50, "bungalow22": 50, + "bungalow23": 50, + "bungalow24": 50, + "bungalow25": 50, "house_w_1": 50, "house_two_story_basement": 50, "multi_unit_two_story_basement": 40, @@ -930,6 +933,11 @@ "house_wooded": 50, "house_prepper": 20, "house_prepper2": 10, + "house_fence01": 20, + "house_fence02": 20, + "house_fence03": 20, + "house_fence04": 20, + "house_fence05": 20, "house_fortified": 20, "duplex": 50, "house_duplex2": 50, diff --git a/data/json/requirements/cooking_components.json b/data/json/requirements/cooking_components.json index e6a7135b0b081..45c9488bc2b0b 100644 --- a/data/json/requirements/cooking_components.json +++ b/data/json/requirements/cooking_components.json @@ -24,35 +24,44 @@ ] }, { - "id": "bread_sandwich", + "id": "bread_toastable", "type": "requirement", - "//": "Bread appropriate for sandwiches.", + "//": "Bread appropriate for toast.", "components": [ [ - [ "flatbread", 1 ], - [ "tortilla_any", 1, "LIST" ], [ "bread", 1 ], [ "wastebread", 1 ], [ "sourdough_bread", 1 ], - [ "biscuit", 1 ], [ "brioche", 1 ], - [ "crackers", 1 ], [ "brown_bread", 1 ], [ "hallula", 1 ] ] ] }, + { + "id": "bread_toastable_wheat_free", + "type": "requirement", + "//": "Wheat free bread appropriate for toast.", + "components": [ [ [ "bread_wheat_free", 1 ], [ "brown_bread_wheat_free", 1 ], [ "cornbread", 1 ] ] ] + }, + { + "id": "bread_sandwich", + "type": "requirement", + "//": "Bread appropriate for sandwiches.", + "components": [ + [ [ "bread_toastable", 1, "LIST" ], [ "tortilla_any", 1, "LIST" ], [ "biscuit", 1 ], [ "crackers", 1 ], [ "toast", 1 ] ] + ] + }, { "id": "bread_sandwich_wheat_free", "type": "requirement", "//": "Wheat free bread appropriate for sandwiches.", "components": [ [ - [ "cornbread", 1 ], - [ "bread_wheat_free", 1 ], + [ "bread_toastable_wheat_free", 1, "LIST" ], [ "flatbread_wheat_free", 1 ], [ "tortilla_corn", 1 ], - [ "brown_bread_wheat_free", 1 ] + [ "toast_wheat_free", 1 ] ] ] }, diff --git a/data/json/ui/structured/structured_health_blocks.json b/data/json/ui/structured/structured_health_blocks.json index 02b771c77c17b..b93efbbe0fdab 100644 --- a/data/json/ui/structured/structured_health_blocks.json +++ b/data/json/ui/structured/structured_health_blocks.json @@ -241,7 +241,7 @@ "fatigue_desc_no_label", "body_temp_desc_no_label", "structured_temp_radiation_layout", - "focus_num" + "structured_focus_mood_layout" ] }, { diff --git a/data/json/vehicleparts/cargo.json b/data/json/vehicleparts/cargo.json index 987b2e41933a7..7b85448b66118 100644 --- a/data/json/vehicleparts/cargo.json +++ b/data/json/vehicleparts/cargo.json @@ -187,6 +187,21 @@ "variants_bases": [ { "id": "wheelbarrow", "label": "Wheelbarrow" } ], "variants": [ { "symbols": "o", "symbols_broken": "#" } ] }, + { + "copy-from": "box_abstract", + "id": "integrated_trashcan", + "//": "Volume based off of:", + "//2": "https://www.uline.com/Product/Detail/H-7938BL/Trash-Cans-with-Wheels/Uline-Trash-Can-with-Wheels-95-Gallon-Black?pricode=WB3072&utm_source=Bing&utm_medium=pla&utm_term=H-7938BL&utm_campaign=Facilities%2BMaintenance&utm_source=Bing&utm_medium=pla&utm_term=H-7938BL&utm_campaign=Facilities%2BMaintenance&msclkid=d3c8827d02691eb87066e72c65ff5790", + "type": "vehicle_part", + "name": { "str": "industrial trash can" }, + "categories": [ "cargo" ], + "color": "light_gray", + "broken_color": "light_gray", + "size": "359614 ml", + "item": "trashcan_large", + "variants_bases": [ { "id": "trash can", "label": "Trash Can" } ], + "variants": [ { "symbols": ")", "symbols_broken": "#" } ] + }, { "id": "cargo_space_external", "type": "vehicle_part", diff --git a/data/json/vehicles/carts.json b/data/json/vehicles/carts.json index b9669095104e8..b9d740ee309d2 100644 --- a/data/json/vehicles/carts.json +++ b/data/json/vehicles/carts.json @@ -133,6 +133,14 @@ "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "wheel_caster", "basketlg#cart" ] } ], "items": [ { "x": 0, "y": 0, "chance": 35, "item_groups": [ "trash_cart" ] } ] }, + { + "id": "rolling_trash_can", + "type": "vehicle", + "name": "Rolling Trash Can", + "blueprint": [ [ "o" ] ], + "parts": [ { "x": 0, "y": 0, "parts": [ "xlframe", "wheel_caster", "integrated_trashcan" ] } ], + "items": [ { "x": 0, "y": 0, "chance": 75, "item_groups": [ "trash" ] } ] + }, { "id": "grocery_cart", "type": "vehicle", diff --git a/data/mods/Aftershock/effects_on_condition.json b/data/mods/Aftershock/effects_on_condition.json index 494f8e6724d23..22a26e2914226 100644 --- a/data/mods/Aftershock/effects_on_condition.json +++ b/data/mods/Aftershock/effects_on_condition.json @@ -65,5 +65,23 @@ }, { "u_teleport": { "global_val": "new_map" }, "force": true } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_CRASHING_SHIP_SETUP", + "eoc_type": "SCENARIO_SPECIFIC", + "effect": [ { "queue_eocs": "EOC_CRASHING_SHIP_U_DIE", "time_in_future": "7 minutes" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_CRASHING_SHIP_U_DIE", + "condition": { "u_near_om_location": "crashing_ship_5", "range": 1 }, + "effect": [ + { + "u_message": "A large boom rocks the hull, fire engulfs the decks. You can do nothing but watch as a wall of burning gas rushes towards you, consumes you as fast as it came, and then all is black.", + "popup": true + }, + "u_die" + ] } ] diff --git a/data/mods/Aftershock/maps/crashing_ship.json b/data/mods/Aftershock/maps/crashing_ship.json index 569208367c73b..696aa9b0a6451 100644 --- a/data/mods/Aftershock/maps/crashing_ship.json +++ b/data/mods/Aftershock/maps/crashing_ship.json @@ -202,72 +202,6 @@ { "group": "afs_escapepod_shootout_corpse", "x": 52, "y": 32 } ], "place_rubble": [ { "x": [ 1, 4 ], "y": [ 24, 29 ], "repeat": [ 5, 20 ] } ], - "place_item": [ - { "item": "afs_set_us_up_the_bomb_act", "x": 59, "y": 8, "amount": 1, "custom-flags": [ "ACTIVATE_ON_PLACE" ] }, - { - "item": "afs_set_us_up_the_bomb_act", - "x": 25, - "y": 71, - "amount": 1, - "custom-flags": [ "ACTIVATE_ON_PLACE" ] - }, - { - "item": "afs_set_us_up_the_bomb_act", - "x": 1, - "y": 16, - "amount": 1, - "custom-flags": [ "ACTIVATE_ON_PLACE" ] - }, - { - "item": "afs_set_us_up_the_bomb_act", - "x": 30, - "y": 4, - "amount": 1, - "custom-flags": [ "ACTIVATE_ON_PLACE" ] - }, - { - "item": "afs_set_us_up_the_bomb_act", - "x": 69, - "y": 37, - "amount": 1, - "custom-flags": [ "ACTIVATE_ON_PLACE" ] - }, - { - "item": "afs_set_us_up_the_bomb_act", - "x": 41, - "y": 62, - "amount": 1, - "custom-flags": [ "ACTIVATE_ON_PLACE" ] - }, - { - "item": "afs_set_us_up_the_bomb_act", - "x": 60, - "y": 57, - "amount": 1, - "custom-flags": [ "ACTIVATE_ON_PLACE" ] - }, - { - "item": "afs_set_us_up_the_bomb_act", - "x": 17, - "y": 42, - "amount": 1, - "custom-flags": [ "ACTIVATE_ON_PLACE" ] - }, - { - "item": "afs_set_us_up_the_bomb_act", - "x": 7, - "y": 68, - "amount": 1, - "custom-flags": [ "ACTIVATE_ON_PLACE" ] - }, - { - "item": "afs_set_us_up_the_bomb_act", - "x": 40, - "y": 31, - "amount": 1, - "custom-flags": [ "ACTIVATE_ON_PLACE" ] - } - ], "place_graffiti": [ { "text": "Barracks", "x": 10, "y": 23 }, { "text": "Barracks", "x": 13, "y": 23 }, @@ -283,49 +217,5 @@ "fields": { "F": { "field": "fd_fire", "intensity": 3, "age": 1 }, "x": { "field": "fd_blood", "intensity": 3 } }, "computers": { "^": { "name": "Escape Pod", "security": 0, "options": [ { "name": "Ready Escape Pod", "action": "unlock" } ] } } } - }, - { - "id": "afs_set_us_up_the_bomb", - "type": "TOOL", - "category": "weapons", - "name": { "str": "ship self-destruct system" }, - "description": "You shouldn't be seeing this!", - "weight": "1 g", - "volume": "1 ml", - "price": 0, - "material": [ "steel" ], - "looks_like": "t_foamcrete_wall_seal", - "symbol": " ", - "color": "white", - "explode_in_fire": false, - "explosion": { "power": 90000000, "shrapnel": { "casing_mass": 1200000, "fragment_mass": 60000 } }, - "use_action": { - "target": "afs_set_us_up_the_bomb_act", - "target_timer": "420 seconds", - "menu_text": "Activate fuze", - "type": "transform" - }, - "flags": [ "BOMB", "HIDDEN_ITEM" ] - }, - { - "id": "afs_set_us_up_the_bomb_act", - "type": "TOOL", - "category": "weapons", - "name": { "str": "active ship self-destruct system" }, - "description": "You shouldn't be seeing this!", - "weight": "1 g", - "volume": "1 ml", - "price": 0, - "material": [ "steel" ], - "looks_like": "t_foamcrete_wall_seal", - "symbol": " ", - "color": "white", - "explode_in_fire": false, - "use_action": { "type": "message", "message": "You should be running!" }, - "countdown_action": { - "type": "explosion", - "explosion": { "power": 90000000, "shrapnel": { "casing_mass": 1260000, "fragment_mass": 60000 } } - }, - "flags": [ "BOMB", "HIDDEN_ITEM" ] } ] diff --git a/data/mods/Aftershock/scenarios.json b/data/mods/Aftershock/scenarios.json index e2faab1be7bfd..9e5692b110c57 100644 --- a/data/mods/Aftershock/scenarios.json +++ b/data/mods/Aftershock/scenarios.json @@ -178,6 +178,7 @@ "allowed_locs": [ "sloc_crashing_ship" ], "professions": [ "afs_espatier", "afs_rating", "afs_ship_escape" ], "flags": [ "LONE_START", "HELI_CRASH" ], - "start_name": "Crashing Ship" + "start_name": "Crashing Ship", + "eoc": [ "EOC_CRASHING_SHIP_SETUP" ] } ] diff --git a/data/mods/Generic_Guns/ammo/gg_ammo_migration.json b/data/mods/Generic_Guns/ammo/gg_ammo_migration.json index 71737d1fed91f..bedd874525109 100644 --- a/data/mods/Generic_Guns/ammo/gg_ammo_migration.json +++ b/data/mods/Generic_Guns/ammo/gg_ammo_migration.json @@ -470,17 +470,7 @@ "replace": "grenade_ammo_teargas" }, { - "id": [ - "shot_00", - "shot_paper_00", - "410shot_000", - "20x66_exp", - "20x66_flechette", - "20x66_frag", - "20x66_inc", - "20x66_shot", - "20x66_flare" - ], + "id": [ "shot_00", "shot_paper_00", "410shot_000", "20x66_exp", "20x66_frag", "20x66_shot", "20x66_flare" ], "type": "MIGRATION", "replace": "shot_buck" }, @@ -510,12 +500,12 @@ "replace": "shot_explosive" }, { - "id": [ "reloaded_shot_00", "reloaded_410shot_000", "20x66_bootleg_shot", "20x66_bootleg_flechette", "shot_scrap" ], + "id": [ "reloaded_shot_00", "reloaded_410shot_000", "20x66_bootleg_shot", "shot_scrap" ], "type": "MIGRATION", "replace": "reloaded_shot_buck" }, { - "id": [ "reloaded_shot_00", "reloaded_410shot_000", "20x66_bootleg_shot", "20x66_bootleg_flechette" ], + "id": [ "reloaded_shot_00", "reloaded_410shot_000" ], "type": "MIGRATION", "replace": "reloaded_shot_buck" }, diff --git a/data/mods/Magiclysm/Spells/attunements/Magnetism_Mage.json b/data/mods/Magiclysm/Spells/attunements/Magnetism_Mage.json index e7a3e17abac8d..2f7bd3b813066 100644 --- a/data/mods/Magiclysm/Spells/attunements/Magnetism_Mage.json +++ b/data/mods/Magiclysm/Spells/attunements/Magnetism_Mage.json @@ -34,9 +34,6 @@ [ "reloaded_10mm_fmj", 1 ], [ "12mm", 1 ], [ "reloaded_10mm_fmj", 1 ], - [ "20x66_bootleg_flechette", 1 ], - [ "20x66_bootleg_slug", 1 ], - [ "20x66_flechette", 1 ], [ "20x66_slug", 1 ], [ "22_cb", 1 ], [ "22_fmj", 1 ], diff --git a/data/mods/Magiclysm/recipes/weapons.json b/data/mods/Magiclysm/recipes/weapons.json index 5283f117febc8..61ef61fc38991 100644 --- a/data/mods/Magiclysm/recipes/weapons.json +++ b/data/mods/Magiclysm/recipes/weapons.json @@ -547,7 +547,7 @@ ], "qualities": [ { "id": "HAMMER", "level": 3 }, { "id": "CHISEL", "level": 3 } ], "tools": [ [ [ "metalworking_tongs", -1 ] ], [ [ "anvil", -1 ] ], [ [ "swage", -1 ] ] ], - "components": [ [ [ "broadsword", 1 ] ], [ [ "gold_small", 20 ] ], [ [ "orichalcum_ingot", 2 ] ] ] + "components": [ [ [ "qt_broadsword", 1 ] ], [ [ "gold_small", 20 ] ], [ [ "orichalcum_ingot", 2 ] ] ] }, { "type": "recipe", diff --git a/data/mods/MindOverMatter/damage_types.json b/data/mods/MindOverMatter/damage_types.json index 86d90c818b508..e6273d7d25164 100644 --- a/data/mods/MindOverMatter/damage_types.json +++ b/data/mods/MindOverMatter/damage_types.json @@ -4,7 +4,7 @@ "type": "damage_type", "physical": false, "magic_color": "yellow", - "name": "photokinetic", + "name": "focused light", "skill": "metaphysics", "derived_from": [ "heat", 0.8 ], "immune_flags": { "character": [ "PHOTOKIN_CHAR_IMMUNE" ], "monster": [ "PHOTOKIN_MONSTER_IMMUNE" ] }, @@ -28,7 +28,7 @@ "id": "psi_photokinetic_damage", "type": "damage_info_order", "info_display": "detailed", - "verb": "buffeting", + "verb": "dazzling", "bionic_info": { "order": 999903, "show_type": false }, "protection_info": { "order": 999903, "show_type": false }, "pet_prot_info": { "order": 999903, "show_type": false }, diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_awakening.json b/data/mods/MindOverMatter/effectoncondition/eoc_awakening.json index 348fc4757643a..d3a536782c441 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_awakening.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_awakening.json @@ -223,8 +223,7 @@ "popup": true }, { "u_add_trait": "PYROKINETIC" }, - { "u_add_trait": "PYROGLOW_WEAK" }, - { "u_add_trait": "PYROGLOW_STRONG" }, + { "u_add_trait": "PYROKIN_ADAPTATION" }, { "u_add_effect": "effect_pyrokinetic_cloak", "duration": "5 minutes" }, { "u_add_effect": "effect_pyrokinetic_aura", "duration": "5 minutes" }, { "run_eocs": "EOC_TEACH_PYROKIN_CONTEMPLATE_RECIPES" }, @@ -1139,8 +1138,7 @@ "popup": true }, { "u_add_trait": "PYROKINETIC" }, - { "u_add_trait": "PYROGLOW_WEAK" }, - { "u_add_trait": "PYROGLOW_STRONG" }, + { "u_add_trait": "PYROKIN_ADAPTATION" }, { "run_eocs": "EOC_TEACH_PYROKIN_CONTEMPLATE_RECIPES" }, { "u_add_effect": "psionic_awakened", "duration": { "math": [ "ps_str * u_val('time: 2 h')" ] } }, { "math": [ "awakening_countup", "+=", "1" ] }, diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json b/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json index fd54bfc8223bf..29d2fc6d7eaf9 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_learn_recipes.json @@ -36,6 +36,8 @@ "type": "effect_on_condition", "id": "EOC_TEACH_PHOTOKIN_CONTEMPLATE_RECIPES", "effect": [ + { "u_learn_recipe": "practice_photokinetic_light_local" }, + { "u_learn_recipe": "practice_photokinetic_create_light" }, { "u_learn_recipe": "practice_photokinetic_snuff_light" }, { "u_learn_recipe": "practice_photokinetic_light_dodge" }, { "u_learn_recipe": "practice_photokinetic_invisibility" }, @@ -43,8 +45,9 @@ { "u_learn_recipe": "practice_photokinetic_light_image" }, { "u_learn_recipe": "practice_photokinetic_rad_immunity" }, { "u_learn_recipe": "practice_photokinetic_light_arms" }, - { "u_learn_recipe": "practice_photokinetic_light_disintegrate" }, - { "u_learn_recipe": "practice_photokinetic_light_flash" } + { "u_learn_recipe": "practice_photokinetic_light_flash" }, + { "u_learn_recipe": "practice_photokinetic_light_blinding_glare" }, + { "u_learn_recipe": "practice_photokinetic_light_disintegrate" } ] }, { @@ -216,7 +219,10 @@ "eoc_type": "EVENT", "required_event": "game_begin", "condition": { "u_has_trait": "PHOTOKINETIC" }, - "effect": [ { "queue_eocs": "EOC_TEACH_PHOTOKIN_FOOD_RECIPES", "time_in_future": [ "10 seconds", "15 seconds" ] } ] + "effect": [ + { "queue_eocs": "EOC_TEACH_PHOTOKIN_CONTEMPLATE_RECIPES", "time_in_future": [ "10 seconds", "15 seconds" ] }, + { "queue_eocs": "EOC_TEACH_PHOTOKIN_FOOD_RECIPES", "time_in_future": [ "10 seconds", "15 seconds" ] } + ] }, { "type": "effect_on_condition", diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_misc.json b/data/mods/MindOverMatter/effectoncondition/eoc_misc.json index 9ba9b2472f45e..30b73102272ba 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_misc.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_misc.json @@ -14,12 +14,13 @@ "condition": { "and": [ { - "u_has_any_trait": [ "BIOKINETIC", "CLAIRSENTIENT", "PYROKINETIC", "TELEKINETIC", "TELEPATH", "TELEPORTER", "VITAKINETIC" ] + "u_has_any_trait": [ "BIOKINETIC", "CLAIRSENTIENT", "PHOTOKINETIC", "PYROKINETIC", "TELEKINETIC", "TELEPATH", "TELEPORTER", "VITAKINETIC" ] }, { "or": [ { "compare_string": [ "BIOKINETIC", { "context_val": "school" } ] }, { "compare_string": [ "CLAIRSENTIENT", { "context_val": "school" } ] }, + { "compare_string": [ "PHOTOKINETIC", { "context_val": "school" } ] }, { "compare_string": [ "PYROKINETIC", { "context_val": "school" } ] }, { "compare_string": [ "TELEKINETIC", { "context_val": "school" } ] }, { "compare_string": [ "TELEPATH", { "context_val": "school" } ] }, @@ -40,12 +41,13 @@ "condition": { "and": [ { - "u_has_any_trait": [ "BIOKINETIC", "CLAIRSENTIENT", "PYROKINETIC", "TELEKINETIC", "TELEPATH", "TELEPORTER", "VITAKINETIC" ] + "u_has_any_trait": [ "BIOKINETIC", "CLAIRSENTIENT", "PHOTOKINETIC", "PYROKINETIC", "TELEKINETIC", "TELEPATH", "TELEPORTER", "VITAKINETIC" ] }, { "or": [ { "compare_string": [ "BIOKINETIC", { "context_val": "school" } ] }, { "compare_string": [ "CLAIRSENTIENT", { "context_val": "school" } ] }, + { "compare_string": [ "PHOTOKINETIC", { "context_val": "school" } ] }, { "compare_string": [ "PYROKINETIC", { "context_val": "school" } ] }, { "compare_string": [ "TELEKINETIC", { "context_val": "school" } ] }, { "compare_string": [ "TELEPATH", { "context_val": "school" } ] }, @@ -58,337 +60,6 @@ }, "effect": [ { "math": [ "u_skill_exp('metaphysics', 'raw')", "+=", "(25 * _difficulty)" ] } ] }, - { - "type": "effect_on_condition", - "id": "EOC_PSIONICS_BIOKINETIC_CHANNELING_FAILURE", - "//": "Once focus becomes more persistant and doesn't immediately drop to 25 on doing basically anything, low focus should also make overload more likely", - "eoc_type": "EVENT", - "required_event": "spellcasting_finish", - "condition": { - "and": [ - { "u_has_trait": "BIOKINETIC" }, - { "compare_string": [ "BIOKINETIC", { "context_val": "school" } ] }, - { "math": [ "_success", "==", "false" ] }, - { - "x_in_y_chance": { - "x": { - "math": [ - "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" - ] - }, - "y": 1000 - } - } - ] - }, - "effect": [ - { "u_message": "Your powers rage out of control!", "type": "bad" }, - { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, - { - "u_add_effect": "psionic_overload", - "duration": { - "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "effect_biokin_overload", - "duration": { - "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - } - ] - }, - { - "type": "effect_on_condition", - "id": "EOC_PSIONICS_CLAIRSENTIENT_CHANNELING_FAILURE", - "eoc_type": "EVENT", - "required_event": "spellcasting_finish", - "condition": { - "and": [ - { "u_has_trait": "CLAIRSENTIENT" }, - { "compare_string": [ "CLAIRSENTIENT", { "context_val": "school" } ] }, - { "math": [ "_success", "==", "false" ] }, - { - "x_in_y_chance": { - "x": { - "math": [ - "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" - ] - }, - "y": 1000 - } - } - ] - }, - "effect": [ - { "u_message": "Your powers rage out of control!", "type": "bad" }, - { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, - { - "u_add_effect": "psionic_overload", - "duration": { - "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "blind_clair_overload", - "duration": { - "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "deaf_clair_overload", - "duration": { - "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - } - ] - }, - { - "type": "effect_on_condition", - "id": "EOC_PSIONICS_PHOTOKINETIC_CHANNELING_FAILURE", - "eoc_type": "EVENT", - "required_event": "spellcasting_finish", - "condition": { - "and": [ - { "u_has_trait": "PHOTOKINETIC" }, - { "compare_string": [ "PHOTOKINETIC", { "context_val": "school" } ] }, - { "math": [ "_success", "==", "false" ] }, - { - "x_in_y_chance": { - "x": { - "math": [ - "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" - ] - }, - "y": 1000 - } - } - ] - }, - "effect": [ - { "u_message": "Your powers rage out of control!", "type": "bad" }, - { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, - { - "u_add_effect": "psionic_overload", - "duration": { - "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "effect_photokin_myopia_overload", - "duration": { - "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "effect_photokin_lumination_overload", - "duration": { - "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - } - ] - }, - { - "type": "effect_on_condition", - "id": "EOC_PSIONICS_PYROKINETIC_CHANNELING_FAILURE", - "eoc_type": "EVENT", - "required_event": "spellcasting_finish", - "condition": { - "and": [ - { "u_has_trait": "PYROKINETIC" }, - { "compare_string": [ "PYROKINETIC", { "context_val": "school" } ] }, - { "math": [ "_success", "==", "false" ] }, - { - "x_in_y_chance": { - "x": { - "math": [ - "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" - ] - }, - "y": 1000 - } - } - ] - }, - "effect": [ - { "u_message": "Your powers rage out of control!", "type": "bad" }, - { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, - { - "u_add_effect": "psionic_overload", - "duration": { - "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "effect_pyrokin_overload", - "duration": { - "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - } - ] - }, - { - "type": "effect_on_condition", - "id": "EOC_PSIONICS_TELEKINETIC_CHANNELING_FAILURE", - "eoc_type": "EVENT", - "required_event": "spellcasting_finish", - "condition": { - "and": [ - { "u_has_trait": "TELEKINETIC" }, - { "compare_string": [ "TELEKINETIC", { "context_val": "school" } ] }, - { "math": [ "_success", "==", "false" ] }, - { - "x_in_y_chance": { - "x": { - "math": [ - "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" - ] - }, - "y": 1000 - } - } - ] - }, - "effect": [ - { "u_message": "Your powers rage out of control!", "type": "bad" }, - { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, - { - "u_add_effect": "psionic_overload", - "duration": { - "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "effect_telekin_overload", - "duration": { - "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - } - ] - }, - { - "type": "effect_on_condition", - "id": "EOC_PSIONICS_TELEPATH_CHANNELING_FAILURE", - "eoc_type": "EVENT", - "required_event": "spellcasting_finish", - "condition": { - "and": [ - { "u_has_trait": "TELEPATH" }, - { "compare_string": [ "TELEPATH", { "context_val": "school" } ] }, - { "math": [ "_success", "==", "false" ] }, - { - "x_in_y_chance": { - "x": { - "math": [ - "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" - ] - }, - "y": 1000 - } - } - ] - }, - "effect": [ - { "u_message": "Your powers rage out of control!", "type": "bad" }, - { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, - { - "u_add_effect": "psionic_overload", - "duration": { - "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "nightmares", - "duration": { - "math": [ "u_val('time: 30 m') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "disrupted_sleep", - "duration": { - "math": [ "u_val('time: 30 m') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - } - ] - }, - { - "type": "effect_on_condition", - "id": "EOC_PSIONICS_TELEPORTER_CHANNELING_FAILURE", - "eoc_type": "EVENT", - "required_event": "spellcasting_finish", - "condition": { - "and": [ - { "u_has_trait": "TELEPORTER" }, - { "compare_string": [ "TELEPORTER", { "context_val": "school" } ] }, - { "math": [ "_success", "==", "false" ] }, - { - "x_in_y_chance": { - "x": { - "math": [ - "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" - ] - }, - "y": 1000 - } - } - ] - }, - "effect": [ - { "u_message": "Your powers rage out of control!", "type": "bad" }, - { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, - { - "u_add_effect": "psionic_overload", - "duration": { - "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "effect_portal_storm_teleport", - "duration": { - "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - } - ] - }, - { - "type": "effect_on_condition", - "id": "EOC_PSIONICS_VITAKINETIC_CHANNELING_FAILURE", - "eoc_type": "EVENT", - "required_event": "spellcasting_finish", - "condition": { - "and": [ - { "u_has_trait": "VITAKINETIC" }, - { "compare_string": [ "VITAKINETIC", { "context_val": "school" } ] }, - { "math": [ "_success", "==", "false" ] }, - { - "x_in_y_chance": { - "x": { - "math": [ - "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" - ] - }, - "y": 1000 - } - } - ] - }, - "effect": [ - { "u_message": "Your powers rage out of control!", "type": "bad" }, - { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, - { - "u_add_effect": "psionic_overload", - "duration": { - "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - }, - { - "u_add_effect": "effect_vitakin_overload", - "duration": { - "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] - } - } - ] - }, { "type": "effect_on_condition", "id": "EOC_PSIONICS_BROKEN_LIMB_ENDS_POWERS", 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 95b13e66ff05a..13a2640585f44 100644 --- a/data/mods/MindOverMatter/effectoncondition/eoc_on_power_use_events.json +++ b/data/mods/MindOverMatter/effectoncondition/eoc_on_power_use_events.json @@ -5,6 +5,7 @@ "effect": [ { "u_lose_trait": "CLAIR_SPEED_READ" }, { "u_lose_effect": "effect_clair_speed_reader" }, + { "u_lose_effect": "effect_photokin_light_local" }, { "u_remove_item_with": "pyrokinetic_fire_tool" }, { "u_remove_item_with": "pyrokinetic_torch_weld" }, { "u_lose_effect": "effect_telekinetic_strength" }, @@ -42,6 +43,7 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, { "u_has_effect": "effect_telekinetic_strength" }, @@ -81,6 +83,7 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, { "u_has_effect": "effect_telekinetic_strength" }, @@ -120,6 +123,7 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, { "u_has_effect": "effect_telekinetic_strength" }, @@ -159,6 +163,7 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, { "u_has_effect": "effect_telekinetic_strength" }, @@ -200,6 +205,7 @@ "or": [ { "u_has_trait": "CLAIR_SPEED_READ" }, { "u_has_effect": "effect_clair_speed_reader" }, + { "u_has_effect": "effect_photokin_light_local" }, { "u_has_item": "pyrokinetic_fire_tool" }, { "u_has_item": "pyrokinetic_torch_weld" }, { "u_has_effect": "effect_telekinetic_strength" }, @@ -305,5 +311,362 @@ "required_event": "character_takes_damage", "condition": { "u_has_effect": "effect_photokin_dodge" }, "effect": [ { "u_lose_effect": "effect_photokin_dodge" } ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PSIONICS_BIOKINETIC_CHANNELING_FAILURE", + "//": "Once focus becomes more persistant and doesn't immediately drop to 25 on doing basically anything, low focus should also make overload more likely", + "eoc_type": "EVENT", + "required_event": "spellcasting_finish", + "condition": { + "and": [ + { "u_has_trait": "BIOKINETIC" }, + { "compare_string": [ "BIOKINETIC", { "context_val": "school" } ] }, + { "math": [ "_success", "==", "false" ] }, + { + "x_in_y_chance": { + "x": { + "math": [ + "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" + ] + }, + "y": 1000 + } + } + ] + }, + "effect": [ + { "u_message": "Your powers rage out of control!", "type": "bad" }, + { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, + { + "u_add_effect": "psionic_overload", + "duration": { + "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "effect_biokin_overload", + "duration": { + "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PSIONICS_CLAIRSENTIENT_CHANNELING_FAILURE", + "eoc_type": "EVENT", + "required_event": "spellcasting_finish", + "condition": { + "and": [ + { "u_has_trait": "CLAIRSENTIENT" }, + { "compare_string": [ "CLAIRSENTIENT", { "context_val": "school" } ] }, + { "math": [ "_success", "==", "false" ] }, + { + "x_in_y_chance": { + "x": { + "math": [ + "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" + ] + }, + "y": 1000 + } + } + ] + }, + "effect": [ + { "u_message": "Your powers rage out of control!", "type": "bad" }, + { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, + { + "u_add_effect": "psionic_overload", + "duration": { + "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "blind_clair_overload", + "duration": { + "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "deaf_clair_overload", + "duration": { + "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PSIONICS_PHOTOKINETIC_CHANNELING_FAILURE", + "eoc_type": "EVENT", + "required_event": "spellcasting_finish", + "condition": { + "and": [ + { "u_has_trait": "PHOTOKINETIC" }, + { "compare_string": [ "PHOTOKINETIC", { "context_val": "school" } ] }, + { "math": [ "_success", "==", "false" ] }, + { + "x_in_y_chance": { + "x": { + "math": [ + "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" + ] + }, + "y": 1000 + } + } + ] + }, + "effect": [ + { "u_message": "Your powers rage out of control!", "type": "bad" }, + { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, + { + "u_add_effect": "psionic_overload", + "duration": { + "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "effect_photokin_myopia_overload", + "duration": { + "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "effect_photokin_lumination_overload", + "duration": { + "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PSIONICS_PYROKINETIC_CHANNELING_FAILURE", + "eoc_type": "EVENT", + "required_event": "spellcasting_finish", + "condition": { + "and": [ + { "u_has_trait": "PYROKINETIC" }, + { "compare_string": [ "PYROKINETIC", { "context_val": "school" } ] }, + { "math": [ "_success", "==", "false" ] }, + { + "x_in_y_chance": { + "x": { + "math": [ + "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" + ] + }, + "y": 1000 + } + } + ] + }, + "effect": [ + { "u_message": "Your powers rage out of control!", "type": "bad" }, + { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, + { + "u_add_effect": "psionic_overload", + "duration": { + "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "effect_pyrokin_overload", + "duration": { + "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PSIONICS_TELEKINETIC_CHANNELING_FAILURE", + "eoc_type": "EVENT", + "required_event": "spellcasting_finish", + "condition": { + "and": [ + { "u_has_trait": "TELEKINETIC" }, + { "compare_string": [ "TELEKINETIC", { "context_val": "school" } ] }, + { "math": [ "_success", "==", "false" ] }, + { + "x_in_y_chance": { + "x": { + "math": [ + "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" + ] + }, + "y": 1000 + } + } + ] + }, + "effect": [ + { "u_message": "Your powers rage out of control!", "type": "bad" }, + { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, + { + "u_add_effect": "psionic_overload", + "duration": { + "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "effect_telekin_overload", + "duration": { + "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PSIONICS_TELEPATH_CHANNELING_FAILURE", + "eoc_type": "EVENT", + "required_event": "spellcasting_finish", + "condition": { + "and": [ + { "u_has_trait": "TELEPATH" }, + { "compare_string": [ "TELEPATH", { "context_val": "school" } ] }, + { "math": [ "_success", "==", "false" ] }, + { + "x_in_y_chance": { + "x": { + "math": [ + "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" + ] + }, + "y": 1000 + } + } + ] + }, + "effect": [ + { "u_message": "Your powers rage out of control!", "type": "bad" }, + { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, + { + "u_add_effect": "psionic_overload", + "duration": { + "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "nightmares", + "duration": { + "math": [ "u_val('time: 30 m') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "disrupted_sleep", + "duration": { + "math": [ "u_val('time: 30 m') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PSIONICS_TELEPORTER_CHANNELING_FAILURE", + "eoc_type": "EVENT", + "required_event": "spellcasting_finish", + "condition": { + "and": [ + { "u_has_trait": "TELEPORTER" }, + { "compare_string": [ "TELEPORTER", { "context_val": "school" } ] }, + { "math": [ "_success", "==", "false" ] }, + { + "x_in_y_chance": { + "x": { + "math": [ + "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" + ] + }, + "y": 1000 + } + } + ] + }, + "effect": [ + { "u_message": "Your powers rage out of control!", "type": "bad" }, + { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, + { + "u_add_effect": "psionic_overload", + "duration": { + "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "effect_portal_storm_teleport", + "duration": { + "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PSIONICS_VITAKINETIC_CHANNELING_FAILURE", + "eoc_type": "EVENT", + "required_event": "spellcasting_finish", + "condition": { + "and": [ + { "u_has_trait": "VITAKINETIC" }, + { "compare_string": [ "VITAKINETIC", { "context_val": "school" } ] }, + { "math": [ "_success", "==", "false" ] }, + { + "x_in_y_chance": { + "x": { + "math": [ + "(10 * (min(0,( _difficulty - 1 - ( u_skill('metaphysics') / 2 ) ) * 15) ) + u_val('vitamin', 'name:vitamin_psionic_drain'))" + ] + }, + "y": 1000 + } + } + ] + }, + "effect": [ + { "u_message": "Your powers rage out of control!", "type": "bad" }, + { "run_eocs": [ "EOC_END_PSI_POWERS" ] }, + { + "u_add_effect": "psionic_overload", + "duration": { + "math": [ "u_val('time: 30 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + }, + { + "u_add_effect": "effect_vitakin_overload", + "duration": { + "math": [ "u_val('time: 15 s') * (1 + ( u_val('vitamin', 'name:vitamin_psionic_drain') / 2 ) ) * rng(1, _difficulty)" ] + } + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PSIONICS_KCAL_COST", + "eoc_type": "EVENT", + "required_event": "spellcasting_finish", + "condition": { + "and": [ + { + "u_has_any_trait": [ "BIOKINETIC", "CLAIRSENTIENT", "PHOTOKINETIC", "PYROKINETIC", "TELEKINETIC", "TELEPATH", "TELEPORTER", "VITAKINETIC" ] + }, + { + "or": [ + { "compare_string": [ "BIOKINETIC", { "context_val": "school" } ] }, + { "compare_string": [ "CLAIRSENTIENT", { "context_val": "school" } ] }, + { "compare_string": [ "PHOTOKINETIC", { "context_val": "school" } ] }, + { "compare_string": [ "PYROKINETIC", { "context_val": "school" } ] }, + { "compare_string": [ "TELEKINETIC", { "context_val": "school" } ] }, + { "compare_string": [ "TELEPATH", { "context_val": "school" } ] }, + { "compare_string": [ "TELEPORTER", { "context_val": "school" } ] }, + { "compare_string": [ "VITAKINETIC", { "context_val": "school" } ] } + ] + } + ] + }, + "effect": [ { "math": [ "u_val('stored_kcal')", "-=", "psionics_kcal_cost(_difficulty)" ] } ] } ] diff --git a/data/mods/MindOverMatter/effects/effects_psionic.json b/data/mods/MindOverMatter/effects/effects_psionic.json index 3112399b34d2f..a97e92f2d73e4 100644 --- a/data/mods/MindOverMatter/effects/effects_psionic.json +++ b/data/mods/MindOverMatter/effects/effects_psionic.json @@ -765,6 +765,16 @@ "flags": [ "SUPER_CLAIRVOYANCE" ], "vitamins": [ { "vitamin": "vitamin_psionic_drain", "rate": [ [ 1, 1 ] ], "tick": [ "2 s" ] } ] }, + { + "type": "effect_type", + "id": "effect_photokin_light_local", + "name": [ "Candle's Light" ], + "desc": [ "The air above your hand glows faintly." ], + "apply_message": "A faint light springs up over your hand.", + "remove_message": "The glow above your hand fades.", + "rating": "good", + "enchantments": [ { "values": [ { "value": "LUMINATION", "add": 5 } ] } ] + }, { "type": "effect_type", "id": "effect_photokin_dodge", @@ -825,9 +835,13 @@ "id": "effect_photokin_arms", "name": [ "refraction of arms" ], "desc": [ "Your arms refract light to create the illusion of having multiple arms and their wielded items." ], - "apply_message": "Light around your arms shimmers and refracts, creating the illusion of multiple arms.", + "apply_message": "", + "decay_messages": [ + [ "Your illusionary arms are obviously translucent.", "bad" ], + [ "Your illusionary arms are losing some of their solid appearance.", "bad" ] + ], "remove_message": "The light around your arms returns to normal.", - "rating": "neutral", + "rating": "good", "show_in_info": true, "base_mods": { "hit_mod": [ 4 ] }, "max_duration": "45 m", @@ -848,6 +862,22 @@ "flags": [ "BLIND" ], "max_duration": "3 d" }, + { + "type": "effect_type", + "id": "effect_photokin_blinding_glare", + "name": [ "Blinding Radiance" ], + "desc": [ "You are glowing like the sun." ], + "apply_message": "", + "remove_message": "The last light finally dies.", + "decay_messages": [ [ "The light you are emitting is dimming rapidly.", "bad" ], [ "The intense glow has started to flicker.", "bad" ] ], + "rating": "good", + "max_duration": "15 minutes", + "max_intensity": 46, + "dur_add_perc": 10, + "int_dur_factor": "20 s", + "base_mods": { "dodge_mod": [ 4 ] }, + "enchantments": [ "enchant_photokin_blinding_glare" ] + }, { "type": "effect_type", "id": "effect_pyrokinetic_flash", diff --git a/data/mods/MindOverMatter/enchantments/enchantments_player.json b/data/mods/MindOverMatter/enchantments/enchantments_player.json index 637df0ed46c9f..ff50160fbed34 100644 --- a/data/mods/MindOverMatter/enchantments/enchantments_player.json +++ b/data/mods/MindOverMatter/enchantments/enchantments_player.json @@ -60,6 +60,40 @@ "has": "HELD", "intermittent_activation": { "effects": [ { "frequency": "10 seconds", "spell_effects": [ { "id": "clair_sense_rads_outside_spawn_item" } ] } ] } }, + { + "type": "enchantment", + "id": "enchant_photokin_blinding_glare", + "condition": "ALWAYS", + "has": "HELD", + "hit_you_effect": [ { "id": "photokin_blinding_glare_attack", "hit_self": false, "once_in": 3 } ], + "hit_me_effect": [ { "id": "photokin_blinding_glare_attack", "hit_self": false, "once_in": 3 } ], + "values": [ { "value": "LUMINATION", "add": 10001 } ] + }, + { + "id": "photokin_blinding_glare_attack", + "type": "SPELL", + "name": "Photokinetic Blinding Radiance burst", + "description": "Blind nearby targets.", + "valid_targets": [ "hostile", "ally" ], + "flags": [ "SILENT", "RANDOM_DURATION" ], + "max_level": { "math": [ "int_to_level(1)" ] }, + "shape": "blast", + "effect": "attack", + "effect_str": "blind", + "min_aoe": { + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_blinding_glare') * 1.2) + 5) * (scaling_factor(u_val('intelligence') ) ), 40)" + ] + }, + "max_aoe": 40, + "min_range": { + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_blinding_glare') * 1.2) + 5) * (scaling_factor(u_val('intelligence') ) ), 40)" + ] + }, + "min_duration": 500, + "max_duration": 2000 + }, { "type": "enchantment", "id": "enchant_pyrokinetic_aura", diff --git a/data/mods/MindOverMatter/fields.json b/data/mods/MindOverMatter/fields.json index 894c44701a7a1..178ed7012c154 100644 --- a/data/mods/MindOverMatter/fields.json +++ b/data/mods/MindOverMatter/fields.json @@ -113,7 +113,6 @@ "effects": [ { "effect_id": "effect_psi_null", - "body_part": "mouth", "intensity": 10, "min_duration": "100 seconds", "max_duration": "350 seconds", @@ -130,5 +129,47 @@ "priority": 8, "half_life": "1 minutes", "phase": "gas" + }, + { + "id": "fd_photokin_light_1", + "type": "field_type", + "intensity_levels": [ + { "name": "glimmer", "sym": "*", "color": "yellow", "light_emitted": 30 }, + { "name": "glow", "color": "yellow", "light_emitted": 60 }, + { "name": "shine", "color": "yellow", "light_emitted": 90 } + ], + "description_affix": "illuminated_by", + "priority": 4, + "half_life": "5 minutes", + "phase": "plasma", + "display_field": true + }, + { + "id": "fd_photokin_light_2", + "type": "field_type", + "intensity_levels": [ + { "name": "glimmer", "sym": "*", "color": "yellow", "light_emitted": 50 }, + { "name": "glow", "color": "yellow", "light_emitted": 100 }, + { "name": "shine", "color": "yellow", "light_emitted": 150 } + ], + "description_affix": "illuminated_by", + "priority": 4, + "half_life": "15 minutes", + "phase": "plasma", + "display_field": true + }, + { + "id": "fd_photokin_light_3", + "type": "field_type", + "intensity_levels": [ + { "name": "glimmer", "sym": "*", "color": "yellow", "light_emitted": 80 }, + { "name": "glow", "color": "yellow", "light_emitted": 160 }, + { "name": "shine", "color": "yellow", "light_emitted": 240 } + ], + "description_affix": "illuminated_by", + "priority": 4, + "half_life": "30 minutes", + "phase": "plasma", + "display_field": true } ] diff --git a/data/mods/MindOverMatter/hobbies.json b/data/mods/MindOverMatter/hobbies.json index c8fe9ef956cf1..2daf51ee044d8 100644 --- a/data/mods/MindOverMatter/hobbies.json +++ b/data/mods/MindOverMatter/hobbies.json @@ -42,7 +42,7 @@ "name": "Newly-Awakened Pyrokinetic", "description": "Something happened during the storms that raged during the Cataclysm, and now you can do things that would have once seemed impossible. With just a thought, you can start a fire or make light radiate from the very air. It's already saved your life once when you burned a zombie while scavenging in a ruined house to ash. Sure, the house burned down too, but you'll definitely get more control as time goes on, right?", "points": 5, - "traits": [ "PYROKINETIC", "PYROGLOW_WEAK", "PYROGLOW_STRONG" ] + "traits": [ "PYROKINETIC", "PYROKIN_ADAPTATION" ] }, { "type": "profession", diff --git a/data/mods/MindOverMatter/itemgroups/feral_deathdrops.json b/data/mods/MindOverMatter/itemgroups/feral_deathdrops.json index da160e9377b96..e7f16447436d6 100644 --- a/data/mods/MindOverMatter/itemgroups/feral_deathdrops.json +++ b/data/mods/MindOverMatter/itemgroups/feral_deathdrops.json @@ -207,7 +207,7 @@ { "group": "underwear", "damage": [ 1, 4 ] }, { "group": "clothing_glasses", "prob": 5 }, { "group": "clothing_watch", "prob": 5 }, - { "group": "wallets", "damage": [ 1, 4 ] }, + { "group": "wallets_phavian", "damage": [ 1, 4 ] }, { "group": "feral_humans_crystal_drops_bio", "prob": 25 }, { "group": "feral_humans_crystal_drops_clair", "prob": 25 }, { "group": "feral_humans_crystal_drops_vita", "prob": 25 }, @@ -228,13 +228,12 @@ { "group": "underwear", "damage": [ 1, 4 ] }, { "group": "clothing_glasses", "prob": 5 }, { "group": "clothing_watch", "prob": 5 }, - { "group": "wallets", "damage": [ 1, 4 ] }, + { "group": "wallets_phavian", "damage": [ 1, 4 ] }, { "group": "feral_humans_crystal_drops_bio", "prob": 40 }, { "group": "feral_humans_crystal_drops_clair", "prob": 40 }, { "group": "feral_humans_crystal_drops_vita", "prob": 25 }, { "item": "phavian_psionic_martial_power_book", "prob": 8 }, - { "group": "dist_psionic_shield_belts", "prob": 60, "damage": [ 1, 4 ] }, - { "item": "id_science_visitor_phavian", "prob": 33 } + { "group": "dist_psionic_shield_belts", "prob": 60, "damage": [ 1, 4 ] } ] } ] diff --git a/data/mods/MindOverMatter/itemgroups/lore.json b/data/mods/MindOverMatter/itemgroups/lore.json index cc69590a0cede..c0e9c631e188b 100644 --- a/data/mods/MindOverMatter/itemgroups/lore.json +++ b/data/mods/MindOverMatter/itemgroups/lore.json @@ -22,5 +22,18 @@ "type": "item_group", "subtype": "distribution", "items": [ { "item": "lab_file_phavian_memo_item", "prob": 1 }, { "item": "lab_file_matrix_research_item", "prob": 3 } ] + }, + { + "id": "dist_lab_file_phavian_psi_research_any", + "type": "item_group", + "subtype": "distribution", + "items": [ + { "item": "lab_file_biokinesis_item", "prob": 1 }, + { "item": "lab_file_clairsentience_item", "prob": 1 }, + { "item": "lab_file_telekinesis_item", "prob": 1 }, + { "item": "lab_file_telepathy_item", "prob": 1 }, + { "item": "lab_file_vitakinesis_item", "prob": 1 }, + { "item": "lab_file_matrix_research_item", "prob": 1 } + ] } ] diff --git a/data/mods/MindOverMatter/items/ammo.json b/data/mods/MindOverMatter/items/ammo.json index 3ff8d8fc4d984..f61901a14d53c 100644 --- a/data/mods/MindOverMatter/items/ammo.json +++ b/data/mods/MindOverMatter/items/ammo.json @@ -29,7 +29,7 @@ "range": 40, "dispersion": 0, "recoil": 0, - "damage": { "damage_type": "heat", "amount": 55, "armor_penetration": 5 } + "damage": { "damage_type": "psi_photokinetic_damage", "amount": 55, "armor_penetration": 4 } }, { "type": "AMMO", diff --git a/data/mods/MindOverMatter/items/files_and_post_it.json b/data/mods/MindOverMatter/items/files_and_post_it.json index 040da89850590..51836750e033e 100644 --- a/data/mods/MindOverMatter/items/files_and_post_it.json +++ b/data/mods/MindOverMatter/items/files_and_post_it.json @@ -32,6 +32,22 @@ "flags": [ "TRADER_AVOID" ], "copy-from": "file" }, + { + "type": "GENERIC", + "id": "lab_file_clairsentience_item", + "name": { "str": "report (clairsentience)", "str_pl": "copies of report (clairsentience)" }, + "category": "books", + "description": "A folder full of what appear to be transcripts of experimental results or reports. Most of it is rather trivial, but certain passages catch your eye…", + "snippet_category": "lab_file_clairsentience", + "weight": "15 g", + "to_hit": -3, + "color": "white", + "symbol": ",", + "material": [ "paper" ], + "volume": "50 ml", + "flags": [ "TRADER_AVOID" ], + "copy-from": "file" + }, { "type": "GENERIC", "id": "lab_file_telekinesis_item", diff --git a/data/mods/MindOverMatter/items/laser_overrides.json b/data/mods/MindOverMatter/items/laser_overrides.json new file mode 100644 index 0000000000000..9f821be45d793 --- /dev/null +++ b/data/mods/MindOverMatter/items/laser_overrides.json @@ -0,0 +1,58 @@ +[ + { + "type": "GUN", + "id": "laser_rifle", + "copy-from": "laser_rifle", + "name": { "str": "A7 laser rifle" }, + "ranged_damage": { "damage_type": "psi_photokinetic_damage", "amount": 25, "armor_penetration": 4 } + }, + { + "type": "GUN", + "id": "bio_laser_gun", + "copy-from": "bio_laser_gun", + "name": { "str": "laser finger" }, + "ranged_damage": { "damage_type": "psi_photokinetic_damage", "amount": 10, "armor_penetration": 4 } + }, + { + "type": "GUN", + "id": "v29", + "copy-from": "v29", + "name": { "str": "V29 laser pistol" }, + "ranged_damage": { "damage_type": "psi_photokinetic_damage", "amount": 10, "armor_penetration": 4 } + }, + { + "type": "GUN", + "id": "v29_turret", + "copy-from": "v29_turret", + "name": { "str": "mounted laser" }, + "ranged_damage": { "damage_type": "psi_photokinetic_damage", "amount": 10, "armor_penetration": 4 } + }, + { + "type": "GUN", + "id": "recon_mech_laser_single", + "copy-from": "recon_mech_laser_single", + "name": { "str": "salvaged RMES marksman laser" }, + "ranged_damage": { "damage_type": "psi_photokinetic_damage", "amount": 30, "armor_penetration": 4 } + }, + { + "type": "GUN", + "id": "recon_mech_laser", + "copy-from": "recon_mech_laser", + "name": { "str": "RMES marksman system" }, + "ranged_damage": { "damage_type": "psi_photokinetic_damage", "amount": 30, "armor_penetration": 4 } + }, + { + "type": "GUN", + "id": "gatling_mech_laser_single", + "copy-from": "gatling_mech_laser_single", + "name": { "str": "salvaged CMES laser cannon" }, + "ranged_damage": { "damage_type": "psi_photokinetic_damage", "amount": 20, "armor_penetration": 4 } + }, + { + "type": "GUN", + "id": "gatling_mech_laser", + "copy-from": "gatling_mech_laser", + "name": { "str": "CMES laser cannon" }, + "ranged_damage": { "damage_type": "psi_photokinetic_damage", "amount": 20, "armor_penetration": 4 } + } +] diff --git a/data/mods/MindOverMatter/jmath.json b/data/mods/MindOverMatter/jmath.json index 26e07eab55e07..a5b71710d2023 100644 --- a/data/mods/MindOverMatter/jmath.json +++ b/data/mods/MindOverMatter/jmath.json @@ -11,6 +11,18 @@ "num_args": 1, "return": "( ( _0 + 10) / 20 )" }, + { + "type": "jmath_function", + "id": "psionics_kcal_cost", + "num_args": 1, + "return": "( (5 * _0) * rng( 0.3, 1.7) )" + }, + { + "type": "jmath_function", + "id": "psionics_contemplation_kcal_cost", + "num_args": 1, + "return": "( (25 * _0) * rng( 0.3, 1.7) )" + }, { "type": "jmath_function", "id": "matrix_awakening_odds", diff --git a/data/mods/MindOverMatter/mapgen/map_extras/phavian_scientists.json b/data/mods/MindOverMatter/mapgen/map_extras/phavian_scientists.json index 70ce8c601507b..38eb41fbcd342 100644 --- a/data/mods/MindOverMatter/mapgen/map_extras/phavian_scientists.json +++ b/data/mods/MindOverMatter/mapgen/map_extras/phavian_scientists.json @@ -62,7 +62,7 @@ "subtype": "collection", "id": "map_extra_phavian_science_corpse", "container-item": "corpse_generic_human", - "//": "Half the time a wallet with an id card, all the time a lab coat", + "//": "Half the time a wallet with an id card, all the time a lab coat, small chance of psi reseach to tantalize", "entries": [ { "group": "wallets_phavian", "prob": 50 }, { "item": "coat_lab", "damage": [ 1, 3 ] }, @@ -71,7 +71,9 @@ { "group": "socks_unisex", "damage": [ 1, 3 ] }, { "group": "lab_shoes", "damage": [ 1, 3 ] }, { "group": "lab_torso", "damage": [ 1, 3 ] }, - { "group": "underwear", "damage": [ 1, 3 ] } + { "group": "underwear", "damage": [ 1, 3 ] }, + { "item": "lab_postit_psi", "prob": 15 }, + { "group": "dist_lab_file_phavian_psi_research_any", "prob": 3 } ] } ] diff --git a/data/mods/MindOverMatter/monsters/animal_psychics.json b/data/mods/MindOverMatter/monsters/animal_psychics.json index 2d0c9c725b15f..947d77d956321 100644 --- a/data/mods/MindOverMatter/monsters/animal_psychics.json +++ b/data/mods/MindOverMatter/monsters/animal_psychics.json @@ -30,6 +30,7 @@ { "id": "ranged_pull", "cooldown": 20, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "hit_dmg_u": "%1$s growls and a powerful forces seizes your %2$s and drags you in!", "hit_dmg_npc": "%1$s growls and is dragged towards it!", "miss_msg_u": "", @@ -80,6 +81,7 @@ { "id": "psi_hodag_speed_boost", "type": "spell", + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "spell_data": { "id": "biokinetic_speed_boost_monster_01", "min_level": 5 }, "cooldown": 18, "monster_message": "%1$s moves too quickly for the eye to follow!" @@ -131,6 +133,7 @@ "type": "spell", "spell_data": { "id": "telepathic_fear_blast_monster", "min_level": 6 }, "cooldown": 18, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares and lets out a silent cry!" } ], diff --git a/data/mods/MindOverMatter/monsters/civilian_psychics.json b/data/mods/MindOverMatter/monsters/civilian_psychics.json index 509ca7ca89beb..ca74d578f001e 100644 --- a/data/mods/MindOverMatter/monsters/civilian_psychics.json +++ b/data/mods/MindOverMatter/monsters/civilian_psychics.json @@ -23,8 +23,14 @@ "dodge": 3, "upgrades": { "half_life": 2, "into": "mon_feral_human_bio" }, "special_attacks": [ - { "id": "smash", "attack_upper": true, "throw_strength": 40, "cooldown": 10 }, - { "id": "bio_op_takedown", "cooldown": 20 } + { + "id": "smash", + "attack_upper": true, + "throw_strength": 40, + "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } } + }, + { "id": "bio_op_takedown", "cooldown": 20, "condition": { "not": { "u_has_effect": "effect_psi_null" } } } ] }, { @@ -91,6 +97,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 0 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s fires a photon beam!" } ] @@ -123,6 +130,7 @@ "type": "spell", "spell_data": { "id": "pyrokinetic_eruption_monster", "min_level": 0 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s summons a blast of flame!" } ] @@ -159,6 +167,7 @@ "throw_strength": 40, "blockable": false, "effects_require_dmg": false, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "hit_dmg_u": "%1$s stares at you and a powerful force hurls you through the air!", "hit_dmg_npc": "%1$s stares at and a powerful force hurls them through the air!", "miss_msg_u": "%s stares at you, and you feel a crushing pressure for a moment before the feeling vanishes!", @@ -203,6 +212,7 @@ "type": "spell", "spell_data": { "id": "teleport_blink_monster", "min_level": 0 }, "cooldown": 5, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s suddenly vanishes!" } ] diff --git a/data/mods/MindOverMatter/monsters/feral_lab_psychics.json b/data/mods/MindOverMatter/monsters/feral_lab_psychics.json index be939287c483a..de48e625f501b 100644 --- a/data/mods/MindOverMatter/monsters/feral_lab_psychics.json +++ b/data/mods/MindOverMatter/monsters/feral_lab_psychics.json @@ -41,6 +41,7 @@ "type": "spell", "spell_data": { "id": "telepathic_confusion_monster", "min_level": 5 }, "cooldown": 12, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "A roar fills %3$s's mind and the world is blotted out!" }, { @@ -48,6 +49,7 @@ "type": "spell", "spell_data": { "id": "telepathic_blast_monster", "min_level": 4 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s!" }, { @@ -55,6 +57,7 @@ "type": "spell", "spell_data": { "id": "telekinetic_hammer_monster", "min_level": 6 }, "cooldown": 12, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s hammers %3$s with psionic force!" }, { @@ -67,6 +70,7 @@ "throw_strength": 100, "blockable": false, "effects_require_dmg": false, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "hit_dmg_u": "%1$s stares at you and a powerful force hurls you through the air!", "hit_dmg_npc": "%1$s stares at and a powerful force hurls them through the air!", "miss_msg_u": "%s stares at you, and you feel a crushing pressure for a moment before the feeling vanishes!", @@ -125,9 +129,15 @@ "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "special_attacks": [ [ "PARROT_AT_DANGER", 15 ], - { "id": "smash", "attack_upper": true, "throw_strength": 50, "cooldown": 15 }, + { + "id": "smash", + "attack_upper": true, + "throw_strength": 50, + "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } } + }, [ "BIO_OP_DISARM", 15 ], - { "id": "bio_op_takedown", "cooldown": 20 } + { "id": "bio_op_takedown", "cooldown": 20, "condition": { "not": { "u_has_effect": "effect_psi_null" } } } ], "flags": [ "SEES", diff --git a/data/mods/MindOverMatter/monsters/feral_psychics.json b/data/mods/MindOverMatter/monsters/feral_psychics.json index fa3cd4c26011a..d43077f17bfd6 100644 --- a/data/mods/MindOverMatter/monsters/feral_psychics.json +++ b/data/mods/MindOverMatter/monsters/feral_psychics.json @@ -35,7 +35,16 @@ "zombify_into": "mon_zombie_survivor", "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "upgrades": { "half_life": 45, "into": "mon_feral_human_bio2" }, - "special_attacks": [ { "id": "smash", "attack_upper": true, "throw_strength": 30, "cooldown": 15 }, [ "BIO_OP_DISARM", 10 ] ], + "special_attacks": [ + { + "id": "smash", + "attack_upper": true, + "throw_strength": 30, + "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } } + }, + [ "BIO_OP_DISARM", 10 ] + ], "flags": [ "SEES", "HEARS", @@ -87,9 +96,15 @@ "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "upgrades": { "half_life": 45, "into": "mon_feral_human_bio3" }, "special_attacks": [ - { "id": "smash", "attack_upper": true, "throw_strength": 50, "cooldown": 10 }, + { + "id": "smash", + "attack_upper": true, + "throw_strength": 50, + "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } } + }, [ "BIO_OP_DISARM", 10 ], - { "id": "bio_op_takedown", "cooldown": 15 } + { "id": "bio_op_takedown", "cooldown": 15, "condition": { "not": { "u_has_effect": "effect_psi_null" } } } ], "flags": [ "SEES", @@ -144,17 +159,24 @@ "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "special_attacks": [ [ "PARROT_AT_DANGER", 10 ], - { "id": "smash", "attack_upper": true, "throw_strength": 50, "cooldown": 10 }, + { + "id": "smash", + "attack_upper": true, + "throw_strength": 50, + "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } } + }, { "type": "leap", "cooldown": 5, "move_cost": 50, "allow_no_target": true, "max_range": 5, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "message": "%1$s moves so quickly your eyes can barely follow them!" }, [ "BIO_OP_DISARM", 10 ], - { "id": "bio_op_takedown", "cooldown": 15 } + { "id": "bio_op_takedown", "cooldown": 15, "condition": { "not": { "u_has_effect": "effect_psi_null" } } } ], "flags": [ "SEES", @@ -310,6 +332,7 @@ "type": "spell", "spell_data": { "id": "telepathic_shrieking_monster", "min_level": 3 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "Static fills your hearing for a moment, blotting out all other sounds!" } ], @@ -371,6 +394,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 3 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's form is shifting with illusions!" }, { @@ -378,6 +402,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 2 }, "cooldown": 20, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s fires a photon beam!" } ], @@ -437,6 +462,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 6 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's form is shifting with illusions!" }, { @@ -444,6 +470,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 5 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s fires a photon beam!" }, { @@ -451,6 +478,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_light_flash_monster", "min_level": 4 }, "cooldown": 20, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s concentrates and unleashes a super-luminous flash!" }, { @@ -458,6 +486,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_radiation_attack_monster", "min_level": 7 }, "cooldown": 25, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at you and you are enveloped in an eerie glow!" } ], @@ -501,7 +530,7 @@ "families": [ "prof_intro_biology", "prof_physiology" ], "dodge": 4, "regenerates": 8, - "regeneration_modifiers": [ [ "effect_vitakin_hurt", -4 ] ], + "regeneration_modifiers": [ [ "effect_vitakin_hurt", -4 ], [ "effect_psi_null", -8 ] ], "bleed_rate": 0, "harvest": "human", "dissect": "dissect_human_sample_single", @@ -523,6 +552,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 7 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s's form is shifting with illusions!" }, { @@ -530,6 +560,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 6 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s fires a photon beam!" }, { @@ -537,6 +568,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_light_flash_monster", "min_level": 6 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s concentrates and unleashes a super-luminous flash!" }, { @@ -544,6 +576,7 @@ "type": "spell", "spell_data": { "id": "photokinetic_radiation_attack_monster", "min_level": 10 }, "cooldown": 20, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at you and you are enveloped in an eerie glow!" } ], @@ -603,6 +636,7 @@ "type": "spell", "spell_data": { "id": "pyrokinetic_eruption_monster", "min_level": 3 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s summons a blast of flame!" }, { @@ -610,6 +644,7 @@ "type": "spell", "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 1 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The air erupts into an eye-searing flash!" } ], @@ -673,13 +708,15 @@ "type": "spell", "spell_data": { "id": "pyrokinetic_eruption_monster", "min_level": 6 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s summons a blast of flame!" }, { - "id": "psi_pyrokin1_flangbang", + "id": "psi_pyrokin2_flashbang", "type": "spell", "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 4 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The air erupts into an eye-searing flash!" }, { @@ -687,6 +724,7 @@ "type": "spell", "spell_data": { "id": "pyrokinetic_blast_monster", "min_level": 4 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s gestures and summons a conflagration!" } ], @@ -732,7 +770,7 @@ "dodge": 3, "armor": { "heat": 50 }, "regenerates": 15, - "regeneration_modifiers": [ [ "effect_vitakin_hurt", -7 ] ], + "regeneration_modifiers": [ [ "effect_vitakin_hurt", -7 ], [ "effect_psi_null", -15 ] ], "bleed_rate": 0, "harvest": "human", "emit_fields": [ { "emit_id": "emit_smoke_stream", "delay": "8 s" } ], @@ -755,6 +793,7 @@ "type": "spell", "spell_data": { "id": "pyrokinetic_eruption_monster", "min_level": 7 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s summons a blast of flame!" }, { @@ -762,6 +801,7 @@ "type": "spell", "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 5 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "The air erupts into an eye-searing flash!" }, { @@ -769,6 +809,7 @@ "type": "spell", "spell_data": { "id": "pyrokinetic_blast_monster", "min_level": 6 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s gestures and summons a conflagration!" } ], @@ -832,6 +873,7 @@ "type": "spell", "spell_data": { "id": "telekinetic_pull_monster", "min_level": 2 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" }, { @@ -844,6 +886,7 @@ "fake_skills": [ [ "throw", 6 ] ], "fake_str": 11, "require_targeting_player": false, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "ranges": [ [ 2, 10, "DEFAULT" ] ], "description": "%1$s makes a throwing motion and one of the rocks around them suddenly launches like a bullet!" }, @@ -857,6 +900,7 @@ "throw_strength": 60, "blockable": false, "effects_require_dmg": false, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "hit_dmg_u": "%1$s stares at you and a powerful force hurls you through the air!", "hit_dmg_npc": "%1$s stares at and a powerful force hurls them through the air!", "miss_msg_u": "%s stares at you, and you feel a crushing pressure for a moment before the feeling vanishes!", @@ -924,6 +968,7 @@ "type": "spell", "spell_data": { "id": "telekinetic_pull_monster", "min_level": 3 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" }, { @@ -931,6 +976,7 @@ "type": "spell", "spell_data": { "id": "telekinetic_hammer_monster", "min_level": 4 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s hammers %3$s with psionic force!" }, { @@ -942,6 +988,7 @@ "range": 8, "throw_strength": 100, "blockable": false, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "hit_dmg_u": "%1$s stares at you and a powerful force hurls you through the air!", "hit_dmg_npc": "%1$s stares at and a powerful force hurls them through the air!", "miss_msg_u": "%s stares at you, and you feel a crushing pressure for a moment before the feeling vanishes!", @@ -1012,6 +1059,7 @@ "type": "spell", "spell_data": { "id": "telepathic_confusion_monster", "min_level": 3 }, "cooldown": 20, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "A roar fills %3$s's mind and the world is blotted out!" }, { @@ -1019,6 +1067,7 @@ "type": "spell", "spell_data": { "id": "telepathic_blast_monster", "min_level": 1 }, "cooldown": 18, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s!" } ], @@ -1080,6 +1129,7 @@ "type": "spell", "spell_data": { "id": "telepathic_confusion_monster", "min_level": 3 }, "cooldown": 16, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "A roar fills %3$s's mind and the world is blotted out!" }, { @@ -1087,6 +1137,7 @@ "type": "spell", "spell_data": { "id": "telepathic_blast_monster", "min_level": 2 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s!" }, { @@ -1094,6 +1145,7 @@ "type": "spell", "spell_data": { "id": "telepathic_horror_monster", "min_level": 4 }, "cooldown": 25, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "" } ], @@ -1156,6 +1208,7 @@ "type": "spell", "spell_data": { "id": "telepathic_confusion_monster", "min_level": 5 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "A roar fills %3$s's mind and the world is blotted out!" }, { @@ -1163,6 +1216,7 @@ "type": "spell", "spell_data": { "id": "telepathic_blast_monster", "min_level": 5 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s!" }, { @@ -1171,6 +1225,7 @@ "spell_data": { "id": "telepathic_horror_aoe_monster", "min_level": 15 }, "allow_no_target": true, "cooldown": 25, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "" }, { @@ -1178,6 +1233,7 @@ "type": "spell", "spell_data": { "id": "telepathic_primal_fear_monster", "min_level": 5 }, "cooldown": 35, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s stares at %3$s and they freeze like a frightened rabbit!" } ], @@ -1236,6 +1292,7 @@ "type": "spell", "spell_data": { "id": "teleport_slow_monster", "min_level": 2 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s looks at %3$s and the world lurches." }, { @@ -1243,6 +1300,7 @@ "cooldown": 8, "allow_no_target": true, "max_range": 8, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "message": "%1$s vanishes and reappears elsewhere!" } ], @@ -1302,6 +1360,7 @@ "type": "spell", "spell_data": { "id": "teleport_slow_monster", "min_level": 4 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s glances at %3$s and the world lurches." }, { @@ -1313,6 +1372,7 @@ "accuracy": 5, "damage_max_instance": [ { "damage_type": "psi_teleporter_teleporting_damage", "amount": 2, "armor_penetration": 10 } ], "blockable": false, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "hit_dmg_u": "%1$s touches you and the world shifts around you!", "hit_dmg_npc": "%1$s touches and the world shifts around them!", "miss_msg_u": "%s reaches for you but you avoid their touch!", @@ -1324,7 +1384,8 @@ "move_cost": 50, "allow_no_target": true, "max_range": 12, - "message": "%1$s vanishes and reappears elsewhere!" + "message": "%1$s vanishes and reappears elsewhere!", + "condition": { "not": { "u_has_effect": "effect_psi_null" } } } ], "flags": [ @@ -1393,6 +1454,7 @@ "accuracy": 6, "damage_max_instance": [ { "damage_type": "psi_teleporter_teleporting_damage", "amount": 2, "armor_penetration": 10 } ], "blockable": false, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "hit_dmg_u": "%1$s touches you and the world warps around you!", "hit_dmg_npc": "%1$s touches and the world warps around them!", "miss_msg_u": "%s reaches for you but you avoid their touch!", @@ -1403,6 +1465,7 @@ "type": "spell", "spell_data": { "id": "teleport_slow_monster", "min_level": 6 }, "cooldown": 10, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s glances at %3$s and the world lurches." }, { @@ -1410,6 +1473,7 @@ "type": "spell", "spell_data": { "id": "teleport_blink_attack_monster", "min_level": 4 }, "cooldown": 20, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s touches %3$s and the world around %3$s wavers." }, { @@ -1418,7 +1482,8 @@ "move_cost": 50, "allow_no_target": true, "max_range": 16, - "message": "%1$s vanishes and reappears elsewhere!" + "message": "%1$s vanishes and reappears elsewhere!", + "condition": { "not": { "u_has_effect": "effect_psi_null" } } } ], "flags": [ @@ -1466,7 +1531,7 @@ "regen_morale": true, "armor": { "bash": 5, "cut": 3, "stab": 3, "bullet": 5 }, "regenerates": 10, - "regeneration_modifiers": [ [ "effect_vitakin_hurt", -5 ] ], + "regeneration_modifiers": [ [ "effect_vitakin_hurt", -5 ], [ "effect_psi_null", -10 ] ], "bleed_rate": 0, "harvest": "human", "dissect": "dissect_human_sample_single", @@ -1483,6 +1548,7 @@ "type": "spell", "spell_data": { "id": "vitakinetic_health_down", "min_level": 4 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s touches %3$s." } ], @@ -1528,7 +1594,7 @@ "regen_morale": true, "armor": { "bash": 5, "cut": 3, "stab": 3, "bullet": 5 }, "regenerates": 20, - "regeneration_modifiers": [ [ "effect_vitakin_hurt", -10 ] ], + "regeneration_modifiers": [ [ "effect_vitakin_hurt", -10 ], [ "effect_psi_null", -20 ] ], "bleed_rate": 0, "harvest": "human", "dissect": "dissect_human_sample_single", @@ -1544,6 +1610,7 @@ "type": "spell", "spell_data": { "id": "vitakinetic_healing_down", "min_level": 4 }, "cooldown": 15, + "condition": { "not": { "u_has_effect": "effect_psi_null" } }, "monster_message": "%1$s touches %3$s." } ], diff --git a/data/mods/MindOverMatter/mutations/psi_passives.json b/data/mods/MindOverMatter/mutations/psi_passives.json index f3f4f278ad2fd..48d396fbb3bc2 100644 --- a/data/mods/MindOverMatter/mutations/psi_passives.json +++ b/data/mods/MindOverMatter/mutations/psi_passives.json @@ -11,8 +11,8 @@ "cancels": [ "BIOKIN_NEEDS", "CLAIR_SENSES", - "PYROGLOW_WEAK", - "PYROGLOW_STRONG", + "PHOTO_EYES", + "PYROKIN_ADAPTATION", "TELEKINETIC_CARRY", "TELEPATHIC_SUGGESTION", "TELEPORTER_PROTECT", @@ -67,68 +67,33 @@ "id": "PHOTO_EYES", "name": { "str": "Photon Regulation" }, "points": 0, - "description": "Your powers adapt the amount of photons your eyes receive.", + "description": "Your powers passively filter the amount of photons your eyes receive.", "flags": [ "FLASH_PROTECTION", "SEESLEEP", "GLARE_RESIST" ], "player_display": true, "purifiable": false }, { "type": "mutation", - "id": "PYROGLOW_WEAK", - "name": { "str": "Pyrokinetic Radiance [soft]" }, + "id": "PYROKIN_ADAPTATION", + "name": { "str": "Internal Fire" }, "points": 0, - "description": "You can make the air around you emit light.", - "active": true, + "description": "You naturally heat the air around you slightly, making it more comfortable in the cold. It also helps prevent you from getting too wet.", + "bodytemp_modifiers": [ 250, 750 ], + "bodytemp_sleep": 500, + "wet_protection": [ + { "part": "head", "ignored": 10 }, + { "part": "leg_l", "ignored": 10 }, + { "part": "leg_r", "ignored": 10 }, + { "part": "foot_l", "ignored": 10 }, + { "part": "foot_r", "ignored": 10 }, + { "part": "arm_l", "ignored": 10 }, + { "part": "arm_r", "ignored": 10 }, + { "part": "hand_l", "ignored": 10 }, + { "part": "hand_r", "ignored": 10 }, + { "part": "torso", "ignored": 10 } + ], "player_display": true, - "purifiable": false, - "cost": 0, - "transform": { - "target": "PYROGLOW_WEAK_A", - "msg_transform": "The air around you starts glowing softly.", - "active": true, - "moves": 10 - } - }, - { - "type": "mutation", - "id": "PYROGLOW_WEAK_A", - "name": { "str": "Pyrokinetic Radiance [soft] (on)" }, - "description": "The air around you is emitting light.", - "copy-from": "PYROGLOW_WEAK", - "valid": false, - "transform": { "target": "PYROGLOW_WEAK", "msg_transform": "The air around you loses its radiance.", "active": false, "moves": 10 }, - "enchantments": [ { "values": [ { "value": "LUMINATION", "add": 20 } ] } ] - }, - { - "type": "mutation", - "id": "PYROGLOW_STRONG", - "name": { "str": "Pyrokinetic Radiance [bright]" }, - "points": 0, - "description": "You can make the air around you emit a strong light.", - "active": true, - "player_display": true, - "purifiable": false, - "cost": 0, - "transform": { - "target": "PYROGLOW_STRONG_A", - "msg_transform": "The air around you starts glowing brightly.", - "active": true, - "moves": 10 - } - }, - { - "type": "mutation", - "id": "PYROGLOW_STRONG_A", - "name": { "str": "Pyrokinetic Radiance [bright] (on)" }, - "description": "The air around you is emitting a bright light.", - "copy-from": "PYROGLOW_STRONG", - "valid": false, - "transform": { "target": "PYROGLOW_STRONG", "msg_transform": "The air around you loses its radiance.", "active": false, "moves": 10 }, - "enchantments": [ - { - "values": [ { "value": "LUMINATION", "add": { "math": [ "(50 + (20 * u_val('spell_level', 'school: PYROKINETIC')))" ] } } ] - } - ] + "purifiable": false }, { "type": "mutation", diff --git a/data/mods/MindOverMatter/mutations/traits.json b/data/mods/MindOverMatter/mutations/traits.json index f0aab3207581f..6d07d2d4e33c7 100644 --- a/data/mods/MindOverMatter/mutations/traits.json +++ b/data/mods/MindOverMatter/mutations/traits.json @@ -41,7 +41,7 @@ "purifiable": false, "valid": false, "flags": [ "PHOTOKINETIC" ], - "spells_learned": [ [ "photokinetic_snuff_light", 2 ], [ "photokinetic_light_dodge", 2 ], [ "photokinetic_light_beam", 2 ] ] + "spells_learned": [ [ "photokinetic_snuff_light", 2 ], [ "photokinetic_light_dodge", 2 ], [ "photokinetic_light_local", 2 ] ] }, { "type": "mutation", diff --git a/data/mods/MindOverMatter/obsolete/trait_migration.json b/data/mods/MindOverMatter/obsolete/trait_migration.json new file mode 100644 index 0000000000000..ffd6a100e3e74 --- /dev/null +++ b/data/mods/MindOverMatter/obsolete/trait_migration.json @@ -0,0 +1,22 @@ +[ + { + "type": "TRAIT_MIGRATION", + "id": "PYROGLOW_WEAK", + "trait": "PYROKIN_ADAPTATION" + }, + { + "type": "TRAIT_MIGRATION", + "id": "PYROGLOW_WEAK_A", + "trait": "PYROKIN_ADAPTATION" + }, + { + "type": "TRAIT_MIGRATION", + "id": "PYROGLOW_STRONG", + "remove": true + }, + { + "type": "TRAIT_MIGRATION", + "id": "PYROGLOW_STRONG_A", + "remove": true + } +] diff --git a/data/mods/MindOverMatter/powers/clairsentience.json b/data/mods/MindOverMatter/powers/clairsentience.json index 700ad829e36de..a8bbd5f417f5c 100644 --- a/data/mods/MindOverMatter/powers/clairsentience.json +++ b/data/mods/MindOverMatter/powers/clairsentience.json @@ -114,22 +114,24 @@ "effect_str": "effect_clair_weak_point", "extra_effects": [ { "id": "psionic_drained_difficulty_three", "hit_self": true } ], "shape": "blast", - "energy_source": "STAMINA", "difficulty": 3, "max_level": { "math": [ "int_to_level(1)" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: clair_spot_weakness') * 1.5) + 1) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: clair_spot_weakness') * 1.5) + 1) * (scaling_factor(u_val('intelligence') ) ), 100)" + ] }, - "max_range": 70, - "base_energy_cost": 2500, - "final_energy_cost": 700, - "energy_increment": -125, + "max_range": 100, "min_duration": { "math": [ "( (u_val('spell_level', 'spell: clair_spot_weakness') * 150) + 1350) * (scaling_factor(u_val('intelligence') ) )" ] }, "max_duration": { "math": [ "( (u_val('spell_level', 'spell: clair_spot_weakness') * 150) + 3000) * (scaling_factor(u_val('intelligence') ) )" ] }, + "energy_source": "STAMINA", + "base_energy_cost": 2500, + "final_energy_cost": 700, + "energy_increment": -125, "base_casting_time": 150, "final_casting_time": 75, "casting_time_increment": -5.5, @@ -260,29 +262,33 @@ "effect": "attack", "extra_effects": [ { "id": "psionic_drained_difficulty_five", "hit_self": true } ], "shape": "blast", - "energy_source": "STAMINA", "difficulty": 5, "max_level": { "math": [ "int_to_level(1)" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: clair_voyance') * 1.5) + 1.5) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: clair_voyance') * 1.5) + 1.5) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: clair_voyance') * 1.5) + 1.5) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: clair_voyance') * 1.5) + 1.5) * (scaling_factor(u_val('intelligence') ) ), 50)" + ] }, "max_aoe": 50, "field_id": "fd_clairvoyant", "min_field_intensity": 1, "max_field_intensity": 1, - "base_energy_cost": 5000, - "final_energy_cost": 2500, - "energy_increment": -250, "min_duration": { "math": [ "( (u_val('spell_level', 'spell: clair_voyance') * 50) + 250) * (scaling_factor(u_val('intelligence') ) )" ] }, "max_duration": { "math": [ "( (u_val('spell_level', 'spell: clair_voyance') * 50) + 1500) * (scaling_factor(u_val('intelligence') ) )" ] }, + "energy_source": "STAMINA", + "base_energy_cost": 5000, + "final_energy_cost": 2500, + "energy_increment": -250, "base_casting_time": 1000, "final_casting_time": 500, "casting_time_increment": -25, @@ -304,18 +310,18 @@ "effect_str": "effect_clair_dodge", "extra_effects": [ { "id": "psionic_drained_difficulty_six", "hit_self": true } ], "shape": "blast", - "energy_source": "STAMINA", "difficulty": 6, "max_level": { "math": [ "int_to_level(1)" ] }, - "base_energy_cost": 5500, - "final_energy_cost": 2250, - "energy_increment": -145, "min_duration": { "math": [ "( (u_val('spell_level', 'spell: clair_dodge_power') * 1200) + 3000) * (scaling_factor(u_val('intelligence') ) )" ] }, "max_duration": { "math": [ "( (u_val('spell_level', 'spell: clair_dodge_power') * 1200) + 45000) * (scaling_factor(u_val('intelligence') ) )" ] }, + "energy_source": "STAMINA", + "base_energy_cost": 5500, + "final_energy_cost": 2250, + "energy_increment": -145, "base_casting_time": 150, "final_casting_time": 70, "casting_time_increment": -9, @@ -335,11 +341,11 @@ "effect": "map", "extra_effects": [ { "id": "psionic_drained_difficulty_seven", "hit_self": true } ], "shape": "blast", - "energy_source": "STAMINA", "difficulty": 7, "max_level": { "math": [ "int_to_level(1)" ] }, "min_aoe": { "math": [ "( (u_val('spell_level', 'spell: clair_see_map') * 1) + 4) * (scaling_factor(u_val('intelligence') ) )" ] }, "max_aoe": { "math": [ "( (u_val('spell_level', 'spell: clair_see_map') * 1) + 11) * (scaling_factor(u_val('intelligence') ) )" ] }, + "energy_source": "STAMINA", "base_energy_cost": 9000, "base_casting_time": 6000, "learn_spells": { "clair_omniscience": 12 } @@ -359,7 +365,6 @@ "effect_str": "effect_clair_clear_sight", "extra_effects": [ { "id": "psionic_drained_difficulty_eight", "hit_self": true } ], "shape": "blast", - "energy_source": "STAMINA", "difficulty": 8, "max_level": { "math": [ "int_to_level(1)" ] }, "min_duration": { @@ -368,6 +373,7 @@ "max_duration": { "math": [ "( (u_val('spell_level', 'spell: clair_clear_sight') * 1000) + 45000) * (scaling_factor(u_val('intelligence') ) )" ] }, + "energy_source": "STAMINA", "base_energy_cost": 5000, "final_energy_cost": 2000, "energy_increment": -250, @@ -391,7 +397,6 @@ "effect_str": "effect_clair_omniscence", "extra_effects": [ { "id": "psionic_drained_difficulty_ten", "hit_self": true } ], "shape": "blast", - "energy_source": "STAMINA", "difficulty": 10, "max_level": { "math": [ "int_to_level(1)" ] }, "min_duration": { @@ -400,6 +405,7 @@ "max_duration": { "math": [ "( (u_val('spell_level', 'spell: clair_omniscience') * 100) + 1000) * (scaling_factor(u_val('intelligence') ) )" ] }, + "energy_source": "STAMINA", "base_energy_cost": 10000, "final_energy_cost": 7500, "energy_increment": -250, diff --git a/data/mods/MindOverMatter/powers/photokinesis.json b/data/mods/MindOverMatter/powers/photokinesis.json index d36ebe988f502..d5549c61c23ac 100644 --- a/data/mods/MindOverMatter/powers/photokinesis.json +++ b/data/mods/MindOverMatter/powers/photokinesis.json @@ -1,4 +1,161 @@ [ + { + "id": "photokinetic_light_local", + "type": "SPELL", + "name": "[Ψ]Candle's Glow (toggle)", + "description": "Create a simple patch of light nearby, sufficient to read or perform simple tasks with.\n\nThis power may be maintained by concentration and causes Drain at intervals. It is canceled by engaging in combat.", + "message": "", + "teachable": false, + "valid_targets": [ "self" ], + "spell_class": "PHOTOKINETIC", + "skill": "metaphysics", + "flags": [ "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "RANDOM_DURATION" ], + "effect": "effect_on_condition", + "effect_str": "EOC_PHOTOKIN_LIGHT_LOCAL_INITIATE", + "shape": "blast", + "difficulty": 1, + "max_level": { "math": [ "int_to_level(1)" ] }, + "min_duration": { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_snuff_light') * 30000) + 180000) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + "max_duration": { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_snuff_light') * 90000) + 540000) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + "energy_source": "STAMINA", + "base_energy_cost": 1500, + "final_energy_cost": 450, + "energy_increment": -80, + "base_casting_time": 125, + "final_casting_time": 50, + "casting_time_increment": -7.5, + "learn_spells": { "photokinetic_create_light": 4, "photokinetic_light_beam": 8, "photokinetic_light_image": 12 } + }, + { + "id": "photokinetic_create_light", + "type": "SPELL", + "name": "[Ψ]Field of Light", + "description": "Create photons to illuminate an entire area.", + "message": "Sudden light bursts forth!", + "teachable": false, + "valid_targets": [ "self" ], + "spell_class": "PHOTOKINETIC", + "skill": "metaphysics", + "flags": [ "CONCENTRATE", "SILENT", "NO_PROJECTILE", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX" ], + "difficulty": 2, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "effect_on_condition", + "effect_str": "EOC_PHOTOKIN_CREATE_LIGHT_SWITCH", + "extra_effects": [ { "id": "psionic_drained_difficulty_two", "hit_self": true } ], + "shape": "blast", + "energy_source": "STAMINA", + "base_energy_cost": 2500, + "final_energy_cost": 1000, + "energy_increment": -150, + "base_casting_time": 125, + "final_casting_time": 50, + "casting_time_increment": -7.5, + "learn_spells": { "photokinetic_light_beam": 6, "photokinetic_light_image": 9, "photokinetic_invisibility": 12 } + }, + { + "id": "photokinetic_create_light_01", + "type": "SPELL", + "name": "[Ψ]Field of Light Subspell #1", + "description": "The first create light subspell. If you have this, it's a bug.", + "message": "", + "teachable": false, + "valid_targets": [ "self", "ground", "ally", "hostile" ], + "spell_class": "PHOTOKINETIC", + "skill": "metaphysics", + "flags": [ "CONCENTRATE", "SILENT", "NO_PROJECTILE", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "RANDOM_DURATION" ], + "difficulty": 2, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "attack", + "shape": "blast", + "min_range": { + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_create_light') * 1.2) + 5) * (scaling_factor(u_val('intelligence') ) ), 70)" + ] + }, + "max_range": 70, + "min_aoe": { + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_create_light') * 0.8) + 1) * (scaling_factor(u_val('intelligence') ) ), 50)" + ] + }, + "max_aoe": 50, + "field_id": "fd_photokin_light_1", + "min_field_intensity": 1, + "max_field_intensity": 3, + "field_chance": 3 + }, + { + "id": "photokinetic_create_light_02", + "type": "SPELL", + "name": "[Ψ]Field of Light Subspell #2", + "description": "The second create light subspell. If you have this, it's a bug.", + "message": "", + "teachable": false, + "valid_targets": [ "self", "ground", "ally", "hostile" ], + "spell_class": "PHOTOKINETIC", + "skill": "metaphysics", + "flags": [ "CONCENTRATE", "SILENT", "NO_PROJECTILE", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "RANDOM_DURATION" ], + "difficulty": 2, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "attack", + "shape": "blast", + "min_range": { + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_create_light') * 1.2) + 5) * (scaling_factor(u_val('intelligence') ) ), 70)" + ] + }, + "max_range": 70, + "min_aoe": { + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_create_light') * 0.8) + 1) * (scaling_factor(u_val('intelligence') ) ), 50)" + ] + }, + "max_aoe": 50, + "field_id": "fd_photokin_light_2", + "min_field_intensity": 1, + "max_field_intensity": 3, + "field_chance": 3 + }, + { + "id": "photokinetic_create_light_03", + "type": "SPELL", + "name": "[Ψ]Field of Light Subspell #3", + "description": "The third create light subspell. If you have this, it's a bug.", + "message": "", + "teachable": false, + "valid_targets": [ "self", "ground", "ally", "hostile" ], + "spell_class": "PHOTOKINETIC", + "skill": "metaphysics", + "flags": [ "CONCENTRATE", "SILENT", "NO_PROJECTILE", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "RANDOM_DURATION" ], + "difficulty": 2, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "attack", + "shape": "blast", + "min_range": { + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_create_light') * 1.2) + 5) * (scaling_factor(u_val('intelligence') ) ), 70)" + ] + }, + "max_range": 70, + "min_aoe": { + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_create_light') * 0.8) + 1) * (scaling_factor(u_val('intelligence') ) ), 50)" + ] + }, + "max_aoe": 50, + "field_id": "fd_photokin_light_3", + "min_field_intensity": 1, + "max_field_intensity": 3, + "field_chance": 3 + }, { "id": "photokinetic_snuff_light", "type": "SPELL", @@ -19,15 +176,18 @@ "min_duration": { "math": [ "((u_val('spell_level', 'spell: photokinetic_snuff_light') * 1000) + 5000)" ] }, "max_duration": { "math": [ "((u_val('spell_level', 'spell: photokinetic_snuff_light') * 1000) + 10000)" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: photokinetic_snuff_light') * 0.8) + 5) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_snuff_light') * 1.2) + 5) * (scaling_factor(u_val('intelligence') ) ), 70)" + ] }, - "max_range": 40, + "max_range": 70, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: photokinetic_snuff_light') * 0.8) + 1) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_snuff_light') * 0.8) + 1) * (scaling_factor(u_val('intelligence') ) ), 50)" + ] }, - "max_aoe": 50, "energy_source": "STAMINA", - "difficulty": 1, + "difficulty": 2, "max_level": { "math": [ "int_to_level(1)" ] }, "base_energy_cost": 2000, "final_energy_cost": 500, @@ -86,6 +246,7 @@ "flags": [ "CONCENTRATE", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "SILENT", "RANDOM_DAMAGE" ], "effect": "attack", "extra_effects": [ { "id": "psionic_drained_difficulty_two", "hit_self": true } ], + "difficulty": 3, "shape": "line", "min_damage": { "math": [ "( (u_val('spell_level', 'spell: photokinetic_light_beam') * 2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] @@ -95,23 +256,29 @@ }, "damage_type": "psi_photokinetic_damage", "min_range": { - "math": [ "( (u_val('spell_level', 'spell: photokinetic_light_beam') * 0.6) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_light_beam') * 0.6) + 2) * (scaling_factor(u_val('intelligence') ) ), 30)" + ] }, "max_range": 30, - "energy_source": "STAMINA", - "difficulty": 2, "max_level": { "math": [ "int_to_level(1)" ] }, "field_id": "fd_laser", "min_field_intensity": 2, "max_field_intensity": 2, "field_chance": 1, + "energy_source": "STAMINA", "base_energy_cost": 2500, - "final_energy_cost": 1000, + "final_energy_cost": 800, "energy_increment": -125, "base_casting_time": 200, "final_casting_time": 50, "casting_time_increment": -12.5, - "learn_spells": { "photokinetic_light_image": 5, "photokinetic_light_flash": 12, "photokinetic_light_disintegrate": 15 } + "learn_spells": { + "photokinetic_light_image": 5, + "photokinetic_light_flash": 12, + "photokinetic_blinding_glare": 15, + "photokinetic_light_disintegrate": 18 + } }, { "id": "photokinetic_light_image", @@ -134,9 +301,11 @@ "min_duration": { "math": [ "((u_val('spell_level', 'spell: photokinetic_light_image') * 1000) + 5000)" ] }, "max_duration": { "math": [ "((u_val('spell_level', 'spell: photokinetic_light_image') * 1000) + 10000)" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: photokinetic_light_image') * 0.8) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_light_image') * 0.8) + 2) * (scaling_factor(u_val('intelligence') ) ), 40)" + ] }, - "max_range": 20, + "max_range": 40, "min_aoe": 3, "max_aoe": 3, "energy_source": "STAMINA", @@ -150,42 +319,6 @@ "casting_time_increment": -12.5, "learn_spells": { "photokinetic_light_arms": 7, "photokinetic_invisibility": 12 } }, - { - "id": "photokinetic_light_arms", - "type": "SPELL", - "name": "[Ψ]Refraction of Arms", - "description": "Create the illusion of extra arms and wielded items to trick your enemies.", - "message": "Your arms shimmer and waver, and then double and double again.", - "teachable": false, - "valid_targets": [ "self" ], - "spell_class": "PHOTOKINETIC", - "skill": "metaphysics", - "flags": [ "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "RANDOM_DURATION" ], - "effect": "attack", - "effect_str": "effect_photokin_arms", - "extra_effects": [ { "id": "psionic_drained_difficulty_three", "hit_self": true } ], - "shape": "blast", - "min_duration": { - "math": [ - "( (u_val('spell_level', 'spell: photokinetic_light_arms') * 2000) + 3000) * (scaling_factor(u_val('intelligence') ) )" - ] - }, - "max_duration": { - "math": [ - "( (u_val('spell_level', 'spell: photokinetic_light_arms') * 2000) + 6000) * (scaling_factor(u_val('intelligence') ) )" - ] - }, - "energy_source": "STAMINA", - "difficulty": 2, - "max_level": { "math": [ "int_to_level(1)" ] }, - "base_energy_cost": 2500, - "final_energy_cost": 1000, - "energy_increment": -125, - "base_casting_time": 250, - "final_casting_time": 100, - "casting_time_increment": -12.5, - "learn_spells": { "photokinetic_rad_immunity": 5, "photokinetic_light_disintegrate": 12 } - }, { "id": "photokinetic_rad_immunity", "type": "SPELL", @@ -255,7 +388,43 @@ "base_casting_time": 250, "final_casting_time": 100, "casting_time_increment": -12.5, - "learn_spells": { "photokinetic_light_flash": 5, "photokinetic_light_disintegrate": 8 } + "learn_spells": { "photokinetic_light_flash": 6, "photokinetic_light_disintegrate": 12 } + }, + { + "id": "photokinetic_light_arms", + "type": "SPELL", + "name": "[Ψ]Refraction of Arms", + "description": "Create the illusion of extra arms and wielded items to trick your enemies, forcing them off balance.", + "message": "Light around your arms shimmers and refracts, creating the illusion of multiple arms.", + "teachable": false, + "valid_targets": [ "self" ], + "spell_class": "PHOTOKINETIC", + "skill": "metaphysics", + "flags": [ "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "RANDOM_DURATION" ], + "effect": "attack", + "effect_str": "effect_photokin_arms", + "extra_effects": [ { "id": "psionic_drained_difficulty_four", "hit_self": true } ], + "shape": "blast", + "min_duration": { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_light_arms') * 2000) + 3000) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + "max_duration": { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_light_arms') * 2000) + 6000) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + "energy_source": "STAMINA", + "difficulty": 4, + "max_level": { "math": [ "int_to_level(1)" ] }, + "base_energy_cost": 3500, + "final_energy_cost": 1500, + "energy_increment": -125, + "base_casting_time": 250, + "final_casting_time": 100, + "casting_time_increment": -12.5, + "learn_spells": { "photokinetic_light_flash": 6, "photokinetic_light_disintegrate": 12 } }, { "id": "photokinetic_light_flash", @@ -268,6 +437,8 @@ "spell_class": "PHOTOKINETIC", "skill": "metaphysics", "flags": [ "CONCENTRATE", "NO_HANDS", "NO_LEGS", "SILENT", "RANDOM_DAMAGE" ], + "difficulty": 6, + "max_level": { "math": [ "int_to_level(1)" ] }, "effect": "attack", "extra_effects": [ { "id": "psionic_drained_difficulty_six", "hit_self": true } ], "shape": "line", @@ -281,27 +452,65 @@ }, "damage_type": "psi_photokinetic_damage", "min_range": { - "math": [ "( (u_val('spell_level', 'spell: photokinetic_light_flash') * 0.6) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_light_flash') * 0.6) + 2) * (scaling_factor(u_val('intelligence') ) ), 50)" + ] }, "max_range": 50, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: photokinetic_light_flash') * 0.3) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: photokinetic_light_flash') * 0.3) + 2) * (scaling_factor(u_val('intelligence') ) ), 20)" + ] }, - "max_aoe": 30, - "energy_source": "STAMINA", - "difficulty": 6, - "max_level": { "math": [ "int_to_level(1)" ] }, + "max_aoe": 20, "field_id": "fd_laser", "min_field_intensity": 2, "max_field_intensity": 3, "field_chance": 1, + "energy_source": "STAMINA", "base_energy_cost": 4000, "final_energy_cost": 1500, "energy_increment": -125, "base_casting_time": 200, "final_casting_time": 50, "casting_time_increment": -12.5, - "learn_spells": { "photokinetic_light_arms": 5, "photokinetic_light_disintegrate": 7 } + "learn_spells": { "photokinetic_light_arms": 5, "photokinetic_blinding_glare": 7, "photokinetic_light_disintegrate": 11 } + }, + { + "id": "photokinetic_blinding_glare", + "type": "SPELL", + "name": "[Ψ]Blinding Radiance", + "description": "You can emit so much light that anyone trying to attack you risks being blinded.", + "message": "You begin glowing as brightly as the sun!", + "teachable": false, + "valid_targets": [ "self" ], + "spell_class": "PHOTOKINETIC", + "skill": "metaphysics", + "flags": [ "CONCENTRATE", "SILENT", "NO_HANDS", "NO_LEGS", "NO_EXPLOSION_SFX", "RANDOM_DURATION" ], + "difficulty": 7, + "max_level": { "math": [ "int_to_level(1)" ] }, + "effect": "attack", + "effect_str": "effect_photokin_blinding_glare", + "extra_effects": [ { "id": "psionic_drained_difficulty_seven", "hit_self": true } ], + "shape": "blast", + "min_duration": { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_blinding_glare') * 1000) + 6000) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + "max_duration": { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_blinding_glare') * 2500) + 18000) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + "energy_source": "STAMINA", + "base_energy_cost": 6500, + "final_energy_cost": 2500, + "energy_increment": -125, + "base_casting_time": 125, + "final_casting_time": 150, + "casting_time_increment": -7.5, + "learn_spells": { "photokinetic_light_disintegrate": 7 } }, { "id": "photokinetic_light_disintegrate", @@ -314,9 +523,11 @@ "spell_class": "PHOTOKINETIC", "skill": "metaphysics", "flags": [ "CONCENTRATE", "NO_HANDS", "NO_LEGS", "SILENT", "RANDOM_DAMAGE" ], + "difficulty": 8, + "max_level": { "math": [ "int_to_level(1)" ] }, "effect": "attack", - "extra_effects": [ { "id": "psionic_drained_difficulty_eight", "hit_self": true } ], "shape": "blast", + "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') ) )" @@ -330,13 +541,11 @@ "damage_type": "psi_photokinetic_damage", "min_range": { "math": [ - "( (u_val('spell_level', 'spell: photokinetic_light_disintegrate') * 2) + 2) * (scaling_factor(u_val('intelligence') ) )" + "min( ( (u_val('spell_level', 'spell: photokinetic_light_disintegrate') * 2) + 2) * (scaling_factor(u_val('intelligence') ) ), 50)" ] }, "max_range": 50, "energy_source": "STAMINA", - "difficulty": 8, - "max_level": { "math": [ "int_to_level(1)" ] }, "base_energy_cost": 7000, "final_energy_cost": 3000, "energy_increment": -150, diff --git a/data/mods/MindOverMatter/powers/photokinesis_eocs.json b/data/mods/MindOverMatter/powers/photokinesis_eocs.json index 0932e7fa94677..efa72a707a217 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_LIGHT_LOCAL_INITIATE", + "condition": { "not": { "u_has_effect": "effect_photokin_light_local" } }, + "effect": [ + { "u_add_effect": "effect_photokin_light_local", "duration": "PERMANENT" }, + { "u_cast_spell": { "id": "psionic_drained_difficulty_one", "hit_self": true } }, + { + "queue_eocs": "EOC_PHOTOKIN_LIGHT_LOCAL_DRAIN", + "time_in_future": [ + { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_light_local') * 300) + 1800) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + { + "math": [ + "( (u_val('spell_level', 'spell: photokinetic_light_local') * 900) + 5400) * (scaling_factor(u_val('intelligence') ) )" + ] + } + ] + } + ], + "false_effect": [ + { "u_lose_effect": "effect_photokin_light_local" }, + { + "math": [ "u_val('stamina')", "+=", "max( (1500 - (u_val('spell_level', 'spell: photokinetic_light_local') * 80) ), 450)" ] + } + ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_LIGHT_LOCAL_DRAIN", + "condition": { "u_has_effect": "effect_photokin_light_local" }, + "effect": [ + { "u_cast_spell": { "id": "psionic_drained_difficulty_one", "hit_self": true } }, + { + "queue_eocs": "EOC_PHOTOKIN_LIGHT_LOCAL_DRAIN", + "time_in_future": [ + { + "math": [ + "( (u_val('spell_level', 'spell: pyrokinetic_call_flames') * 150) + 2500) * (scaling_factor(u_val('intelligence') ) )" + ] + }, + { + "math": [ + "( (u_val('spell_level', 'spell: pyrokinetic_call_flames') * 360) + 4500) * (scaling_factor(u_val('intelligence') ) )" + ] + } + ] + } + ], + "false_effect": [ ] + }, + { + "type": "effect_on_condition", + "id": "EOC_PHOTOKIN_CREATE_LIGHT_SWITCH", + "effect": { + "switch": { "math": [ "u_val('spell_level', 'spell: photokinetic_create_light')" ] }, + "cases": [ + { "case": 0, "effect": [ { "u_cast_spell": { "id": "photokinetic_create_light_01" }, "targeted": true } ] }, + { "case": 8, "effect": [ { "u_cast_spell": { "id": "photokinetic_create_light_02" }, "targeted": true } ] }, + { "case": 16, "effect": [ { "u_cast_spell": { "id": "photokinetic_create_light_03" }, "targeted": true } ] } + ] + } + }, { "type": "effect_on_condition", "id": "EOC_PHOTOKIN_RAD_IMMUNITY_INITIATE", diff --git a/data/mods/MindOverMatter/powers/pyrokinesis.json b/data/mods/MindOverMatter/powers/pyrokinesis.json index 3730651686e35..01501d2a676c6 100644 --- a/data/mods/MindOverMatter/powers/pyrokinesis.json +++ b/data/mods/MindOverMatter/powers/pyrokinesis.json @@ -23,7 +23,9 @@ "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_eruption') * 3) + 26) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_eruption') / 10) + 1) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_eruption') / 10) + 1) * (scaling_factor(u_val('intelligence') ) ), 5)" + ] }, "max_range": 5, "field_id": "fd_fire", @@ -68,15 +70,17 @@ "difficulty": 1, "max_level": { "math": [ "int_to_level(1)" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_flash') * 1.5) + 3 ) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_flash') * 1.5) + 3 ) * (scaling_factor(u_val('intelligence') ) ), 50)" + ] }, - "max_range": 75, + "max_range": 50, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_flash') * 0.25) + 1) * (scaling_factor(u_val('intelligence') ) )" ] - }, - "max_aoe": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_flash') * 0.25) + 4) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_flash') * 0.25) + 1) * (scaling_factor(u_val('intelligence') ) ), 8)" + ] }, + "max_aoe": 8, "min_duration": { "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_flash') * 150) + 100) * (scaling_factor(u_val('intelligence') ) )" ] }, @@ -135,11 +139,15 @@ "difficulty": 3, "max_level": { "math": [ "int_to_level(1)" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_quell_flames') * 0.8) + 5) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_quell_flames') * 0.8) + 5) * (scaling_factor(u_val('intelligence') ) ), 70)" + ] }, "max_range": 70, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_quell_flames') * 0.5) + 1) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_quell_flames') * 0.5) + 1) * (scaling_factor(u_val('intelligence') ) ), 50)" + ] }, "max_aoe": 50, "energy_source": "STAMINA", @@ -210,14 +218,17 @@ ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_flamethrower') * 0.2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_flamethrower') * 0.2) + 3) * (scaling_factor(u_val('intelligence') ) ), 20)" + ] }, "max_range": 20, - "range_increment": 0.2, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_flamethrower') * 3) + 27) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_flamethrower') * 3) + 27) * (scaling_factor(u_val('intelligence') ) ), 145)" + ] }, - "max_aoe": 180, + "max_aoe": 145, "field_id": "fd_fire", "min_field_intensity": 1, "max_field_intensity": 2, @@ -502,13 +513,17 @@ "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_blast') * 5) + 115) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_blast') * 1.2) + 4) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_blast') * 1.2) + 4) * (scaling_factor(u_val('intelligence') ) ), 70)" + ] }, "max_range": 80, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_blast') * 0.4) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_blast') * 0.4) + 2) * (scaling_factor(u_val('intelligence') ) ), 25)" + ] }, - "max_aoe": 20, + "max_aoe": 25, "field_id": "fd_fire", "min_field_intensity": 1, "max_field_intensity": 2, @@ -552,9 +567,11 @@ "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_aoe_blast') * 8) + 120) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: pyrokinetic_aoe_blast') * 0.9) + 4) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: pyrokinetic_aoe_blast') * 0.9) + 4) * (scaling_factor(u_val('intelligence') ) ), 35)" + ] }, - "max_aoe": 30, + "max_aoe": 35, "field_id": "fd_fire", "min_field_intensity": 2, "max_field_intensity": 2, diff --git a/data/mods/MindOverMatter/powers/telekinesis.json b/data/mods/MindOverMatter/powers/telekinesis.json index 79d48f58ad4b3..db3217b985328 100644 --- a/data/mods/MindOverMatter/powers/telekinesis.json +++ b/data/mods/MindOverMatter/powers/telekinesis.json @@ -23,7 +23,9 @@ "math": [ "( (u_val('spell_level', 'spell: telekinetic_pull') * -1.5) - 6) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: telekinetic_pull') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telekinetic_pull') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) ), 40)" + ] }, "max_range": 40, "energy_source": "STAMINA", @@ -60,7 +62,9 @@ "math": [ "( (u_val('spell_level', 'spell: telekinetic_push') * 0.25) + 6) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: telekinetic_push') * 1.2) + 1) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telekinetic_push') * 1.2) + 1) * (scaling_factor(u_val('intelligence') ) ), 40)" + ] }, "max_range": 40, "energy_source": "STAMINA", @@ -197,7 +201,9 @@ "damage_type": "psi_telekinetic_damage", "max_level": { "math": [ "int_to_level(1)" ] }, "min_damage": { - "math": [ "( (u_val('spell_level', 'spell: telekinetic_wave') * 0.25) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telekinetic_wave') * 0.25) + 2) * (scaling_factor(u_val('intelligence') ) ), 15)" + ] }, "max_damage": { "math": [ "( (u_val('spell_level', 'spell: telekinetic_wave') * 0.25) + 6) * (scaling_factor(u_val('intelligence') ) )" ] @@ -273,7 +279,9 @@ "math": [ "( (u_val('spell_level', 'spell: telekinetic_hammer') * 1.5) + 73) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: telekinetic_hammer') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telekinetic_hammer') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) ), 70)" + ] }, "max_range": 70, "energy_source": "STAMINA", @@ -410,11 +418,15 @@ "math": [ "( (u_val('spell_level', 'spell: telekinetic_explosion') * 5) + 100) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: telekinetic_explosion') * 1.2) + 4) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telekinetic_explosion') * 1.2) + 4) * (scaling_factor(u_val('intelligence') ) ), 60)" + ] }, "max_range": 60, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: telekinetic_explosion') * 0.3) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telekinetic_explosion') * 0.3) + 2) * (scaling_factor(u_val('intelligence') ) ), 30)" + ] }, "max_aoe": 30, "energy_source": "STAMINA", diff --git a/data/mods/MindOverMatter/powers/telepathy.json b/data/mods/MindOverMatter/powers/telepathy.json index 9d6637ba3933d..8b43a68c71326 100644 --- a/data/mods/MindOverMatter/powers/telepathy.json +++ b/data/mods/MindOverMatter/powers/telepathy.json @@ -164,7 +164,9 @@ "math": [ "( (u_val('spell_level', 'spell: telepathic_blast') * 3) + 5) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: telepathic_blast') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telepathic_blast') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "energy_source": "STAMINA", @@ -205,7 +207,9 @@ "math": [ "( (u_val('spell_level', 'spell: telepathic_confusion') * 100) + 2000) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: telepathic_confusion') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telepathic_confusion') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "energy_source": "STAMINA", @@ -270,11 +274,15 @@ ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: telepathic_fear') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telepathic_fear') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: telepathic_fear') * 0.15) + 0) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telepathic_fear') * 0.15) + 0) * (scaling_factor(u_val('intelligence') ) ), 4)" + ] }, "energy_source": "STAMINA", "base_energy_cost": 6000, @@ -305,11 +313,15 @@ "math": [ "( (u_val('spell_level', 'spell: telepathic_fear') * 150) + 500) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: telepathic_fear') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telepathic_fear') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: telepathic_fear') * 0.15) + 0) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telepathic_fear') * 0.15) + 0) * (scaling_factor(u_val('intelligence') ) ), 4)" + ] }, "ignored_monster_species": [ "PSI_NULL" ] }, @@ -384,7 +396,9 @@ "math": [ "( (u_val('spell_level', 'spell: telepathic_blast_radius') * 2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: telepathic_blast_radius') * 1.2 ) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telepathic_blast_radius') * 1.2 ) + 2) * (scaling_factor(u_val('intelligence') ) ), 40)" + ] }, "energy_source": "STAMINA", "base_energy_cost": 5000, @@ -410,7 +424,9 @@ "max_damage": 2, "damage_increment": 0.1, "min_aoe": { - "math": [ "( (u_val('spell_level', 'spell: telepathic_blast_radius') * 1.2 ) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telepathic_blast_radius') * 1.2 ) + 2) * (scaling_factor(u_val('intelligence') ) ), 40)" + ] } }, { @@ -447,7 +463,9 @@ ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: telepathic_mind_control') * 1) + 3) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: telepathic_mind_control') * 1) + 3) * (scaling_factor(u_val('intelligence') ) ), 70)" + ] }, "max_range": 70, "energy_source": "STAMINA", diff --git a/data/mods/MindOverMatter/powers/teleportation.json b/data/mods/MindOverMatter/powers/teleportation.json index cb8c16f3307de..9dcde608775de 100644 --- a/data/mods/MindOverMatter/powers/teleportation.json +++ b/data/mods/MindOverMatter/powers/teleportation.json @@ -51,7 +51,7 @@ "max_aoe": 20, "aoe_increment": 0.2, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: teleport_slow') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ "min( ( (u_val('spell_level', 'spell: teleport_slow') * 1.2) + 3) * (scaling_factor(u_val('intelligence') ) ), 80)" ] }, "max_range": 80, "min_duration": { @@ -87,7 +87,7 @@ "difficulty": 2, "max_level": { "math": [ "int_to_level(1)" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: teleport_phase') * 0.1) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ "min( ( (u_val('spell_level', 'spell: teleport_phase') * 0.1) + 2) * (scaling_factor(u_val('intelligence') ) ), 4)" ] }, "max_range": 4, "energy_source": "STAMINA", @@ -148,7 +148,9 @@ "difficulty": 4, "max_level": { "math": [ "int_to_level(1)" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: teleport_transpose') * 2.5) + 1) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: teleport_transpose') * 2.5) + 1) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "energy_source": "STAMINA", @@ -214,7 +216,9 @@ "math": [ "( (u_val('spell_level', 'spell: teleport_collapse') * -0.15) - 3) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: teleport_collapse') * 1.2) + 5) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: teleport_collapse') * 1.2) + 5) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "min_aoe": 3, @@ -250,7 +254,9 @@ "max_aoe": 1, "aoe_increment": -0.25, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: teleport_farstep') * 2.5) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: teleport_farstep') * 2.5) + 2) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "energy_source": "STAMINA", @@ -285,7 +291,9 @@ "math": [ "( (u_val('spell_level', 'spell: teleport_banish') * 35) + 350) * (scaling_factor(u_val('intelligence') ) )" ] }, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: teleport_banish') * 2) + 1.5) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: teleport_banish') * 2) + 1.5) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "energy_source": "STAMINA", @@ -342,7 +350,9 @@ "max_level": { "math": [ "int_to_level(1)" ] }, "min_damage": 1, "min_range": { - "math": [ "( (u_val('spell_level', 'spell: teleport_summon') * 1.5) + 2) * (scaling_factor(u_val('intelligence') ) )" ] + "math": [ + "min( ( (u_val('spell_level', 'spell: teleport_summon') * 1.5) + 2) * (scaling_factor(u_val('intelligence') ) ), 80)" + ] }, "max_range": 80, "energy_source": "STAMINA", diff --git a/data/mods/MindOverMatter/professions.json b/data/mods/MindOverMatter/professions.json index 2c95e16527d13..e29ba2e2dd8b1 100644 --- a/data/mods/MindOverMatter/professions.json +++ b/data/mods/MindOverMatter/professions.json @@ -100,7 +100,7 @@ "description": "Fire always fascinated you. The fires you set almost got you arrested a few times, but the urge was just too powerful. It was like they were calling to you, urging you to create them. And ever since the sky broke, you can create fire with merely a thought.", "points": 4, "skills": [ { "level": 2, "name": "cooking" }, { "level": 1, "name": "driving" }, { "level": 2, "name": "metaphysics" } ], - "traits": [ "PYROMANIA", "PYROKINETIC", "PYROGLOW_WEAK", "PYROGLOW_STRONG" ], + "traits": [ "PYROMANIA", "PYROKINETIC", "PYROKIN_ADAPTATION" ], "spells": [ { "id": "pyrokinetic_eruption", "level": 4 }, { "id": "pyrokinetic_quell_flames", "level": 2 }, diff --git a/data/mods/MindOverMatter/recipes/practice/biokinetic_practice.json b/data/mods/MindOverMatter/recipes/practice/biokinetic_practice.json index 0351468993cb5..1d5c6e7e92203 100644 --- a/data/mods/MindOverMatter/recipes/practice/biokinetic_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/biokinetic_practice.json @@ -53,6 +53,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_overcome_pain')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(1)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -103,6 +104,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_physical_enhance')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -153,6 +155,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_flexibility')", "+=", "(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": { @@ -204,6 +207,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_armor_skin')", "+=", "(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": { @@ -255,6 +259,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_climate_control')", "+=", "(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": { @@ -306,6 +311,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_enhance_mobility')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -357,6 +363,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_hammerhand')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -408,6 +415,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_reflex_enhance')", "+=", "(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": { @@ -459,6 +467,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_sealed_system')", "+=", "(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": { @@ -510,6 +519,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_combat_dance')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(8)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -561,6 +571,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: biokin_perfected_motion')", "+=", "(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": { diff --git a/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json b/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json index 024a3c2d5df26..afe177496aa12 100644 --- a/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/clairsentient_practice.json @@ -53,6 +53,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_night_vision')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(1)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -103,6 +104,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_danger_sense')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -153,6 +155,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_speed_reading')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -203,6 +206,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_spot_weakness')", "+=", "(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": { @@ -253,6 +257,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_sense_rads')", "+=", "(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": { @@ -304,6 +309,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_ranged_enhance')", "+=", "(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": { @@ -353,6 +359,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_voyance')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -396,7 +403,7 @@ "and": [ { "math": [ "u_val('spell_level', 'spell: clair_dodge_power')", ">=", "1" ] }, { - "math": [ "u_val('spell_exp', 'spell: clair_dodge_power')", "<=", "(difficulty_four_contemplation(1))" ] + "math": [ "u_val('spell_exp', 'spell: clair_dodge_power')", "<=", "(difficulty_six_contemplation(1))" ] } ] }, @@ -404,6 +411,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_dodge_power')", "+=", "(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": { @@ -453,6 +461,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_see_map')", "+=", "(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": { @@ -496,7 +505,7 @@ "and": [ { "math": [ "u_val('spell_level', 'spell: clair_clear_sight')", ">=", "1" ] }, { - "math": [ "u_val('spell_exp', 'spell: clair_clear_sight')", "<=", "(difficulty_six_contemplation(1))" ] + "math": [ "u_val('spell_exp', 'spell: clair_clear_sight')", "<=", "(difficulty_eight_contemplation(1))" ] } ] }, @@ -504,6 +513,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_clear_sight')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(8)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -555,6 +565,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: clair_omniscience')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(10)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { diff --git a/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json index 134aab5d8d371..c31ede8630b3a 100644 --- a/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/photokinesis_practice.json @@ -10,6 +10,8 @@ "description": "Recipes related to practicing photokinesis.", "skill_used": "metaphysics", "nested_category_data": [ + "practice_photokinetic_light_local", + "practice_photokinetic_create_light", "practice_photokinetic_snuff_light", "practice_photokinetic_light_dodge", "practice_photokinetic_invisibility", @@ -18,10 +20,113 @@ "practice_photokinetic_rad_immunity", "practice_photokinetic_light_arms", "practice_photokinetic_light_disintegrate", + "practice_photokinetic_light_blinding_glare", "practice_photokinetic_light_flash" ], "difficulty": 1 }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "name": "contemplation: candle's light", + "id": "practice_photokinetic_light_local", + "description": "Contemplate your powers and improve your ability to create a small amount of light.", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "metaphysics", + "difficulty": 0, + "time": "30 m", + "autolearn": false, + "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], + "flags": [ "SECRET", "BLIND_HARD" ], + "result_eocs": [ + { + "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_LOCAL", + "condition": { + "and": [ + { "math": [ "u_val('spell_level', 'spell: photokinetic_light_local')", ">=", "1" ] }, + { + "math": [ "u_val('spell_exp', 'spell: photokinetic_light_local')", "<=", "(difficulty_one_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_light_local')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(1)" ] }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": { + "run_eocs": [ + { + "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_LOCAL_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_light_local')", ">=", "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", + "name": "contemplation: field of light", + "id": "practice_photokinetic_create_light", + "description": "Contemplate your powers and improve your ability to create light at a distance.", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "metaphysics", + "difficulty": 1, + "time": "30 m", + "autolearn": false, + "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], + "flags": [ "SECRET", "BLIND_HARD" ], + "result_eocs": [ + { + "id": "EOC_PRACTICE_PHOTOKIN_CREATE_LIGHT", + "condition": { + "and": [ + { "math": [ "u_val('spell_level', 'spell: photokinetic_create_light')", ">=", "1" ] }, + { + "math": [ "u_val('spell_exp', 'spell: photokinetic_create_light')", "<=", "(difficulty_two_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_create_light')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, + { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } + ], + "false_effect": { + "run_eocs": [ + { + "id": "EOC_PRACTICE_PHOTOKIN_CREATE_LIGHT_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_create_light')", ">=", "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", @@ -31,7 +136,7 @@ "category": "CC_*", "subcategory": "CSC_*_NESTED", "skill_used": "metaphysics", - "difficulty": 0, + "difficulty": 1, "time": "30 m", "autolearn": false, "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], @@ -43,7 +148,7 @@ "and": [ { "math": [ "u_val('spell_level', 'spell: photokinetic_snuff_light')", ">=", "1" ] }, { - "math": [ "u_val('spell_exp', 'spell: photokinetic_snuff_light')", "<=", "(difficulty_one_contemplation(1))" ] + "math": [ "u_val('spell_exp', 'spell: photokinetic_snuff_light')", "<=", "(difficulty_two_contemplation(1))" ] } ] }, @@ -51,6 +156,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: photokinetic_snuff_light')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -101,6 +207,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: photokinetic_light_dodge')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -131,7 +238,7 @@ "category": "CC_*", "subcategory": "CSC_*_NESTED", "skill_used": "metaphysics", - "difficulty": 1, + "difficulty": 2, "time": "30 m", "autolearn": false, "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], @@ -143,7 +250,7 @@ "and": [ { "math": [ "u_val('spell_level', 'spell: photokinetic_light_beam')", ">=", "1" ] }, { - "math": [ "u_val('spell_exp', 'spell: photokinetic_light_beam')", "<=", "(difficulty_two_contemplation(1))" ] + "math": [ "u_val('spell_exp', 'spell: photokinetic_light_beam')", "<=", "(difficulty_three_contemplation(1))" ] } ] }, @@ -151,6 +258,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: photokinetic_light_beam')", "+=", "(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": { @@ -202,6 +310,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: photokinetic_light_image')", "+=", "(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": { @@ -226,9 +335,9 @@ { "type": "recipe", "activity_level": "LIGHT_EXERCISE", - "name": "contemplation: refraction of arms", - "id": "practice_photokinetic_light_arms", - "description": "Contemplate your powers and improve your ability to create illusions of extra arms.", + "name": "contemplation: light barrier", + "id": "practice_photokinetic_rad_immunity", + "description": "Contemplate your powers and improve your ability to create a barrier of light around you.", "category": "CC_*", "subcategory": "CSC_*_NESTED", "skill_used": "metaphysics", @@ -240,26 +349,27 @@ "flags": [ "SECRET", "BLIND_HARD" ], "result_eocs": [ { - "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_ARMS", + "id": "EOC_PRACTICE_PHOTOKIN_RAD_IMMUNITY", "condition": { "and": [ - { "math": [ "u_val('spell_level', 'spell: photokinetic_light_arms')", ">=", "1" ] }, + { "math": [ "u_val('spell_level', 'spell: photokinetic_rad_immunity')", ">=", "1" ] }, { - "math": [ "u_val('spell_exp', 'spell: photokinetic_light arms')", "<=", "(difficulty_three_contemplation(1))" ] + "math": [ "u_val('spell_exp', 'spell: photokinetic_rad_immunity')", "<=", "(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: photokinetic_light_arms')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('spell_exp', 'spell: photokinetic_rad_immunity')", "+=", "(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_PHOTOKIN_LIGHT_ARMS_FALSE", - "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_light_arms')", ">=", "1" ] }, + "id": "EOC_PRACTICE_PHOTOKIN_RAD_IMMUNITY_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_rad_immunity')", ">=", "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" } @@ -277,13 +387,13 @@ { "type": "recipe", "activity_level": "LIGHT_EXERCISE", - "name": "contemplation: light barrier", - "id": "practice_photokinetic_rad_immunity", - "description": "Contemplate your powers and improve your ability to create a barrier of light around you.", + "name": "contemplation: veil of light", + "id": "practice_photokinetic_invisibility", + "description": "Contemplate your powers and improve your ability to refract light in a way that makes you invisible.", "category": "CC_*", "subcategory": "CSC_*_NESTED", "skill_used": "metaphysics", - "difficulty": 2, + "difficulty": 3, "time": "30 m", "autolearn": false, "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], @@ -291,26 +401,27 @@ "flags": [ "SECRET", "BLIND_HARD" ], "result_eocs": [ { - "id": "EOC_PRACTICE_PHOTOKIN_RAD_IMMUNITY", + "id": "EOC_PRACTICE_PHOTOKIN_INVISIBILITY", "condition": { "and": [ - { "math": [ "u_val('spell_level', 'spell: photokinetic_rad_immunity')", ">=", "1" ] }, + { "math": [ "u_val('spell_level', 'spell: photokinetic_invisibility')", ">=", "1" ] }, { - "math": [ "u_val('spell_exp', 'spell: photokinetic_rad_immunity')", "<=", "(difficulty_three_contemplation(1))" ] + "math": [ "u_val('spell_exp', 'spell: photokinetic_invisibility')", "<=", "(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_rad_immunity')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('spell_exp', 'spell: photokinetic_invisibility')", "+=", "(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_RAD_IMMUNITY_FALSE", - "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_rad_immunity')", ">=", "1" ] }, + "id": "EOC_PRACTICE_PHOTOKIN_INVISIBILITY_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_invisibility')", ">=", "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" } @@ -328,9 +439,9 @@ { "type": "recipe", "activity_level": "LIGHT_EXERCISE", - "name": "contemplation: veil of light", - "id": "practice_photokinetic_invisibility", - "description": "Contemplate your powers and improve your ability to refract light in a way that makes you invisible.", + "name": "contemplation: refraction of arms", + "id": "practice_photokinetic_light_arms", + "description": "Contemplate your powers and improve your ability to create illusions of extra arms.", "category": "CC_*", "subcategory": "CSC_*_NESTED", "skill_used": "metaphysics", @@ -342,26 +453,27 @@ "flags": [ "SECRET", "BLIND_HARD" ], "result_eocs": [ { - "id": "EOC_PRACTICE_PHOTOKIN_INVISIBILITY", + "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_ARMS", "condition": { "and": [ - { "math": [ "u_val('spell_level', 'spell: photokinetic_invisibility')", ">=", "1" ] }, + { "math": [ "u_val('spell_level', 'spell: photokinetic_light_arms')", ">=", "1" ] }, { - "math": [ "u_val('spell_exp', 'spell: photokinetic_invisibility')", "<=", "(difficulty_four_contemplation(1))" ] + "math": [ "u_val('spell_exp', 'spell: photokinetic_light arms')", "<=", "(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_invisibility')", "+=", "(contemplation_factor(1))" ] }, + { "math": [ "u_val('spell_exp', 'spell: photokinetic_light_arms')", "+=", "(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_INVISIBILITY_FALSE", - "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_invisibility')", ">=", "1" ] }, + "id": "EOC_PRACTICE_PHOTOKIN_LIGHT_ARMS_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_light_arms')", ">=", "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" } @@ -385,7 +497,7 @@ "category": "CC_*", "subcategory": "CSC_*_NESTED", "skill_used": "metaphysics", - "difficulty": 6, + "difficulty": 5, "time": "30 m", "autolearn": false, "tools": [ [ [ "matrix_crystal_drained", -1 ] ] ], @@ -398,7 +510,7 @@ "and": [ { "math": [ "u_val('spell_level', 'spell: photokinetic_light_flash')", ">=", "1" ] }, { - "math": [ "u_val('spell_exp', 'spell: photokinetic_light_flash')", "<=", "(difficulty_seven_contemplation(1))" ] + "math": [ "u_val('spell_exp', 'spell: photokinetic_light_flash')", "<=", "(difficulty_six_contemplation(1))" ] } ] }, @@ -406,6 +518,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: photokinetic_light_flash')", "+=", "(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": { @@ -427,6 +540,60 @@ } ] }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "name": "contemplation: blinding radiance", + "id": "practice_photokinetic_light_blinding_glare", + "description": "Contemplate your powers and improve your ability to glow so brightly you can blind your enemies.", + "category": "CC_*", + "subcategory": "CSC_*_NESTED", + "skill_used": "metaphysics", + "difficulty": 6, + "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_BLINDING_GLARE", + "condition": { + "and": [ + { "math": [ "u_val('spell_level', 'spell: photokinetic_blinding_glare')", ">=", "1" ] }, + { + "math": [ "u_val('spell_exp', 'spell: photokinetic_blinding_glare')", "<=", "(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: photokinetic_blinding_glare')", "+=", "(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_PHOTOKIN_BLINDING_GLARE_FALSE", + "condition": { "math": [ "u_val('spell_level', 'spell: photokinetic_blinding_glare')", ">=", "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", @@ -459,6 +626,7 @@ "math": [ "u_val('spell_exp', 'spell: photokinetic_light_disintegrate')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(8)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { diff --git a/data/mods/MindOverMatter/recipes/practice/pyrokinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/pyrokinesis_practice.json index 1548ff5539dfb..bd2558db4e5f0 100644 --- a/data/mods/MindOverMatter/recipes/practice/pyrokinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/pyrokinesis_practice.json @@ -54,6 +54,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_flash')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(1)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -104,6 +105,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_eruption')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -154,6 +156,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_quell_flames')", "+=", "(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": { @@ -204,6 +207,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_call_flames')", "+=", "(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": { @@ -255,6 +259,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_cloak')", "+=", "(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": { @@ -306,6 +311,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_flamethrower')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -357,6 +363,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_lance')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -406,6 +413,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_aura')", "+=", "(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": { @@ -457,6 +465,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_thermogenesis')", "+=", "(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": { @@ -508,6 +517,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_flame_immunity')", "+=", "(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": { @@ -559,6 +569,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_blast')", "+=", "(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": { @@ -610,6 +621,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: pyrokinetic_aoe_blast')", "+=", "(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": { diff --git a/data/mods/MindOverMatter/recipes/practice/telekinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/telekinesis_practice.json index 79447e8877dd4..3544eb5c064e7 100644 --- a/data/mods/MindOverMatter/recipes/practice/telekinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/telekinesis_practice.json @@ -52,6 +52,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_pull')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(1)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -100,6 +101,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_push')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -150,6 +152,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_momentum')", "+=", "(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": { @@ -201,6 +204,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_slowfall')", "+=", "(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": { @@ -252,6 +256,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_wave')", "+=", "(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": { @@ -303,6 +308,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_strength')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -354,6 +360,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_hammer')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -405,6 +412,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_vehicle_lift')", "+=", "(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": { @@ -456,6 +464,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_shield')", "+=", "(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": { @@ -507,6 +516,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_explosion')", "+=", "(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": { @@ -558,6 +568,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_levitation')", "+=", "(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": { @@ -609,6 +620,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telekinetic_aegis')", "+=", "(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": { diff --git a/data/mods/MindOverMatter/recipes/practice/telepathy_practice.json b/data/mods/MindOverMatter/recipes/practice/telepathy_practice.json index 779671e047891..eac4a732db1b7 100644 --- a/data/mods/MindOverMatter/recipes/practice/telepathy_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/telepathy_practice.json @@ -53,6 +53,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_concentration')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(1)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -103,6 +104,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_shield')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -153,6 +155,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_morale')", "+=", "(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": { @@ -203,6 +206,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_mind_sense')", "+=", "(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": { @@ -254,6 +258,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_blast')", "+=", "(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": { @@ -305,6 +310,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_confusion')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -356,6 +362,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_invisibility')", "+=", "(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": { @@ -405,6 +412,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_fear')", "+=", "(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": { @@ -456,6 +464,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_blast_radius')", "+=", "(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": { @@ -507,6 +516,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_mind_control')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(8)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -558,6 +568,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: telepathic_network')", "+=", "(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": { diff --git a/data/mods/MindOverMatter/recipes/practice/teleportation_practice.json b/data/mods/MindOverMatter/recipes/practice/teleportation_practice.json index 10a872cf4d37e..4f651d089906a 100644 --- a/data/mods/MindOverMatter/recipes/practice/teleportation_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/teleportation_practice.json @@ -51,6 +51,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_blink')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(1)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -99,6 +100,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_slow')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -147,6 +149,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_phase')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -197,6 +200,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_stride')", "+=", "(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": { @@ -247,6 +251,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_transpose')", "+=", "(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": { @@ -298,6 +303,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_collapse')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -349,6 +355,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_displacement')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -398,6 +405,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_farstep')", "+=", "(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": { @@ -449,6 +457,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_banish')", "+=", "(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": { @@ -500,6 +509,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_gateway')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(8)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -549,6 +559,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: teleport_summon')", "+=", "(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": { diff --git a/data/mods/MindOverMatter/recipes/practice/vitakinesis_practice.json b/data/mods/MindOverMatter/recipes/practice/vitakinesis_practice.json index 719c30dadb448..5ab3218da8910 100644 --- a/data/mods/MindOverMatter/recipes/practice/vitakinesis_practice.json +++ b/data/mods/MindOverMatter/recipes/practice/vitakinesis_practice.json @@ -55,6 +55,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_health_power')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(1)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -105,6 +106,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_stop_bleeding')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(2)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -155,6 +157,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_hurt_touch')", "+=", "(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": { @@ -205,6 +208,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_health_power_ally')", "+=", "(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": { @@ -256,6 +260,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_sleeping_trance')", "+=", "(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": { @@ -305,6 +310,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_pain_split')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -356,6 +362,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_stop_infection')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(5)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -407,6 +414,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_healing_trance')", "+=", "(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": { @@ -456,6 +464,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_purge_rads')", "+=", "(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": { @@ -507,6 +516,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_blood_purge')", "+=", "(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": { @@ -558,6 +568,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_banish_illness')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(8)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { @@ -607,6 +618,7 @@ { "u_message": "You spend some time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_super_heal')", "+=", "(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": { @@ -658,6 +670,7 @@ { "u_message": "You spend a lot of time meditating and contemplating your powers and emerge with new knowledge." }, { "math": [ "u_val('spell_exp', 'spell: vita_limb_restore')", "+=", "(contemplation_factor(1))" ] }, { "math": [ "u_val('vitamin', 'name:vitamin_psionic_drain')", "+=", "rng( 0,2 )" ] }, + { "math": [ "u_val('stored_kcal')", "-=", "psionics_contemplation_kcal_cost(10)" ] }, { "run_eocs": "EOC_PSI_PRACTICE_FOCUS_MOD" } ], "false_effect": { diff --git a/data/mods/MindOverMatter/snippets/snippets.json b/data/mods/MindOverMatter/snippets/snippets.json index d6e2c3fbd5e5a..d02248c8c90af 100644 --- a/data/mods/MindOverMatter/snippets/snippets.json +++ b/data/mods/MindOverMatter/snippets/snippets.json @@ -18,7 +18,9 @@ { "id": "general_graffiti_psi_2", "text": "This is a detailed drawing of a pyramid with an eye in it. Below is written \"We see now.\"" - } + }, + { "id": "general_graffiti_psi_3", "text": "We greet the new dawn" }, + { "id": "general_graffiti_psi_4", "text": "Dawn is breaking" } ] }, { @@ -59,6 +61,26 @@ { "id": "note_psi_5", "text": "\"Using the Force is way easier than going into the houses. Stand out in a storm. You'll thank me later, if you survive.\"" + }, + { + "id": "note_psi_6", + "text": "\"This is it, the next stage in human evolution. The sheep weren't worthy and will fall before the ascension of Homo Superior.\"" + }, + { + "id": "note_psi_7", + "text": "\"All this meditating has finally paid off. You need me to get you something, leave me a note at the old gas station south of Ashland on 93. You'll have what you need in a couple days.\"" + }, + { + "id": "note_psi_8", + "text": "\"Those things, the ones that sound like people, it's not just their claws. I saw them lift another guy clear off his feet from thirty feet away and take him apart while he screamed and screamed. All the while saying shit like \"The store is closing in fifteen minutes.\" I don't care what they have in those towers, I'm never going anywhere near them again.\"" + }, + { + "id": "note_psi_9", + "text": "\"I always knew there was something off about that office building on main. I'm not going to check it out because downtown is overrun but I saw weird lights from the top floor two lights running. Something's still happening up there.\"" + }, + { + "id": "note_psi_10", + "text": "\"Met some girl living out in the wilds west of town. She snuck up perfectly behind me and held me at gunpoint until she was sure I wouldn't try to steal from her. Once we had that cleared up, told me to skip north and avoid 90 because some assholes had set up a roadblock. I asked her how she knew where I was going and she said, \"It was revealed to me in a dream.\" I should have listened to her.\"" } ] }, diff --git a/data/mods/MindOverMatter/snippets/snippets_new.json b/data/mods/MindOverMatter/snippets/snippets_new.json index 8986b4adefff0..19726c4de7b17 100644 --- a/data/mods/MindOverMatter/snippets/snippets_new.json +++ b/data/mods/MindOverMatter/snippets/snippets_new.json @@ -121,12 +121,24 @@ { "name": "post-it", "id": "lab_postit_psi_48", "text": "Can't block them out anymore" }, { "name": "post-it", "id": "lab_postit_psi_49", "text": "Can they go through halfway?" }, { "name": "post-it", "id": "lab_postit_psi_50", "text": "Same dream, every night" }, - { "name": "post-it", "id": "lab_postit_psi_51", "text": "Great, some of the mice escaped" } + { "name": "post-it", "id": "lab_postit_psi_51", "text": "Great, some of the mice escaped" }, + { "name": "post-it", "id": "lab_postit_psi_52", "text": "It's like a shadow and it won't go away" }, + { + "name": "post-it", + "id": "lab_postit_psi_53", + "text": "SMOKE USHER found something. It's everywhere. It's in us" + }, + { "name": "post-it", "id": "lab_postit_psi_54", "text": "Zombies can't awaken. What a surprise" }, + { "name": "post-it", "id": "lab_postit_psi_55", "text": "She hurled a quarter 45.8 smoots" }, + { "name": "post-it", "id": "lab_postit_psi_56", "text": "Highest recorded temperature at 1247°C" }, + { "name": "post-it", "id": "lab_postit_psi_57", "text": "Eyes, always watching from outside" }, + { "name": "post-it", "id": "lab_postit_psi_58", "text": "We're definitely sailing the black seas of infinity" } ] }, { "type": "snippet", "category": "lab_file_biokinesis", + "//": "Phavian designation for biokinetic study is BURNT NOVEMBER. Designation for use in combat is VERDANT HAND", "text": [ { "name": "AAR ID# V78-08", @@ -146,18 +158,78 @@ { "name": "incident report: 385924", "id": "lab_file_biokinesis_04", - "text": "Upon leaving for the evening, Dr. Erikson neglected to seal cage #3, allowing one of experimental mice (#748562) to gain access to the matrix crystal supplies. One crystal discharged, affecting 748562 and apparently causing an awakening. 748562 escaped the room, squeezing under the door, and is currently loose within the facility.\n\nDr. Erickson has been placed on administrative leave pending a full investigation and new procedures for storing matrix crystals are currently being implemented. A search for 748562 is still underway." + "text": "Upon leaving for the evening, Dr. Erikson neglected to seal cage #3, allowing one of the experimental mice (#748562) to gain access to the matrix crystal supplies. One crystal discharged, affecting 748562 and apparently causing an awakening. 748562 escaped the room, squeezing under the door, and is currently loose within the facility.\n\nDr. Erickson has been placed on administrative leave pending a full investigation and new procedures for storing matrix crystals are currently being implemented. A search for 748562 is still underway." }, { "name": "torn notebook page", "id": "lab_file_biokinesis_05", - "text": "wanted me to keep a logbook of my daily exercise but I don't understand the point. I run, I lift, I sleep, that's about all these have me do here. What, they want \"5:40 a.m.: 30 reps 250 lbs, run 20 minutes, 100 burpees (10 sets)\" blah blah who cares? That shit doesn't matter. We're all trapped here and things are going to hell and we got some kind of poison in our bodies that's going to bring us back when we die so we can eat brains.\n\nWell, fine, here's my log: 6:05 a.m.: 50 reps 400 lbs, sprint 10 minutes, 200 pull-ups, triple sommersault from a standing start. Put me in the Olympics right now." + "text": "They wanted me to keep a logbook of my daily exercise but I don't understand the point. I run, I lift, I sleep, that's about all these have me do here. What, they want \"5:40 a.m.: 30 reps 250 lbs, run 20 minutes, 100 burpees (10 sets)\" blah blah who cares? That shit doesn't matter. We're all trapped here and things are going to hell and we got some kind of poison in our bodies that's going to bring us back when we die so we can eat brains.\n\nWell, fine, here's my log: 6:05 a.m.: 50 reps 400 lbs, sprint 10 minutes, 200 pull-ups, triple somersault from a standing start. Put me in the Olympics right now." + }, + { + "name": "The VERDANT HAND combat protocols", + "id": "lab_file_biokinesis_06", + "text": "They demanded that I include that title on this report even though it's pretentious as hell. This isn't some superweapon that will change the face of modern warfare, it's just a better form of hand-to-hand combat. They can't dodge bullets. They can't punch through brick walls. They can't do that movie thing where the hero hits a bad guy and the bad guy goes flying twenty feet. They're just faster and stronger and hit harder, all good things, but they aren't going to beat someone with a gun. There's a reason we invented guns and why functional martial arts training is about defending yourself and getting away, not about going on the offense.\n\nSo is it worth training people? That's the wrong question. This isn't a codified martial art, it's just using dimensional metaphysics to enhance existing methods of combat. A VERDANT HAND candidate will be better at Muay Thai than anyone who hasn't gone through BURNT NOVEMBER but they still need the actual martial arts training. This is just another tool. I'm not sure why there's so much focus on this, to be honest. With the cost of retrieving materials, surely we could spend that money better elsewhere. Modern warfare does not rely on single superheroes winning battles." + } + ] + }, + { + "type": "snippet", + "category": "lab_file_clairsentience", + "//": "Phavian designation for clairsentience study is NOBLE HORIZON. Phavian designation for use of clairsentience to find appropriate portal targets for immersion dives is COLD BELOW", + "text": [ + { + "name": "Notes scribbled on notebook paper", + "id": "lab_file_clairsentience_01", + "text": "I'm looking up at the sky. I can see the same constellations on Earth, but they're shimmering somehow, like there's a haze or a fog or something between us. Then, the stars start to slowly go out. Not in a wave, but randomly--one here, one there, faster and faster until the entire sky was dark. Then the moon disappeared as well and everything went black.\n\nI'm standing on the edge of a cliff. Below me is the churning sea, the waters black under the stormclouds. The sea rises slowly as rain falls in sheets, lightning striking the waters. They break over the edge of the cliff, then over my head. I drown.\n\nI am standing in a forest. The trees rustle all around me and the birds sing, and then clouds pass over the sun. The sun dims and then starts to go black. It's an eclipse. The light fades and all the birdsong dies. I stand in pitch blackness with the rustle of leaves around me." + }, + { + "name": "testing report I2-8129", + "id": "lab_file_clairsentience_02", + "text": "Subject O21 was placed blindfolded in a completely dark room with a deck of shuffled playing cards, instructed to remove the blindfold, and asked to sort them in standard order: clubs, diamonds, hearts, spades, each in numerical order. Task was completed in 6:03 with 18/52 cards in the proper order and minor to major ordering errors in all other cards. Subject was then asked to to drink from the coffee cup in the room. Cup was placed on a shelf above the door to prevent movement around the room from discovering it, but task was completed in 1:14, with the only difficulty being subject's height (158 cm) making it harder to reach the shelf. Subject was then asked to cross the room to the table, pick up the paper, and read the sequence of numbers written on it. Subject was unable to do so, only correctly reciting the first two digits.\n\nExperiment does uphold the thesis that successful NOBLE HORIZON mathematicians perceive their surroundings through means other than light. As O21 was unable to read the document, their sense is not \"sight\" as such. Further experimentation to determine its limits is necessary." + }, + { + "name": "COLD BELOW progress report", + "id": "lab_file_clairsentience_03", + "text": "Dr. Richardson,\nAfter all of the time and money I wish I had more promising news to report. Netherum mathematics is an inexact science, as you well know, so it's very hard to find a protocol that will work the same every time. Melchior has the advantage of processing speed but our mathematicians have to put in the hours, but they can make connections Melchior cannot because he can only work with the data he's given, whereas NOBLE HORIZON provides new data. But, unpredictably. We've discovered any number of immersion destinations where the physical laws are so different even the probes wouldn't work, much less a dive team. The majority of them, even BURNT NOVEMBER wouldn't be sufficient to sustain a diver. There's no value in exotic materials that will probably not survive the transition.\n\nOn the other hand, COLD BELOW did discover Plane 398RG and we got quite a few awakenings out of it before testing was prohibited. And on the other other hand, they found 9472P where the entire world's biomass had been assimilated by XE157 and we lost the entire dive team because XE157 ignored the probes. It's like that bell curve meme where Melchior is in the middle and COLD BELOW is both ends. If only we had a better way to get the far side." + }, + { + "name": "GRAY DAWN vs. NOBLE HORIZON testing", + "id": "lab_file_clairsentience_04", + "text": "In the interests of testing Dr. Al-Masri's hypothesis, we assembled a group of NOBLE HORIZON and GRAY DAWN mathematicians and had them both attempt to conduct a simple number guessing game. Melchior provided a six-digit number and both teams attempted to guess it. GRAY DAWN were competitive when the number was overseen by a third party, as expected, but when both teams were provided with a terminal interface and instructed to enter their guesses, GRAY DAWN scored no better than chance. On the other hand, NOBLE HORIZON consistently managed to guess at least three digits and successfully guessed the entire six-digit sequence twice (out of ten total sequences). This disparity was maintained when both groups were placed in empty rooms, instructed to write down their guesses on a sheet of paper, and place it into a box before leaving the room. Finally, NOBLE HORIZON attained a better than chance score on the final test, when both groups were instructed to guess the sequence before Melchior was asked to provide a sequence.\n\nThis leads to two conclusions. The first is that the alarmists are wrong; Melchior is not secretly harboring a genius intellect and plotting to control XEDRA from within, it is a computer, capable of processing vast amounts of data and using netherum mathematics to process that data much faster than would otherwise be possible. The second is that while GRAY DAWN requires a specific source from which to attain new information, NOBLE HORIZON does not. Even in situations where no information transfer would be possible, such as the final two testing scenarios, NOBLE HORIZON still had a better-than-chance rate of correctly determining the sequence." + } + ] + }, + { + "type": "snippet", + "category": "lab_file_telekinesis", + "//": "Phavian designation for telekinetic study is JUNIPER GOLD. Phavian designation for telekinetic study for use in combat is ONYX LIGHTNING", + "text": [ + { + "name": "It's all just motion", + "id": "lab_file_telekinesis_01", + "text": "Why is there a distinction between pyrokinesis and telekinesis at all? Fire isn't a fundamental element, it's the result of heat which is the result of molecular motion. There's no conceptual reason why a pyrokinetic couldn't make all the molecules of an object move in a particular direction, producing motion of the entire object, or a telekinetic couldn't produce a more chaotic motion that resulted in the object's energy increasing. Furthermore, in no test has a telekinetic been able to move part of an object unless that part is designed for motion; pulling a lever is possible, but breaking a plate in half is not. And a pyrokinetic cannot apply the reverse and slow down an object's molecules to reduce heat unless that object is on fire.\n\nMy theory is that it's all psychological. We've all grown up with modern culture and stories about what psychics are \"supposed\" to be capable of, and so the matrix crystals and Netherum mathematics shape the candidates' abilities toward those pre-determined pathways. If we could get a SMOKE USHER mathematician from an uncontacted tribe, maybe they'd be able to induce diseases in their targets or steal their soul, in accordance with that tribe's beliefs and practices about supernatural powers. But since our candidates come from a culture where pyrokinesis and telekinesis are separate things and geokinesis or osteokinesis are very rare to nonexistant in fiction, the former result from awakenings and the latter do not.\n\nI would like to formally request a wider variety of cultural backgrounds for our project candidates to test this theory." + }, + { + "name": "re: the Third", + "id": "lab_file_telekinesis_02", + "text": "Sarah,\nI read your email and you're right--it's not a law anymore if we have such an easily-demonstrable counterexample. \"Newton's Third Conjecture\" doesn't have the same ring to it but seems more accurate. We've done a lot of experiments to find some sort of consequences for the TKs and so far there's nothing other than the standard metabolic cost. Netherum mathematics is work, but the mechanism of the force is unclear. We've already tried both a scale and water displacement and neither of them showed any measurable counterforce. That leaves a few possibilities:/n1)There is no counterforce. That breaks classical mechanics in half but frankly we're already at that point anyway.\n2)The counterforce is exerted elsewhere, such as the Netherum. This is basically just handwavium, \"well, we can't see it but it must be out there.\" Must it? Plus then the counterforce isn't actually acting on the origin point anyway unless you buy Dr. Ho's ridiculous \"The soul is a Nether construct\" theory.\n3)The counterforce applies in some way we aren't looking for, like, I don't know, DNA damage or other microscopic-level areas. We already had comprehensive checkups and didn't find anything, but we're not entirely sure what we're looking for.\n\n\"we're not entirely sure what we're looking for\" is basically the theme of this whole project, honestly. It's amazing we've discovered as much as we have.\n\n-Neha" + }, + { + "name": "testing report B8-9123", + "id": "lab_file_telekinesis_03", + "text": ".00: No penetration\n9mm: No penetration\n10mm: No penetration\n.357: No penetration\n.22: No penetration\n.308: No penetration\n.30-06: No penetration\n.50: Mathematician refused to continue with experiment despite repeated entreaties from supervisors." + }, + { + "name": "testing report I4-7707", + "id": "lab_file_telekinesis_04", + "text": "Dr. Richardson,\nPer request, we assessed the ability of three JUNIPER GOLD mathematicians to affect very small masses. Subjects were ordered to look into a microscope at water flora, then at bacterial samples, and then at images from electron microscopes. While it makes intuitive sense that larger masses would require more effort and control to manipulate through telekinesis, its actual behavior does not always follow logical constraints--see the way that barrier react to external forces. In this experiment, we found that manipulating water flora was possible but bacterial samples and electron microscopes both failed. Our initial hypothesis was that direct observation was required, but the bacterial test provided that is not sufficient to explain JUNIPER GOLD's limitations. It is currently unclear if this is a psychological limitation or something inherent to to JUNIPER GOLD. Further testing with a wider variety of mathematicians is required.\nMadeline Robbins\nResearcher" } ] }, { "type": "snippet", "category": "lab_file_telepathy", + "//": "Phavian designation for telepathic study is GRAY DAWN.", "text": [ { "name": "testing report C3-6204", @@ -183,23 +255,23 @@ "name": "testing report N2-7394", "id": "lab_file_telepathy_05", "text": "1) Subject native Arabic speaker. Asked to think of word sequence in English. Mathematician successfully determined sequence word. Asked to think of word sequence in Arabic, mathematician unable to determine word boundaries and isolate words.\n2) Subject native English speaker. Asked to attempt to think of Chinese poem (phonetic transcription provided). Mathematician able to isolate word on second attempt.\n3) Subject native English speaker. Asked to think of word randomly-generated using English phonemes. Mathematician able to isolate word on second attempt.\n4) Subject native French speaker; also fluent in German, English, and Italian with some ability in Romanian, Latin, and Russian. Asked to think of a word sequence in Russian. Mathematician unable to isolate sequence word despite six attempts.\n6) Subject native Yiddish speaker. Asked to think of word in German, which the subject did not speak. Mathematician able to isolate word on third attempt.\n7) Subject native English speaker. Asked to think of word sequence in Sindarian, the invented language from \"The Lord of the Rings\". Mathematician unable to isolate word despite six attempts.\n\nUnfortunately, a deficit of mathematicians who lack English fluency limits the range of our experiments. Nonetheless, the results are consistent with there being no universal language of thought." - } - ] - }, - { - "type": "snippet", - "category": "lab_file_telekinesis", - "text": [ + }, { - "name": "It's all just motion", - "id": "lab_file_telekinesis_01", - "text": "Why is there a distinction between pyrokinesis and telekinesis at all? Fire isn't a fundamental element, it's the result of heat which is the result of molecular motion. There's no conceptual reason why a pyrokinetic couldn't make all the molecules of an object move in a particular direction, producing motion of the entire object, or a telekinetic couldn't produce a more chaotic motion that resulted in the object's energy increasing. Furthermore, in no test has a telekinetic been able to move part of an object unless that part is designed for motion; pulling a lever is possible, but breaking a plate in half is not. And a pyrokinetic cannot apply the reverse and slow down an object's molecules to reduce heat unless that object is on fire.\n\nMy theory is that it's all psychological. We've all grown up with modern culture and stories about what psychics are \"supposed\" to be capable of, and so the matrix crystals and Netherum mathematics shape the candidates' abilities toward those pre-determined pathways. If we could get a SMOKE USHER mathematician from an uncontacted tribe, maybe they'd be able to induce diseases in their targets or steal or their soul, in accordance with that tribe's belief practices about supernatural powers. But since our candidates come from a culture where pyrokinesis and telekinesis are separate things and geokinesis or osteokinesis are very rare in fiction, the former result from awakenings and the latter do not.\n\nI would like to formally request a wider variety of cultural backgrounds for our project candidates to test this theory." + "name": "OS812 Report", + "id": "lab_file_telepathy_06", + "text": "One of the major problems with GRAY DAWN study so far is the need for either line-of-sight or extreme proximity (generally within 2 meters, though certain mathematicians have a range of up to 4 meters), limiting its value in most real-world applications. We can hardly use GRAY DAWN for long-term communications if 4 meters is the maximum range of effective communication. However, I am pleased to report that OS812 is successful far beyond our initial expectations. While the construction requirements are extremely expensive, including, among other things, three active matrix crystals, but it increases the range for GRAY DAWN communication up to several kilometers. While this is still obviously too short to use for most practical purposes, it represents a very promising breakthrough over previous range limitations." + }, + { + "name": "Handwritten notes on lined paper", + "id": "lab_file_telepathy_07", + "text": "I know this isn't part of my report but I have to write it down somewhere. People are getting weird. They teach us to block out stray thoughts and I used to have no trouble with it, but even since the lockdown and the news about the outbreak it's gotten so hard that I can't always do it. Sometimes it leaks through, and lately it's all bad. I came around a corner into a group of researchers yesterday and accidentally knocked into one. She didn't even drop the coffee she was carrying, but just for a moment I caught her thinking about ripping my throat out with her bare hands! She snapped out a \"Watch it!\" and kept going without even giving me time to apologize, but her mind… And when Dr. Chen was arguing with his assistent earlier this morning, both of them thought about shooting each other. The assistant even thought about going on a mass shooting afterwards! I'm no therapist but I don't think this is just us being cooped up in here. Something is really wrong." } ] }, { "type": "snippet", "category": "lab_file_vitakinesis", + "//": "Phavian designation for vitakinetic study is SMOKE USHER", "text": [ { "name": "SMOKE USHER anti-agapic properties (revised estimate)", @@ -208,6 +280,7 @@ }, { "name": "Compound XV471 update", + "//": "This is a refernce to Panaceus testing", "id": "lab_file_vitakinesis_02", "text": "Application of matrix technology and XE037 samples together with cutting-edge medical advances blah blah you know the drill. Anyway, we sourced the samples, we synthesized the compound, we did the tests. It's magic. I know that sounds dumb but it's literally magic. Animal testing showed complete remission of every cancer they developed. \"Alright, Eric,\" you say, \"that's fine but cancer testing in animals is b̵u̵l̵l̵s̵h̵i̵t̵\"clinically irrelevant due to to high real-world failure rates in humans\". Sure, yes, you're right. But we sourced some enthusiastic voluntolds from XEDRA-12's stock and a couple of them had cancer they were planning on testing XE037 interactions with. Well they aren't going to anymore because XV471 cleaned them right up. Totally healthy. Zero cancer.\n\nSubject B84 had cystic fibrosis and it's gone. GONE. Perfectly normal lungs. Now what's that other than magic?\n\nYou want to get more funding for this, just authorize selling XV471 to some sick Russian oligarch for like $10 billion. He gets cured and the money keeps flowing. And honestly it needs to be that expensive with how much this stuff costs to produce. We get the materials and process them and nine times out of ten it's just a sugar pill for no damn reason I can find. But that tenth time, wow.\n\nShred this after you read it. I don't need the director lecturing me about professionalism again." }, @@ -257,7 +330,7 @@ { "name": "LV-429 Analysis", "id": "lab_file_matrix_research_04", - "text": "Human-portable laser weapons suffer from three major problems--high power draw preventing them from easily being transportable or usable in skirmish combat, long dwell times meaning that the operator must remain exposed to return fire in order to do anything more than blind the target, and common atmospheric conditions like dust or haze severely reducing the effectiveness of the beam. The LV-429 solves all three of these problems. Before the primary laser is fired, a secondary netherum mathemathical beam clears the path of the laser, removing atmospheric contaminants without affecting the target. The laser is fired in a series of short pulses, each much higher intensity than a standard laser, eliminating the need for extensive dwell time. Finally, the power source contains a small ND-cell, capable of powering the weapon effectively indefinitely.\n\nOne problem remains to be solved. While the weapon is capable of providing enough power for every shot in succession, matrix technology has not yet provided us with more efficient battery storage. This means that the ND-cell must charge existing batteries, allowing the LV-429 to be fired only once every few seconds, obviously too low a rate of fire for any live engagement. Further enhancements in power storage technology will be necessary before proper deployment." + "text": "Human-portable laser weapons suffer from three major problems--high power draw preventing them from easily being transportable or usable in skirmish combat, long dwell times meaning that the operator must remain exposed to return fire in order to do anything more than blind the target, and common atmospheric conditions like dust or haze severely reducing the effectiveness of the beam. The LV-429 solves all three of these problems. Before the primary laser is fired, a secondary netherum mathemathical beam clears the path of the laser, removing atmospheric contaminants without affecting the target. The laser is fired in a series of short pulses, each much higher intensity than a standard laser, eliminating the need for extensive dwell time. Finally, the power source contains a small ND-cell, capable of powering the weapon effectively indefinitely.\n\nOne problem remains to be solved. While the weapon is capable of providing enough power for every shot in succession, matrix technology has not yet provided us with more efficient battery storage. This means that the ND-cell must charge existing batteries, allowing the LV-429 to be fired only once every few seconds, obviously too low a rate of fire for any live engagement. An attempt to overcome this limitation by including processed matrix crystals for additional energy production led to unacceptable heat levels, rendering the weapon unusable after less than a minute of sustained fire and, in one case, leading to the detonation of the prototype and the death of the tester. Further enhancements in power storage technology will be necessary before proper deployment." }, { "name": "XE037 or whatever", @@ -267,7 +340,13 @@ { "name": "Re: COBALT RAIN", "id": "lab_file_matrix_research_06", - "text": "As my initial report indicated, COBALT RAIN has passed all the tests we've performed. In fact, it exceeded our production predictions by over 15%. It's not actually a perpetual motion machine but it might as well be from the end-user's point of view. It produces energy with no fuel required, at a constant rate, with no waste byproducts and very little heat.\n\nHowever--there's always a however in this line of work--it has the significant disadvantage that prevents me from recommending it for deployment at this time. COBALT RAIN works through a microportal to the Netherum, siphoning energy through without the possibility of hostile incursions. During normal operation, this remains true, but if the device is damaged it can destabilize containment and the portal can rapidly expand without warning. Just last week we had an incident during testing, and while the engineers were able to get the device shut down quickly, something still came through the portal. We're lucky that it doesn't seem hostile or really even interested in us. Despite its appearance (see attached), XE843 is indifferent to the presence or absence of others, light levels, food, or noise. It just wanders around its containment cell. We've contacted XEDRA-40 to ask them if they want to take a look at it. I'll forward the reply to you when we get it.\n\nWork to overcome this significant drawback is ongoing. At the moment, however, COBALT RAIN should remain in the prototype stage.\n\nAnita Morales\nSenior Researcher" + "//": "XE843 here is a Gracken", + "text": "As my initial report indicated, COBALT RAIN has passed all the tests we've performed. In fact, it exceeded our production predictions by over 15%. It's not actually a perpetual motion machine but it might as well be from the end-user's point of view. It produces energy with no fuel required, at a constant rate, with no waste byproducts and very little heat.\n\nHowever--there's always a however in this line of work--it has the significant disadvantage that prevents me from recommending it for deployment at this time. COBALT RAIN works through a microportal to the Netherum, siphoning energy through without the possibility of hostile incursions. During normal operation, this remains true, but if the device is damaged it can destabilize containment and the portal can rapidly expand without warning. Just last week we had an incident during testing, and while the engineers were able to get the device shut down quickly, something still came through the portal. We're lucky that it doesn't seem hostile or really even interested in us. Despite its appearance (see attached), XE843 is indifferent to the presence or absence of others, light levels, food, or noise. It just wanders around its containment cell. We've contacted XEDRA-40 to ask them if they want to take a look at it. I'll forward the reply to you when we get it.\n\nWork to overcome this significant drawback is ongoing. At the moment, however, COBALT RAIN should remain in the prototype stage.\n\nAnita Morales\nSenior Researcher" + }, + { + "name": "Matrix mechanics testing report", + "id": "lab_file_matrix_research_07", + "text": "As requested, we conducted multiple tests using various matrix crystals to determine the precise effect on mathematician capabilities. The first test subject was V72, representing JUNIPER GOLD. In previous capability testing, V72 was capable of lifting 10.23g and holding it steady for at least 300 seconds, as well as consistently being able to reduce their acceleration when free-falling to 9.32 m/s². When holding a charged matrix crystal, the effect was nothing short of astonishing--the mass limit on lifting increased to 2.43 kg and the acceleration when free-falling dropped to 7.17 m/s².\n\nBURNT NOVEMBER Subject Q51 displayed a resting heart rate of 65 bpm, a grip strength of 30 kg, and a 8:31 mile time. When holding a charged matrix crystal, these improved to 55 bpm, a grip strength of 41 kg, and a 5:45 mile time.\n\nThe evidence shows that skin contact with a charged matrix crystal dramatically improves mathematician capabilities, up to several hundred times depending on their exact capabilities. While matrix crystals are always in short supply, some of them should definitely be earmarked for usage by our most capable mathematicians." } ] }, @@ -278,7 +357,7 @@ { "name": "To all employees: re: GASPAR", "id": "lab_file_phavian_memo_01", - "text": "Colleagues,\n\nI'd like to take a moment to address the recent rumors. I know that stress levels are high with the quarantine and the XE037 news, but there is no need to engage in unwarranted speculation. In these unprecedented times, it's important to remember that we're all in this together and we will solve the problems before us, as we have no many others.\n\nI will be perfectly clear. There is no \"Project GASPAR.\" Trained mathematicians are the most important resource that we have, and it would be the height of folly to waste them on replicating a resource that already exists simply because the current state of emergency has placed us out of contact. Furthemore, it is important to remember that Netherum mathematics are not magic. They obey a consistent set of rules and we are capable of determining those rules empirically. We can test how much an ONYX LIGHTNING mathematician can lift to the milligram. We can determine the effective communication range for a GRAY DAWN candidate down to the decimeter. We would never simply \"throw things at the wall and see what sticks.\" Science requires rigor.\n\nThese are troubling times, but we will get through them together.\n\nSincerely,\nHarold Liu\nDirector, Project PHAVIAN" + "text": "Colleagues,\n\nI'd like to take a moment to address the recent rumors. I know that stress levels are high with the quarantine and the XE037 news, but there is no need to engage in unwarranted speculation. In these unprecedented times, it's important to remember that we're all in this together and we will solve the problems before us, as we have so many others.\n\nI will be perfectly clear. There is no \"Project GASPAR.\" Trained mathematicians are the most important resource that we have, and it would be the height of folly to waste them on replicating a resource that already exists simply because the current state of emergency has placed us out of contact. Furthermore, it is important to remember that Netherum mathematics are not magic. They obey a consistent set of rules and we are capable of determining those rules empirically. We can test how much a JUNIPER GOLD mathematician can lift to the milligram. We can determine the effective communication range for a GRAY DAWN candidate down to the decimeter. We would never simply \"throw things at the wall and see what sticks.\" Science requires rigor.\n\nThese are troubling times, but we will get through them together.\n\nSincerely,\nHarold Liu\nDirector, Project PHAVIAN" }, { "name": "To all employees: re: terminology", @@ -289,6 +368,16 @@ "name": "Re: your proposal", "id": "lab_file_phavian_memo_03", "text": "Anna, I know things are stressful, especially with some of the irregularities in staff behavior we've been witnessing, and under normal circumstances I would never countenance your proposal. I have to admit, though, that I was extremely disturbed by what I've heard of the behavior of several VERDANT HAND mathematicians, as well as Dr. Holland and Dr. Almeida's recent public argument. As such, for the duration of the emergency, I think that your \"psi-cop\" proposal is a good one. I'll draft a memo immediately to Dr. Nayak to organize the GREY DAWN mathematicians toward keeping order and maintaining morale. Hopefully, this will only be the matter of a few weeks before Dr. Sidhu and his team can find a solution. They already found one way to remove XE037 contamination, so hope remains.\n\nSincerely,\nHarold Liu" + }, + { + "name": "Introductory materials", + "id": "lab_file_phavian_memo_04", + "text": "Colleague,\n\nGreetings. You have selected, or have been selected, to participate in XEDRA-23, or as we call it, Project PHAVIAN. As a member of XEDRA, you will already have seen many extraordinary things in the course of your work, things which you previously might have scoffed at or dismissed out of hand. You will see more extraordinary things in the course of your work here, things that even those at other XEDRA divisions would have thought impossible a few years ago. Phase experiments expand the range of human exploration, but matrix technology unlocks human potential to a degree never before seen. You will be a part of that endeavor, advancing human knowledge and ensuring the United States of America's place at the forefront of scientific advancement throughout the 21st century.\n\nThere is an ancient proverb that is often translated as \"A single spark can start a prairie fire.\" Our work here will be the light that will lead humanity into a new age. I look forward to working with you.\n\nHarold Liu\nDirector, Project PHAVIAN" + }, + { + "name": "Something is seriously wrong", + "id": "lab_file_phavian_memo_05", + "text": "Dr. Liu,\nSorry for the inflammatory title but, well, something is seriously wrong. The LOST RAIN mathematicians are universally reporting that something strange is happening to space itself. You've seen the testing data about them being able to change effective distance between two points and they're reporting that ALL distances are being affected to a very small degree. I don't know if this has anything to do with the erratic behavior from the staff or XE037 contamination but coupled with all the BURNT NOVEMBER reports of impending doom, plus all the news filtering from the outside, I think we need to prepare for the worst.\n\nJohn Goldberg\nResearcher" } ] } diff --git a/data/mods/TEST_DATA/EOC.json b/data/mods/TEST_DATA/EOC.json index 6634b465689e8..0c4fb8aa73594 100644 --- a/data/mods/TEST_DATA/EOC.json +++ b/data/mods/TEST_DATA/EOC.json @@ -673,6 +673,17 @@ { "set_string_var": { "context_val": "victim_type" }, "target_var": { "global_val": "victim_type" } } ] }, + { + "type": "effect_on_condition", + "id": "EOC_character_kills_monster_event_test", + "eoc_type": "EVENT", + "required_event": "character_kills_monster", + "effect": [ + { "u_add_var": "last_event", "type": "test", "context": "event", "value": "character_kills_monster" }, + { "set_string_var": { "context_val": "victim_type" }, "target_var": { "global_val": "victim_type" } }, + { "math": [ "test_exp", "=", "_exp" ] } + ] + }, { "type": "effect_on_condition", "id": "EOC_character_wields_item_event_test", diff --git a/data/mods/TEST_DATA/items.json b/data/mods/TEST_DATA/items.json index f71fedea58edc..09f15dfacd6b7 100644 --- a/data/mods/TEST_DATA/items.json +++ b/data/mods/TEST_DATA/items.json @@ -4111,7 +4111,7 @@ "description": "A custom-designed extremely thick ripstop and aramid poncho for the true frontier explorer. Striped in brown and blue, the white seal of Hub 01 is emblazoned proudly on the front. Integrating quick access pouches attached to a waist drawstring and two waterproof internal dry bags it touts plenty of storage. This poncho also has notable clips and velcro just below the waist and around the shoulders, perhaps something attaches there.", "//": "at least 3x thicker than a normal poncho", "weight": "960 g", - "volume": "250 ml", + "volume": "2500 ml", "price": 4000, "price_postapoc": 750, "symbol": "[", diff --git a/data/mods/TEST_DATA/known_bad_density.json b/data/mods/TEST_DATA/known_bad_density.json index da4cfc9ca8fe6..9ca64faa16370 100644 --- a/data/mods/TEST_DATA/known_bad_density.json +++ b/data/mods/TEST_DATA/known_bad_density.json @@ -14,7 +14,6 @@ "brew_sake_koji", "artifact_slow_aura", "coffee_raw", - "art_knot", "sushi_veggyroll", "sugar_fried", "donut_holes", @@ -23,9 +22,7 @@ "homeopathic_pills", "marloss_berry", "bot_lab_security_drone_YM", - "art_disc", "raw_curing_fatty_meat", - "art_napkin", "light_minus_battery_cell", "RPG-7_tbg7v", "caramel_apple", @@ -47,7 +44,6 @@ "cuvettes", "mutant_cracklins", "venom_wasp", - "art_sphere", "cooked_marrow", "fruit_pancakes", "broken_mech_combat", @@ -114,7 +110,6 @@ "bot_lab_security_drone_BS", "protein_drink", "xl_gambeson_sleeve", - "art_rod", "deployment_bag", "chem_ferric_chloride", "venom_bee", @@ -122,20 +117,15 @@ "young_koji_done", "adrenaline_injector", "transponder", - "test_weapon1", "xl_tacvest", "plastic_straw", "k_gambeson_pants", "corpse_stabbed", "torch_done", "integrated_patchskin2", - "art_crescent", "soup_blood", "bone_marrow", - "cable_speaker", "conc_venom", - "art_lamp", - "robofac_yrax_deactivation_manual", "cornbread", "hoboreel", "tanbark", @@ -150,7 +140,6 @@ "rmi2_corpse", "milk_fortified", "coin_gold", - "cable_xlr", "prophylactic_antivenom", "mannequin", "soy_wheat_dough_done", @@ -267,7 +256,6 @@ "coin_silver", "test_tube", "codeine", - "art_crystal", "brew_vinegar", "mutant_human_blood", "tactical_grenade_pouch", @@ -289,10 +277,8 @@ "meal_bone_tainted", "hackerman_computer", "tarp_raincatcher", - "microphone_xlr_generic", "load_bearing_vest_sling", "fish_bait", - "art_pyramid", "xl_k_gambeson_loose", "mre_accessory", "candy3gator", @@ -341,8 +327,6 @@ "stab_plate", "gum", "c4", - "recon_mech_laser_single", - "gatling_mech_laser_single", "brew_burdock_wine", "firecracker_pack", "slingshot", @@ -354,7 +338,6 @@ "splatter_guard", "water_mill", "water_wheel", - "mixer_music", "bleach", "36navy", "diazepam", @@ -372,9 +355,6 @@ "torch_lit", "engineering_robotics_kit", "bot_grenade_hack", - "hd_tow_cable", - "material_rhodonite", - "textbook_atomic_lab", "human_cracklins", "acid_spray", "protein_powder", @@ -382,14 +362,11 @@ "large_stomach_sealed", "book_nonf_hard_dodge_tlwd", "joint", - "recipe_lab_cvd", "blt_wheat_free", "chem_slaked_lime", "thermal_suit_on", - "headphones_circumaural", "milkshake_fastfood", "drink_gunfire", - "art_spiral", "conc_paralytic", "soft_adobe_brick", "seed_sugar_beet", @@ -397,13 +374,10 @@ "iodine_crystal", "gasfilter_s", "polycarbonate_sheet", - "art_jelly", "chem_hydrogen_peroxide_conc", "sling", "protein_shake", "bacon", - "petrified_eye", - "test_weapon2", "brew_hb_seltzer", "broken_mech_lifter", "sig_mcx_rattler_sbr", @@ -414,7 +388,6 @@ "fetid_goop", "tinder", "rehydrated_meat", - "art_teardrop", "hickory_nut", "milkshake", "lye_potassium", @@ -558,10 +531,7 @@ "bot_lab_security_drone_BM", "bot_manhack", "heavy_load_bearing_vest_sling", - "art_beads", - "cable_instrument", "bot_flashbang_hack", - "recon_mech_laser", "jabberwock_heart_desiccated", "hazelnut", "broken_lab_security_drone_YM", @@ -624,7 +594,6 @@ "brew_mycus_wine", "chicory_coffee", "peanutbutter", - "lens_small", "peanut", "royal_jelly", "cattail_jelly", @@ -632,19 +601,11 @@ "xl_k_gambeson", "manual_rifle", "meat_cooked", - "crossbow", "corpse_generic_male", "cookies", - "RAM", "wastebread", - "test_robofac_armor_rig", - "story_book", - "radio_repeater_mod", - "guidebook", - "gatling_mech_laser", "protein_shake_fortified", "bot_c4_hack", - "art_snake", "chem_rocket_fuel", "test_bitter_almond", "press", @@ -713,7 +674,6 @@ "soapy_water", "camera_control", "material_quicklime", - "art_urchin", "meat_fried", "k_gambeson", "test_waterproof_bag", diff --git a/data/mods/TEST_DATA/materials.json b/data/mods/TEST_DATA/materials.json index 25698bfa8889f..788466f1b417d 100644 --- a/data/mods/TEST_DATA/materials.json +++ b/data/mods/TEST_DATA/materials.json @@ -12,5 +12,17 @@ "name": "Lycra", "copy-from": "lycra", "resist": { "bash": 2, "cut": 2, "stab": 50, "acid": 9, "heat": 2, "bullet": 2 } + }, + { + "type": "material", + "id": "test_material", + "name": "Test", + "density": 1, + "//": "Fake material, used to fix density of test items", + "bash_dmg_verb": "tested", + "cut_dmg_verb": "tested", + "dmg_adj": [ "lightly tested", "tested", "very tested", "thoroughly tested" ], + "resist": { "bash": 0, "cut": 0, "acid": 0, "heat": 0, "bullet": 0, "electric": 0 }, + "chip_resist": 18 } ] diff --git a/data/mods/TEST_DATA/weapons.json b/data/mods/TEST_DATA/weapons.json index 4cfb3a2e2133c..0510d3b271db3 100644 --- a/data/mods/TEST_DATA/weapons.json +++ b/data/mods/TEST_DATA/weapons.json @@ -9,6 +9,7 @@ "id": "test_weapon1", "name": { "str": "test melee weapon 1" }, "description": "Test melee weapon 1.", + "material": [ "test_material" ], "weight": "1 kg", "volume": "1 L", "symbol": ";" @@ -18,6 +19,7 @@ "id": "test_weapon2", "name": { "str": "test melee weapon 2" }, "description": "Test melee weapon 2.", + "material": [ "test_material" ], "weight": "1 kg", "volume": "1 L", "symbol": ";", diff --git a/data/mods/Xedra_Evolved/eocs/inventor.json b/data/mods/Xedra_Evolved/eocs/inventor.json index db3970c8cf78f..3dbd585b732aa 100644 --- a/data/mods/Xedra_Evolved/eocs/inventor.json +++ b/data/mods/Xedra_Evolved/eocs/inventor.json @@ -60,6 +60,7 @@ "trinket_damage", "trinket_range", "trinket_sound", + "choke_wideshot", "mod_inv_pistol_booster", "inventor_research_base_3", "inventor_research_energy_1", diff --git a/data/mods/Xedra_Evolved/itemgroups/itemgroups.json b/data/mods/Xedra_Evolved/itemgroups/itemgroups.json index 17dba950b2158..a571cbd7172ab 100644 --- a/data/mods/Xedra_Evolved/itemgroups/itemgroups.json +++ b/data/mods/Xedra_Evolved/itemgroups/itemgroups.json @@ -27,7 +27,7 @@ { "group": "cigar_box_opened", "prob": 20 }, { "group": "cigar_box_unopened", "prob": 5 }, { "group": "tobacco_products", "prob": 151 }, - { "item": "contacts", "prob": 15 }, + { "item": "contacts", "prob": 15, "count": 6 }, { "group": "clothing_glasses", "prob": 80 }, { "item": "fan", "prob": 10 }, { "item": "briefcase", "prob": 40 }, @@ -106,7 +106,7 @@ }, [ "junk_burrito", 25 ], { "group": "tobacco_products", "prob": 31 }, - [ "contacts", 15 ], + { "item": "contacts", "prob": 15, "count": 6 }, { "group": "clothing_glasses", "prob": 80 }, [ "briefcase", 40 ], [ "purse", 40 ], diff --git a/data/mods/Xedra_Evolved/items/inventor/gunmods.json b/data/mods/Xedra_Evolved/items/inventor/gunmods.json index b3dc4ec8e45c6..b52139366ebb8 100644 --- a/data/mods/Xedra_Evolved/items/inventor/gunmods.json +++ b/data/mods/Xedra_Evolved/items/inventor/gunmods.json @@ -53,6 +53,27 @@ "range_modifier": -2, "min_skills": [ [ "weapon", 4 ], [ "deduction", 4 ] ] }, + { + "id": "choke_wideshot", + "type": "GUNMOD", + "name": { "str": "wide-shot shotgun choke" }, + "description": "A choke that makes the pellets spread out wide to hit multiple enemies. The pellets will have shorter range but somehow deals higher damage.", + "weight": "300 g", + "volume": "150 ml", + "longest_side": "4 cm", + "integral_longest_side": "4 cm", + "material": [ "steel" ], + "symbol": ":", + "color": "yellow", + "location": "muzzle", + "mod_targets": [ "shotgun" ], + "install_time": "60 m", + "shot_spread_multiplier_modifier": 3, + "damage_modifier": { "damage_type": "bullet", "amount": 25 }, + "range_modifier": -6, + "flags": [ "CHOKE" ], + "min_skills": [ [ "weapon", 4 ], [ "deduction", 4 ] ] + }, { "id": "mod_inv_pistol_booster", "type": "GUNMOD", diff --git a/data/mods/Xedra_Evolved/items/tools.json b/data/mods/Xedra_Evolved/items/tools.json index db5995fb61a98..a356f9e898fec 100644 --- a/data/mods/Xedra_Evolved/items/tools.json +++ b/data/mods/Xedra_Evolved/items/tools.json @@ -35,6 +35,7 @@ "neoprene", "gutskin", "canvas", + "denim", "fae_fur" ], "skill": "tailor", diff --git a/data/mods/Xedra_Evolved/mapgen/overmap_special.json b/data/mods/Xedra_Evolved/mapgen/overmap_special.json index 5b3f1501c1a73..03a9d3584cfd2 100644 --- a/data/mods/Xedra_Evolved/mapgen/overmap_special.json +++ b/data/mods/Xedra_Evolved/mapgen/overmap_special.json @@ -161,7 +161,8 @@ { "point": [ 1, 0, -1 ], "overmap": "cathedralv_b_NE_north" }, { "point": [ 0, 1, -1 ], "overmap": "cathedralv_b_SW_north" }, { "point": [ 1, 1, -1 ], "overmap": "cathedralv_b_SE_north" } - ] + ], + "spawns": { "group": "GROUP_VAMPIRE_CATHEDRAL", "population": [ 10, 30 ], "radius": [ 1, 8 ] } }, { "type": "overmap_special", diff --git a/data/mods/Xedra_Evolved/monsters/monstergroup.json b/data/mods/Xedra_Evolved/monsters/monstergroup.json index b9335e2343562..0023b7460239d 100644 --- a/data/mods/Xedra_Evolved/monsters/monstergroup.json +++ b/data/mods/Xedra_Evolved/monsters/monstergroup.json @@ -89,20 +89,28 @@ "name": "GROUP_MOROI", "monsters": [ { "monster": "mon_vampire_moroi", "weight": 35 }, { "monster": "mon_renfield", "weight": 50, "pack_size": [ 1, 2 ] } ] }, + { + "type": "monstergroup", + "name": "GROUP_VAMPIRE_CATHEDRAL", + "monsters": [ + { "monster": "mon_bat_giant", "weight": 35, "pack_size": [ 1, 2 ] }, + { "monster": "mon_renfield", "weight": 50, "pack_size": [ 1, 3 ] } + ] + }, { "type": "monstergroup", "name": "GROUP_STRIGOI", "monsters": [ - { "monster": "mon_zombie", "weight": 50, "pack_size": [ 1, 2 ] }, + { "monster": "mon_renfield", "weight": 50, "pack_size": [ 1, 2 ] }, { "monster": "mon_vampire_strigoi", "weight": 25 }, - { "monster": "mon_vampire_strigoi", "weight": 1, "pack_size": [ 2, 4 ] } + { "monster": "mon_vampire_strigoi", "weight": 1, "pack_size": [ 2, 4 ] }, + { "monster": "xe_mon_bat", "weight": 30, "pack_size": [ 2, 4 ] } ] }, { "type": "monstergroup", "name": "GROUP_VAMPIRES_MIXED", "monsters": [ - { "monster": "mon_zombie", "weight": 50, "pack_size": [ 1, 2 ] }, { "monster": "mon_renfield", "weight": 50, "pack_size": [ 1, 2 ] }, { "monster": "mon_vampire_moroi", "weight": 25 }, { "monster": "mon_vampire_strigoi", "weight": 15 } @@ -111,10 +119,7 @@ { "type": "monstergroup", "name": "GROUP_RENFIELDS", - "monsters": [ - { "monster": "mon_zombie", "weight": 50, "pack_size": [ 1, 2 ] }, - { "monster": "mon_renfield", "weight": 50, "pack_size": [ 1, 2 ] } - ] + "monsters": [ { "monster": "mon_renfield", "weight": 50, "pack_size": [ 1, 2 ] } ] }, { "type": "monstergroup", diff --git a/data/mods/Xedra_Evolved/recipes/inventor/gunmods.json b/data/mods/Xedra_Evolved/recipes/inventor/gunmods.json index bc962e3663024..83f55dbcb7e6a 100644 --- a/data/mods/Xedra_Evolved/recipes/inventor/gunmods.json +++ b/data/mods/Xedra_Evolved/recipes/inventor/gunmods.json @@ -89,6 +89,43 @@ "category": "CC_XEDRA", "subcategory": "CSC_XEDRA_MISC" }, + { + "type": "recipe", + "activity_level": "LIGHT_EXERCISE", + "result": "choke_wideshot", + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SAW_M", "level": 2 }, { "id": "SAW_M_FINE", "level": 1 }, { "id": "GRIND", "level": 1 } ], + "proficiencies": [ + { "proficiency": "prof_elec_soldering", "time_multiplier": 3, "skill_penalty": -100, "learning_time_multiplier": 0.3 }, + { + "proficiency": "prof_metalworking", + "time_multiplier": 3, + "skill_penalty": -100, + "learning_time_multiplier": 0.3 + }, + { + "proficiency": "prof_gunsmithing_improv", + "time_multiplier": 3, + "skill_penalty": -100, + "learning_time_multiplier": 0.3 + } + ], + "components": [ + [ [ "pipe", 1 ] ], + [ [ "scrap", 1 ] ], + [ [ "sheet_metal_small", 1 ] ], + [ [ "amplifier", 1 ] ], + [ [ "cable", 100 ] ], + [ [ "circuit", 1 ] ] + ], + "time": "18 h", + "skill_used": "deduction", + "difficulty": 7, + "skills_required": [ "fabrication", 3 ], + "flags": [ "SECRET" ], + "category": "CC_XEDRA", + "subcategory": "CSC_XEDRA_MISC" + }, { "type": "recipe", "activity_level": "LIGHT_EXERCISE", diff --git a/data/mods/classic_zombies/items/blacklists.json b/data/mods/classic_zombies/items/blacklists.json index 2bb070545cc1f..be8237b406ab7 100644 --- a/data/mods/classic_zombies/items/blacklists.json +++ b/data/mods/classic_zombies/items/blacklists.json @@ -10,14 +10,9 @@ "20x66_20_mag", "20x66_40_mag", "20x66_beanbag", - "20x66_bootleg_flechette", - "20x66_bootleg_shot", - "20x66_bootleg_slug", "20x66_exp", "20x66_flare", - "20x66_flechette", "20x66_frag", - "20x66_inc", "20x66_shot", "20x66_slug", "8mm_bootleg", diff --git a/data/raw/keybindings.json b/data/raw/keybindings.json index c99518dd433dd..cfd4770f44b87 100644 --- a/data/raw/keybindings.json +++ b/data/raw/keybindings.json @@ -1484,6 +1484,12 @@ "name": "Change gender", "bindings": [ { "input_method": "keyboard_char", "key": "@" }, { "input_method": "keyboard_code", "key": "2", "mod": [ "shift" ] } ] }, + { + "type": "keybinding", + "id": "CHANGE_OUTFIT", + "name": "Change outfit", + "bindings": [ { "input_method": "keyboard_char", "key": "$" }, { "input_method": "keyboard_code", "key": "4", "mod": [ "shift" ] } ] + }, { "type": "keybinding", "id": "SWITCH_GENDER", diff --git a/doc/EFFECT_ON_CONDITION.md b/doc/EFFECT_ON_CONDITION.md index b5f0e7ba255cb..59ebe75981673 100644 --- a/doc/EFFECT_ON_CONDITION.md +++ b/doc/EFFECT_ON_CONDITION.md @@ -1057,7 +1057,7 @@ Every event EOC passes context vars with each of their key value pairs that the | character_gets_headshot | | { "character", `character_id` } | character / NONE | | character_heals_damage | | { "character", `character_id` },
{ "damage", `int` }, | character / NONE | | character_kills_character | | { "killer", `character_id` },
{ "victim", `character_id` },
{ "victim_name", `string` }, | character / NONE | -| character_kills_monster | | { "killer", `character_id` },
{ "victim_type", `mtype_id` }, | character / NONE | +| character_kills_monster | | { "killer", `character_id` },
{ "victim_type", `mtype_id` },
{ "exp", `int` }, | character / monster | | character_learns_spell | | { "character", `character_id` },
{ "spell", `spell_id` } | character / NONE | | character_loses_effect | | { "character", `character_id` },
{ "effect", `efftype_id` }, | character / NONE | | character_melee_attacks_character | | { "attacker", `character_id` },
{ "weapon", `itype_id` },
{ "hits", `bool` },
{ "victim", `character_id` },
{ "victim_name", `string` }, | character (attacker) / character (victim) | @@ -2427,11 +2427,14 @@ Search a specific coordinates of map around `u_`, `npc_` or `target_params` and | "u_location_variable" / "npc_location_variable" | **mandatory** | [variable object](##variable-object) | variable, where the location would be saved | | "min_radius", "max_radius" | optional | int, float or [variable object](##variable-object) | default 0; radius around the player or NPC, where the location would be searched | | "outdoor_only" | optional | boolean | default false; if true, only outdoor values would be picked | +| "passable_only" | optional | boolean | default false; if true, only passable values would be picked | | "target_params" | optional | assign_mission_target | if used, the search would be performed not from `u_` or `npc_` location, but from `mission_target`. it uses an [assign_mission_target](MISSIONS_JSON.md) syntax | | "x_adjust", "y_adjust", "z_adjust" | optional | int, float or [variable object](##variable-object) | add this amount to `x`, `y` or `z` coordinate in the end; `"x_adjust": 2` would save the coordinate with 2 tile shift to the right from targeted | | "z_override" | optional | boolean | default is false; if true, instead of adding up to `z` level, override it with absolute value; `"z_adjust": 3` with `"z_override": true` turn the value of `z` to `3` | | "terrain" / "furniture" / "trap" / "monster" / "zone" / "npc" | optional | string or [variable object](##variable-object) | if used, search the entity with corresponding id between `target_min_radius` and `target_max_radius`; if empty string is used (e.g. `"monster": ""`), return any entity from the same radius | | "target_min_radius", "target_max_radius" | optional | int, float or [variable object](##variable-object) | default 0, min and max radius for search, if previous field was used | +| "true_eocs" | optional | string, [variable object](##variable-object), `effect_on_condition` or range of all of them | if the location was found, all EoCs from this field would be triggered; | +| "false_eocs" | optional | string, [variable object](##variable-object), `effect_on_condition` or range of all of them | if the location was not found, all EoCs from this field would be triggered | ##### Valid talkers: diff --git a/doc/FREQUENTLY_MADE_SUGGESTIONS.md b/doc/FREQUENTLY_MADE_SUGGESTIONS.md index 6d9283258e9f8..4218522f2f349 100644 --- a/doc/FREQUENTLY_MADE_SUGGESTIONS.md +++ b/doc/FREQUENTLY_MADE_SUGGESTIONS.md @@ -277,12 +277,6 @@ In addition to "appliances", there may also be "facilities". Again, under the h ### User interface -#### Nestable container model for inventory: Will go in as soon an there’s a good implementation/someone is working on it. - -KorGgenT implemented this in spring 2020 and although there are still some teething issues, it's working fairly well and will be a headline feature for the 0.F release. - -~~This is a really old and good one, the problem being the most straightforward implementation of it where you manually manage all those containers is a terrible interface. (see DF adventure mode) For this to go in, it must default to the inventory system doing all the work for the player, and the player only specifies what goes where occasionally.~~ - #### The ability to select MP3s to play while listening to music: Too complicated CDDA runs across a wide variety of platforms, each of which has their own special code for finding files on the local filesystem. They also each have their own way to play an MP3, and generally they have multiple ways to play an MP3. Adding support for selecting MP3s to play from inside the game requires that CDDA present a way to browse the local filesystem to find the MP3 files and a way to play them. This code would be different for each platform and for each MP3 player; supporting it would be a maintenance nightmare full of weird and obscure bugs. diff --git a/doc/MONSTER_SPECIAL_ATTACKS.md b/doc/MONSTER_SPECIAL_ATTACKS.md index a843462918e5b..9271f1e266bce 100644 --- a/doc/MONSTER_SPECIAL_ATTACKS.md +++ b/doc/MONSTER_SPECIAL_ATTACKS.md @@ -93,6 +93,7 @@ These special attacks are mostly hardcoded in C++ and are generally not configur - ```BOOMER_GLOW``` Spits glowing bile. - ```BOOMER``` Spits bile. - ```BRANDISH``` Brandishes a knife at the player. +- ```BROWSE``` The monster will eat harvestable foods from BROWSABLE trees and plants when they're in season. - ```BREATHE``` Spawns a `breather`. Note: `breather hub` only! - ```CALLBLOBS``` Calls 2/3 of nearby blobs to defend this monster, and sends 1/3 of nearby blobs after the player. - ```CHICKENBOT``` Robot can attack with tazer, M4, or MGL depending on distance. Note: Legacy special attack. @@ -103,7 +104,7 @@ These special attacks are mostly hardcoded in C++ and are generally not configur - ```DISAPPEAR``` Hallucination (or other unusual monster) disappears. - ```DOGTHING``` The dog _thing_ spawns into a tentacle dog. - ```EAT_CARRION``` The monster will nibble on organic corpses, including zombies and plants, damaging them and filling its stomach if it has the EATS flag. -- ```EAT_CROP``` The monster eats an adjacent planted crop. +- ```EAT_CROP``` The monster eats an adjacent planted crop or CATTLE flagged comestible. - ```EAT_FOOD``` The monster eats an adjacent non-seed food item (apart from their own eggs and food with fun < -20). If paired with the EATS flag, this will fill its stomach. - ```EVOLVE_KILL_STRIKE``` Damages the target's torso (damage scales with monster's melee dice), if it succeeds in killing a fleshy target the monster will upgrade to its next evolution. - ```FEAR_PARALYZE``` Paralyzes the player with fear. @@ -121,6 +122,7 @@ These special attacks are mostly hardcoded in C++ and are generally not configur - ```FUNGUS_INJECT``` Performs a needle attack that can cause fungal infections. - ```FUNGUS_SPROUT``` Grows a fungal wall. - ```FUNGAL_TRAIL``` Spreads fungal terrain. +- ```GRAZE``` The monster eats grass, shrubs and flowers. - ```GENE_STING``` Shoots a dart at the player that causes a mutation if it connects. - ```GENERATOR``` Regenerates health, hums. - ```GRENADIER``` Deploys tear gas/pacification/flashbang/c4 hacks from its ammo. diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index 884eaa3e711f6..c7505eeaf5f5e 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -877,6 +877,14 @@ static bool butchery_drops_harvest( item *corpse_item, const mtype &mt, Characte _( "You salvage what you can from the corpse, but it is badly damaged." ) ); } } + if( corpse_item->has_flag( flag_UNDERFED ) ) { + monster_weight = std::round( 0.9 * monster_weight ); + if( action != butcher_type::FIELD_DRESS && action != butcher_type::SKIN && + action != butcher_type::DISSECT ) { + you.add_msg_if_player( m_bad, + _( "The corpse looks a little underweight..." ) ); + } + } if( corpse_item->has_flag( flag_SKINNED ) ) { monster_weight = std::round( 0.85 * monster_weight ); } @@ -943,6 +951,9 @@ static bool butchery_drops_harvest( item *corpse_item, const mtype &mt, Characte entry.type == harvest_drop_bone ) ) { roll /= 2; } + if( corpse_item->has_flag( flag_UNDERFED ) && ( entry.type == harvest_drop_flesh ) ) { + roll /= 1.6; + } if( corpse_item->has_flag( flag_SKINNED ) && entry.type == harvest_drop_skin ) { roll = 0; diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index a93eecbacc614..d4365323e9f2c 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -2787,9 +2787,10 @@ static requirement_check_result generic_multi_activity_check_requirement( reqs = vpi.repair_requirements(); } } - const std::string ran_str = random_string( 10 ); - const requirement_id req_id( ran_str ); - requirement_data::save_requirement( reqs, req_id ); + const requirement_id req_id( std::to_string( reqs.make_hash() ) ); + if( requirement_data::all().count( req_id ) == 0 ) { + requirement_data::save_requirement( reqs, req_id ); + } what_we_need = req_id; } else if( reason == do_activity_reason::NEEDS_MINING ) { what_we_need = requirement_data_mining_standard; @@ -2838,9 +2839,10 @@ static requirement_check_result generic_multi_activity_check_requirement( // this is an activity that only requires this one tool, so we will fetch and wield it. requirement_data reqs_data = requirement_data( tool_comp_vector, quality_comp_vector, requirement_comp_vector ); - const std::string ran_str = random_string( 10 ); - const requirement_id req_id( ran_str ); - requirement_data::save_requirement( reqs_data, req_id ); + const requirement_id req_id( std::to_string( reqs_data.make_hash() ) ); + if( requirement_data::all().count( req_id ) == 0 ) { + requirement_data::save_requirement( reqs_data, req_id ); + } what_we_need = req_id; } bool tool_pickup = reason == do_activity_reason::NEEDS_TILLING || diff --git a/src/avatar_action.cpp b/src/avatar_action.cpp index 0c6a880e408e9..1d8514817c979 100644 --- a/src/avatar_action.cpp +++ b/src/avatar_action.cpp @@ -868,7 +868,8 @@ bool avatar_action::eat_here( avatar &you ) { map &here = get_map(); if( ( you.has_active_mutation( trait_RUMINANT ) || you.has_active_mutation( trait_GRAZER ) ) && - ( here.ter( you.pos() ) == t_underbrush || here.ter( you.pos() ) == t_shrub ) ) { + ( here.has_flag( ter_furn_flag::TFLAG_SHRUB, you.pos() ) && + !here.has_flag( ter_furn_flag::TFLAG_GRAZER_INEDIBLE, you.pos() ) ) ) { if( you.has_effect( effect_hunger_engorged ) ) { add_msg( _( "You're too full to eat the leaves from the %s." ), here.ter( you.pos() )->name() ); return true; @@ -879,26 +880,34 @@ bool avatar_action::eat_here( avatar &you ) return true; } } - if( you.has_active_mutation( trait_GRAZER ) && ( here.ter( you.pos() ) == t_grass || - here.ter( you.pos() ) == t_grass_long || here.ter( you.pos() ) == t_grass_tall ) ) { + if( ( you.has_active_mutation( trait_RUMINANT ) || you.has_active_mutation( trait_GRAZER ) ) && + ( here.has_flag( ter_furn_flag::TFLAG_FLOWER, you.pos() ) && + !here.has_flag( ter_furn_flag::TFLAG_GRAZER_INEDIBLE, you.pos() ) ) ) { + if( you.has_effect( effect_hunger_engorged ) ) { + add_msg( _( "You're too full to eat the %s." ), here.ter( you.pos() )->name() ); + return true; + } else { + here.furn_set( you.pos(), f_null ); + item food( "small_plant", calendar::turn, 1 ); + you.assign_activity( consume_activity_actor( food ) ); + return true; + } + } + if( you.has_active_mutation( trait_GRAZER ) && + ( here.has_flag( ter_furn_flag::TFLAG_GRAZABLE, you.pos() ) && + !here.has_flag( ter_furn_flag::TFLAG_FUNGUS, you.pos() ) ) ) { if( you.has_effect( effect_hunger_engorged ) ) { add_msg( _( "You're too full to graze." ) ); return true; } else { item food( item( "grass", calendar::turn, 1 ) ); you.assign_activity( consume_activity_actor( food ) ); - if( here.ter( you.pos() ) == t_grass_tall ) { - here.ter_set( you.pos(), t_grass_long ); - } else if( here.ter( you.pos() ) == t_grass_long ) { - here.ter_set( you.pos(), t_grass ); - } else { - here.ter_set( you.pos(), t_dirt ); - } + here.ter_set( you.pos(), here.get_ter_transforms_into( you.pos() ) ); return true; } } if( you.has_active_mutation( trait_GRAZER ) ) { - if( here.ter( you.pos() ) == t_grass_golf ) { + if( here.ter( you.pos() ) == ( t_grass_golf ) || here.ter( you.pos() ) == ( t_grass ) ) { add_msg( _( "This grass is too short to graze." ) ); return true; } else if( here.ter( you.pos() ) == t_grass_dead ) { @@ -907,6 +916,9 @@ bool avatar_action::eat_here( avatar &you ) } else if( here.ter( you.pos() ) == t_grass_white ) { add_msg( _( "This grass is tainted with paint and thus inedible." ) ); return true; + } else if( here.ter( you.pos() ) == t_grass_alien ) { + add_msg( _( "This grass is razor sharp and would probably shred your mouth." ) ); + return true; } } return false; diff --git a/src/character.cpp b/src/character.cpp index 7f3c057ae42c1..5821c067d71f1 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -9042,8 +9042,7 @@ units::temperature_delta Character::bodytemp_modifier_traits_floor() const units::temperature Character::temp_corrected_by_climate_control( units::temperature temperature, int heat_strength, int chill_strength ) const { - const units::temperature_delta base_variation = units::from_celsius_delta( units::to_celsius( - BODYTEMP_NORM ) ); + const units::temperature_delta base_variation = BODYTEMP_NORM - 27_C; const units::temperature_delta variation_heat = base_variation * ( heat_strength / 100.0f ); const units::temperature_delta variation_chill = -base_variation * ( chill_strength / 100.0f ); diff --git a/src/creature.cpp b/src/creature.cpp index 81278e888a125..11b257baa79e1 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -168,12 +168,7 @@ Creature::Creature( Creature && ) noexcept( map_is_noexcept &&list_is_noexcept ) Creature &Creature::operator=( const Creature & ) = default; Creature &Creature::operator=( Creature && ) noexcept = default; -Creature::~Creature() -{ - if( g ) { - get_map().remove_creature_from_reachability( this ); - } -} +Creature::~Creature() = default; tripoint Creature::pos() const { diff --git a/src/effect_on_condition.cpp b/src/effect_on_condition.cpp index c5653c108e41d..97d5d047d1a42 100644 --- a/src/effect_on_condition.cpp +++ b/src/effect_on_condition.cpp @@ -145,20 +145,24 @@ void effect_on_conditions::load_new_character( Character &you ) static void process_new_eocs( queued_eocs &eoc_queue, std::vector &eoc_vector, - std::map &new_eocs ) + std::map &new_eocs, bool global_queue ) { queued_eocs temp_queued_eocs; while( !eoc_queue.empty() ) { - if( eoc_queue.top().eoc.is_valid() ) { - temp_queued_eocs.push( eoc_queue.top() ); + // Check if EoC is moved from global to local, or vice versa + if( global_queue == eoc_queue.top().eoc->global ) { + if( eoc_queue.top().eoc.is_valid() ) { + temp_queued_eocs.push( eoc_queue.top() ); + } + new_eocs[eoc_queue.top().eoc] = false; } - new_eocs[eoc_queue.top().eoc] = false; eoc_queue.pop(); } eoc_queue = std::move( temp_queued_eocs ); for( auto eoc = eoc_vector.begin(); eoc != eoc_vector.end(); ) { - if( !eoc->is_valid() ) { + // Check if EoC is moved from global to local, or vice versa + if( !eoc->is_valid() || global_queue != ( *eoc )->global ) { eoc = eoc_vector.erase( eoc ); } else { new_eocs[*eoc] = false; @@ -177,10 +181,10 @@ void effect_on_conditions::load_existing_character( Character &you ) } } process_new_eocs( you.queued_effect_on_conditions, you.inactive_effect_on_condition_vector, - new_eocs ); + new_eocs, false ); if( is_avatar ) { process_new_eocs( g->queued_global_effect_on_conditions, - g->inactive_global_effect_on_condition_vector, new_eocs ); + g->inactive_global_effect_on_condition_vector, new_eocs, true ); } for( const std::pair &eoc_pair : new_eocs ) { diff --git a/src/event.h b/src/event.h index d6aa47798667c..d5ccd0612bb18 100644 --- a/src/event.h +++ b/src/event.h @@ -342,9 +342,10 @@ struct event_spec { template<> struct event_spec { - static constexpr std::array, 2> fields = {{ + static constexpr std::array, 3> fields = {{ { "killer", cata_variant_type::character_id }, { "victim_type", cata_variant_type::mtype_id }, + { "exp", cata_variant_type::int_}, } }; }; diff --git a/src/faction_camp.cpp b/src/faction_camp.cpp index 06c4f6b7c42eb..3845508a5b93f 100644 --- a/src/faction_camp.cpp +++ b/src/faction_camp.cpp @@ -5188,6 +5188,10 @@ bool basecamp::distribute_food() if( !it.is_comestible() ) { return false; } + // Always reject in-progress craft item + if( it.is_craft() ) { + return false; + } // Stuff like butchery refuse and other disgusting stuff if( it.get_comestible_fun() < -6 ) { return false; diff --git a/src/flag.cpp b/src/flag.cpp index 88ddb36a1eed6..2fcdedc0d149b 100644 --- a/src/flag.cpp +++ b/src/flag.cpp @@ -336,6 +336,7 @@ const flag_id flag_TRADER_KEEP_EQUIPPED( "TRADER_KEEP_EQUIPPED" ); const flag_id flag_TWO_WAY_RADIO( "TWO_WAY_RADIO" ); const flag_id flag_UNBREAKABLE( "UNBREAKABLE" ); const flag_id flag_UNBREAKABLE_MELEE( "UNBREAKABLE_MELEE" ); +const flag_id flag_UNDERFED( "UNDERFED" ); const flag_id flag_UNDERSIZE( "UNDERSIZE" ); const flag_id flag_UNDERWATER_GUN( "UNDERWATER_GUN" ); const flag_id flag_UNRECOVERABLE( "UNRECOVERABLE" ); diff --git a/src/flag.h b/src/flag.h index be132940a2f23..7ac99624e9803 100644 --- a/src/flag.h +++ b/src/flag.h @@ -342,6 +342,7 @@ extern const flag_id flag_TRADER_KEEP_EQUIPPED; extern const flag_id flag_TWO_WAY_RADIO; extern const flag_id flag_UNBREAKABLE; extern const flag_id flag_UNBREAKABLE_MELEE; +extern const flag_id flag_UNDERFED; extern const flag_id flag_UNDERSIZE; extern const flag_id flag_UNDERWATER_GUN; extern const flag_id flag_UNRECOVERABLE; diff --git a/src/inventory_ui.cpp b/src/inventory_ui.cpp index e37f1c3e6afd4..54ca47de3fc1b 100644 --- a/src/inventory_ui.cpp +++ b/src/inventory_ui.cpp @@ -3409,12 +3409,14 @@ void inventory_multiselector::set_chosen_count( inventory_entry &entry, size_t c if( count == 0 ) { entry.chosen_count = 0; } else { + size_t size_before = to_use.size(); entry.chosen_count = std::min( {count, max_chosen_count, entry.get_available_count() } ); if( it->count_by_charges() ) { - auto iter = find_if( to_use.begin(), to_use.end(), [&it]( const drop_location & drop ) { + auto iter = find_if( to_use.begin(), + to_use.begin() + size_before, [&it]( const drop_location & drop ) { return drop.first == it; } ); - if( iter == to_use.end() ) { + if( iter == to_use.begin() + size_before ) { to_use.emplace_back( it, static_cast( entry.chosen_count ) ); } } else { @@ -3422,10 +3424,11 @@ void inventory_multiselector::set_chosen_count( inventory_entry &entry, size_t c if( count == 0 ) { break; } - auto iter = find_if( to_use.begin(), to_use.end(), [&loc]( const drop_location & drop ) { + auto iter = find_if( to_use.begin(), + to_use.begin() + size_before, [&loc]( const drop_location & drop ) { return drop.first == loc; } ); - if( iter == to_use.end() ) { + if( iter == to_use.begin() + size_before ) { to_use.emplace_back( loc, 1 ); } count--; diff --git a/src/item.cpp b/src/item.cpp index 366f95068df13..16ef6d1b247f1 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -5446,6 +5446,14 @@ void item::melee_combat_info( std::vector &info, const iteminfo_query iteminfo::lower_is_better, attack_cost ); } insert_separation_line( info ); + } else if( player_character.get_skill_level( skill_melee ) < 3 && + ( !dmg_types.empty() || type->m_to_hit > 0 ) ) { + insert_separation_line( info ); + if( parts->test( iteminfo_parts::DESCRIPTION_MELEEDMG ) ) { + info.emplace_back( "DESCRIPTION", _( "Average melee damage:" ) ); + info.emplace_back( "BASE", + _( "You don't know enough about fighting to know how effectively you could use this." ) ); + } } } diff --git a/src/item_factory.cpp b/src/item_factory.cpp index e75dcf8fd74ea..12978ac2c3ebc 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -2705,7 +2705,7 @@ void itype_variant_data::load( const JsonObject &jo ) alt_color = color_from_string( jo.get_string( "color" ) ); } optional( jo, false, "ascii_picture", art ); - optional( jo, false, "weight", weight ); + optional( jo, false, "weight", weight, 1 ); optional( jo, false, "append", append ); optional( jo, false, "expand_snippets", expand_snippets ); } diff --git a/src/item_pocket.cpp b/src/item_pocket.cpp index 22663bacde180..fd70285f2e3d5 100644 --- a/src/item_pocket.cpp +++ b/src/item_pocket.cpp @@ -2198,7 +2198,7 @@ ret_val item_pocket::insert_item( const item &it, inserted = &contents.back(); } if( restack_charges ) { - restack( inserted ); + inserted = restack( inserted ); } return ret_val::make_success( inserted ); } diff --git a/src/iuse.cpp b/src/iuse.cpp index 553152b938a3a..1a4de8f0c7bb5 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -167,6 +167,7 @@ static const efftype_id effect_brainworms( "brainworms" ); static const efftype_id effect_cig( "cig" ); static const efftype_id effect_contacts( "contacts" ); static const efftype_id effect_corroding( "corroding" ); +static const efftype_id effect_critter_well_fed( "critter_well_fed" ); static const efftype_id effect_crushed( "crushed" ); static const efftype_id effect_datura( "datura" ); static const efftype_id effect_dazed( "dazed" ); @@ -308,6 +309,7 @@ static const json_character_flag json_flag_MYOPIC_IN_LIGHT( "MYOPIC_IN_LIGHT" ); static const json_character_flag json_flag_PAIN_IMMUNE( "PAIN_IMMUNE" ); static const mon_flag_str_id mon_flag_DOGFOOD( "DOGFOOD" ); +static const mon_flag_str_id mon_flag_EATS( "EATS" ); static const mon_flag_str_id mon_flag_ELECTRONIC( "ELECTRONIC" ); static const mon_flag_str_id mon_flag_NO_BREATHE( "NO_BREATHE" ); static const mon_flag_str_id mon_flag_SEES( "SEES" ); @@ -1613,6 +1615,15 @@ std::optional iuse::petfood( Character *p, item *it, const tripoint & ) } p->add_msg_if_player( _( "You feed your %1$s to the %2$s." ), it->tname(), mon->get_name() ); + if( mon->has_flag( mon_flag_EATS ) ) { + int kcal = it->get_comestible()->default_nutrition.kcal(); + mon->amount_eaten += kcal; + if( mon->amount_eaten >= mon->stomach_size ) { + p->add_msg_if_player( _( "The %1$s seems full now." ), mon->get_name() ); + } + } else if( !mon->has_flag( mon_flag_EATS ) ) { + mon->add_effect( effect_critter_well_fed, 24_hours ); + } if( petfood.feed.empty() ) { p->add_msg_if_player( m_good, _( "The %1$s is your pet now!" ), mon->get_name() ); diff --git a/src/kill_tracker.cpp b/src/kill_tracker.cpp index 421c2712f9f2a..aa0364690b15b 100644 --- a/src/kill_tracker.cpp +++ b/src/kill_tracker.cpp @@ -130,11 +130,6 @@ static Character *get_avatar_or_follower( const character_id &id ) return nullptr; } -static int compute_kill_xp( const mtype_id &mon_type ) -{ - return mon_type->difficulty + mon_type->difficulty_base; -} - static constexpr int npc_kill_xp = 10; void kill_tracker::notify( const cata::event &e ) @@ -145,7 +140,7 @@ void kill_tracker::notify( const cata::event &e ) if( Character *killer = get_avatar_or_follower( killer_id ) ) { const mtype_id victim_type = e.get( "victim_type" ); kills[victim_type]++; - killer->kill_xp += compute_kill_xp( victim_type ); + killer->kill_xp += e.get( "exp" ); victim_type.obj().families.practice_kill( *killer ); } break; diff --git a/src/map.cpp b/src/map.cpp index ef4b03333aa2e..d49fa77fe103a 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -46,7 +46,6 @@ #include "field.h" #include "field_type.h" #include "flag.h" -#include "flood_fill.h" #include "fragment_cloud.h" #include "fungal_effects.h" #include "game.h" @@ -2868,25 +2867,29 @@ void map::drop_items( const tripoint &p ) int creature_hit_chance = rng( 0, 100 ); creature_hit_chance /= hit_mod * occupied_tile_fraction( creature_below->get_size() ); - if( creature_hit_chance < 15 ) { - add_msg( _( "Falling %s hits %s in the head!" ), i.tname(), creature_below->get_name() ); + add_msg_if_player_sees( creature_below->pos(), _( "Falling %s hits %s in the head!" ), i.tname(), + creature_below->get_name() ); creature_below->deal_damage( nullptr, bodypart_id( "head" ), damage_instance( damage_bash, damage ) ); } else if( creature_hit_chance < 30 ) { - add_msg( _( "Falling %s hits %s in the torso!" ), i.tname(), creature_below->get_name() ); + add_msg_if_player_sees( creature_below->pos(), _( "Falling %s hits %s in the torso!" ), i.tname(), + creature_below->get_name() ); creature_below->deal_damage( nullptr, bodypart_id( "torso" ), damage_instance( damage_bash, damage ) ); } else if( creature_hit_chance < 65 ) { - add_msg( _( "Falling %s hits %s in the left arm!" ), i.tname(), creature_below->get_name() ); + add_msg_if_player_sees( creature_below->pos(), _( "Falling %s hits %s in the left arm!" ), + i.tname(), creature_below->get_name() ); creature_below->deal_damage( nullptr, bodypart_id( "arm_l" ), damage_instance( damage_bash, damage ) ); } else if( creature_hit_chance < 100 ) { - add_msg( _( "Falling %s hits %s in the right arm!" ), i.tname(), creature_below->get_name() ); + add_msg_if_player_sees( creature_below->pos(), _( "Falling %s hits %s in the right arm!" ), + i.tname(), creature_below->get_name() ); creature_below->deal_damage( nullptr, bodypart_id( "arm_r" ), damage_instance( damage_bash, damage ) ); } else { - add_msg( _( "Falling %s misses the %s!" ), i.tname(), creature_below->get_name() ); + add_msg_if_player_sees( creature_below->pos(), _( "Falling %s misses the %s!" ), i.tname(), + creature_below->get_name() ); } } @@ -10272,66 +10275,3 @@ tripoint drawsq_params::center() const return view_center; } } - -/** This is lazily evaluated on demand. Each creature in a zone is visited - * as it flood fills, then the zone number is incremented. At the end all creatures in - * the same zone will have the same zone number assigned, which can be used to have creatures in - * different zones ignore each other very cheaply. - */ -void map::flood_fill_zone( const Creature &origin ) -{ - creature_tracker &tracker = get_creature_tracker(); - - ff::flood_fill_visit_10_connected( origin.pos_bub(), - [this]( const tripoint_bub_ms & loc, int direction ) { - if( direction == 0 ) { - return inbounds( loc ) && ( is_transparent_wo_fields( loc.raw() ) || - passable( loc ) ); - } - if( direction == 1 ) { - const maptile &up = maptile_at( loc ); - const ter_t &up_ter = up.get_ter_t(); - if( up_ter.id.is_null() ) { - return false; - } - if( ( ( up_ter.movecost != 0 && up.get_furn_t().movecost >= 0 ) || - is_transparent_wo_fields( loc.raw() ) ) && - ( up_ter.has_flag( ter_furn_flag::TFLAG_NO_FLOOR ) || - up_ter.has_flag( ter_furn_flag::TFLAG_GOES_DOWN ) ) ) { - return true; - } - } - if( direction == -1 ) { - const maptile &up = maptile_at( loc + tripoint_above ); - const ter_t &up_ter = up.get_ter_t(); - if( up_ter.id.is_null() ) { - return false; - } - const maptile &down = maptile_at( loc ); - const ter_t &down_ter = up.get_ter_t(); - if( down_ter.id.is_null() ) { - return false; - } - if( ( ( down_ter.movecost != 0 && down.get_furn_t().movecost >= 0 ) || - is_transparent_wo_fields( loc.raw() ) ) && - ( up_ter.has_flag( ter_furn_flag::TFLAG_NO_FLOOR ) || - up_ter.has_flag( ter_furn_flag::TFLAG_GOES_DOWN ) ) ) { - return true; - } - } - return false; - }, - [&tracker, this]( const tripoint_bub_ms & loc ) { - Creature *creature = tracker.creature_at( loc ); - if( creature ) { - const int n = zone_number * zone_tick; - creatures_by_zone[n].push_back( creature ); - creature->set_reachable_zone( n ); - } - } ); - if( zone_number == std::numeric_limits::max() ) { - zone_number = 1; - } else { - zone_number++; - } -} diff --git a/src/map.h b/src/map.h index 17dbf6727d42b..967c9c88ac44c 100644 --- a/src/map.h +++ b/src/map.h @@ -2236,59 +2236,14 @@ class map bool _main_requires_cleanup = false; std::optional _main_cleanup_override = std::nullopt; - // Tracks the dirtiness of the visitable zones cache. This must be flipped when + // Tracks the dirtiness of the visitable zones cache, but that cache does not live here, + // it is distributed among the active monsters. This must be flipped when // persistent visibility from terrain or furniture changes // (this excludes vehicles and fields) or when persistent traversability changes, // which means walls and floors. bool visitable_cache_dirty = false; - int zone_number = 1; - int zone_tick = 1; - std::unordered_map> creatures_by_zone; - std::unordered_set to_remove; - - void flood_fill_zone( const Creature &origin ); - - void flood_fill_if_needed( const Creature &origin ) { - if( get_visitable_zones_cache_dirty() ) { - creatures_by_zone.clear(); - to_remove.clear(); - zone_tick = zone_tick > 0 ? -1 : 1; - set_visitable_zones_cache_dirty( false ); - zone_number = 1; - } - // This check insures we only flood fill when the target monster has an uninitialized zone, - // or if it has a zone from last turn. In other words it only triggers on - // the first monster in a zone each turn. We can detect this because the sign - // of the zone numbers changes on every invalidation. - int old_zone = origin.get_reachable_zone(); - // Compare with zone_tick == old_zone && old_zone != 0 - if( old_zone * zone_tick <= 0 ) { - flood_fill_zone( origin ); - } - } public: - // Only call from the Creature destructor. - void remove_creature_from_reachability( Creature *creature ) { - to_remove.insert( creature ); - } - - template - void visit_reachable_creatures( const Creature &origin, Functor f ) { - flood_fill_if_needed( origin ); - const auto map_iter = creatures_by_zone.find( origin.get_reachable_zone() ); - if( map_iter != creatures_by_zone.end() ) { - auto vector_iter = map_iter->second.begin(); - const auto vector_end = map_iter->second.end(); - for( ; vector_iter != vector_end; ++vector_iter ) { - Creature *other = *vector_iter; - if( to_remove.count( other ) == 0 ) { - f( *other ); - } - } - } - } - void queue_main_cleanup(); bool is_main_cleanup_queued() const; void main_cleanup_override( bool over ); diff --git a/src/mapdata.cpp b/src/mapdata.cpp index 127327821eb59..025541d606ec8 100644 --- a/src/mapdata.cpp +++ b/src/mapdata.cpp @@ -261,6 +261,9 @@ std::string enum_to_string( ter_furn_flag data ) case ter_furn_flag::TFLAG_ELEVATOR: return "ELEVATOR"; case ter_furn_flag::TFLAG_ACTIVE_GENERATOR: return "ACTIVE_GENERATOR"; case ter_furn_flag::TFLAG_NO_FLOOR_WATER: return "NO_FLOOR_WATER"; + case ter_furn_flag::TFLAG_GRAZABLE: return "GRAZABLE"; + case ter_furn_flag::TFLAG_GRAZER_INEDIBLE: return "GRAZER_INEDIBLE"; + case ter_furn_flag::TFLAG_BROWSABLE: return "BROWSABLE"; // *INDENT-ON* case ter_furn_flag::NUM_TFLAG_FLAGS: @@ -741,6 +744,7 @@ ter_id t_null, t_pit_corpsed, t_pit_covered, t_pit_spiked, t_pit_spiked_covered, t_pit_glass, t_pit_glass_covered, t_rock_floor, t_grass, t_grass_long, t_grass_tall, t_grass_golf, t_grass_dead, t_grass_white, t_moss, + t_grass_alien, t_metal_floor, t_pavement, t_pavement_y, t_sidewalk, t_concrete, t_zebra, t_thconc_floor, t_thconc_floor_olight, t_strconc_floor, diff --git a/src/mapdata.h b/src/mapdata.h index 959b88e726125..ff929ec4e8123 100644 --- a/src/mapdata.h +++ b/src/mapdata.h @@ -251,6 +251,9 @@ enum class ter_furn_flag : int { TFLAG_YOUNG, TFLAG_PLANT, TFLAG_FISHABLE, + TFLAG_GRAZABLE, + TFLAG_GRAZER_INEDIBLE, + TFLAG_BROWSABLE, TFLAG_TREE, TFLAG_PLOWABLE, TFLAG_ORGANIC, @@ -692,6 +695,7 @@ extern ter_id t_null, t_pit_corpsed, t_pit_covered, t_pit_spiked, t_pit_spiked_covered, t_pit_glass, t_pit_glass_covered, t_rock_floor, t_grass, t_grass_long, t_grass_tall, t_grass_golf, t_grass_dead, t_grass_white, t_moss, + t_grass_alien, t_metal_floor, t_pavement, t_pavement_y, t_sidewalk, t_concrete, t_zebra, t_thconc_floor, t_thconc_floor_olight, t_strconc_floor, diff --git a/src/monattack.cpp b/src/monattack.cpp index 443c1854d94f4..e9f49c2e5c111 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -44,6 +44,7 @@ #include "game.h" #include "game_constants.h" #include "gun_mode.h" +#include "harvest.h" #include "item.h" #include "item_stack.h" #include "itype.h" @@ -338,15 +339,49 @@ bool mattack::eat_crop( monster *z ) int num_targets = 1; map &here = get_map(); for( const tripoint &p : here.points_in_radius( z->pos(), 1 ) ) { - if( here.has_flag( ter_furn_flag::TFLAG_PLANT, p ) && one_in( num_targets ) ) { + if( here.has_flag( ter_furn_flag::TFLAG_PLANT, p ) && + ( here.has_flag( ter_furn_flag::TFLAG_GROWTH_HARVEST, p ) || + here.has_flag( ter_furn_flag::TFLAG_GROWTH_MATURE, p ) ) && one_in( num_targets ) ) { num_targets++; target = p; } - } - if( target ) { - here.furn_set( *target, furn_str_id( here.furn( *target )->plant->base ) ); - here.i_clear( *target ); - return true; + if( target ) { + if( z->amount_eaten <= z->stomach_size ) { + add_msg_if_player_sees( *z, _( "The %1s eats the %2s." ), z->name(), here.furnname( p ) ); + here.furn_set( *target, furn_str_id( here.furn( *target )->plant->base ) ); + here.i_clear( *target ); + z->amount_eaten += 350; + return true; + } + } + map_stack items = here.i_at( p ); + for( item &item : items ) { + //This prevents crop eaters from eating planted seeds + if( here.has_flag( ter_furn_flag::TFLAG_PLANT, p ) ) { + continue; + } + if( !item.is_food() || item.get_comestible_fun() < -20 || item.made_of( material_water ) || + !item.has_flag( flag_CATTLE ) ) { + continue; + } + if( z->amount_eaten <= z->stomach_size ) { + //Check for stomach size 0 so as to not break creatures which haven't + //been given a stomach size yet. + int consumed = 1; + if( item.count_by_charges() ) { + int kcal = item.get_comestible()->default_nutrition.kcal(); + z->amount_eaten += kcal; + add_msg_if_player_sees( *z, _( "The %1s eats the %2s." ), z->name(), item.display_name() ); + here.use_charges( p, 1, item.type->get_id(), consumed ); + } else { + int kcal = item.get_comestible()->default_nutrition.kcal(); + z->amount_eaten += kcal; + add_msg_if_player_sees( *z, _( "The %1s gobbles up the %2s." ), z->name(), item.display_name() ); + here.use_amount( p, 1, item.type->get_id(), consumed ); + } + return true; + } + } } return true; } @@ -451,30 +486,21 @@ bool mattack::eat_food( monster *z ) map_stack items = here.i_at( p ); for( item &item : items ) { //Fun limit prevents scavengers from eating feces - if( !item.is_food() || item.get_comestible_fun() < -20 || item.made_of( material_water ) ) { + if( !item.is_food() || item.get_comestible_fun() < -20 || item.has_flag( flag_INEDIBLE ) || + item.made_of( material_water ) ) { continue; } //Don't eat own eggs - if( z->has_flag( mon_flag_EATS ) && z->type->baby_egg != item.type->get_id() && - z->amount_eaten < z->stomach_size ) { - int consumed = 1; - if( item.count_by_charges() ) { - z->amount_eaten += 1; - add_msg_if_player_sees( *z, _( "The %1s eats the %2s." ), z->name(), item.display_name() ); - here.use_charges( p, 1, item.type->get_id(), consumed ); - } else { - z->amount_eaten += 1; - add_msg_if_player_sees( *z, _( "The %1s gobbles up the %2s." ), z->name(), item.display_name() ); - here.use_amount( p, 1, item.type->get_id(), consumed ); - } - return true; - } - if( !z->has_flag( mon_flag_EATS ) && z->type->baby_egg != item.type->get_id() ) { + if( z->type->baby_egg != item.type->get_id() && ( z->amount_eaten <= z->stomach_size ) ) { int consumed = 1; if( item.count_by_charges() ) { + int kcal = item.get_comestible()->default_nutrition.kcal(); + z->amount_eaten += kcal; add_msg_if_player_sees( *z, _( "The %1s eats the %2s." ), z->name(), item.display_name() ); here.use_charges( p, 1, item.type->get_id(), consumed ); } else { + int kcal = item.get_comestible()->default_nutrition.kcal(); + z->amount_eaten += kcal; add_msg_if_player_sees( *z, _( "The %1s gobbles up the %2s." ), z->name(), item.display_name() ); here.use_amount( p, 1, item.type->get_id(), consumed ); } @@ -496,11 +522,15 @@ bool mattack::eat_carrion( monster *z ) map_stack items = here.i_at( p ); for( item &item : items ) { //TODO: Completely eaten corpses should leave bones and other inedibles. - if( item.has_flag( flag_CORPSE ) && z->amount_eaten < z->stomach_size && + if( item.has_flag( flag_CORPSE ) && item.damage() < item.max_damage() && + z->amount_eaten < z->stomach_size && ( item.made_of( material_flesh ) || item.made_of( material_iflesh ) || item.made_of( material_hflesh ) || item.made_of( material_veggy ) ) ) { - item.mod_damage( 500 ); - z->amount_eaten += 1; + item.mod_damage( 700 ); + if( item.damage() >= item.max_damage() && item.can_revive() ) { + item.set_flag( flag_PULPED ); + } + z->amount_eaten += 100; add_msg_if_player_sees( *z, _( "The %1s gnaws on the %2s." ), z->name(), item.display_name() ); return true; } @@ -509,6 +539,65 @@ bool mattack::eat_carrion( monster *z ) return true; } +bool mattack::graze( monster *z ) +{ + map &here = get_map(); + //Grazers eat grass and entire plants or bushes. Toxic/inedible plants can be blacklisted with GRAZER_INEDIBLE. + for( const tripoint &p : here.points_in_radius( z->pos(), 1 ) ) { + //Don't eat grass right next to the player. + if( z->friendly && rl_dist( get_player_character().pos(), p ) <= 2 ) { + continue; + } + if( here.has_flag( ter_furn_flag::TFLAG_FLOWER, p ) && + !here.has_flag( ter_furn_flag::TFLAG_GRAZER_INEDIBLE, p ) && + ( z->amount_eaten <= z->stomach_size ) ) { + here.furn_set( p, f_null ); + z->amount_eaten += 50; + //Calorie amount is based on the "small_plant" dummy item, as with the grazer mutation. + return true; + } + if( here.has_flag( ter_furn_flag::TFLAG_SHRUB, p ) && + !here.has_flag( ter_furn_flag::TFLAG_GRAZER_INEDIBLE, p ) && + ( z->amount_eaten <= z->stomach_size ) ) { + add_msg_if_player_sees( *z, _( "The %1s eats the %2s." ), z->name(), here.tername( p ) ); + here.ter_set( p, t_dirt ); + z->amount_eaten += 174; + //Calorie amount is based on the "underbrush" dummy item, as with the grazer mutation. + return true; + } + if( here.has_flag( ter_furn_flag::TFLAG_GRAZABLE, p ) && z->amount_eaten < z->stomach_size ) { + here.ter_set( p, here.get_ter_transforms_into( p ) ); + z->amount_eaten += 70; + //Calorie amount is based on the "grass" dummy item, as with the grazer mutation. + return true; + } + } + return true; +} + +bool mattack::browse( monster *z ) +{ + map &here = get_map(); + //Browsers eat fruit/nuts/etc off of seasonally harvestable plants and trees. + for( const tripoint &p : here.points_in_radius( z->pos(), 1 ) ) { + // Don't forage for food if the player is right there. + if( z->friendly && rl_dist( get_player_character().pos(), p ) <= 2 ) { + continue; + } + if( here.has_flag( ter_furn_flag::TFLAG_BROWSABLE, p ) && ( z->amount_eaten <= z->stomach_size ) ) { + const harvest_id harvest = here.get_harvest( p ); + if( !harvest.is_null() || !harvest->empty() ) { + add_msg_if_player_sees( *z, _( "The %1s eats from the %2s." ), z->name(), here.tername( p ) ); + here.ter_set( p, here.get_ter_transforms_into( p ) ); + z->amount_eaten += 174; + //Calorie amount is based on the "underbrush" dummy item, as with the grazer mutation. + return true; + } + } + } + return true; +} + bool mattack::shriek( monster *z ) { Creature *target = z->attack_target(); diff --git a/src/monattack.h b/src/monattack.h index a0dbcde33f7a1..cc4f27c35115a 100644 --- a/src/monattack.h +++ b/src/monattack.h @@ -9,6 +9,7 @@ namespace mattack { bool none( monster *z ); bool absorb_items( monster *z ); +bool browse( monster *z ); bool eat_carrion( monster *z ); bool eat_crop( monster *z ); bool eat_food( monster *z ); @@ -108,6 +109,7 @@ bool doot( monster *z ); bool zombie_fuse( monster *z ); bool dsa_drone_scan( monster *z ); bool blow_whistle( monster *z ); +bool graze( monster *z ); void taze( monster *z, Creature *target ); void rifle( monster *z, Creature *target ); // Automated M4 diff --git a/src/mondeath.cpp b/src/mondeath.cpp index 05d98d0aead44..ae0395b0a521e 100644 --- a/src/mondeath.cpp +++ b/src/mondeath.cpp @@ -49,6 +49,7 @@ #include "viewer.h" static const efftype_id effect_no_ammo( "no_ammo" ); +static const efftype_id effect_critter_underfed( "critter_underfed" ); static const harvest_drop_type_id harvest_drop_bone( "bone" ); static const harvest_drop_type_id harvest_drop_flesh( "flesh" ); @@ -201,6 +202,9 @@ item_location mdeath::splatter( monster &z ) if( z.has_effect( effect_no_ammo ) ) { corpse.set_var( "no_ammo", "no_ammo" ); } + if( z.has_effect( effect_critter_underfed ) ) { + corpse.set_flag( STATIC( flag_id( "UNDERFED" ) ) ); + } return here.add_item_ret_loc( z.pos(), corpse ); } return {}; @@ -289,5 +293,8 @@ item_location make_mon_corpse( monster &z, int damageLvl ) if( z.has_effect( effect_no_ammo ) ) { corpse.set_var( "no_ammo", "no_ammo" ); } + if( z.has_effect( effect_critter_underfed ) ) { + corpse.set_flag( STATIC( flag_id( "UNDERFED" ) ) ); + } return get_map().add_item_ret_loc( z.pos(), corpse ); } diff --git a/src/monexamine.cpp b/src/monexamine.cpp index b5ee296758fc7..2097ff828cf24 100644 --- a/src/monexamine.cpp +++ b/src/monexamine.cpp @@ -41,6 +41,7 @@ #include "value_ptr.h" static const efftype_id effect_controlled( "controlled" ); +static const efftype_id effect_critter_well_fed( "critter_well_fed" ); static const efftype_id effect_harnessed( "harnessed" ); static const efftype_id effect_has_bag( "has_bag" ); static const efftype_id effect_leashed( "leashed" ); @@ -62,6 +63,7 @@ static const itype_id itype_id_military( "id_military" ); static const mon_flag_str_id mon_flag_CANPLAY( "CANPLAY" ); static const mon_flag_str_id mon_flag_CAN_BE_CULLED( "CAN_BE_CULLED" ); +static const mon_flag_str_id mon_flag_EATS( "EATS" ); static const mon_flag_str_id mon_flag_MILKABLE( "MILKABLE" ); static const mon_flag_str_id mon_flag_PAY_BOT( "PAY_BOT" ); static const mon_flag_str_id mon_flag_PET_MOUNTABLE( "PET_MOUNTABLE" ); @@ -477,13 +479,15 @@ void stop_leading( monster &z ) */ void milk_source( monster &source_mon ) { + itype_id milked_item = source_mon.type->starting_ammo.begin()->first; auto milkable_ammo = source_mon.ammo.find( milked_item ); if( milkable_ammo == source_mon.ammo.end() ) { debugmsg( "The %s has no milkable %s.", source_mon.get_name(), milked_item.str() ); return; } - if( milkable_ammo->second > 0 ) { + + else if( milkable_ammo->second > 0 ) { const int moves = to_moves( time_duration::from_minutes( milkable_ammo->second / 2 ) ); std::vector coords{}; std::vector str_values{}; @@ -500,6 +504,9 @@ void milk_source( monster &source_mon ) add_msg( _( "You milk the %s." ), source_mon.get_name() ); } else { add_msg( _( "The %s has no more milk." ), source_mon.get_name() ); + if( !source_mon.has_effect( effect_critter_well_fed ) ) { + add_msg( _( "It might not be getting enough to eat." ) ); + } } } @@ -613,7 +620,14 @@ bool monexamine::pet_menu( monster &z ) std::string pet_name = z.get_name(); amenu.text = string_format( _( "What to do with your %s?" ), pet_name ); - + if( z.has_flag( mon_flag_EATS ) && ( z.amount_eaten < ( z.stomach_size / 10 ) ) ) { + amenu.text = string_format( _( "What to do with your %s?\n" "Hunger: Famished" ), pet_name ); + } else if( z.has_flag( mon_flag_EATS ) && ( z.amount_eaten > ( z.stomach_size / 10 ) && + z.amount_eaten < z.stomach_size ) ) { + amenu.text = string_format( _( "What to do with your %s?\n" "Hunger: Hungry" ), pet_name ); + } else if( z.has_flag( mon_flag_EATS ) && z.amount_eaten >= z.stomach_size ) { + amenu.text = string_format( _( "What to do with your %s?\n" "Hunger: Full" ), pet_name ); + } amenu.addentry( swap_pos, true, 's', _( "Swap positions" ) ); amenu.addentry( push_monster, true, 'p', _( "Push %s" ), pet_name ); if( z.has_effect( effect_leashed ) ) { @@ -932,7 +946,14 @@ bool monexamine::mfriend_menu( monster &z ) const std::string pet_name = z.get_name(); amenu.text = string_format( _( "What to do with your %s?" ), pet_name ); - + if( z.has_flag( mon_flag_EATS ) && ( z.amount_eaten < ( z.stomach_size / 10 ) ) ) { + amenu.text = string_format( _( "What to do with your %s?\n" "Hunger: Famished" ), pet_name ); + } else if( z.has_flag( mon_flag_EATS ) && ( z.amount_eaten > ( z.stomach_size / 10 ) && + z.amount_eaten < z.stomach_size ) ) { + amenu.text = string_format( _( "What to do with your %s?\n" "Hunger: Hungry" ), pet_name ); + } else if( z.has_flag( mon_flag_EATS ) && z.amount_eaten >= z.stomach_size ) { + amenu.text = string_format( _( "What to do with your %s?\n" "Hunger: Full" ), pet_name ); + } amenu.addentry( swap_pos, true, 's', _( "Swap positions" ) ); amenu.addentry( push_monster, true, 'p', _( "Push %s" ), pet_name ); amenu.addentry( rename, true, 'e', _( "Rename" ) ); diff --git a/src/monmove.cpp b/src/monmove.cpp index f57268d64a38b..f7b04a2869cf4 100644 --- a/src/monmove.cpp +++ b/src/monmove.cpp @@ -485,6 +485,85 @@ bool monster::mating_angry() const return mating_angry; } +/** This is lazily evaluated in monster::plan(). Each monster in a zone is visited + * as it flood fills, then the zone number is incremented. At the end all monsters in + * the same zone will have the same zone number assigned, which can be used to have monsters in + * different zones ignore each other very cheaply. + */ +static void flood_fill_zone( Creature &origin ) +{ + static int zone_number = 1; + static int zone_tick = 1; + map &here = get_map(); + if( here.get_visitable_zones_cache_dirty() ) { + zone_tick = zone_tick > 0 ? -1 : 1; + here.set_visitable_zones_cache_dirty( false ); + zone_number = 1; + } + // This check insures we only flood fill when the target monster has an uninitialized zone, + // or if it has a zone from last turn. In other words it only triggers on + // the first monster in a zone each turn. We can detect this because the sign + // of the zone numbers changes on every invalidation. + int old_zone = origin.get_reachable_zone(); + // Compare with zone_tick == old_zone && old_zone != 0 + if( ( zone_tick > 0 && old_zone > 0 ) || + ( zone_tick < 0 && old_zone < 0 ) ) { + return; + } + creature_tracker &tracker = get_creature_tracker(); + + ff::flood_fill_visit_10_connected( origin.pos_bub(), + [&here]( const tripoint_bub_ms & loc, int direction ) { + if( direction == 0 ) { + return here.inbounds( loc ) && ( here.is_transparent_wo_fields( loc.raw() ) || + here.passable( loc ) ); + } + if( direction == 1 ) { + const maptile &up = here.maptile_at( loc ); + const ter_t &up_ter = up.get_ter_t(); + if( up_ter.id.is_null() ) { + return false; + } + if( ( ( up_ter.movecost != 0 && up.get_furn_t().movecost >= 0 ) || + here.is_transparent_wo_fields( loc.raw() ) ) && + ( up_ter.has_flag( ter_furn_flag::TFLAG_NO_FLOOR ) || + up_ter.has_flag( ter_furn_flag::TFLAG_GOES_DOWN ) ) ) { + return true; + } + } + if( direction == -1 ) { + const maptile &up = here.maptile_at( loc + tripoint_above ); + const ter_t &up_ter = up.get_ter_t(); + if( up_ter.id.is_null() ) { + return false; + } + const maptile &down = here.maptile_at( loc ); + const ter_t &down_ter = up.get_ter_t(); + if( down_ter.id.is_null() ) { + return false; + } + if( ( ( down_ter.movecost != 0 && down.get_furn_t().movecost >= 0 ) || + here.is_transparent_wo_fields( loc.raw() ) ) && + ( up_ter.has_flag( ter_furn_flag::TFLAG_NO_FLOOR ) || + up_ter.has_flag( ter_furn_flag::TFLAG_GOES_DOWN ) ) ) { + return true; + } + } + return false; + }, + [&tracker]( const tripoint_bub_ms & loc ) { + Creature *creature = tracker.creature_at( loc ); + if( creature ) { + creature->set_reachable_zone( zone_number * zone_tick ); + } + } ); + if( zone_number == std::numeric_limits::max() ) { + zone_number = 1; + } else { + zone_number++; + } +} + void monster::plan() { const auto &factions = g->critter_tracker->factions(); @@ -495,6 +574,7 @@ void monster::plan() std::bitset seen_levels = here.get_inter_level_visibility( pos().z ); monster_attitude mood = attitude(); Character &player_character = get_player_character(); + flood_fill_zone( *this ); // If we can see the player, move toward them or flee. if( friendly == 0 && seen_levels.test( player_character.pos().z + OVERMAP_DEPTH ) && sees( player_character ) ) { @@ -599,40 +679,52 @@ void monster::plan() turns_since_target ); int turns_to_skip = max_turns_to_skip * rate_limiting_factor; if( friendly == 0 && ( turns_to_skip == 0 || turns_since_target % turns_to_skip == 0 ) ) { - here.visit_reachable_creatures( *this, [this, &seen_levels, &mon_plan, - &valid_targets]( Creature & other ) { - mf_attitude faction_att = faction.obj().attitude( other.get_monster_faction() ); + for( const auto &fac_list : factions ) { + mf_attitude faction_att = faction.obj().attitude( fac_list.first ); if( faction_att == MFA_NEUTRAL || faction_att == MFA_FRIENDLY ) { - return; - } - if( !seen_levels.test( other.posz() + OVERMAP_DEPTH ) ) { - return; + continue; } - float rating = rate_target( other, mon_plan.dist, mon_plan.smart_planning ); - if( rating == mon_plan.dist ) { - ++valid_targets; - if( one_in( valid_targets ) ) { - mon_plan.target = &other; + + for( const auto &fac : fac_list.second ) { + if( !seen_levels.test( fac.first + OVERMAP_DEPTH ) ) { + continue; } - } - if( rating < mon_plan.dist ) { - mon_plan.target = &other; - mon_plan.dist = rating; - valid_targets = 1; - } - if( rating <= 5 ) { - if( anger <= 30 ) { - anger += mon_plan.angers_hostile_near; + for( const weak_ptr_fast &weak : fac.second ) { + const shared_ptr_fast shared = weak.lock(); + if( !shared ) { + continue; + } + monster &mon = *shared; + if( get_reachable_zone() != mon.get_reachable_zone() ) { + continue; + } + float rating = rate_target( mon, mon_plan.dist, mon_plan.smart_planning ); + if( rating == mon_plan.dist ) { + ++valid_targets; + if( one_in( valid_targets ) ) { + mon_plan.target = &mon; + } + } + if( rating < mon_plan.dist ) { + mon_plan.target = &mon; + mon_plan.dist = rating; + valid_targets = 1; + } + if( rating <= 5 ) { + if( anger <= 30 ) { + anger += mon_plan.angers_hostile_near; + } + morale -= mon_plan.fears_hostile_near; + } + if( !mon_plan.fleeing && anger <= 20 && valid_targets != 0 ) { + anger += mon_plan.angers_hostile_seen; + } + if( !mon_plan.fleeing && valid_targets != 0 ) { + morale -= mon_plan.fears_hostile_seen; + } } - morale -= mon_plan.fears_hostile_near; - } - if( !mon_plan.fleeing && anger <= 20 && valid_targets != 0 ) { - anger += mon_plan.angers_hostile_seen; } - if( !mon_plan.fleeing && valid_targets != 0 ) { - morale -= mon_plan.fears_hostile_seen; - } - } ); + } } if( mon_plan.target == nullptr ) { // Just avoiding overflow. diff --git a/src/monster.cpp b/src/monster.cpp index 427c71995eb4d..526663485cd0e 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -117,11 +117,13 @@ static const efftype_id effect_stunned( "stunned" ); static const efftype_id effect_supercharged( "supercharged" ); static const efftype_id effect_tied( "tied" ); static const efftype_id effect_tpollen( "tpollen" ); +static const efftype_id effect_critter_underfed( "critter_underfed" ); static const efftype_id effect_venom_dmg( "venom_dmg" ); static const efftype_id effect_venom_player1( "venom_player1" ); static const efftype_id effect_venom_player2( "venom_player2" ); static const efftype_id effect_venom_weaken( "venom_weaken" ); static const efftype_id effect_webbed( "webbed" ); +static const efftype_id effect_critter_well_fed( "critter_well_fed" ); static const efftype_id effect_worked_on( "worked_on" ); static const emit_id emit_emit_shock_cloud( "emit_shock_cloud" ); @@ -263,6 +265,11 @@ static const std::map> attitu {monster_attitude::MATT_NULL, {translate_marker( "BUG: Behavior unnamed." ), def_h_red}}, }; +static int compute_kill_xp( const mtype_id &mon_type ) +{ + return mon_type->difficulty + mon_type->difficulty_base; +} + monster::monster() { unset_dest(); @@ -598,7 +605,7 @@ void monster::try_reproduce() } chance += 2; - if( has_flag( mon_flag_EATS ) && amount_eaten == 0 ) { + if( has_flag( mon_flag_EATS ) && has_effect( effect_critter_underfed ) ) { chance += 1; //Reduce the chances but don't prevent birth if the animal is not eating. } if( season_match && female && one_in( chance ) ) { @@ -638,17 +645,36 @@ void monster::refill_udders() // already full up return; } - if( calendar::turn - udder_timer > 1_days ) { - // You milk once a day. - ammo.begin()->second = type->starting_ammo.begin()->second; - udder_timer = calendar::turn; + if( ( !has_flag( mon_flag_EATS ) || has_effect( effect_critter_well_fed ) ) ) { + if( calendar::turn - udder_timer > 1_days ) { + // You milk once a day. Monsters with the EATS flag need to be well fed or they won't refill their udders. + ammo.begin()->second = type->starting_ammo.begin()->second; + udder_timer = calendar::turn; + } + } +} + +void monster::reset_digestion() +{ + if( calendar::turn - stomach_timer > 3_days ) { + //If the player hasn't been around, assume critters have been operating at a subsistence level. + //Otherwise everything will constantly be underfed. We only run this on load to prevent problems. + remove_effect( effect_critter_underfed ); + remove_effect( effect_critter_well_fed ); + amount_eaten = 0; + stomach_timer = calendar::turn; } } void monster::digest_food() { - if( calendar::turn - stomach_timer > 1_days && amount_eaten > 0 ) { - amount_eaten -= 1; + if( calendar::turn - stomach_timer > 1_days ) { + if( ( amount_eaten >= stomach_size ) && !has_effect( effect_critter_underfed ) ) { + add_effect( effect_critter_well_fed, 24_hours ); + } else if( ( amount_eaten < ( stomach_size / 10 ) ) && !has_effect( effect_critter_well_fed ) ) { + add_effect( effect_critter_underfed, 24_hours ); + } + amount_eaten = 0; stomach_timer = calendar::turn; } } @@ -665,6 +691,9 @@ void monster::try_biosignature() if( !type->biosig_timer ) { return; } + if( has_effect( effect_critter_underfed ) ) { + return; + } if( !biosig_timer ) { biosig_timer.emplace( calendar::turn + *type->biosig_timer ); @@ -2719,7 +2748,9 @@ void monster::die( Creature *nkiller ) if( get_killer() != nullptr ) { Character *ch = get_killer()->as_character(); if( !is_hallucination() && ch != nullptr ) { - get_event_bus().send( ch->getID(), type->id ); + cata::event e = cata::event::make( ch->getID(), type->id, + compute_kill_xp( type->id ) ); + get_event_bus().send_with_talker( ch, this, e ); if( ch->is_avatar() && ch->has_trait( trait_KILLER ) ) { if( one_in( 4 ) ) { const translation snip = SNIPPET.random_from_category( "killer_on_kill" ).value_or( translation() ); @@ -3183,6 +3214,31 @@ void monster::process_effects() } } + if( has_effect( effect_critter_well_fed ) && one_in( 90 ) ) { + heal( 1 ); + } + + //We already check these timers on_load, but adding a random chance for them to go off here + //will make it so that the player needn't leave the area and return for critters to poop, + //become hungry, evolve, have babies, or refill udders. + if( one_in( 30000 ) ) { + try_upgrade( false ); + try_reproduce(); + try_biosignature(); + + if( amount_eaten > 0 ) { + if( has_flag( mon_flag_EATS ) ) { + digest_food(); + } else { + amount_eaten = 0; + } + } + + if( has_flag( mon_flag_MILKABLE ) ) { + refill_udders(); + } + } + //Monster will regen morale and aggression if it is at/above max HP //It regens more morale and aggression if is currently fleeing. if( type->regen_morale && hp >= type->hp ) { @@ -3710,9 +3766,15 @@ void monster::on_load() try_upgrade( false ); try_reproduce(); try_biosignature(); + reset_digestion(); - if( has_flag( mon_flag_EATS ) ) { - digest_food(); + //Clean up runaway values for monsters which eat but don't digest yet. + if( amount_eaten > 0 ) { + if( has_flag( mon_flag_EATS ) ) { + digest_food(); + } else { + amount_eaten = 0; + } } if( has_flag( mon_flag_MILKABLE ) ) { diff --git a/src/monster.h b/src/monster.h index dd6c278f89270..48f571552d2d2 100644 --- a/src/monster.h +++ b/src/monster.h @@ -118,6 +118,7 @@ class monster : public Creature void try_biosignature(); void refill_udders(); void digest_food(); + void reset_digestion(); void spawn( const tripoint &p ); void spawn( const tripoint_abs_ms &loc ); std::vector get_absorb_material() const; diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index 5e5a5c2a94a2c..2d00f96be4f07 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -487,9 +487,11 @@ void MonsterGenerator::init_attack() add_hardcoded_attack( "NONE", mattack::none ); add_hardcoded_attack( "ABSORB_ITEMS", mattack::absorb_items ); add_hardcoded_attack( "SPLIT", mattack::split ); + add_hardcoded_attack( "BROWSE", mattack::browse ); add_hardcoded_attack( "EAT_CARRION", mattack::eat_carrion ); add_hardcoded_attack( "EAT_CROP", mattack::eat_crop ); add_hardcoded_attack( "EAT_FOOD", mattack::eat_food ); + add_hardcoded_attack( "GRAZE", mattack::graze ); add_hardcoded_attack( "CHECK_UP", mattack::nurse_check_up ); add_hardcoded_attack( "ASSIST", mattack::nurse_assist ); add_hardcoded_attack( "OPERATE", mattack::nurse_operate ); diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index a557eebdf39f6..c2478b1cf826b 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -95,6 +95,9 @@ static const trait_id trait_WEAKSCENT( "WEAKSCENT" ); static const trait_id trait_XS( "XS" ); static const trait_id trait_XXXL( "XXXL" ); +// Wether or not to use Outfit (M) at character creation +static bool outfit = true; + // Responsive screen behavior for small terminal sizes static bool isWide = false; @@ -422,6 +425,7 @@ void avatar::randomize( const bool random_scenario, bool play_now ) *this = avatar(); male = ( rng( 1, 100 ) > 50 ); + outfit = male; if( !MAP_SHARING::isSharing() ) { play_now ? pick_name() : pick_name( true ); } else { @@ -607,7 +611,7 @@ void avatar::add_profession_items() return; } - std::list prof_items = prof->items( male, get_mutations() ); + std::list prof_items = prof->items( outfit, get_mutations() ); for( item &it : prof_items ) { if( it.has_flag( STATIC( flag_id( "WET" ) ) ) ) { @@ -1015,11 +1019,19 @@ static const char *g_switch_msg( const avatar &u ) { return u.male ? //~ Gender switch message. 1s - change key name, 2s - profession name. - _( "Press %1$s to switch " - "to %2$s (female)." ) : + _( "Identity: %2$s (male) (press %1$s to switch)" ) + : //~ Gender switch message. 1s - change key name, 2s - profession name. - _( "Press %1$s to switch " - "to %2$s (male)." ); + _( "Identity: %2$s (female) (press %1$s to switch)" ); +} + +static const char *dress_switch_msg() +{ + return outfit ? + //~ Outfit switch message. 1s - change key name. + _( "Outfit: male (press %1$s to change)" ) : + //~ Outfit switch message. 1s - change key name. + _( "Outfit: female (press %1$s to change)" ); } void set_points( tab_manager &tabs, avatar &u, pool_type &pool ) @@ -1970,7 +1982,8 @@ static std::string assemble_profession_details( const avatar &u, const input_con assembled += string_format( _( "Origin: %s" ), mod_src ) + "\n"; assembled += string_format( g_switch_msg( u ), ctxt.get_desc( "CHANGE_GENDER" ), - sorted_profs[cur_id]->gender_appropriate_name( !u.male ) ) + "\n"; + sorted_profs[cur_id]->gender_appropriate_name( u.male ) ) + "\n"; + assembled += string_format( dress_switch_msg(), ctxt.get_desc( "CHANGE_OUTFIT" ) ) + "\n"; if( sorted_profs[cur_id]->get_requirement().has_value() ) { assembled += "\n" + colorize( _( "Profession requirements:" ), COL_HEADER ) + "\n"; @@ -2045,7 +2058,7 @@ static std::string assemble_profession_details( const avatar &u, const input_con } // Profession items - const auto prof_items = sorted_profs[cur_id]->items( u.male, u.get_mutations() ); + const auto prof_items = sorted_profs[cur_id]->items( outfit, u.get_mutations() ); assembled += "\n" + colorize( _( "Profession items:" ), COL_HEADER ) + "\n"; if( prof_items.empty() ) { assembled += pgettext( "set_profession_item", "None" ) + std::string( "\n" ); @@ -2227,6 +2240,7 @@ void set_profession( tab_manager &tabs, avatar &u, pool_type pool ) ctxt.register_navigate_ui_list(); ctxt.register_action( "CONFIRM" ); ctxt.register_action( "CHANGE_GENDER" ); + ctxt.register_action( "CHANGE_OUTFIT" ); ctxt.register_action( "SORT" ); ctxt.register_action( "HELP_KEYBINDINGS" ); ctxt.register_action( "FILTER" ); @@ -2384,6 +2398,9 @@ void set_profession( tab_manager &tabs, avatar &u, pool_type pool ) // Add traits for the new profession (and perhaps scenario, if, for example, // both the scenario and old profession require the same trait) u.add_traits(); + } else if( action == "CHANGE_OUTFIT" ) { + outfit = !outfit; + recalc_profs = true; } else if( action == "CHANGE_GENDER" ) { u.male = !u.male; profession_sorter.male = u.male; diff --git a/src/npctalk.cpp b/src/npctalk.cpp index fd9d5367cce7e..dad55cad48e80 100644 --- a/src/npctalk.cpp +++ b/src/npctalk.cpp @@ -3255,6 +3255,7 @@ void talk_effect_fun_t::set_location_variable( const JsonObject &jo, std::string dbl_or_var dov_y_adjust = get_dbl_or_var( jo, "y_adjust", false, 0 ); bool z_override = jo.get_bool( "z_override", false ); const bool outdoor_only = jo.get_bool( "outdoor_only", false ); + const bool passable_only = jo.get_bool( "passable_only", false ); std::optional target_params; if( jo.has_object( "target_params" ) ) { JsonObject target_obj = jo.get_object( "target_params" ); @@ -3303,9 +3304,9 @@ void talk_effect_fun_t::set_location_variable( const JsonObject &jo, std::string std::vector true_eocs = load_eoc_vector( jo, "true_eocs" ); std::vector false_eocs = load_eoc_vector( jo, "false_eocs" ); - function = [dov_min_radius, dov_max_radius, var_name, outdoor_only, target_params, is_npc, type, - dov_x_adjust, dov_y_adjust, dov_z_adjust, z_override, true_eocs, false_eocs, search_target, - search_type, dov_target_min_radius, dov_target_max_radius]( dialogue & d ) { + function = [dov_min_radius, dov_max_radius, var_name, outdoor_only, passable_only, target_params, + is_npc, type, dov_x_adjust, dov_y_adjust, dov_z_adjust, z_override, true_eocs, false_eocs, + search_target, search_type, dov_target_min_radius, dov_target_max_radius]( dialogue & d ) { talker *target = d.actor( is_npc ); tripoint talker_pos = get_map().getabs( target->pos() ); tripoint target_pos = talker_pos; @@ -3403,6 +3404,7 @@ void talk_effect_fun_t::set_location_variable( const JsonObject &jo, std::string target_pos = talker_pos + tripoint( rng( -max_radius, max_radius ), rng( -max_radius, max_radius ), 0 ); if( ( !outdoor_only || here.is_outside( target_pos ) ) && + ( !passable_only || here.passable( target_pos ) ) && rl_dist( target_pos, talker_pos ) >= min_radius ) { found = true; break; diff --git a/src/pickup.cpp b/src/pickup.cpp index 27242c7e50d3e..183628bd54973 100644 --- a/src/pickup.cpp +++ b/src/pickup.cpp @@ -492,7 +492,7 @@ void Pickup::pick_info::serialize( JsonOut &jsout ) const void Pickup::pick_info::deserialize( const JsonObject &jsobj ) { - int src_type_; + int src_type_ = 0; jsobj.read( "total_bulk_volume", total_bulk_volume ); jsobj.read( "src_type", src_type_ ); src_type = static_cast( src_type_ ); diff --git a/src/requirements.cpp b/src/requirements.cpp index 95a39eb3d7d20..a9531c9b4906e 100644 --- a/src/requirements.cpp +++ b/src/requirements.cpp @@ -1495,6 +1495,15 @@ void requirement_data::dump( JsonOut &jsout ) const jsout.end_object(); } +uint64_t requirement_data::make_hash() const +{ + std::ostringstream stream; + JsonOut json( stream ); + dump( json ); + std::hash hasher; + return hasher( stream.str() ); +} + /// Helper function for deduped_requirement_data constructor below. /// /// The goal of this function is to consolidate a particular item_comp that diff --git a/src/requirements.h b/src/requirements.h index 79a805c528300..a7a9a59761c0b 100644 --- a/src/requirements.h +++ b/src/requirements.h @@ -385,6 +385,8 @@ struct requirement_data { */ void dump( JsonOut &jsout ) const; + uint64_t make_hash() const; + private: requirement_id id_ = requirement_id::NULL_ID(); // NOLINT(cata-serialize) diff --git a/src/talker_monster.cpp b/src/talker_monster.cpp index 0e10ee8a0d8cf..d1d02f1452566 100644 --- a/src/talker_monster.cpp +++ b/src/talker_monster.cpp @@ -23,6 +23,11 @@ std::string talker_monster_const::disp_name() const return me_mon_const->disp_name(); } +std::string talker_monster_const::get_name() const +{ + return me_mon_const->get_name(); +} + int talker_monster_const::posx() const { return me_mon_const->posx(); @@ -210,6 +215,11 @@ int talker_monster_const::get_hp_max( const bodypart_id & ) const return me_mon_const->get_hp_max(); } +double talker_monster_const::armor_at( damage_type_id &dt, bodypart_id &bp ) const +{ + return me_mon_const->get_armor_type( dt, bp ); +} + bool talker_monster_const::will_talk_to_u( const Character &you, bool ) { return !you.is_dead_state(); diff --git a/src/talker_monster.h b/src/talker_monster.h index 8717ff8638427..bef58e89cd27d 100644 --- a/src/talker_monster.h +++ b/src/talker_monster.h @@ -32,6 +32,7 @@ class talker_monster_const: public talker_cloner // identity and location std::string disp_name() const override; + std::string get_name() const override; int posx() const override; int posy() const override; @@ -62,6 +63,7 @@ class talker_monster_const: public talker_cloner std::vector get_topics( bool radio_contact ) override; int get_cur_hp( const bodypart_id & ) const override; int get_hp_max( const bodypart_id & ) const override; + double armor_at( damage_type_id &dt, bodypart_id &bp ) const override; int get_volume() const override; int get_weight() const override; diff --git a/tests/eoc_test.cpp b/tests/eoc_test.cpp index 50dd8d444f37f..8a094b59f0f7b 100644 --- a/tests/eoc_test.cpp +++ b/tests/eoc_test.cpp @@ -1070,6 +1070,15 @@ TEST_CASE( "EOC_combat_event_test", "[eoc]" ) "character_ranged_attacks_monster" ); CHECK( globvars.get_global_value( "npctalk_var_weapon" ) == "shotgun_s" ); CHECK( globvars.get_global_value( "npctalk_var_victim_type" ) == "mon_zombie" ); + + // character_kills_monster + clear_map(); + monster &victim = spawn_test_monster( "mon_zombie", target_pos ); + victim.die( &get_avatar() ); + + CHECK( get_avatar().get_value( "npctalk_var_test_event_last_event" ) == "character_kills_monster" ); + CHECK( globvars.get_global_value( "npctalk_var_victim_type" ) == "mon_zombie" ); + CHECK( globvars.get_global_value( "npctalk_var_test_exp" ) == "4" ); } TEST_CASE( "EOC_spell_exp", "[eoc]" ) diff --git a/tests/event_test.cpp b/tests/event_test.cpp index 65d0b6abc2d99..7ed81c7d5ec37 100644 --- a/tests/event_test.cpp +++ b/tests/event_test.cpp @@ -15,13 +15,15 @@ static const mtype_id zombie( "zombie" ); TEST_CASE( "construct_event", "[event]" ) { cata::event e = cata::event::make( - character_id( 7 ), zombie ); + character_id( 7 ), zombie, 100 ); CHECK( e.type() == event_type::character_kills_monster ); CHECK( e.time() == calendar::turn ); CHECK( e.get( "killer" ) == character_id( 7 ) ); CHECK( e.get( "victim_type" ) == zombie ); + CHECK( e.get( "exp" ) == 100 ); CHECK( e.get( "killer" ) == character_id( 7 ) ); CHECK( e.get( "victim_type" ) == zombie ); + CHECK( e.get( "exp" ) == 100 ); } struct test_subscriber : public event_subscriber { @@ -37,7 +39,7 @@ TEST_CASE( "push_event_on_vector", "[event]" ) { std::vector test_events; cata::event original_event = cata::event::make( - character_id( 5 ), zombie ); + character_id( 5 ), zombie, 0 ); test_events.push_back( original_event ); REQUIRE( test_events.size() == 1 ); } @@ -46,7 +48,7 @@ TEST_CASE( "notify_subscriber", "[event]" ) { test_subscriber sub; cata::event original_event = cata::event::make( - character_id( 5 ), zombie ); + character_id( 5 ), zombie, 0 ); sub.notify( original_event ); REQUIRE( sub.events.size() == 1 ); } @@ -58,7 +60,7 @@ TEST_CASE( "send_event_through_bus", "[event]" ) bus.subscribe( &sub ); bus.send( cata::event::make( - character_id( 5 ), zombie ) ); + character_id( 5 ), zombie, 0 ) ); REQUIRE( sub.events.size() == 1 ); const cata::event &e = sub.events[0]; CHECK( e.type() == event_type::character_kills_monster ); @@ -74,7 +76,7 @@ TEST_CASE( "destroy_bus_before_subscriber", "[event]" ) bus.subscribe( &sub ); bus.send( cata::event::make( - character_id( 5 ), zombie ) ); + character_id( 5 ), zombie, 0 ) ); CHECK( sub.events.size() == 1 ); } @@ -89,7 +91,7 @@ struct expect_subscriber : public event_subscriber { TEST_CASE( "notify_subscriber_2", "[event]" ) { cata::event original_event = cata::event::make( - character_id( 5 ), zombie ); + character_id( 5 ), zombie, 0 ); expect_subscriber sub; sub.notify( original_event ); diff --git a/tests/memorial_test.cpp b/tests/memorial_test.cpp index b014baba9b0eb..8297af43ed373 100644 --- a/tests/memorial_test.cpp +++ b/tests/memorial_test.cpp @@ -130,7 +130,7 @@ TEST_CASE( "memorials", "[memorial]" ) "afterwards.", ch, ch2, "victim_name" ); check_memorial( - m, b, "Killed a Kevlar hulk.", ch, mon ); + m, b, "Killed a Kevlar hulk.", ch, mon, 0 ); check_memorial( m, b, "Put out the fire.", ch, eff ); diff --git a/tests/npc_talk_test.cpp b/tests/npc_talk_test.cpp index cd2eb25c3d41b..63a52c172be4e 100644 --- a/tests/npc_talk_test.cpp +++ b/tests/npc_talk_test.cpp @@ -1245,7 +1245,7 @@ TEST_CASE( "npc_compare_int", "[npc_talk]" ) player_character.inv->add_item( item( itype_bottle_glass ) ); player_character.inv->add_item( item( itype_bottle_glass ) ); cata::event e = cata::event::make( - get_player_character().getID(), mon_zombie_bio_op ); + get_player_character().getID(), mon_zombie_bio_op, 0 ); get_event_bus().send( e ); player_character.magic->learn_spell( spell_test_spell_json, player_character, false ); player_character.set_mutation( trait_test_trait ); // Give the player the spell scool test_trait diff --git a/tests/stats_tracker_test.cpp b/tests/stats_tracker_test.cpp index 476f23ca7df88..3708e64097af7 100644 --- a/tests/stats_tracker_test.cpp +++ b/tests/stats_tracker_test.cpp @@ -81,9 +81,9 @@ TEST_CASE( "stats_tracker_count_events", "[stats]" ) const character_id u_id = get_player_character().getID(); const cata::event kill1 = - cata::event::make( u_id, mon_zombie ); + cata::event::make( u_id, mon_zombie, 0 ); const cata::event kill2 = cata::event::make( u_id, - mon_zombie_brute ); + mon_zombie_brute, 0 ); const cata::event::data_type char_is_player{ { "killer", cata_variant( u_id ) } }; CHECK( s.get_events( kill1.type() ).count( kill1.data() ) == 0 ); @@ -310,11 +310,11 @@ TEST_CASE( "stats_tracker_with_event_statistics", "[stats]" ) character_id other_id = u_id; ++other_id; const cata::event avatar_zombie_kill = - cata::event::make( u_id, mon_zombie ); + cata::event::make( u_id, mon_zombie, 0 ); const cata::event avatar_dog_kill = - cata::event::make( u_id, mon_dog ); + cata::event::make( u_id, mon_dog, 0 ); const cata::event other_kill = - cata::event::make( other_id, mon_zombie ); + cata::event::make( other_id, mon_zombie, 0 ); send_game_start( b, u_id ); CHECK( event_statistic_avatar_id->value( s ) == cata_variant( u_id ) ); @@ -526,11 +526,11 @@ TEST_CASE( "stats_tracker_watchers", "[stats]" ) character_id other_id = u_id; ++other_id; const cata::event avatar_zombie_kill = - cata::event::make( u_id, mon_zombie ); + cata::event::make( u_id, mon_zombie, 0 ); const cata::event avatar_dog_kill = - cata::event::make( u_id, mon_dog ); + cata::event::make( u_id, mon_dog, 0 ); const cata::event other_kill = - cata::event::make( other_id, mon_zombie ); + cata::event::make( other_id, mon_zombie, 0 ); watch_stat kills_watcher; watch_stat zombie_kills_watcher; @@ -651,7 +651,7 @@ TEST_CASE( "achievements_tracker", "[stats]" ) SECTION( "hidden_kills" ) { const cata::event avatar_zombie_kill = - cata::event::make( u_id, mon_zombie ); + cata::event::make( u_id, mon_zombie, 0 ); achievement_id a_kill_10( "achievement_kill_10_monsters" ); achievement_id a_kill_100( "achievement_kill_100_monsters" ); @@ -679,7 +679,7 @@ TEST_CASE( "achievements_tracker", "[stats]" ) calendar::turn = calendar::start_of_game + time_since_game_start; const cata::event avatar_zombie_kill = - cata::event::make( u_id, mon_zombie ); + cata::event::make( u_id, mon_zombie, 0 ); achievement_id c_pacifist( "conduct_zero_kills" ); achievement_id c_merciful( "conduct_zero_character_kills" ); @@ -933,7 +933,7 @@ TEST_CASE( "achievements_tracker_in_game", "[stats]" ) send_game_start( get_event_bus(), u_id ); const cata::event avatar_zombie_kill = - cata::event::make( u_id, mon_zombie ); + cata::event::make( u_id, mon_zombie, 0 ); get_event_bus().send( avatar_zombie_kill ); achievement_id c_pacifist( "conduct_zero_kills" ); diff --git a/tools/json_tools/generic_guns_validator.py b/tools/json_tools/generic_guns_validator.py index 3295d935d6081..f1d138947268a 100755 --- a/tools/json_tools/generic_guns_validator.py +++ b/tools/json_tools/generic_guns_validator.py @@ -126,6 +126,15 @@ def items_for_which_all_ancestors(items, pred): return result +def blacklisted_items(data): + blacklists = items_of_type(data, 'ITEM_BLACKLIST') + items = set() + for blacklist in blacklists: + if 'items' in blacklist: + items.update(set(blacklist['items'])) + return items + + def main(): core_data, core_errors = util.import_data() print('Importing Generic Guns data from %r' % GG_DIR) @@ -136,6 +145,7 @@ def main(): sys.exit(1) gg_migrations = get_ids(items_of_type(gg_data, 'MIGRATION')) + gg_blacklist = blacklisted_items(gg_data) core_guns = items_of_type(core_data, 'GUN') @@ -192,7 +202,7 @@ def is_bullet(i): returncode = 0 def check_missing(items, name): - ids = get_ids(items) - ID_WHITELIST + ids = get_ids(items) - ID_WHITELIST - gg_blacklist missing_migrations = ids - gg_migrations if missing_migrations: