From 622d18e5fd478c940bd09ac146709cba77a5568c Mon Sep 17 00:00:00 2001 From: "Clarence \"Sparr\" Risher" Date: Sat, 19 Oct 2024 11:55:51 -0400 Subject: [PATCH 01/14] Add DECONSTRUCT category, skip in blueprint calculations, deprioritize DECORATE --- data/json/construction_category.json | 5 + data/json/deconstruction.json | 152 +++++++++++++-------------- src/construction.cpp | 77 ++++++++++---- 3 files changed, 135 insertions(+), 99 deletions(-) diff --git a/data/json/construction_category.json b/data/json/construction_category.json index 0e540061b836a..e31311a52f5fc 100644 --- a/data/json/construction_category.json +++ b/data/json/construction_category.json @@ -65,6 +65,11 @@ "id": "OTHER", "name": "Others" }, + { + "type": "construction_category", + "id": "DECONSTRUCT", + "name": "Deconstructions" + }, { "//": "Should be last in the list", "type": "construction_category", diff --git a/data/json/deconstruction.json b/data/json/deconstruction.json index 8c37b3cf0a3e2..c8d34f1f52013 100644 --- a/data/json/deconstruction.json +++ b/data/json/deconstruction.json @@ -52,7 +52,7 @@ "id": "constr_remove_window_empty", "group": "remove_empty_window", "//": "Removes an empty window frame, leaving bare floor", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 3 ] ], "time": "60 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -65,7 +65,7 @@ "id": "constr_remove_metal_window_empty", "group": "remove_empty_window", "//": "Removes an empty metal window frame, leaving bare floor", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 3 ] ], "time": "60 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -78,7 +78,7 @@ "id": "constr_remove_concrete_floor", "group": "remove_concrete_floor", "//": "Breaks through the concrete pad, leaving a shallow pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -91,7 +91,7 @@ "id": "constr_remove_t_thconc_floor", "group": "remove_concrete_floor", "//": "Breaks through the concrete pad, leaving a shallow pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -104,7 +104,7 @@ "id": "constr_remove_t_thconc_y_floor", "group": "remove_concrete_floor", "//": "Breaks through the concrete pad, leaving a shallow pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -117,7 +117,7 @@ "id": "constr_remove_t_thconc_r_floor", "group": "remove_concrete_floor", "//": "Breaks through the concrete pad, leaving a shallow pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -130,7 +130,7 @@ "id": "constr_remove_t_strconc_floor", "group": "remove_reinforced_concrete_floor", "//": "Breaks through the reinforced concrete pad, leaving a deep pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 7 ] ], "time": "180 m", "using": [ [ "concrete_removal_standard", 1 ], [ "metal_removal_standard", 1 ] ], @@ -143,7 +143,7 @@ "id": "constr_remove_t_strconc_floor_halfway", "group": "remove_reinforced_concrete_floor", "//": "Breaks through the reinforced concrete pad, leaving a deep pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "80 m", "using": [ [ "concrete_removal_standard", 1 ], [ "metal_removal_standard", 1 ] ], @@ -156,7 +156,7 @@ "id": "constr_remove_w_linoleum_tiles", "group": "remove_linoleum_tiles", "//": "Removes white linoleum tiles from the floor, leaving bare concrete", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 2 ] ], "time": "10 m", "using": [ [ "linoleum_removal_standard", 1 ] ], @@ -169,7 +169,7 @@ "id": "constr_remove_g_linoleum_tiles", "group": "remove_linoleum_tiles", "//": "Removes gray linoleum tiles from the floor, leaving bare concrete", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 2 ] ], "time": "10 m", "using": [ [ "linoleum_removal_standard", 1 ] ], @@ -182,7 +182,7 @@ "id": "constr_remove_floor", "group": "remove_floor", "//": "Prys up the floor boards, leaving dirt", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 3 ] ], "time": "30 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -195,7 +195,7 @@ "id": "constr_remove_wooden_floor", "group": "remove_floor", "//": "Prys up the floor boards, leaving dirt", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 3 ] ], "time": "30 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -208,7 +208,7 @@ "id": "constr_remove_waxed_floor_y", "group": "remove_floor", "//": "Prys up the floor boards, leaving dirt", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 3 ] ], "time": "30 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -221,7 +221,7 @@ "id": "constr_remove_waxed_floor", "group": "remove_floor", "//": "Prys up the floor boards, leaving dirt", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 3 ] ], "time": "30 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -234,7 +234,7 @@ "id": "constr_remove_concrete_wall", "group": "remove_concrete_wall", "//": "Cuts a segment of concrete wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -247,7 +247,7 @@ "id": "constr_remove_simple_concrete_wall", "group": "remove_concrete_wall", "//": "Cuts a segment of concrete wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -260,7 +260,7 @@ "id": "constr_remove_simple_concrete_wall_embrasure", "group": "remove_concrete_wall", "//": "Cuts a segment of concrete wall (with an embrasure) out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -273,7 +273,7 @@ "id": "constr_remove_halfway_concrete_wall", "group": "remove_concrete_wall", "//": "Cuts a segment of half complete concrete wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "50 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -286,7 +286,7 @@ "id": "constr_remove_halfway_reinforced_concrete_wall", "group": "remove_reinforced_concrete_wall", "//": "Cuts a segment of half complete reinforced concrete wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "50 m", "using": [ [ "concrete_removal_standard", 1 ], [ "metal_removal_standard", 1 ] ], @@ -303,7 +303,7 @@ "id": "constr_remove_reinforced_concrete_wall", "group": "remove_reinforced_concrete_wall", "//": "Cuts a segment of reinforced concrete wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ], [ "metal_removal_standard", 1 ] ], @@ -320,7 +320,7 @@ "id": "constr_remove_reinforced_concrete_wall_embrasure", "group": "remove_reinforced_concrete_wall", "//": "Cuts a segment of reinforced concrete wall (with an embrasure) out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ], [ "metal_removal_standard", 1 ] ], @@ -337,7 +337,7 @@ "id": "constr_remove_wall_r", "group": "remove_wall", "//": "Cuts a segment of wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -350,7 +350,7 @@ "id": "constr_remove_wall_w", "group": "remove_wall", "//": "Cuts a segment of wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -363,7 +363,7 @@ "id": "constr_remove_wall_b", "group": "remove_wall", "//": "Cuts a segment of wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -376,7 +376,7 @@ "id": "constr_remove_wall_g", "group": "remove_wall", "//": "Cuts a segment of wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -389,7 +389,7 @@ "id": "constr_remove_wall_y", "group": "remove_wall", "//": "Cuts a segment of wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -402,7 +402,7 @@ "id": "constr_remove_wall_P", "group": "remove_wall", "//": "Cuts a segment of wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -415,7 +415,7 @@ "id": "constr_remove_wall_p", "group": "remove_wall", "//": "Cuts a segment of wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -428,7 +428,7 @@ "id": "constr_remove_rock_wall", "group": "remove_rock_wall", "//": "Cuts out a segment of stone wall, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ], [ "survival", 2 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -441,7 +441,7 @@ "id": "constr_remove_rock_wall_embrasure", "group": "remove_rock_wall", "//": "Cuts out a segment of stone wall with embrasure, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ], [ "survival", 2 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -454,7 +454,7 @@ "id": "constr_remove_rock_wall_halfway", "group": "remove_rock_wall", "//": "Cuts out a segment of half complete stone wall, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ], [ "survival", 2 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -467,7 +467,7 @@ "id": "constr_remove_brick_wall", "group": "remove_brick_wall", "//": "Cuts a segment of brick wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -480,7 +480,7 @@ "id": "constr_remove_brick_wall_embrasure", "group": "remove_brick_wall", "//": "Cuts a segment of brick wall with embrasure out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -493,7 +493,7 @@ "id": "constr_remove_brick_wall_halfway", "group": "remove_brick_wall", "//": "Cuts a segment of half complete brick wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -506,7 +506,7 @@ "id": "constr_remove_adobe_brick_wall", "group": "remove_brick_wall", "//": "Cuts a segment of adobe brick wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -519,7 +519,7 @@ "id": "constr_remove_adobe_brick_wall_halfway", "group": "remove_brick_wall", "//": "Cuts a segment of half complete adobe brick wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -532,7 +532,7 @@ "id": "constr_remove_adobe_brick_wall_embrasure", "group": "remove_brick_wall", "//": "Cuts a segment of adobe brick wall with embrasure out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "concrete_removal_standard", 1 ] ], @@ -545,7 +545,7 @@ "id": "constr_remove_wooden_wall", "group": "remove_wooden_wall", "//": "Cuts a segment of wooden wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -558,7 +558,7 @@ "id": "constr_remove_wooden_wall_chipped", "group": "remove_wooden_wall", "//": "Cuts a segment of chipped wooden wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -571,7 +571,7 @@ "id": "constr_remove_wooden_wall_broken", "group": "remove_wooden_wall", "//": "Cuts a segment of broken wooden wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "40 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -584,7 +584,7 @@ "id": "constr_remove_wooden_wall_embrasure", "group": "remove_wooden_wall", "//": "Cuts a segment of wooden wall with embrasure out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -597,7 +597,7 @@ "id": "constr_remove_wooden_wall_wide_opening", "group": "remove_wooden_wall", "//": "Cuts a segment of wooden wall with wide opening out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "60 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -610,7 +610,7 @@ "id": "constr_remove_wooden_wall_halfway", "group": "remove_wooden_wall", "//": "Cuts a segment of half complete wooden wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "40 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -627,7 +627,7 @@ "id": "constr_remove_log_wall", "group": "remove_wooden_wall", "//": "Cuts a segment of log wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -640,7 +640,7 @@ "id": "constr_remove_log_wall_chipped", "group": "remove_wooden_wall", "//": "Cuts a segment of a chipped log wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -653,7 +653,7 @@ "id": "constr_remove_log_wall_broken", "group": "remove_wooden_wall", "//": "Cuts a segment of broken log wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "60 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -666,7 +666,7 @@ "id": "constr_remove_log_wall_embrasure", "group": "remove_wooden_wall", "//": "Cuts a segment of log wall with embrasure out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -679,7 +679,7 @@ "id": "constr_remove_log_wall_widened", "group": "remove_wooden_wall", "//": "Cuts a segment of log wall with a wide opening out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "60 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -692,7 +692,7 @@ "id": "constr_remove_log_wall_half", "group": "remove_wooden_wall", "//": "Cuts a segment of half complete log wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "30 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -705,7 +705,7 @@ "id": "constr_remove_palisade_wall", "group": "remove_wooden_wall", "//": "Cuts a segment of palisade wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -718,7 +718,7 @@ "id": "constr_remove_palisade_embrasure", "group": "remove_wooden_wall", "//": "Cuts a segment of palisade wall with embrasure out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -731,7 +731,7 @@ "id": "constr_remove_palisade_gate", "group": "remove_wooden_wall", "//": "Cuts a segment of palisade gate out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 5 ] ], "time": "90 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -744,7 +744,7 @@ "id": "constr_remove_wall", "group": "remove_wall", "//": "Cuts a segment of wall out very neatly, and then breaks it apart for disposal.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "120 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -757,7 +757,7 @@ "id": "constr_remove_sidewalk", "group": "remove_roadway", "//": "Breaks through the sidewalk, leaving a shallow pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "120 m", "using": [ [ "road_removal_standard", 1 ] ], @@ -770,7 +770,7 @@ "id": "constr_remove_pavement", "group": "remove_roadway", "//": "Breaks through the pavement, leaving a shallow pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "30 m", "using": [ [ "road_removal_standard", 1 ] ], @@ -783,7 +783,7 @@ "id": "constr_remove_pavement_y", "group": "remove_roadway", "//": "Breaks through the pavement, leaving a shallow pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "30 m", "using": [ [ "road_removal_standard", 1 ] ], @@ -796,7 +796,7 @@ "id": "constr_remove_zebra", "group": "remove_roadway", "//": "Breaks through the pavement, leaving a shallow pit", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 6 ] ], "time": "30 m", "using": [ [ "road_removal_standard", 1 ] ], @@ -809,7 +809,7 @@ "id": "constr_remove_metal_door_frame", "group": "remove_metal_door", "//": "Removes a metal door frame", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 2 ] ], "time": "15 m", "using": [ [ "metal_removal_standard", 1 ] ], @@ -822,7 +822,7 @@ "id": "constr_remove_metal_door", "group": "remove_metal_door", "//": "Removes a metal door", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "metal_removal_standard", 1 ] ], @@ -835,7 +835,7 @@ "id": "constr_remove_metal_door_peephole", "group": "remove_metal_door", "//": "Removes a metal door with a peephole", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "metal_removal_standard", 1 ] ], @@ -853,7 +853,7 @@ "id": "constr_remove_metal_door_locked", "group": "remove_metal_door", "//": "Removes a metal door", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "metal_removal_standard", 1 ] ], @@ -866,7 +866,7 @@ "id": "constr_remove_metal_door_lab", "group": "remove_metal_door", "//": "Removes a metal door", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "metal_removal_standard", 1 ] ], @@ -879,7 +879,7 @@ "id": "constr_remove_reb_cage", "group": "remove_rebar_cage", "//": "Remove a Rebar cage", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 3 ] ], "time": "20 m", "using": [ [ "metal_removal_standard", 1 ] ], @@ -892,7 +892,7 @@ "id": "constr_remove_reb_cage_floor", "group": "remove_rebar_cage", "//": "Remove a Rebar floor cage", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 3 ] ], "time": "20 m", "using": [ [ "metal_removal_standard", 1 ] ], @@ -910,7 +910,7 @@ "id": "constr_remove_column_halfway", "group": "remove_concrete_column", "//": "Variant 1: foundation", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "40 m", "using": [ [ "concrete_removal_standard", 1 ], [ "metal_removal_standard", 1 ] ], @@ -923,7 +923,7 @@ "id": "constr_remove_column", "group": "remove_concrete_column", "//": "Variant 2: Finished column", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "70 m", "using": [ [ "concrete_removal_standard", 1 ], [ "metal_removal_standard", 1 ] ], @@ -936,7 +936,7 @@ "id": "constr_remove_reinforced_glass", "group": "remove_glass_wall", "//": "Removes a reinforced glass wall", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -949,7 +949,7 @@ "id": "constr_remove_glass_wall", "group": "remove_glass_wall", "//": "Removes a glass wall", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -962,7 +962,7 @@ "id": "constr_remove_glass_door", "group": "remove_glass_door", "//": "Removes a glass door", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -975,7 +975,7 @@ "id": "constr_remove_glass_frosted_door", "group": "remove_glass_door", "//": "Removes a frosted glass door", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -988,7 +988,7 @@ "id": "constr_remove_glass_door_lab", "group": "remove_glass_door", "//": "Removes a lab glass door", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -1001,7 +1001,7 @@ "id": "constr_remove_glass_frosted_door_lab", "group": "remove_glass_door", "//": "Removes a frosted lab glass door", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -1014,7 +1014,7 @@ "id": "constr_remove_reinforced_glass_door", "group": "remove_glass_door", "//": "Removes a reinforced glass door", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -1027,7 +1027,7 @@ "id": "constr_remove_reinforced_glass_door_lab", "group": "remove_glass_door", "//": "Removes a reinforced lab glass door", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 4 ] ], "time": "10 m", "using": [ [ "wall_floor_glass_removal_standard", 1 ] ], @@ -1040,7 +1040,7 @@ "id": "constr_remove_object_fireplace", "group": "deconstruct_fireplace", "//": "Breaks a fireplace apart giving you back most of the bricks used in its construction.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "fabrication", 2 ] ], "time": "90 m", "using": [ [ "cement_removal", 1 ] ], @@ -1053,7 +1053,7 @@ "id": "constr_extract_teeth", "group": "remove_wall", "//": "Extract some impossibly-sharp teeth for later use.", - "category": "CONSTRUCT", + "category": "DECONSTRUCT", "required_skills": [ [ "survival", 4 ] ], "time": "90 m", "using": [ [ "nm_teeth_removal", 1 ] ], diff --git a/src/construction.cpp b/src/construction.cpp index 02e73730a1307..273a12d6bc241 100644 --- a/src/construction.cpp +++ b/src/construction.cpp @@ -80,6 +80,8 @@ static const activity_id ACT_MULTIPLE_CONSTRUCTION( "ACT_MULTIPLE_CONSTRUCTION" static const construction_category_id construction_category_ALL( "ALL" ); static const construction_category_id construction_category_APPLIANCE( "APPLIANCE" ); +static const construction_category_id construction_category_DECONSTRUCT( "DECONSTRUCT" ); +static const construction_category_id construction_category_DECORATE( "DECORATE" ); static const construction_category_id construction_category_FILTER( "FILTER" ); static const construction_category_id construction_category_REPAIR( "REPAIR" ); @@ -2551,40 +2553,69 @@ build_reqs get_build_reqs_for_furn_ter_ids( total_builds[build.id] += count; std::string build_pre_ter = build.pre_terrain; while( !build_pre_ter.empty() ) { - for( const construction &pre_build : constructions ) { - if( pre_build.category == construction_category_REPAIR ) { - continue; - } - if( ( pre_build.post_terrain.empty() || - ( !pre_build.post_is_furniture && - ter_id( pre_build.post_terrain ) != base_ter ) ) && - ( pre_build.pre_terrain.empty() || - ( pre_build.post_is_furniture && - ter_id( pre_build.pre_terrain ) == base_ter ) ) && - pre_build.post_terrain == build_pre_ter && - pre_build.pre_terrain != build.post_terrain ) { - if( total_builds.find( pre_build.id ) == total_builds.end() ) { - total_builds[pre_build.id] = 0; + bool found_pre = false; + // only consider DECORATE constructions if there's no other way to build the target + // this will allow painting walls, but will skip un-painting walls as a way to make a wall + for( bool allow_decorate : { + false, true + } ) { + for( const construction &pre_build : constructions ) { + if( ( pre_build.category == construction_category_DECORATE ) != allow_decorate ) { + continue; + } + if( pre_build.category == construction_category_REPAIR ) { + continue; + } + if( ( pre_build.post_terrain.empty() || + ( !pre_build.post_is_furniture && + ter_id( pre_build.post_terrain ) != base_ter ) ) && + ( pre_build.pre_terrain.empty() || + ( pre_build.post_is_furniture && + ter_id( pre_build.pre_terrain ) == base_ter ) ) && + pre_build.post_terrain == build_pre_ter && + pre_build.pre_terrain != build.post_terrain ) { + if( total_builds.find( pre_build.id ) == total_builds.end() ) { + total_builds[pre_build.id] = 0; + } + total_builds[pre_build.id] += count; + build_pre_ter = pre_build.pre_terrain; + found_pre = true; + break; } - total_builds[pre_build.id] += count; - build_pre_ter = pre_build.pre_terrain; + } + if( found_pre ) { break; } } - break; + if( !found_pre ) { + break; + } } }; // go through the list of terrains and add their constructions and any pre-constructions // to the map of total builds for( const auto &ter_data : changed_ids.first ) { - for( const construction &build : constructions ) { - if( build.post_terrain.empty() || build.post_is_furniture || - build.category == construction_category_REPAIR ) { - continue; + bool found = false; + // only consider DECORATE constructions if there's no other way to build the target + // this will allow painting walls, but will skip un-painting walls as a way to make a wall + for( bool allow_decorate : { + false, true + } ) { + for( const construction &build : constructions ) { + if( build.post_terrain.empty() || build.post_is_furniture || + build.category == construction_category_REPAIR || + build.category == construction_category_DECONSTRUCT || + ( build.category == construction_category_DECORATE ) != allow_decorate ) { + continue; + } + if( ter_id( build.post_terrain ) == ter_data.first ) { + add_builds( build, ter_data.second ); + found = true; + break; + } } - if( ter_id( build.post_terrain ) == ter_data.first ) { - add_builds( build, ter_data.second ); + if( found ) { break; } } From 1fd3929392a635a4cb19ea90aa13c7eb242a6b88 Mon Sep 17 00:00:00 2001 From: "Clarence \"Sparr\" Risher" Date: Sat, 19 Oct 2024 23:44:06 -0400 Subject: [PATCH 02/14] Eliminate faction camp storage zones cache --- src/basecamp.cpp | 17 +++++++---------- src/basecamp.h | 10 +--------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/basecamp.cpp b/src/basecamp.cpp index efb7ee6b15f02..bfa2d9bfd7d2c 100644 --- a/src/basecamp.cpp +++ b/src/basecamp.cpp @@ -704,21 +704,18 @@ void basecamp::form_storage_zones( map &here, const tripoint_abs_ms &abspos ) 60, get_owner() ); // Find the nearest unsorted zone to dump objects at if( !zones.empty() ) { - if( zones != storage_zones ) { - std::unordered_set src_set; - for( const zone_data *zone : zones ) { - for( const tripoint_abs_ms &p : tripoint_range( - zone->get_start_point(), zone->get_end_point() ) ) { - src_set.emplace( p ); - } + std::unordered_set src_set; + for( const zone_data *zone : zones ) { + for( const tripoint_abs_ms &p : tripoint_range( + zone->get_start_point(), zone->get_end_point() ) ) { + src_set.emplace( p ); } - set_storage_tiles( src_set ); } + set_storage_tiles( src_set ); src_loc = here.bub_from_abs( zones.front()->get_center_point() ); - set_storage_zone( zones ); } map &here = get_map(); - for( const zone_data *zone : storage_zones ) { + for( const zone_data *zone : zones ) { if( zone->get_type() == zone_type_CAMP_STORAGE ) { for( const tripoint_abs_ms &p : tripoint_range( zone->get_start_point(), zone->get_end_point() ) ) { diff --git a/src/basecamp.h b/src/basecamp.h index 94f61547adfbd..e61591ddd5972 100644 --- a/src/basecamp.h +++ b/src/basecamp.h @@ -467,17 +467,9 @@ class basecamp void serialize( JsonOut &json ) const; void deserialize( const JsonObject &data ); void load_data( const std::string &data ); - inline const std::vector &get_storage_zone() const { - return storage_zones; - } - // dumping spot in absolute co-ords - inline void set_storage_zone( const std::vector &zones ) { - storage_zones = zones; - } inline const std::unordered_set &get_storage_tiles() const { return src_set; } - // dumping spot in absolute co-ords inline void set_storage_tiles( const std::unordered_set &tiles ) { src_set = tiles; } @@ -504,10 +496,10 @@ class basecamp std::map expansions; comp_list camp_workers; // NOLINT(cata-serialize) basecamp_map camp_map; // NOLINT(cata-serialize) + // dumping spot in absolute co-ords tripoint_abs_ms dumping_spot; // Tiles inside STORAGE-type zones that have LIQUIDCONT terrain std::vector liquid_dumping_spots; - std::vector storage_zones; // NOLINT(cata-serialize) std::unordered_set src_set; // NOLINT(cata-serialize) std::set fuel_types; // NOLINT(cata-serialize) std::vector fuels; // NOLINT(cata-serialize) From 6c942d6474e076b89afa16b22afd22c01e79176d Mon Sep 17 00:00:00 2001 From: "Clarence \"Sparr\" Risher" Date: Sun, 20 Oct 2024 14:29:14 -0400 Subject: [PATCH 03/14] No free wiring in log walls --- data/json/furniture_and_terrain/terrain-walls.json | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/data/json/furniture_and_terrain/terrain-walls.json b/data/json/furniture_and_terrain/terrain-walls.json index 94a7766c6a273..1f0f992ae2ca0 100644 --- a/data/json/furniture_and_terrain/terrain-walls.json +++ b/data/json/furniture_and_terrain/terrain-walls.json @@ -2321,17 +2321,7 @@ "roof": "t_wood_roof", "connect_groups": "WALL", "connects_to": "WALL", - "flags": [ - "FLAMMABLE", - "NOITEM", - "SUPPORTS_ROOF", - "WALL", - "NO_SCENT", - "AUTO_WALL_SYMBOL", - "MINEABLE", - "BLOCK_WIND", - "WIRED_WALL" - ], + "flags": [ "FLAMMABLE", "NOITEM", "SUPPORTS_ROOF", "WALL", "NO_SCENT", "AUTO_WALL_SYMBOL", "MINEABLE", "BLOCK_WIND" ], "bash": { "str_min": 60, "str_max": 180, From 5add4c10d03c05cf8721190153d6832271823b0a Mon Sep 17 00:00:00 2001 From: "Standing-StormStanding-Storm git config --global user.name Standing-Storm git config --global user.name Standing-Storm" Date: Mon, 21 Oct 2024 12:41:55 -0500 Subject: [PATCH 04/14] Initial commit --- .../{eoc_dummy_mod_interactions.json => eoc_dummy.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename data/mods/MindOverMatter/effectoncondition/{eoc_dummy_mod_interactions.json => eoc_dummy.json} (100%) diff --git a/data/mods/MindOverMatter/effectoncondition/eoc_dummy_mod_interactions.json b/data/mods/MindOverMatter/effectoncondition/eoc_dummy.json similarity index 100% rename from data/mods/MindOverMatter/effectoncondition/eoc_dummy_mod_interactions.json rename to data/mods/MindOverMatter/effectoncondition/eoc_dummy.json From c264a0fc0f70cde9a7c3146382f32f5c11451086 Mon Sep 17 00:00:00 2001 From: RenechCDDA <84619419+RenechCDDA@users.noreply.github.com> Date: Sun, 20 Oct 2024 07:37:37 -0400 Subject: [PATCH 05/14] Debug radiation on characters and map tiles --- data/raw/keybindings.json | 7 +++++++ src/debug_menu.cpp | 10 +++++++++- src/editmap.cpp | 15 ++++++++++++++- src/editmap.h | 1 + 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/data/raw/keybindings.json b/data/raw/keybindings.json index 6fd1ea00fbc14..b2425a9aa1d4d 100644 --- a/data/raw/keybindings.json +++ b/data/raw/keybindings.json @@ -2021,6 +2021,13 @@ "name": "Edit fields", "bindings": [ { "input_method": "keyboard_any", "key": "f" } ] }, + { + "type": "keybinding", + "id": "EDIT_RADS", + "category": "EDITMAP", + "name": "Edit radiation", + "bindings": [ { "input_method": "keyboard_any", "key": "a" } ] + }, { "type": "keybinding", "id": "EDIT_TERRAIN", diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index b127553a1eb63..b0ed997a09aa0 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -2249,7 +2249,7 @@ static void character_edit_menu() } enum { - D_DESC, D_SKILLS, D_THEORY, D_PROF, D_STATS, D_SPELLS, D_ITEMS, D_DELETE_ITEMS, D_DROP_ITEMS, D_ITEM_WORN, + D_DESC, D_SKILLS, D_THEORY, D_PROF, D_STATS, D_SPELLS, D_ITEMS, D_DELETE_ITEMS, D_DROP_ITEMS, D_ITEM_WORN, D_RADS, D_HP, D_STAMINA, D_MORALE, D_PAIN, D_NEEDS, D_NORMALIZE_BODY, D_HEALTHY, D_STATUS, D_MISSION_ADD, D_MISSION_EDIT, D_TELE, D_MUTATE, D_BIONICS, D_CLASS, D_ATTITUDE, D_OPINION, D_PERSONALITY, D_ADD_EFFECT, D_ASTHMA, D_PRINT_VARS, D_WRITE_EOCS, D_KILL_XP, D_CHECK_TEMP, D_EDIT_VARS, D_FACTION @@ -2265,6 +2265,7 @@ static void character_edit_menu() nmenu.addentry( D_DELETE_ITEMS, true, 'd', "%s", _( "Delete (all) items" ) ); nmenu.addentry( D_DROP_ITEMS, true, 'D', "%s", _( "Drop items" ) ); nmenu.addentry( D_ITEM_WORN, true, 'w', "%s", _( "Wear/wield an item from player's inventory" ) ); + nmenu.addentry( D_RADS, true, 'r', "%s", _( "Set radiation" ) ); nmenu.addentry( D_HP, true, 'h', "%s", _( "Set hit points" ) ); nmenu.addentry( D_STAMINA, true, 'S', "%s", _( "Set stamina" ) ); nmenu.addentry( D_MORALE, true, 'o', "%s", _( "Set morale" ) ); @@ -2347,6 +2348,13 @@ static void character_edit_menu() } } break; + case D_RADS: { + int value; + if( query_int( value, _( "Set rads to? Currently: %d" ), you.get_rad() ) ) { + you.set_rad( value ); + } + } + break; case D_HP: character_edit_hp_menu( you ); break; diff --git a/src/editmap.cpp b/src/editmap.cpp index 19b2732ee83a5..5dbd222505514 100644 --- a/src/editmap.cpp +++ b/src/editmap.cpp @@ -359,6 +359,7 @@ std::optional editmap::edit() ctxt.register_action( "LEVEL_DOWN" ); ctxt.register_action( "EDIT_TRAPS" ); ctxt.register_action( "EDIT_FIELDS" ); + ctxt.register_action( "EDIT_RADS" ); ctxt.register_action( "EDIT_TERRAIN" ); ctxt.register_action( "EDIT_FURNITURE" ); ctxt.register_action( "EDIT_OVERMAP" ); @@ -393,9 +394,10 @@ std::optional editmap::edit() // \u00A0 is the non-breaking space info_txt_curr = string_format( pgettext( "keybinding descriptions", - "%s, %s, [%s,%s,%s,%s]\u00A0fast scroll, %s, %s, %s, %s, %s, %s" ), + "%s, %s, %s, [%s,%s,%s,%s]\u00A0fast scroll, %s, %s, %s, %s, %s, %s" ), ctxt.describe_key_and_name( "EDIT_TRAPS" ), ctxt.describe_key_and_name( "EDIT_FIELDS" ), + ctxt.describe_key_and_name( "EDIT_RADS" ), ctxt.get_desc( "LEFT_WIDE", 1 ), ctxt.get_desc( "RIGHT_WIDE", 1 ), ctxt.get_desc( "UP_WIDE", 1 ), ctxt.get_desc( "DOWN_WIDE", 1 ), ctxt.describe_key_and_name( "EDITMAP_SHOW_ALL" ), @@ -417,6 +419,8 @@ std::optional editmap::edit() edit_feature(); } else if( action == "EDIT_FIELDS" ) { edit_fld(); + } else if( action == "EDIT_RADS" ) { + edit_rads(); } else if( action == "EDIT_ITEMS" ) { edit_itm(); } else if( action == "EDIT_TRAPS" ) { @@ -1211,6 +1215,15 @@ void editmap::setup_fmenu( uilist &fmenu ) } } +void editmap::edit_rads() const +{ + map &here = get_map(); + int value = 0; + if( query_int( value, _( "Set rads to? Currently: %d" ), here.get_radiation( target ) ) ) { + here.set_radiation( target, value ); + } +} + void editmap::edit_fld() { uilist fmenu; diff --git a/src/editmap.h b/src/editmap.h index a6afb6a2bb72b..f89dab7f74bc2 100644 --- a/src/editmap.h +++ b/src/editmap.h @@ -58,6 +58,7 @@ class editmap template void edit_feature(); void edit_fld(); + void edit_rads() const; void edit_itm(); void edit_critter( Creature &critter ); void edit_mapgen(); From 9389fa3f42e99bdeec7187fd814c081d9e98c0d5 Mon Sep 17 00:00:00 2001 From: Valiant Date: Tue, 22 Oct 2024 10:54:14 +0400 Subject: [PATCH 06/14] Changed symbol for ladder up --- data/json/mapgen/military/mil_base/mil_base_z0.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/json/mapgen/military/mil_base/mil_base_z0.json b/data/json/mapgen/military/mil_base/mil_base_z0.json index 3be4f044530e5..72cdf04178af1 100644 --- a/data/json/mapgen/military/mil_base/mil_base_z0.json +++ b/data/json/mapgen/military/mil_base/mil_base_z0.json @@ -907,7 +907,7 @@ "x,,,,b ,,, Xssssssssssss8888ssX sss_______yy_______sss ", "x,,,,b,,,, XssssssssssssssssssX sss_______yy_______sss ", "x ,, b ,,, XssssssssssssssssssX sss________________sss ", - "x ,, b,,,, XssssUsssssss8888ssX sss_______yy_______sss ", + "x ,, b,,,, Xssss№sssssss8888ssX sss_______yy_______sss ", "x ,, b ,,, XsssZssssZsssdJJ8ssX sss_______yy_______sss ", "x,,, b,,, Xssssssssssss8888ssX sss_______yy_______sss ", "x,,,,b ,,, XssssssssssssssssssX sss________________sss ", @@ -964,7 +964,7 @@ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxG" ], "palettes": [ "mil_base_palette" ], - "terrain": { "U": "t_ladder_up" }, + "terrain": { "№": "t_ladder_up" }, "items": { "n": [ { "item": "mil_base_casing_hmg", "chance": 50, "repeat": [ 50, 100 ] } ], ";": [ { "item": "mil_base_bodybag", "chance": 90 } ], From 4eefcce244cb575ece839c625c334ce048057d3b Mon Sep 17 00:00:00 2001 From: Benjamin Mauer Date: Tue, 22 Oct 2024 04:01:54 -0400 Subject: [PATCH 07/14] Removes the hoodie pocket from cropped hoodies Adds a delete entry to cropped hoodies for the pockets flag, as they physically lack the area where the kangaroo pocket is. --- data/json/items/armor/torso_clothes.json | 1 + 1 file changed, 1 insertion(+) diff --git a/data/json/items/armor/torso_clothes.json b/data/json/items/armor/torso_clothes.json index d24c25f34043e..1936d5519a8cc 100644 --- a/data/json/items/armor/torso_clothes.json +++ b/data/json/items/armor/torso_clothes.json @@ -921,6 +921,7 @@ { "id": "hoodie_cropped", "copy-from": "hoodie", + "delete": { "flags": [ "POCKETS" ] }, "type": "ARMOR", "name": { "str": "cropped hoodie" }, "description": "A sweatshirt with a hood, cropped to expose the stomach.", From b26af4580d566700ca0c7321f2bb5dbf15a73f58 Mon Sep 17 00:00:00 2001 From: Valiant Date: Tue, 22 Oct 2024 12:57:50 +0400 Subject: [PATCH 08/14] Do not exit early from `handle_failure` function is there's `breakable` field isn't defined for furniture/terrain Instead, make all calculations for bashing furniture/terrain on failure only if `breakable` field is defined, and print failure message regardless of that check. --- src/activity_actor.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp index 6ac06a507caf1..6a808456efb12 100644 --- a/src/activity_actor.cpp +++ b/src/activity_actor.cpp @@ -5941,23 +5941,21 @@ void prying_activity_actor::handle_prying( Character &who ) }; auto handle_failure = [&]( const pry_data & pdata ) -> void { - if( !pdata.breakable ) + if( pdata.breakable ) { - return; - } - - int difficulty = pdata.difficulty; - difficulty -= tool->get_quality( qual_PRY ) - pdata.prying_level; - - /** @EFFECT_MECHANICS reduces chance of breaking when prying */ - const int dice_mech = dice( 2, static_cast( round( who.get_skill_level( skill_mechanics ) ) ) ); - /** @ARM_STR reduces chance of breaking when prying */ - const int dice_str = dice( 2, who.get_arm_str() ); - - if( dice( 4, difficulty ) > dice_mech + dice_str ) - { - // bash will always succeed - here.bash( target, 0, false, true ); + int difficulty = pdata.difficulty; + difficulty -= tool->get_quality( qual_PRY ) - pdata.prying_level; + + /** @EFFECT_MECHANICS reduces chance of breaking when prying */ + const int dice_mech = dice( 2, + static_cast( round( who.get_skill_level( skill_mechanics ) ) ) ); + /** @ARM_STR reduces chance of breaking when prying */ + const int dice_str = dice( 2, who.get_arm_str() ); + + if( dice( 4, difficulty ) > dice_mech + dice_str ) { + // bash will always succeed + here.bash( target, 0, false, true ); + } } if( !data->prying_data().failure.empty() ) From 42d987963ea2dd632674c479acde981df80892dc Mon Sep 17 00:00:00 2001 From: John Candlebury Date: Tue, 22 Oct 2024 09:18:27 -0600 Subject: [PATCH 09/14] Audit Inheritable flags for exosuits. --- data/json/flags.json | 48 +++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/data/json/flags.json b/data/json/flags.json index ffda206818e2d..abf073737d227 100644 --- a/data/json/flags.json +++ b/data/json/flags.json @@ -512,7 +512,8 @@ "id": "FRAGILE", "type": "json_flag", "info": "This gear is fragile and won't protect you for long.", - "conflicts": [ "STURDY" ] + "conflicts": [ "STURDY" ], + "inherit": false }, { "id": "FRAGILE_MELEE", @@ -920,7 +921,8 @@ "id": "STURDY", "type": "json_flag", "info": "This clothing will protect you from harm and withstand a lot of abuse.", - "conflicts": [ "FRAGILE" ] + "conflicts": [ "FRAGILE" ], + "inherit": false }, { "id": "SUN_GLASSES", @@ -2210,72 +2212,86 @@ { "id": "EXO_SMALL", "type": "json_flag", - "info": "This is meant for a small exosuit hardpoint." + "info": "This is meant for a small exosuit hardpoint.", + "inherit": false }, { "id": "EXO_LARGE", "type": "json_flag", - "info": "This is meant for a large exosuit hardpoint." + "info": "This is meant for a large exosuit hardpoint.", + "inherit": false }, { "id": "EXO_PSU", "type": "json_flag", - "info": "This is meant for an exosuit PSU hardpoint." + "info": "This is meant for an exosuit PSU hardpoint.", + "inherit": false }, { "id": "EXO_SMALL_GADGET", "type": "json_flag", - "info": "This is meant for small exosuit gadgets, 1 L or less." + "info": "This is meant for small exosuit gadgets, 1 L or less.", + "inherit": false }, { "id": "EXO_HELMET_GADGET", "type": "json_flag", - "info": "This is meant for helmet-specific gadgets." + "info": "This is meant for helmet-specific gadgets.", + "inherit": false }, { "id": "EXO_MEDIUM_GADGET", "type": "json_flag", - "info": "This is meant for medium exosuit gadgets, between 1 L and 5 L." + "info": "This is meant for medium exosuit gadgets, between 1 L and 5 L.", + "inherit": false }, { "id": "EXO_LARGE_GADGET", "type": "json_flag", - "info": "This is meant for large exosuit gadgets, larger than 5 L." + "info": "This is meant for large exosuit gadgets, larger than 5 L.", + "inherit": false }, { "id": "EXO_UNDERLAYER", "type": "json_flag", - "info": "This is meant for exosuit underlayers." + "info": "This is meant for exosuit underlayers.", + "inherit": false }, { "id": "EXO_HELMET_PLATE", "type": "json_flag", - "info": "This is meant for exoskeleton helmet plating." + "info": "This is meant for exoskeleton helmet plating.", + "inherit": false }, { "id": "EXO_TORSO_PLATE", "type": "json_flag", - "info": "This is meant for exoskeleton torso plating." + "info": "This is meant for exoskeleton torso plating.", + "inherit": false }, { "id": "EXO_ARM_PLATE", "type": "json_flag", - "info": "This is meant for exoskeleton arm plating." + "info": "This is meant for exoskeleton arm plating.", + "inherit": false }, { "id": "EXO_GLOVE_PLATE", "type": "json_flag", - "info": "This is meant for exoskeleton arm plating." + "info": "This is meant for exoskeleton arm plating.", + "inherit": false }, { "id": "EXO_LEG_PLATE", "type": "json_flag", - "info": "This is meant for exoskeleton leg plating." + "info": "This is meant for exoskeleton leg plating.", + "inherit": false }, { "id": "EXO_BOOT_PLATE", "type": "json_flag", - "info": "This is meant for exoskeleton foot plating." + "info": "This is meant for exoskeleton foot plating.", + "inherit": false }, { "id": "ROBOFAC_ROBOT_MEDIUM", From dc09921ef10bb0e33572d721c989ea8066e41669 Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:15:19 -0500 Subject: [PATCH 10/14] Change sight range --- data/mods/Xedra_Evolved/enchantments/mutations.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/mods/Xedra_Evolved/enchantments/mutations.json b/data/mods/Xedra_Evolved/enchantments/mutations.json index 246c34fc3e127..84ce2bf6cbf28 100644 --- a/data/mods/Xedra_Evolved/enchantments/mutations.json +++ b/data/mods/Xedra_Evolved/enchantments/mutations.json @@ -30,7 +30,7 @@ "type": "enchantment", "id": "EATER_SIXTH_SENSE", "condition": "ALWAYS", - "values": [ { "value": "MAX_MANA", "add": { "math": [ "u_skill('deduction')*50" ] } } ] + "values": [ { "value": "SIGHT_RANGE_NETHER", "add": { "math": [ "u_spell_count('school': 'EATER')" ] } } ] }, { "type": "enchantment", From 99d27e568f594c16626526f5ce90dbf457958079 Mon Sep 17 00:00:00 2001 From: Son Phan Trung Date: Wed, 23 Oct 2024 22:16:05 +0700 Subject: [PATCH 11/14] hide fullscreen option to emscripten builds (#77270) --- src/options.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/options.cpp b/src/options.cpp index e5823e6596a64..33085594d5a14 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -2616,7 +2616,7 @@ void options_manager::add_options_graphics() display_list.front().first, COPT_CURSES_HIDE ); #endif -#if !defined(__ANDROID__) // Android is always fullscreen +#if !defined(__ANDROID__) || !defined(__EMSCRIPTEN__) // Android and Emscripten are always fullscreen add( "FULLSCREEN", page_id, to_translation( "Fullscreen" ), to_translation( "Starts Cataclysm in one of the fullscreen modes. Requires restart." ), { { "no", to_translation( "No" ) }, { "maximized", to_translation( "Maximized" ) }, { "fullscreen", to_translation( "Fullscreen" ) }, { "windowedbl", to_translation( "Windowed borderless" ) } }, From 9e4143a8c1f6a5ce7502cb3b83fbbbdaafbe2f7e Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Wed, 23 Oct 2024 10:41:22 -0500 Subject: [PATCH 12/14] [MoM] Feral psion updates with copy-from (#77259) * Chain-through and add base form * Chain through * Linting --- .../monsters/feral_lab_psychics.json | 283 +- .../monsters/feral_psychics.json | 2857 ++++++----------- 2 files changed, 1135 insertions(+), 2005 deletions(-) diff --git a/data/mods/MindOverMatter/monsters/feral_lab_psychics.json b/data/mods/MindOverMatter/monsters/feral_lab_psychics.json index aca965222287f..143b1cbbe7751 100644 --- a/data/mods/MindOverMatter/monsters/feral_lab_psychics.json +++ b/data/mods/MindOverMatter/monsters/feral_lab_psychics.json @@ -4,204 +4,147 @@ "type": "MONSTER", "name": { "str": "Dr. Brain" }, "description": "An ordinary-looking scientist lost amid the carnage, were it not for the bloodshot eyes, the enlarged cranium, and the fact that the zombies ignore them. Bits of paper and chemistry equipment lazily float in the air near them.", + "copy-from": "mon_feral_psion_default", "//": "This is supposed to be a rare boss kind of monster, with both telepathic and telekinetic abililites, but no tougher than a normal zombie.", "default_faction": "science", - "looks_like": "chud", - "bodytype": "human", "species": [ "FERAL", "TELEKIN_PUSHPULL_NULL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], "symbol": "@", "color": "magenta", - "aggression": 30, - "morale": 100, - "melee_skill": 4, - "melee_dice": 1, - "melee_dice_sides": 3, - "melee_damage": [ { "damage_type": "cut", "amount": 2 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 2, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "path_settings": { "max_dist": 30, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, - "vision_day": 50, - "vision_night": 3, "death_drops": "feral_scientists_death_drops_psychic", "zombify_into": "mon_zombie_scientist", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT", "PLAYER_CLOSE" ], - "special_attacks": [ - [ "PARROT_AT_DANGER", 15 ], - { - "id": "psi_drbrain_flashbang", - "type": "spell", - "spell_data": { "id": "telepathic_confusion_monster", "min_level": 5 }, - "cooldown": { "math": [ "6 + rand(12)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "A roar fills %3$s's mind and the world is blotted out!" - }, - { - "id": "psi_drbrain_blast", - "type": "spell", - "spell_data": { "id": "telepathic_blast_monster", "min_level": 4 }, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s stares at %3$s!" - }, - { - "type": "monster_attack", - "attack_type": "melee", - "id": "mon_telekinetic_mindhammer", - "cooldown": { "math": [ "5 + rand(10)" ] }, - "move_cost": 80, - "range": 6, - "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 25 } ], - "dodgeable": false, - "uncanny_dodgeable": true, - "blockable": false, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "hit_dmg_u": "%1$s stares at you and your %2$s is hammered with psionic force!", - "hit_dmg_npc": "%1$s stares at and their %2$s is hammered with psionic force!", - "miss_msg_u": "%1$s stares at you and you narrowly avoid an unseen attack!", - "miss_msg_npc": "%1$s stares and narrowly avoids an unseen attack!", - "no_dmg_msg_u": "%1$s stares at you, but the telekinetic attack rebounds off your armor.", - "no_dmg_msg_npc": "%1$s stares at , but the telekinetic attack rebounds off their armor." - }, - { - "id": "smash", - "move_cost": 80, - "cooldown": { "math": [ "4 + rand(8)" ] }, - "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 20, "armor_penetration": 10 } ], - "hitsize_min": 12, - "range": 8, - "throw_strength": 70, - "dodgeable": false, - "uncanny_dodgeable": true, - "blockable": false, - "effects_require_dmg": false, - "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, - "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!", - "miss_msg_npc": "%s stares at but nothing happens!" - }, - { - "id": "psi_drbrain_momentum_alteration", - "type": "spell", - "spell_data": { "id": "telekinetic_momentum_monster" }, - "cooldown": 1, - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_momentum_alteration" } } ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 15 ], + { + "id": "psi_drbrain_flashbang", + "type": "spell", + "spell_data": { "id": "telepathic_confusion_monster", "min_level": 5 }, + "cooldown": { "math": [ "6 + rand(12)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "A roar fills %3$s's mind and the world is blotted out!" + }, + { + "id": "psi_drbrain_blast", + "type": "spell", + "spell_data": { "id": "telepathic_blast_monster", "min_level": 4 }, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s stares at %3$s!" + }, + { + "type": "monster_attack", + "attack_type": "melee", + "id": "mon_telekinetic_mindhammer", + "cooldown": { "math": [ "5 + rand(10)" ] }, + "move_cost": 80, + "accuracy": 7, + "range": 6, + "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 25 } ], + "dodgeable": false, + "uncanny_dodgeable": true, + "blockable": false, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "hit_dmg_u": "%1$s stares at you and your %2$s is hammered with psionic force!", + "hit_dmg_npc": "%1$s stares at and their %2$s is hammered with psionic force!", + "miss_msg_u": "%1$s stares at you and you narrowly avoid an unseen attack!", + "miss_msg_npc": "%1$s stares and narrowly avoids an unseen attack!", + "no_dmg_msg_u": "%1$s stares at you, but the telekinetic attack rebounds off your armor.", + "no_dmg_msg_npc": "%1$s stares at , but the telekinetic attack rebounds off their armor." + }, + { + "id": "smash", + "move_cost": 80, + "cooldown": { "math": [ "4 + rand(8)" ] }, + "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 20, "armor_penetration": 10 } ], + "hitsize_min": 12, + "accuracy": 7, + "range": 8, + "throw_strength": 70, + "dodgeable": false, + "uncanny_dodgeable": true, + "blockable": false, + "effects_require_dmg": false, + "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, + "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!", + "miss_msg_npc": "%s stares at but nothing happens!" }, - "monster_message": "The air around %1$s wavers." - }, - { - "id": "psi_drbrain_inertial_barrier", - "type": "spell", - "spell_data": { "id": "telekinetic_barrier_monster" }, - "cooldown": 1, - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_inertial_barrier" } } ] + { + "id": "psi_drbrain_momentum_alteration", + "type": "spell", + "spell_data": { "id": "telekinetic_momentum_monster" }, + "cooldown": 1, + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_momentum_alteration" } } ] + }, + "monster_message": "The air around %1$s wavers." }, - "monster_message": "The air around %1$s distorts." - }, - [ "PULL_METAL_WEAPON", 8 ] - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "TEEP_IMMUNE" - ] + { + "id": "psi_drbrain_inertial_barrier", + "type": "spell", + "spell_data": { "id": "telekinetic_barrier_monster" }, + "cooldown": 1, + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_inertial_barrier" } } ] + }, + "monster_message": "The air around %1$s distorts." + }, + [ "PULL_METAL_WEAPON", 8 ] + ], + "flags": [ "TEEP_IMMUNE", "PUSH_MON" ] + } }, { "id": "mon_feral_security_psychic", "type": "MONSTER", "name": "feral security guard, Ψ Division", "description": "A security guard gone feral, or so you thought. As you look closer, you notice the relatively-normal appearance, the clear eyes, and the patch on their uniform with a Ψ shape in front of the logo of XEDRA. The zombies around them ignore them as they move smoothly and purposefully through the ruins.", + "copy-from": "mon_feral_psion_default", "default_faction": "science", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 110, - "material": [ "flesh" ], + "proportional": { "speed": 1.1 }, + "relative": { "melee_skill": 3, "melee_dice": 1, "dodge": 4 }, "color": "pink", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 6, - "melee_dice": 2, - "melee_dice_sides": 5, - "melee_damage": [ { "damage_type": "bash", "amount": 6 } ], + "melee_damage": [ { "damage_type": "bash", "amount": 3 } ], "attack_cost": 85, "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 5, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 35, - "vision_night": 7, - "path_settings": { "max_dist": 30, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_security_death_drops_psychic", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], - "special_attacks": [ - [ "PARROT_AT_DANGER", 15 ], - { - "id": "smash", - "attack_upper": true, - "throw_strength": 50, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } - }, - [ "BIO_OP_DISARM", 15 ], - { - "id": "bio_op_takedown", - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } - }, - { - "id": "psi_biokin_guard_hardened_skin", - "type": "spell", - "spell_data": { "id": "biokinetic_hardened_skin_monster" }, - "cooldown": 120, - "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_hardened_skin" } } ] }, - "monster_message": "%1$s's skin takes on a slightly waxen appearance." - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PATH_AVOID_FIRE", - "PRIORITIZE_TARGETS", - "STUN_IMMUNE" - ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 15 ], + { + "id": "smash", + "attack_upper": true, + "throw_strength": 50, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } + }, + [ "BIO_OP_DISARM", 15 ], + { + "id": "bio_op_takedown", + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } + }, + { + "id": "psi_biokin_guard_hardened_skin", + "type": "spell", + "spell_data": { "id": "biokinetic_hardened_skin_monster" }, + "cooldown": 120, + "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_hardened_skin" } } ] }, + "monster_message": "%1$s's skin takes on a slightly waxen appearance." + } + ], + "flags": [ "STUN_IMMUNE" ] + } }, { "id": "mon_feral_security_captain_psychic", "type": "MONSTER", "copy-from": "mon_feral_human_bio3", "name": "feral security captain, Ψ Division", - "looks_like": "chud", + "default_faction": "science", "description": "A feral security guard with a military-style uniform, bearing the XEDRA logo and some kind of rank insignia. Their movements are precise, controlled, and inhumanly smooth, and while their eyes are still bloodshot, they have a spark lacking in most ferals you've seen.", "death_drops": "feral_security_captain_death_drops_psychic" } diff --git a/data/mods/MindOverMatter/monsters/feral_psychics.json b/data/mods/MindOverMatter/monsters/feral_psychics.json index eb01eb9e2185c..3098a0c9a1b3c 100644 --- a/data/mods/MindOverMatter/monsters/feral_psychics.json +++ b/data/mods/MindOverMatter/monsters/feral_psychics.json @@ -1,49 +1,10 @@ [ { - "id": "mon_feral_human_bio", + "id": "mon_feral_psion_default", "type": "MONSTER", - "name": "feral adept", - "description": "This feral human moves with a disturbing fluid grace. Despite that, they bear the same crazed expression as all the others.", - "//": "Additional HP, speed, armor, and vision distance due to biokinetic powers", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 110, - "material": [ "flesh" ], - "symbol": "@", - "color": "pink", - "aggression": 30, - "morale": 100, - "melee_skill": 5, - "melee_dice": 2, - "melee_dice_sides": 4, - "melee_damage": [ { "damage_type": "bash", "amount": 3 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 48, - "vision_night": 4, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, - "death_drops": "feral_humans_death_drops_bio", - "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": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } - }, - [ "BIO_OP_DISARM", 10 ] - ], + "copy-from": "mon_feral_human_pipe", + "//": "interstitial copy-from to edit flags and special attacks appropriately", + "special_attacks": [ [ "BROWSE", 100 ], [ "EAT_FOOD", 100 ] ], "flags": [ "SEES", "HEARS", @@ -55,81 +16,78 @@ "CAN_OPEN_DOORS", "PATH_AVOID_DANGER", "PATH_AVOID_FIRE", - "PRIORITIZE_TARGETS" + "PRIORITIZE_TARGETS", + "EATS" ] }, + { + "id": "mon_feral_human_bio", + "type": "MONSTER", + "name": "feral adept", + "description": "This feral human moves with a disturbing fluid grace. Despite that, they bear the same crazed expression as all the others.", + "copy-from": "mon_feral_psion_default", + "proportional": { "speed": 1.1 }, + "relative": { "melee_skill": 2, "melee_dice": 1, "melee_dice_sides": -2, "dodge": 2 }, + "symbol": "@", + "color": "pink", + "melee_damage": [ { "damage_type": "bash", "amount": 3 } ], + "death_drops": "feral_humans_death_drops_bio", + "zombify_into": "mon_zombie_survivor", + "upgrades": { "half_life": 45, "into": "mon_feral_human_bio2" }, + "extend": { + "special_attacks": [ + { + "id": "smash", + "attack_upper": true, + "throw_strength": 30, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } + }, + [ "BIO_OP_DISARM", 10 ] + ] + } + }, { "id": "mon_feral_human_bio2", "type": "MONSTER", "name": { "str": "feral dervish", "str_pl": "feral dervishes" }, "description": "Despite their appearance, this creature moves too quickly and smoothly to be truly human. Bloodshot eyes are the only indicator that they are not some kind of perfectly precise android.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 125, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "proportional": { "speed": 1.25 }, + "relative": { "melee_skill": 4, "melee_dice": 1, "dodge": 4 }, "color": "pink", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 8, - "melee_dice": 2, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "bash", "amount": 6 } ], "attack_cost": 80, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 5, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 50, - "vision_night": 7, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_bio", "zombify_into": "mon_zombie_survivor", - "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": { "math": [ "5 + rand(10)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } - }, - [ "BIO_OP_DISARM", 10 ], - { - "id": "bio_op_takedown", - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } - }, - { - "id": "psi_biokin2_hardened_skin", - "type": "spell", - "spell_data": { "id": "biokinetic_hardened_skin_monster" }, - "cooldown": 1, - "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_hardened_skin" } } ] }, - "monster_message": "%1$s's skin takes on a slightly waxen appearance." - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PATH_AVOID_FIRE", - "PRIORITIZE_TARGETS", - "STUN_IMMUNE" - ] + "extend": { + "special_attacks": [ + { + "id": "smash", + "attack_upper": true, + "throw_strength": 50, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } + }, + [ "BIO_OP_DISARM", 10 ], + { + "id": "bio_op_takedown", + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } + }, + { + "id": "psi_biokin2_hardened_skin", + "type": "spell", + "spell_data": { "id": "biokinetic_hardened_skin_monster" }, + "cooldown": 1, + "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_hardened_skin" } } ] }, + "monster_message": "%1$s's skin takes on a slightly waxen appearance." + } + ], + "flags": [ "STUN_IMMUNE" ] + } }, { "id": "mon_feral_human_bio3", @@ -137,2095 +95,1324 @@ "name": "human whirlwind", "description": "With inhumanly precise movements, this feral moves toward you. They are clearly still alive, but their mouth is closed and their chest does not rise or fall. As you watch, they suddenly blur into rapid motion.", "//": "NO_BREATHE here is due to the biokinetic Sealed System power.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 135, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "proportional": { "speed": 1.35 }, + "relative": { "melee_skill": 6, "melee_dice": 1, "dodge": 6 }, "color": "pink", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 8, - "melee_dice": 2, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "bash", "amount": 8 } ], "attack_cost": 75, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 5, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 55, - "vision_night": 7, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_bio", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], - "special_attacks": [ - [ "PARROT_AT_DANGER", 10 ], - { - "id": "smash", - "attack_upper": true, - "throw_strength": 50, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } ] - } - }, - { - "type": "leap", - "cooldown": { "math": [ "2 + rand(5)" ] }, - "move_cost": 50, - "allow_no_target": true, - "max_range": 5, - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 10 ], + { + "id": "smash", + "attack_upper": true, + "throw_strength": 50, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } ] + } }, - "message": "%1$s moves so quickly your eyes can barely follow them!" - }, - [ "BIO_OP_DISARM", 10 ], - { - "id": "bio_op_takedown", - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } ] - } - }, - { - "id": "psi_biokin3_hardened_skin", - "type": "spell", - "spell_data": { "id": "biokinetic_hardened_skin_monster" }, - "cooldown": 1, - "condition": { - "and": [ - { "not": { "u_has_flag": "NO_PSIONICS" } }, - { "not": { "u_has_effect": "effect_monster_hardened_skin" } }, - { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } - ] + { + "type": "leap", + "cooldown": { "math": [ "2 + rand(5)" ] }, + "move_cost": 50, + "allow_no_target": true, + "max_range": 5, + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } ] + }, + "message": "%1$s moves so quickly your eyes can barely follow them!" }, - "monster_message": "%1$s's skin takes on a slightly waxen appearance." - }, - { - "type": "monster_attack", - "attack_type": "melee", - "id": "psi_biokin3_hurricane_blows_probe", - "cooldown": { "math": [ "15 + rand(30)" ] }, - "move_cost": 100, - "damage_max_instance": [ { "damage_type": "bash", "amount": 0 } ], - "self_effects_always": [ { "id": "effect_psi_biokin3_hurricane_blows", "duration": 0 } ], - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } ] + [ "BIO_OP_DISARM", 10 ], + { + "id": "bio_op_takedown", + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } ] + } }, - "dodgeable": false, - "blockable": false, - "hit_dmg_u": "%1$s blurs as they explode into motion!", - "hit_dmg_npc": "%1$s blurs as they explode into motion!", - "miss_msg_u": "%1$s blurs as they explode into motion!", - "miss_msg_npc": "%1$s blurs as they explode into motion!", - "no_dmg_msg_u": "%1$s blurs as they explode into motion!", - "no_dmg_msg_npc": "%1$s blurs as they explode into motion!" - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PATH_AVOID_FIRE", - "PRIORITIZE_TARGETS", - "NO_BREATHE", - "STUN_IMMUNE" - ] + { + "id": "psi_biokin3_hardened_skin", + "type": "spell", + "spell_data": { "id": "biokinetic_hardened_skin_monster" }, + "cooldown": 1, + "condition": { + "and": [ + { "not": { "u_has_flag": "NO_PSIONICS" } }, + { "not": { "u_has_effect": "effect_monster_hardened_skin" } }, + { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } + ] + }, + "monster_message": "%1$s's skin takes on a slightly waxen appearance." + }, + { + "type": "monster_attack", + "attack_type": "melee", + "id": "psi_biokin3_hurricane_blows_probe", + "cooldown": { "math": [ "15 + rand(30)" ] }, + "move_cost": 100, + "damage_max_instance": [ { "damage_type": "bash", "amount": 0 } ], + "self_effects_always": [ { "id": "effect_psi_biokin3_hurricane_blows", "duration": 0 } ], + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_psi_biokin3_hurricane_blows" } } ] + }, + "dodgeable": false, + "blockable": false, + "hit_dmg_u": "%1$s blurs as they explode into motion!", + "hit_dmg_npc": "%1$s blurs as they explode into motion!", + "miss_msg_u": "%1$s blurs as they explode into motion!", + "miss_msg_npc": "%1$s blurs as they explode into motion!", + "no_dmg_msg_u": "%1$s blurs as they explode into motion!", + "no_dmg_msg_npc": "%1$s blurs as they explode into motion!" + } + ], + "flags": [ "STUN_IMMUNE", "NO_BREATHE" ] + } }, { "id": "mon_feral_human_clair", "type": "MONSTER", "name": "feral seer", "description": "This feral human completely lacks the crazed look most of their compatriots have. Instead, they fix their bloodshot eyes straight at you, seeming to gaze right into your soul, and raise their weapon.", - "//": "Speed bonus here, like HARDTOSHOOT below, does not represent faster physical movement but rather foreseeing the player's actions", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 105, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "relative": { "melee_skill": 1, "dodge": 4, "vision_night": 7 }, "color": "dark_gray", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 4, - "melee_dice": 2, - "melee_dice_sides": 3, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 5, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 45, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, "death_drops": "feral_humans_death_drops_clair", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], - "special_attacks": [ { "id": "feral_weapon_pipe" } ], "upgrades": { "half_life": 45, "into": "mon_feral_human_clair2" }, - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "GOODHEARING", - "HARDTOSHOOT" - ] + "extend": { "special_attacks": [ { "id": "feral_weapon_pipe" } ], "flags": [ "GOODHEARING", "HARDTOSHOOT", "WIELDED_WEAPON" ] } }, { "id": "mon_feral_human_clair2", "type": "MONSTER", "name": { "str": "feral visionary", "str_pl": "feral visionaries" }, "description": "By the time you see this feral, they have already noticed you. They stare straight at you, regardless of obstruction or any obstacle in between, clutching a weapon in one hand.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "relative": { "melee_skill": 3, "dodge": 7, "vision_day": 5, "vision_night": 12 }, "color": "dark_gray", "symbol": "@", - "aggression": 30, "morale": 110, - "melee_skill": 6, - "melee_dice": 3, - "melee_dice_sides": 3, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 8, "armor": { "bullet": 20 }, "//": "Armor here represents knowing where the enemy is going to shoot and not being there, not being literally immune to bullets.", - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 50, - "vision_night": 50, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, "death_drops": "feral_humans_death_drops_clair", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], - "special_attacks": [ - { - "type": "gun", - "cooldown": { "math": [ "2 + rand(4)" ] }, - "move_cost": 150, - "gun_type": "feral_clair_thrown_rock", - "ammo_type": "rock", - "no_ammo_sound": "", - "fake_skills": [ [ "throw", 5 ] ], - "fake_str": 8, - "condition": { "not": { "u_has_effect": "maimed_arm" } }, - "require_targeting_player": false, - "ranges": [ [ 2, 7, "DEFAULT" ] ], - "description": "The feral visionary throws a rock!" - }, - { "id": "feral_weapon_pipe" } - ], "starting_ammo": { "rock": 6 }, "upgrades": { "half_life": 45, "into": "mon_feral_human_clair3" }, - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "DROPS_AMMO", - "WIELDED_WEAPON", - "GOODHEARING", - "HARDTOSHOOT", - "ALL_SEEING" - ] + "extend": { + "special_attacks": [ + { + "type": "gun", + "cooldown": { "math": [ "2 + rand(4)" ] }, + "move_cost": 150, + "gun_type": "feral_clair_thrown_rock", + "ammo_type": "rock", + "no_ammo_sound": "", + "fake_skills": [ [ "throw", 5 ] ], + "fake_str": 8, + "condition": { "not": { "u_has_effect": "maimed_arm" } }, + "require_targeting_player": false, + "ranges": [ [ 2, 7, "DEFAULT" ] ], + "description": "The feral visionary throws a rock!" + }, + { "id": "feral_weapon_pipe" } + ], + "flags": [ "GOODHEARING", "HARDTOSHOOT", "WIELDED_WEAPON", "DROPS_AMMO", "ALL_SEEING" ] + } }, { "id": "mon_feral_human_clair3", "type": "MONSTER", "name": "pattern screamer", "description": "This feral's eyes are closed, but they move with no hesitation, effortlessly avoiding all obstacles in their path, and clutching a large rock in one hand and a long bit of debris in the other. When you look at them, you hear a static crackling, just on the threshold of inaudibility.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "relative": { "melee_skill": 3, "melee_dice": 2, "melee_dice_sides": -3, "dodge": 11, "vision_day": 10, "vision_night": 22 }, "color": "dark_gray", "symbol": "@", - "aggression": 40, "morale": 110, - "melee_skill": 6, - "melee_dice": 3, - "melee_dice_sides": 3, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 12, "armor": { "bullet": 40 }, "//": "Armor here represents knowing where the enemy is going to shoot and not being there, not being literally immune to bullets.", - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 55, - "vision_night": 55, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, "death_drops": "feral_humans_death_drops_clair", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], - "special_attacks": [ - { - "type": "gun", - "cooldown": { "math": [ "2 + rand(4)" ] }, - "move_cost": 150, - "gun_type": "pattern_screamer_thrown_rock", - "ammo_type": "rock", - "no_ammo_sound": "", - "fake_skills": [ [ "throw", 9 ] ], - "fake_str": 10, - "condition": { "not": { "u_has_effect": "maimed_arm" } }, - "require_targeting_player": false, - "ranges": [ [ 2, 10, "DEFAULT" ] ], - "description": "With inhuman accuracy, the pattern screamer throws a rock!" - }, - { "id": "feral_weapon_pipe" }, - { - "id": "psi_pattern_scream", - "type": "spell", - "spell_data": { "id": "telepathic_shrieking_monster", "min_level": 3 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "Static fills your hearing for a moment, blotting out all other sounds!" - } - ], "starting_ammo": { "rock": 6 }, - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "DROPS_AMMO", - "WIELDED_WEAPON", - "GOODHEARING", - "HARDTOSHOOT", - "ALL_SEEING" - ] + "extend": { + "special_attacks": [ + { + "type": "gun", + "cooldown": { "math": [ "2 + rand(4)" ] }, + "move_cost": 150, + "gun_type": "pattern_screamer_thrown_rock", + "ammo_type": "rock", + "no_ammo_sound": "", + "fake_skills": [ [ "throw", 9 ] ], + "fake_str": 10, + "condition": { "not": { "u_has_effect": "maimed_arm" } }, + "require_targeting_player": false, + "ranges": [ [ 2, 10, "DEFAULT" ] ], + "description": "With inhuman accuracy, the pattern screamer throws a rock!" + }, + { "id": "feral_weapon_pipe" }, + { + "id": "psi_pattern_scream", + "type": "spell", + "spell_data": { "id": "telepathic_shrieking_monster", "min_level": 3 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "Static fills your hearing for a moment, blotting out all other sounds!" + } + ] + } }, { "id": "mon_feral_human_electrokin", "type": "MONSTER", "name": "feral sparker", "description": "This feral has the standard bloodshot eyes and erratic movements, but in addition, some of their gestures unleash a shower of sparks. They seem totally unphased by the light or the crackling sounds.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", "color": "cyan", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "electric", "amount": 4 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology", "prof_electromagnetics" ], - "dodge": 2, "armor": { "electric": 15 }, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_electro", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "upgrades": { "half_life": 45, "into": "mon_feral_human_electrokin2" }, - "special_attacks": [ - { - "id": "psi_electrokin_dazehit", - "type": "spell", - "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 3 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's touches %3$s with a jolt!" - } - ], - "special_when_hit": [ "ZAPBACK", 50 ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS" - ] + "extend": { + "special_attacks": [ + { + "id": "psi_electrokin_dazehit", + "type": "spell", + "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 3 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's touches %3$s with a jolt!" + } + ] + }, + "special_when_hit": [ "ZAPBACK", 50 ] }, { "id": "mon_feral_human_electrokin2", "type": "MONSTER", "name": "feral dynamo", "description": "Lightning crackles across this feral's skin, occasionally discharging into the surrounding environment. Their bloodshot eyes have an eerie blue glow.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", "color": "cyan", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "electric", "amount": 7 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology", "prof_electromagnetics" ], - "dodge": 2, "armor": { "electric": 15 }, - "harvest": "human", "emit_fields": [ { "emit_id": "emit_shock_cloud", "delay": "15 s" } ], - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_electro", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "upgrades": { "half_life": 45, "into": "mon_feral_human_electrokin3" }, - "special_attacks": [ - { - "id": "psi_electrokin2_dazehit", - "type": "spell", - "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 3 }, - "cooldown": { "math": [ "4 + rand(8)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's touches %3$s with a jolt!" - }, - { - "id": "psi_electrokin2_lightning_bolt", - "type": "spell", - "spell_data": { "id": "electrokinetic_lightning_bolt_monster", "min_level": 4 }, - "cooldown": { "math": [ "10 + rand(20)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's unleashes a bolt of lightning!" - }, - { - "id": "psi_electrokin2_paralyze", - "type": "spell", - "spell_data": { "id": "electrokinetic_paralysis_monster", "min_level": 5 }, - "cooldown": { "math": [ "15 + rand(30)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's waves a hand at %3$s and sparks crackle over their skin!" - } - ], "special_when_hit": [ "ZAPBACK", 80 ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "ELECTRIC" - ] + "extend": { + "special_attacks": [ + { + "id": "psi_electrokin2_dazehit", + "type": "spell", + "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 3 }, + "cooldown": { "math": [ "4 + rand(8)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's touches %3$s with a jolt!" + }, + { + "id": "psi_electrokin2_lightning_bolt", + "type": "spell", + "spell_data": { "id": "electrokinetic_lightning_bolt_monster", "min_level": 4 }, + "cooldown": { "math": [ "10 + rand(20)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's unleashes a bolt of lightning!" + }, + { + "id": "psi_electrokin2_paralyze", + "type": "spell", + "spell_data": { "id": "electrokinetic_paralysis_monster", "min_level": 5 }, + "cooldown": { "math": [ "15 + rand(30)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's waves a hand at %3$s and sparks crackle over their skin!" + } + ], + "flags": [ "ELECTRIC" ] + } }, { "id": "mon_feral_human_electrokin3", "type": "MONSTER", "name": "avatar of the storm", "description": "This feral is barely visible, their body constantly wreathed in bolts of lightning. A harsh actinic glow casts their surroundings into sharp relief while leaving their own features concealed. Crackling lightning nearly-constantly explodes from their body and grounds itself nearby.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 110, + "copy-from": "mon_feral_psion_default", + "proportional": { "speed": 1.1 }, + "relative": { "dodge": 1 }, "//": "Speed due to Neuro-acceleration", - "material": [ "flesh" ], "color": "cyan", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "electric", "amount": 10 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology", "prof_electromagnetics" ], - "dodge": 2, - "harvest": "human", "emit_fields": [ { "emit_id": "emit_shock_cloud", "delay": "2 s" } ], "luminance": 30, - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_electro", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], - "special_attacks": [ - { - "id": "psi_electrokin3_dazehit", - "type": "spell", - "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 5 }, - "cooldown": { "math": [ "4 + rand(8)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's touches %3$s with a jolt!" - }, - { - "id": "psi_electrokin3_lightning_bolt", - "type": "spell", - "spell_data": { "id": "electrokinetic_lightning_blast_monster", "min_level": 8 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's unleashes a bolt of lightning!" - }, - { - "id": "psi_electrokin3_paralyze", - "type": "spell", - "spell_data": { "id": "electrokinetic_paralysis_monster", "min_level": 8 }, - "cooldown": { "math": [ "12 + rand(24)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's waves a hand at %3$s and sparks crackle over their skin!" - }, - { - "id": "psi_electrokin3_revive", - "type": "spell", - "spell_data": { "id": "electrokinetic_revive_monster", "min_level": 5 }, - "cooldown": { "math": [ "25 + rand(50)" ] }, - "allow_no_target": true, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's gestures and lighting crackles around them!" - } - ], "special_when_hit": [ "ZAPBACK", 95 ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "ELECTRIC_FIELD" - ] + "extend": { + "special_attacks": [ + { + "id": "psi_electrokin3_dazehit", + "type": "spell", + "spell_data": { "id": "electrokinetic_shock_touch_monster", "min_level": 5 }, + "cooldown": { "math": [ "4 + rand(8)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's touches %3$s with a jolt!" + }, + { + "id": "psi_electrokin3_lightning_bolt", + "type": "spell", + "spell_data": { "id": "electrokinetic_lightning_blast_monster", "min_level": 8 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's unleashes a bolt of lightning!" + }, + { + "id": "psi_electrokin3_paralyze", + "type": "spell", + "spell_data": { "id": "electrokinetic_paralysis_monster", "min_level": 8 }, + "cooldown": { "math": [ "12 + rand(24)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's waves a hand at %3$s and sparks crackle over their skin!" + }, + { + "id": "psi_electrokin3_revive", + "type": "spell", + "spell_data": { "id": "electrokinetic_revive_monster", "min_level": 5 }, + "cooldown": { "math": [ "25 + rand(50)" ] }, + "allow_no_target": true, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's gestures and lighting crackles around them!" + } + ], + "flags": [ "ELECTRIC_FIELD" ] + } }, { "id": "mon_feral_human_photokin", "type": "MONSTER", "name": "feral radiant", "description": "This feral's skin has some sort of radiance. Their eyes are bright with light and there's a slight shimmer around their form.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", "color": "yellow", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, - "melee_damage": [ { "damage_type": "bash", "amount": 4 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_photo", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_blind_oneineight", "hit_self": true } }, "upgrades": { "half_life": 45, "into": "mon_feral_human_photokin2" }, - "special_attacks": [ - { - "id": "psi_photokin1_lightdodge", - "type": "spell", - "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 3 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's form is shifting with illusions!" - }, - { - "id": "psi_photokin1_lightbeam", - "type": "spell", - "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 2 }, - "cooldown": { "math": [ "10 + rand(20)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s fires a photon beam!" - }, - { - "id": "psi_photokin1_illuminate", - "type": "spell", - "spell_data": { "id": "photokinetic_illumination_monster", "min_level": 5 }, - "cooldown": { "math": [ "15 + rand(30)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's looks at you for a moment." - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS" - ] + "extend": { + "special_attacks": [ + { + "id": "psi_photokin1_lightdodge", + "type": "spell", + "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 3 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's form is shifting with illusions!" + }, + { + "id": "psi_photokin1_lightbeam", + "type": "spell", + "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 2 }, + "cooldown": { "math": [ "10 + rand(20)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s fires a photon beam!" + }, + { + "id": "psi_photokin1_illuminate", + "type": "spell", + "spell_data": { "id": "photokinetic_illumination_monster", "min_level": 5 }, + "cooldown": { "math": [ "15 + rand(30)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's looks at you for a moment." + } + ] + } }, { "id": "mon_feral_human_photokin2", "type": "MONSTER", "name": "feral beacon", "description": "Almost blinding light radiates from this feral's skin. They seem to have greater control over their powers than most ferals, but they are still clearly insane.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", "color": "yellow", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 4, - "melee_dice": 1, - "melee_dice_sides": 6, - "melee_damage": [ { "damage_type": "bash", "amount": 4 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 4, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_photo", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_blind_oneinfour", "hit_self": true } }, "luminance": 50, "upgrades": { "half_life": 45, "into": "mon_feral_human_photokin3" }, - "special_attacks": [ - [ "PARROT_AT_DANGER", 10 ], - { - "id": "psi_photokin2_lightdodge", - "type": "spell", - "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 6 }, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's form is shifting with illusions!" - }, - { - "id": "psi_photokin2_lightbeam", - "type": "spell", - "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 5 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s fires a photon beam!" - }, - { - "id": "psi_photokin2_lightflash", - "type": "spell", - "spell_data": { "id": "photokinetic_light_flash_monster", "min_level": 4 }, - "cooldown": { "math": [ "10 + rand(20)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s concentrates and unleashes a super-luminous flash!" - }, - { - "id": "psi_photokin2_radiation_blast", - "type": "spell", - "spell_data": { "id": "photokinetic_radiation_attack_monster", "min_level": 7 }, - "cooldown": { "math": [ "12 + rand(24)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s stares at %3$s and %3$s is enveloped in an eerie glow!" - }, - { - "id": "psi_photokin2_illuminate", - "type": "spell", - "spell_data": { "id": "photokinetic_illumination_monster", "min_level": 10 }, - "cooldown": { "math": [ "15 + rand(30)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's looks at you for a moment." - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "PHOTOKIN_MONSTER_IMMUNE" - ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 10 ], + { + "id": "psi_photokin2_lightdodge", + "type": "spell", + "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 6 }, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's form is shifting with illusions!" + }, + { + "id": "psi_photokin2_lightbeam", + "type": "spell", + "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 5 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s fires a photon beam!" + }, + { + "id": "psi_photokin2_lightflash", + "type": "spell", + "spell_data": { "id": "photokinetic_light_flash_monster", "min_level": 4 }, + "cooldown": { "math": [ "10 + rand(20)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s concentrates and unleashes a super-luminous flash!" + }, + { + "id": "psi_photokin2_radiation_blast", + "type": "spell", + "spell_data": { "id": "photokinetic_radiation_attack_monster", "min_level": 7 }, + "cooldown": { "math": [ "12 + rand(24)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s stares at %3$s and %3$s is enveloped in an eerie glow!" + }, + { + "id": "psi_photokin2_illuminate", + "type": "spell", + "spell_data": { "id": "photokinetic_illumination_monster", "min_level": 10 }, + "cooldown": { "math": [ "15 + rand(30)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's looks at you for a moment." + } + ], + "flags": [ "PHOTOKIN_MONSTER_IMMUNE" ] + } }, { "id": "mon_feral_human_photokin3", "type": "MONSTER", "name": "atom splitter", "description": "This feral glows brighter than streetlamp, casting their surroundings into sharp relief amid the glow. They are clearly still lucid but their expression is blank and their eyes are unfocused.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 105, - "speed": 100, + "copy-from": "mon_feral_psion_default", "material": [ "flesh" ], "color": "yellow", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 4, - "melee_dice": 1, - "melee_dice_sides": 6, - "melee_damage": [ { "damage_type": "bash", "amount": 4 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 4, - "regenerates": 8, - "regeneration_modifiers": [ [ "effect_vitakin_hurt", -4 ], [ "effect_psi_null", -8 ] ], - "bleed_rate": 0, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_photo", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_blindness", "hit_self": true }, "message": "%1$s shrieks and unleashes a powerful blinding flash!" }, "luminance": 200, - "special_attacks": [ - [ "PARROT_AT_DANGER", 10 ], - { - "id": "psi_photokin3_lightdodge", - "type": "spell", - "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 7 }, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's form is shifting with illusions!" - }, - { - "id": "psi_photokin3_lightbeam", - "type": "spell", - "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 6 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s fires a photon beam!" - }, - { - "id": "psi_photokin3_lightflash", - "type": "spell", - "spell_data": { "id": "photokinetic_light_flash_monster", "min_level": 6 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s concentrates and unleashes a super-luminous flash!" - }, - { - "id": "psi_photokin3_radiation_blast", - "type": "spell", - "spell_data": { "id": "photokinetic_radiation_attack_monster", "min_level": 10 }, - "cooldown": { "math": [ "10 + rand(20)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s stares at you and you are enveloped in an eerie glow!" - }, - { - "id": "psi_photokin3_illuminate", - "type": "spell", - "spell_data": { "id": "photokinetic_illumination_monster", "min_level": 15 }, - "cooldown": { "math": [ "15 + rand(30)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s's looks at you for a moment." - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "PHOTOKIN_MONSTER_IMMUNE" - ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 10 ], + { + "id": "psi_photokin3_lightdodge", + "type": "spell", + "spell_data": { "id": "photokinetic_light_dodge_monster", "min_level": 7 }, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's form is shifting with illusions!" + }, + { + "id": "psi_photokin3_lightbeam", + "type": "spell", + "spell_data": { "id": "photokinetic_light_beam_monster", "min_level": 6 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s fires a photon beam!" + }, + { + "id": "psi_photokin3_lightflash", + "type": "spell", + "spell_data": { "id": "photokinetic_light_flash_monster", "min_level": 6 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s concentrates and unleashes a super-luminous flash!" + }, + { + "id": "psi_photokin3_radiation_blast", + "type": "spell", + "spell_data": { "id": "photokinetic_radiation_attack_monster", "min_level": 10 }, + "cooldown": { "math": [ "10 + rand(20)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s stares at you and you are enveloped in an eerie glow!" + }, + { + "id": "psi_photokin3_illuminate", + "type": "spell", + "spell_data": { "id": "photokinetic_illumination_monster", "min_level": 15 }, + "cooldown": { "math": [ "15 + rand(30)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s's looks at you for a moment." + } + ], + "flags": [ "PHOTOKIN_MONSTER_IMMUNE" ] + } }, { "id": "mon_feral_human_pyrokin", "type": "MONSTER", "name": "feral burner", "description": "This feral human looks a little more composed than most, but only a little. Their clothes are singed and the air around them shimmers like a summer heat haze.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", "color": "red", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "heat", "amount": 4 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 2, "armor": { "heat": 15 }, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_pyro", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_explosion_oneineight", "hit_self": true } }, "upgrades": { "half_life": 45, "into": "mon_feral_human_pyrokin2" }, - "special_attacks": [ - { - "type": "monster_attack", - "attack_type": "melee", - "id": "mon_fountain_of_flames", - "cooldown": { "math": [ "5 + rand(10)" ] }, - "move_cost": 80, - "damage_max_instance": [ { "damage_type": "heat", "amount": 20 } ], - "dodgeable": true, - "blockable": false, - "effects": [ { "id": "onfire", "duration": 60, "chance": 25, "affect_hit_bp": true } ], - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "hit_dmg_u": "%1$s gestures and your %2$s is engulfed in flames!", - "hit_dmg_npc": "%1$s gestures and 's %2$s is engulfed in flames!", - "miss_msg_u": "%1$s gestures and you narrowly avoid a burst of flame!", - "miss_msg_npc": "%1$s gestures and narrowly avoids a burst of flame!", - "no_dmg_msg_u": "%1$s gestures and your %2$s is engulfed in flames, but they do not burn you.", - "no_dmg_msg_npc": "%1$s gestures and 's %2$s is engulfed in flames, but it does not burn them." - }, - { - "id": "psi_pyrokin1_flashbang", - "type": "spell", - "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 1 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "The air erupts into an eye-searing flash!" - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "FIREPROOF" - ] + "extend": { + "special_attacks": [ + { + "type": "monster_attack", + "attack_type": "melee", + "id": "mon_fountain_of_flames", + "cooldown": { "math": [ "5 + rand(10)" ] }, + "accuracy": 4, + "move_cost": 80, + "damage_max_instance": [ { "damage_type": "heat", "amount": 20 } ], + "dodgeable": true, + "blockable": false, + "effects": [ { "id": "onfire", "duration": 60, "chance": 25, "affect_hit_bp": true } ], + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "hit_dmg_u": "%1$s gestures and your %2$s is engulfed in flames!", + "hit_dmg_npc": "%1$s gestures and 's %2$s is engulfed in flames!", + "miss_msg_u": "%1$s gestures and you narrowly avoid a burst of flame!", + "miss_msg_npc": "%1$s gestures and narrowly avoids a burst of flame!", + "no_dmg_msg_u": "%1$s gestures and your %2$s is engulfed in flames, but they do not burn you.", + "no_dmg_msg_npc": "%1$s gestures and 's %2$s is engulfed in flames, but it does not burn them." + }, + { + "id": "psi_pyrokin1_flashbang", + "type": "spell", + "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 1 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "The air erupts into an eye-searing flash!" + } + ], + "flags": [ "FIREPROOF" ] + } }, { "id": "mon_feral_human_pyrokin2", "type": "MONSTER", "name": "feral inferno", "description": "Through a cloud of smoke and fire, you can see a human form. Their body is barely visible through the flames.", + "copy-from": "mon_feral_psion_default", "//": "I kind of want them to emit flames as well as smoke, but testing shows that leads to basically everything burning uncontrollable and entire hordes of zombies dying. Their pyrokinesis already causes enough havoc. Change once fire is no longer the most deadly post-Cataclysm weapon.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], "color": "red", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 4, - "melee_dice": 1, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "heat", "amount": 8 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, "armor": { "heat": 30 }, - "harvest": "human", "emit_fields": [ { "emit_id": "emit_smoke_stream", "delay": "8 s" } ], - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_pyro", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_explosion_oneinfour", "hit_self": true } }, "luminance": 50, "upgrades": { "half_life": 45, "into": "mon_feral_human_pyrokin3" }, - "special_attacks": [ - [ "PARROT_AT_DANGER", 10 ], - { - "type": "monster_attack", - "attack_type": "melee", - "id": "mon_fountain_of_flames", - "cooldown": { "math": [ "5 + rand(10)" ] }, - "move_cost": 80, - "range": 2, - "damage_max_instance": [ { "damage_type": "heat", "amount": 25 } ], - "dodgeable": true, - "blockable": false, - "effects": [ { "id": "onfire", "duration": 60, "chance": 50, "affect_hit_bp": true } ], - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "hit_dmg_u": "%1$s gestures and your %2$s is engulfed in flames!", - "hit_dmg_npc": "%1$s gestures and 's %2$s is engulfed in flames!", - "miss_msg_u": "%1$s gestures and you narrowly avoid a burst of flame!", - "miss_msg_npc": "%1$s gestures and narrowly avoids a burst of flame!", - "no_dmg_msg_u": "%1$s gestures and your %2$s is engulfed in flames, but they do not burn you.", - "no_dmg_msg_npc": "%1$s gestures and 's %2$s is engulfed in flames, but it does not burn them." - }, - { - "id": "psi_pyrokin2_flashbang", - "type": "spell", - "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 4 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "The air erupts into an eye-searing flash!" - }, - { - "id": "psi_pyrokin2_flamebomb", - "type": "spell", - "spell_data": { "id": "pyrokinetic_blast_monster", "min_level": 4 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s gestures and summons a conflagration!" - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "FIREY" - ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 10 ], + { + "type": "monster_attack", + "attack_type": "melee", + "id": "mon_fountain_of_flames", + "cooldown": { "math": [ "5 + rand(10)" ] }, + "accuracy": 6, + "move_cost": 80, + "range": 2, + "damage_max_instance": [ { "damage_type": "heat", "amount": 25 } ], + "dodgeable": true, + "blockable": false, + "effects": [ { "id": "onfire", "duration": 60, "chance": 50, "affect_hit_bp": true } ], + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "hit_dmg_u": "%1$s gestures and your %2$s is engulfed in flames!", + "hit_dmg_npc": "%1$s gestures and 's %2$s is engulfed in flames!", + "miss_msg_u": "%1$s gestures and you narrowly avoid a burst of flame!", + "miss_msg_npc": "%1$s gestures and narrowly avoids a burst of flame!", + "no_dmg_msg_u": "%1$s gestures and your %2$s is engulfed in flames, but they do not burn you.", + "no_dmg_msg_npc": "%1$s gestures and 's %2$s is engulfed in flames, but it does not burn them." + }, + { + "id": "psi_pyrokin2_flashbang", + "type": "spell", + "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 4 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "The air erupts into an eye-searing flash!" + }, + { + "id": "psi_pyrokin2_flamebomb", + "type": "spell", + "spell_data": { "id": "pyrokinetic_blast_monster", "min_level": 4 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s gestures and summons a conflagration!" + } + ], + "flags": [ "FIREY" ] + } }, { "id": "mon_feral_human_pyrokin3", "type": "MONSTER", "name": "unending conflagration", "description": "Occasionally through the fire and smoke, you can see a human form. Their flesh blackens and withers in the heat, then the burns retreat and healthy skin replaces it, over and over again.", + "copy-from": "mon_feral_psion_default", "//": "No ballistic armor because the temperature to melt a bullet after being fired but before it hits you is apparently over 100 million degrees.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 105, - "speed": 100, - "material": [ "flesh" ], "color": "red", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 4, - "melee_dice": 1, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "heat", "amount": 10 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, "armor": { "heat": 50 }, "bleed_rate": 0, "harvest": "human", "emit_fields": [ { "emit_id": "emit_pyrokinetic_aura_7", "delay": "2 s" } ], - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_pyro", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_conflagration", "hit_self": true }, "message": "%1$s screams and the flames around them burst outward!" }, "luminance": 200, - "special_attacks": [ - [ "PARROT_AT_DANGER", 10 ], - { - "type": "monster_attack", - "attack_type": "melee", - "id": "mon_fountain_of_flames", - "cooldown": { "math": [ "5 + rand(10)" ] }, - "move_cost": 80, - "range": 3, - "damage_max_instance": [ { "damage_type": "heat", "amount": 35 } ], - "dodgeable": true, - "blockable": false, - "effects": [ { "id": "onfire", "duration": 60, "chance": 75, "affect_hit_bp": true } ], - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "hit_dmg_u": "%1$s gestures and your %2$s is engulfed in flames!", - "hit_dmg_npc": "%1$s gestures and 's %2$s is engulfed in flames!", - "miss_msg_u": "%1$s gestures and you narrowly avoid a burst of flame!", - "miss_msg_npc": "%1$s gestures and narrowly avoids a burst of flame!", - "no_dmg_msg_u": "%1$s gestures and your %2$s is engulfed in flames, but they do not burn you.", - "no_dmg_msg_npc": "%1$s gestures and 's %2$s is engulfed in flames, but it does not burn them." - }, - { - "id": "psi_pyrokin3_flashbang", - "type": "spell", - "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 5 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "The air erupts into an eye-searing flash!" - }, - { - "id": "psi_pyrokin3_flamebomb", - "type": "spell", - "spell_data": { "id": "pyrokinetic_blast_monster", "min_level": 6 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s gestures and summons a conflagration!" - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "FIREY" - ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 10 ], + { + "type": "monster_attack", + "attack_type": "melee", + "id": "mon_fountain_of_flames", + "cooldown": { "math": [ "5 + rand(10)" ] }, + "accuracy": 8, + "move_cost": 80, + "range": 3, + "damage_max_instance": [ { "damage_type": "heat", "amount": 35 } ], + "dodgeable": true, + "blockable": false, + "effects": [ { "id": "onfire", "duration": 60, "chance": 75, "affect_hit_bp": true } ], + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "hit_dmg_u": "%1$s gestures and your %2$s is engulfed in flames!", + "hit_dmg_npc": "%1$s gestures and 's %2$s is engulfed in flames!", + "miss_msg_u": "%1$s gestures and you narrowly avoid a burst of flame!", + "miss_msg_npc": "%1$s gestures and narrowly avoids a burst of flame!", + "no_dmg_msg_u": "%1$s gestures and your %2$s is engulfed in flames, but they do not burn you.", + "no_dmg_msg_npc": "%1$s gestures and 's %2$s is engulfed in flames, but it does not burn them." + }, + { + "id": "psi_pyrokin3_flashbang", + "type": "spell", + "spell_data": { "id": "pyrokinetic_flash_monster", "min_level": 5 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "The air erupts into an eye-searing flash!" + }, + { + "id": "psi_pyrokin3_flamebomb", + "type": "spell", + "spell_data": { "id": "pyrokinetic_blast_monster", "min_level": 6 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s gestures and summons a conflagration!" + } + ], + "flags": [ "FIREY" ] + }, + "delete": { "flags": [ "PATH_AVOID_FIRE" ] } }, { "id": "mon_feral_human_telekin", "type": "MONSTER", "name": "feral PKer", "description": "Though they still have a maniacal expression, this feral human is distinguished by the rocks floating in the around around them.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL", "TELEKIN_PUSHPULL_NULL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", "color": "yellow", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 4, - "melee_dice": 1, - "melee_dice_sides": 6, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, - "armor": { "bash": 8, "cut": 5, "stab": 3, "bullet": 15, "psi_telekinetic_damage": 10 }, "death_drops": "feral_humans_death_drops_telekin", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_telekeinetic_hit_oneinfive", "hit_self": true }, "message": "As the %1$s dies, a wave of force explodes outward!" }, "upgrades": { "half_life": 45, "into": "mon_feral_human_telekin2" }, "starting_ammo": { "rock": 6 }, - "special_attacks": [ - { - "id": "psi_telekin1_telegrab", - "type": "spell", - "spell_data": { "id": "telekinetic_pull_monster", "min_level": 2 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, - "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" - }, - { - "type": "gun", - "cooldown": { "math": [ "2 + rand(4)" ] }, - "move_cost": 50, - "gun_type": "feral_human_thrown_rock", - "ammo_type": "rock", - "no_ammo_sound": "", - "fake_skills": [ [ "throw", 6 ] ], - "fake_str": 11, - "require_targeting_player": false, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "ranges": [ [ 2, 10, "DEFAULT" ] ], - "description": "%1$s makes a throwing motion and one of the rocks around them suddenly launches like a bullet!" - }, - { - "id": "smash", - "move_cost": 80, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 15, "armor_penetration": 10 } ], - "hitsize_min": 12, - "range": 6, - "throw_strength": 20, - "dodgeable": false, - "uncanny_dodgeable": true, - "blockable": false, - "effects_require_dmg": false, - "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, - "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!", - "miss_msg_npc": "%s stares at but nothing happens!" - }, - { - "id": "psi_telekin1_momentum_alteration", - "type": "spell", - "spell_data": { "id": "telekinetic_momentum_monster" }, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_momentum_alteration" } } ] + "extend": { + "special_attacks": [ + { + "id": "psi_telekin1_telegrab", + "type": "spell", + "spell_data": { "id": "telekinetic_pull_monster", "min_level": 2 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, + "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" }, - "monster_message": "The air around %1$s wavers." - }, - [ "PULL_METAL_WEAPON", 15 ] - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PATH_AVOID_FIRE", - "PRIORITIZE_TARGETS", - "PUSH_VEH", - "PUSH_MON" - ] + { + "type": "gun", + "cooldown": { "math": [ "2 + rand(4)" ] }, + "move_cost": 50, + "gun_type": "feral_human_thrown_rock", + "ammo_type": "rock", + "no_ammo_sound": "", + "fake_skills": [ [ "throw", 6 ] ], + "fake_str": 11, + "require_targeting_player": false, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "ranges": [ [ 2, 10, "DEFAULT" ] ], + "description": "%1$s makes a throwing motion and one of the rocks around them suddenly launches like a bullet!" + }, + { + "id": "smash", + "move_cost": 80, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 15, "armor_penetration": 10 } ], + "hitsize_min": 12, + "accuracy": 4, + "range": 6, + "throw_strength": 20, + "dodgeable": false, + "uncanny_dodgeable": true, + "blockable": false, + "effects_require_dmg": false, + "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, + "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!", + "miss_msg_npc": "%s stares at but nothing happens!" + }, + { + "id": "psi_telekin1_momentum_alteration", + "type": "spell", + "spell_data": { "id": "telekinetic_momentum_monster" }, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_momentum_alteration" } } ] + }, + "monster_message": "The air around %1$s wavers." + }, + [ "PULL_METAL_WEAPON", 15 ] + ], + "flags": [ "PUSH_MON" ] + } }, { "id": "mon_feral_human_telekin2", "type": "MONSTER", "name": "feral mindhand", "description": "This feral human moves quickly across uneven terrain and, when you look more closely, you see that they are floating just above the ground. The air around them is distorted strangely, like looking through the surface of water.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", + "copy-from": "mon_feral_psion_default", "species": [ "FERAL", "TELEKIN_PUSHPULL_NULL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], "color": "yellow", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 6, - "melee_dice": 1, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "bash", "amount": 4 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_telekin", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_telekeinetic_hit_oneinthree", "hit_self": true }, "message": "As the %1$s dies, a wave of force explodes outward!" }, "upgrades": { "half_life": 45, "into": "mon_feral_human_telekin3" }, - "special_attacks": [ - { - "id": "psi_telekin2_telegrab", - "type": "spell", - "spell_data": { "id": "telekinetic_pull_monster", "min_level": 3 }, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, - "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" - }, - { - "type": "monster_attack", - "attack_type": "melee", - "id": "mon_telekinetic_mindhammer", - "cooldown": { "math": [ "6 + rand(12)" ] }, - "move_cost": 80, - "range": 8, - "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 20 } ], - "dodgeable": false, - "uncanny_dodgeable": true, - "blockable": false, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "hit_dmg_u": "%1$s stares at you and your %2$s is hammered with psionic force!", - "hit_dmg_npc": "%1$s stares at and their %2$s is hammered with psionic force!", - "miss_msg_u": "%1$s stares at you and you narrowly avoid an unseen attack!", - "miss_msg_npc": "%1$s stares and narrowly avoids an unseen attack!", - "no_dmg_msg_u": "%1$s stares at you, but the telekinetic attack rebounds off your armor.", - "no_dmg_msg_npc": "%1$s stares at , but the telekinetic attack rebounds off their armor." - }, - { - "id": "smash", - "move_cost": 80, - "cooldown": { "math": [ "4 + rand(8)" ] }, - "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 25, "armor_penetration": 10 } ], - "hitsize_min": 12, - "range": 8, - "throw_strength": 50, - "dodgeable": false, - "uncanny_dodgeable": true, - "blockable": false, - "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, - "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!", - "miss_msg_npc": "%s stares at but nothing happens!" - }, - { - "id": "psi_telekin2_momentum_alteration", - "type": "spell", - "spell_data": { "id": "telekinetic_momentum_monster" }, - "cooldown": 1, - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_momentum_alteration" } } ] + "extend": { + "special_attacks": [ + { + "id": "psi_telekin2_telegrab", + "type": "spell", + "spell_data": { "id": "telekinetic_pull_monster", "min_level": 3 }, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, + "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" }, - "monster_message": "The air around %1$s wavers." - }, - { - "id": "psi_telekin2_inertial_barrier", - "type": "spell", - "spell_data": { "id": "telekinetic_barrier_monster" }, - "cooldown": 1, - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_inertial_barrier" } } ] + { + "type": "monster_attack", + "attack_type": "melee", + "id": "mon_telekinetic_mindhammer", + "cooldown": { "math": [ "6 + rand(12)" ] }, + "move_cost": 80, + "accuracy": 6, + "range": 8, + "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 20 } ], + "dodgeable": false, + "uncanny_dodgeable": true, + "blockable": false, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "hit_dmg_u": "%1$s stares at you and your %2$s is hammered with psionic force!", + "hit_dmg_npc": "%1$s stares at and their %2$s is hammered with psionic force!", + "miss_msg_u": "%1$s stares at you and you narrowly avoid an unseen attack!", + "miss_msg_npc": "%1$s stares and narrowly avoids an unseen attack!", + "no_dmg_msg_u": "%1$s stares at you, but the telekinetic attack rebounds off your armor.", + "no_dmg_msg_npc": "%1$s stares at , but the telekinetic attack rebounds off their armor." }, - "monster_message": "The air around %1$s distorts." - }, - [ "PULL_METAL_WEAPON", 10 ] - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PATH_AVOID_FIRE", - "PRIORITIZE_TARGETS", - "CLIMBS", - "PUSH_VEH", - "PUSH_MON", - "TELEKIN_IMMUNE" - ] + { + "id": "smash", + "move_cost": 80, + "cooldown": { "math": [ "4 + rand(8)" ] }, + "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 25, "armor_penetration": 10 } ], + "hitsize_min": 12, + "accuracy": 6, + "range": 8, + "throw_strength": 50, + "dodgeable": false, + "uncanny_dodgeable": true, + "blockable": false, + "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, + "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!", + "miss_msg_npc": "%s stares at but nothing happens!" + }, + { + "id": "psi_telekin2_momentum_alteration", + "type": "spell", + "spell_data": { "id": "telekinetic_momentum_monster" }, + "cooldown": 1, + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_momentum_alteration" } } ] + }, + "monster_message": "The air around %1$s wavers." + }, + { + "id": "psi_telekin2_inertial_barrier", + "type": "spell", + "spell_data": { "id": "telekinetic_barrier_monster" }, + "cooldown": 1, + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_inertial_barrier" } } ] + }, + "monster_message": "The air around %1$s distorts." + }, + [ "PULL_METAL_WEAPON", 10 ] + ], + "flags": [ "CLIMBS", "PUSH_VEH", "PUSH_MON" ] + } }, { "id": "mon_feral_human_telekin3", "type": "MONSTER", "name": "unstoppable force", "description": "Hovering half a meter off the ground, this feral human is surrounded by a whirling cloud of rock, dust, splintered wood, and various household objects. As they move, the ground occasionally shakes.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", + "copy-from": "mon_feral_psion_default", "species": [ "FERAL", "TELEKIN_PUSHPULL_NULL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], "color": "yellow", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 7, - "melee_dice": 1, - "melee_dice_sides": 6, "melee_damage": [ { "damage_type": "bash", "amount": 8 } ], - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_telekin", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_telekeinetic_hit_oneinthree", "hit_self": true }, "message": "As the %1$s dies, a wave of force explodes outward!" }, - "special_attacks": [ - { - "id": "psi_telekin3_telegrab", - "type": "spell", - "spell_data": { "id": "telekinetic_pull_monster", "min_level": 6 }, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, - "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" - }, - { - "type": "monster_attack", - "attack_type": "melee", - "id": "mon_telekinetic3_mindhammer", - "cooldown": { "math": [ "6 + rand(12)" ] }, - "move_cost": 80, - "range": 11, - "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 35 } ], - "dodgeable": false, - "uncanny_dodgeable": true, - "blockable": false, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "hit_dmg_u": "%1$s stares at you and your %2$s is hammered with psionic force!", - "hit_dmg_npc": "%1$s stares at and their %2$s is hammered with psionic force!", - "miss_msg_u": "%1$s stares at you and you narrowly avoid an unseen attack!", - "miss_msg_npc": "%1$s stares and narrowly avoids an unseen attack!", - "no_dmg_msg_u": "%1$s stares at you, but the telekinetic attack rebounds off your armor.", - "no_dmg_msg_npc": "%1$s stares at , but the telekinetic attack rebounds off their armor." - }, - { - "id": "smash", - "move_cost": 80, - "cooldown": { "math": [ "4 + rand(8)" ] }, - "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 25, "armor_penetration": 10 } ], - "hitsize_min": 12, - "range": 11, - "throw_strength": 50, - "dodgeable": false, - "uncanny_dodgeable": true, - "blockable": false, - "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, - "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!", - "miss_msg_npc": "%s stares at but nothing happens!" - }, - { - "id": "psi_telekin3_momentum_alteration", - "type": "spell", - "spell_data": { "id": "telekinetic_momentum_monster" }, - "cooldown": 1, - "condition": { - "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_momentum_alteration" } } ] + "extend": { + "special_attacks": [ + { + "id": "psi_telekin3_telegrab", + "type": "spell", + "spell_data": { "id": "telekinetic_pull_monster", "min_level": 6 }, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, + "monster_message": "%1$s stares at %3$s and %3$s is lifted up and pulled towards them!" }, - "monster_message": "The air around %1$s wavers." - }, - { - "id": "psi_telekin3_inertial_barrier", - "type": "spell", - "spell_data": { "id": "telekinetic_barrier_monster_improved" }, - "cooldown": 1, - "condition": { - "and": [ - { "not": { "u_has_flag": "NO_PSIONICS" } }, - { "not": { "u_has_effect": "effect_monster_inertial_barrier_improved" } } - ] + { + "type": "monster_attack", + "attack_type": "melee", + "id": "mon_telekinetic3_mindhammer", + "cooldown": { "math": [ "6 + rand(12)" ] }, + "move_cost": 80, + "accuracy": 9, + "range": 11, + "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 35 } ], + "dodgeable": false, + "uncanny_dodgeable": true, + "blockable": false, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "hit_dmg_u": "%1$s stares at you and your %2$s is hammered with psionic force!", + "hit_dmg_npc": "%1$s stares at and their %2$s is hammered with psionic force!", + "miss_msg_u": "%1$s stares at you and you narrowly avoid an unseen attack!", + "miss_msg_npc": "%1$s stares and narrowly avoids an unseen attack!", + "no_dmg_msg_u": "%1$s stares at you, but the telekinetic attack rebounds off your armor.", + "no_dmg_msg_npc": "%1$s stares at , but the telekinetic attack rebounds off their armor." }, - "monster_message": "The air around %1$s distorts." - }, - { - "id": "psi_telekin3_wreckingball", - "type": "spell", - "spell_data": { "id": "telekinetic_explosion_monster", "min_level": 8 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s gestures and the ground burst apart!" - }, - { - "id": "psi_telekin3_earthshake", - "type": "spell", - "spell_data": { "id": "telekinetic_earthshaker_monster", "min_level": 5 }, - "cooldown": { "math": [ "15 + rand(30)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s closes their eyes and the ground shakes!" - }, - [ "PULL_METAL_WEAPON", 5 ] - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PATH_AVOID_FIRE", - "PRIORITIZE_TARGETS", - "FLIES", - "PUSH_VEH", - "PUSH_MON", - "TELEKIN_IMMUNE" - ] + { + "id": "smash", + "move_cost": 80, + "cooldown": { "math": [ "4 + rand(8)" ] }, + "damage_max_instance": [ { "damage_type": "psi_telekinetic_damage", "amount": 25, "armor_penetration": 10 } ], + "hitsize_min": 12, + "accuracy": 9, + "range": 11, + "throw_strength": 50, + "dodgeable": false, + "uncanny_dodgeable": true, + "blockable": false, + "condition": { "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "npc_has_flag": "TELEKIN_SHIELD" } } ] }, + "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!", + "miss_msg_npc": "%s stares at but nothing happens!" + }, + { + "id": "psi_telekin3_momentum_alteration", + "type": "spell", + "spell_data": { "id": "telekinetic_momentum_monster" }, + "cooldown": 1, + "condition": { + "and": [ { "not": { "u_has_flag": "NO_PSIONICS" } }, { "not": { "u_has_effect": "effect_monster_momentum_alteration" } } ] + }, + "monster_message": "The air around %1$s wavers." + }, + { + "id": "psi_telekin3_inertial_barrier", + "type": "spell", + "spell_data": { "id": "telekinetic_barrier_monster_improved" }, + "cooldown": 1, + "condition": { + "and": [ + { "not": { "u_has_flag": "NO_PSIONICS" } }, + { "not": { "u_has_effect": "effect_monster_inertial_barrier_improved" } } + ] + }, + "monster_message": "The air around %1$s distorts." + }, + { + "id": "psi_telekin3_wreckingball", + "type": "spell", + "spell_data": { "id": "telekinetic_explosion_monster", "min_level": 8 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s gestures and the ground bursts apart!" + }, + { + "id": "psi_telekin3_earthshake", + "type": "spell", + "spell_data": { "id": "telekinetic_earthshaker_monster", "min_level": 5 }, + "cooldown": { "math": [ "15 + rand(30)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s closes their eyes and the ground shakes!" + }, + [ "PULL_METAL_WEAPON", 5 ] + ], + "flags": [ "FLIES", "PUSH_VEH", "PUSH_MON" ] + } }, { "id": "mon_feral_human_teep", "type": "MONSTER", "name": "feral esper", "description": "This feral human lacks the crazed look most of their kind have. Instead, their gaze is unfocused, as though listening to voices only they can hear.", + "copy-from": "mon_feral_psion_default", + "relative": { "dodge": 2 }, "//": "Additional dodge due to reading the player's mind", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], "color": "white", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, "armor": { "psi_telepathic_damage": 20 }, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, "death_drops": "feral_humans_death_drops_teep", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_psychic_scream", "hit_self": true, "min_level": 5 }, "message": "As the %1$s dies, a scream fills your mind!" }, "upgrades": { "half_life": 45, "into": "mon_feral_human_teep2" }, - "special_attacks": [ - { - "id": "psi_telepath1_scream", - "type": "spell", - "spell_data": { "id": "telepathic_confusion_monster", "min_level": 3 }, - "cooldown": { "math": [ "10 + rand(20)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "A roar fills %3$s's mind and the world is blotted out!" - }, - { - "id": "psi_telepath1_blast", - "type": "spell", - "spell_data": { "id": "telepathic_blast_monster", "min_level": 1 }, - "cooldown": { "math": [ "9 + rand(18)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s stares at %3$s!" - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS" - ] + "extend": { + "special_attacks": [ + { + "id": "psi_telepath1_scream", + "type": "spell", + "spell_data": { "id": "telepathic_confusion_monster", "min_level": 3 }, + "cooldown": { "math": [ "10 + rand(20)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "A roar fills %3$s's mind and the world is blotted out!" + }, + { + "id": "psi_telepath1_blast", + "type": "spell", + "spell_data": { "id": "telepathic_blast_monster", "min_level": 1 }, + "cooldown": { "math": [ "9 + rand(18)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s stares at %3$s!" + } + ] + } }, { "id": "mon_feral_human_teep2", "type": "MONSTER", "name": "feral brainburner", "description": "Before you see them, you can feel it--a sensation like spiders crawling along your brain. As you shudder, this feral human looks at you and smiles slightly.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "relative": { "dodge": 3 }, "color": "white", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, "death_drops": "feral_humans_death_drops_teep", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_psychic_scream", "hit_self": true, "min_level": 10 }, "message": "As the %1$s dies, a scream fills your mind!" }, "upgrades": { "half_life": 45, "into": "mon_feral_human_teep3" }, - "special_attacks": [ - [ "PARROT_AT_DANGER", 10 ], - { - "id": "psi_telepath2_scream", - "type": "spell", - "spell_data": { "id": "telepathic_confusion_monster", "min_level": 3 }, - "cooldown": { "math": [ "8 + rand(16)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "A roar fills %3$s's mind and the world is blotted out!" - }, - { - "id": "psi_telepath2_blast", - "type": "spell", - "spell_data": { "id": "telepathic_blast_monster", "min_level": 2 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s stares at %3$s!" - }, - { - "id": "psi_telepath2_horror", - "type": "spell", - "spell_data": { "id": "telepathic_horror_monster", "min_level": 4 }, - "cooldown": { "math": [ "12 + rand(24)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s stares at %3$s!" - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "TEEP_IMMUNE" - ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 10 ], + { + "id": "psi_telepath2_scream", + "type": "spell", + "spell_data": { "id": "telepathic_confusion_monster", "min_level": 3 }, + "cooldown": { "math": [ "8 + rand(16)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "A roar fills %3$s's mind and the world is blotted out!" + }, + { + "id": "psi_telepath2_blast", + "type": "spell", + "spell_data": { "id": "telepathic_blast_monster", "min_level": 2 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s stares at %3$s!" + }, + { + "id": "psi_telepath2_horror", + "type": "spell", + "spell_data": { "id": "telepathic_horror_monster", "min_level": 4 }, + "cooldown": { "math": [ "12 + rand(24)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s stares at %3$s!" + } + ], + "flags": [ "TEEP_IMMUNE" ] + } }, { "id": "mon_feral_human_teep3", "type": "MONSTER", "name": { "str": "instiller of nightmares", "str_pl": "instillers of nightmares" }, "description": "Just another feral, with the typical bloodshot eyes and intense expression. You have only a moment to think that before your heart starts racing in your chest and the hair stands up on the back of your neck as every instinct screams at you to run.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "relative": { "dodge": 4 }, "color": "white", "symbol": "@", - "aggression": 30, - "morale": 100, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, "death_drops": "feral_humans_death_drops_teep", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "death_function": { "effect": { "id": "death_psychic_scream", "hit_self": true, "min_level": 15 }, "message": "As the %1$s dies, a scream fills your mind!" }, "upgrades": { "half_life": 45, "into": "mon_feral_human_teep3" }, - "special_attacks": [ - [ "PARROT_AT_DANGER", 10 ], - { - "id": "psi_telepath3_scream", - "type": "spell", - "spell_data": { "id": "telepathic_confusion_monster", "min_level": 5 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "A roar fills %3$s's mind and the world is blotted out!" - }, - { - "id": "psi_telepath3_blast", - "type": "spell", - "spell_data": { "id": "telepathic_blast_monster", "min_level": 5 }, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s stares at %3$s!" - }, - { - "id": "psi_telepath3_horror_aoe", - "type": "spell", - "spell_data": { "id": "telepathic_horror_aoe_monster", "min_level": 15 }, - "allow_no_target": true, - "cooldown": { "math": [ "12 + rand(24)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s eyes suddenly go wide!" - }, - { - "id": "psi_telepath3_freeze", - "type": "spell", - "spell_data": { "id": "telepathic_primal_fear_monster", "min_level": 5 }, - "cooldown": { "math": [ "17 + rand(34)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s stares at %3$s and they freeze like a frightened rabbit!" - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "TEEP_IMMUNE" - ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 10 ], + { + "id": "psi_telepath3_scream", + "type": "spell", + "spell_data": { "id": "telepathic_confusion_monster", "min_level": 5 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "A roar fills %3$s's mind and the world is blotted out!" + }, + { + "id": "psi_telepath3_blast", + "type": "spell", + "spell_data": { "id": "telepathic_blast_monster", "min_level": 5 }, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s stares at %3$s!" + }, + { + "id": "psi_telepath3_horror_aoe", + "type": "spell", + "spell_data": { "id": "telepathic_horror_aoe_monster", "min_level": 15 }, + "allow_no_target": true, + "cooldown": { "math": [ "12 + rand(24)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s eyes suddenly go wide!" + }, + { + "id": "psi_telepath3_freeze", + "type": "spell", + "spell_data": { "id": "telepathic_primal_fear_monster", "min_level": 5 }, + "cooldown": { "math": [ "17 + rand(34)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s stares at %3$s and they freeze like a frightened rabbit!" + } + ], + "flags": [ "TEEP_IMMUNE" ] + } }, { "id": "mon_feral_human_porter", "type": "MONSTER", "name": "feral jumper", "description": "What was once empty air suddenly contains this feral human. They have the same crazed expression as their fellows, but their gaze is focused on more distant locations.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "relative": { "dodge": 2 }, "color": "blue", "symbol": "@", - "aggression": 30, "morale": 25, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 50, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, "death_drops": "feral_humans_death_drops_porter", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "upgrades": { "half_life": 45, "into": "mon_feral_human_porter2" }, - "special_attacks": [ - { - "id": "psi_teleport1_slow", - "type": "spell", - "spell_data": { "id": "teleport_slow_monster", "min_level": 2 }, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s looks at %3$s and the world lurches." - }, - { - "type": "leap", - "cooldown": { "math": [ "4 + rand(8)" ] }, - "allow_no_target": true, - "max_range": 8, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "message": "%1$s vanishes and reappears elsewhere!" - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "CLIMBS", - "HARDTOSHOOT", - "TELEPORT_IMMUNE" - ] + "extend": { + "special_attacks": [ + { + "id": "psi_teleport1_slow", + "type": "spell", + "spell_data": { "id": "teleport_slow_monster", "min_level": 2 }, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s looks at %3$s and the world lurches." + }, + { + "type": "leap", + "cooldown": { "math": [ "4 + rand(8)" ] }, + "allow_no_target": true, + "max_range": 8, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "message": "%1$s vanishes and reappears elsewhere!" + } + ], + "flags": [ "CLIMBS", "HARDTOSHOOT", "TELEPORT_IMMUNE" ] + } }, { "id": "mon_feral_human_porter2", "type": "MONSTER", "name": "feral slider", "description": "Every time you blink, this feral human is in a different place. They are always in motion without actually crossing the intervening space.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "relative": { "dodge": 4 }, "color": "blue", "symbol": "@", - "aggression": 30, "morale": 25, - "melee_skill": 4, - "melee_dice": 1, - "melee_dice_sides": 6, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, "death_drops": "feral_humans_death_drops_porter", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "upgrades": { "half_life": 45, "into": "mon_feral_human_porter3" }, - "special_attacks": [ - { - "id": "psi_teleport2_slow", - "type": "spell", - "spell_data": { "id": "teleport_slow_monster", "min_level": 4 }, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s glances at %3$s and the world lurches." - }, - { - "type": "monster_attack", - "attack_type": "melee", - "id": "teleport_touch", - "move_cost": 80, - "cooldown": { "math": [ "7 + rand(14)" ] }, - "accuracy": 5, - "damage_max_instance": [ { "damage_type": "psi_teleporter_teleporting_damage", "amount": 2, "armor_penetration": 10 } ], - "blockable": false, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "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!", - "miss_msg_npc": "%s reaches for but they dodge!" - }, - { - "type": "leap", - "cooldown": { "math": [ "1 + rand(2)" ] }, - "move_cost": 50, - "allow_no_target": true, - "max_range": 12, - "message": "%1$s vanishes and reappears elsewhere!", - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "CLIMBS", - "HARDTOSHOOT", - "TELEPORT_IMMUNE" - ] + "extend": { + "special_attacks": [ + { + "id": "psi_teleport2_slow", + "type": "spell", + "spell_data": { "id": "teleport_slow_monster", "min_level": 4 }, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s glances at %3$s and the world lurches." + }, + { + "type": "monster_attack", + "attack_type": "melee", + "id": "teleport_touch", + "move_cost": 80, + "cooldown": { "math": [ "7 + rand(14)" ] }, + "accuracy": 5, + "damage_max_instance": [ { "damage_type": "psi_teleporter_teleporting_damage", "amount": 2, "armor_penetration": 10 } ], + "blockable": false, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "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!", + "miss_msg_npc": "%s reaches for but they dodge!" + }, + { + "type": "leap", + "cooldown": { "math": [ "1 + rand(2)" ] }, + "move_cost": 50, + "allow_no_target": true, + "max_range": 12, + "message": "%1$s vanishes and reappears elsewhere!", + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } + } + ], + "flags": [ "CLIMBS", "HARDTOSHOOT", "TELEPORT_IMMUNE" ] + } }, { "id": "mon_feral_human_porter3", "type": "MONSTER", "name": "ephemeral riftwalker", "description": "This feral barely seems to exist in the real world. They constantly vanish and reappear, weird light and strange mist following in their wake.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 84, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "relative": { "dodge": 6 }, "color": "blue", "symbol": "@", - "aggression": 30, "morale": 25, - "melee_skill": 4, - "melee_dice": 1, - "melee_dice_sides": 6, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, - "harvest": "human", "emit_fields": [ { "emit_id": "emit_plasma", "delay": "1 s" } ], - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true, "avoid_dangerous_fields": true }, "death_drops": "feral_humans_death_drops_porter", "death_function": { "effect": { "id": "teleport_summon_monster", "hit_self": true }, "message": "As the %1$s dies, the air warps around them!" }, "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "luminance": 25, - "special_attacks": [ - [ "PARROT_AT_DANGER", 10 ], - { - "type": "monster_attack", - "attack_type": "melee", - "id": "teleport_touch", - "move_cost": 65, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "accuracy": 6, - "damage_max_instance": [ { "damage_type": "psi_teleporter_teleporting_damage", "amount": 2, "armor_penetration": 10 } ], - "blockable": false, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "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!", - "miss_msg_npc": "%s reaches for but they dodge!" - }, - { - "id": "psi_teleport3_slow", - "type": "spell", - "spell_data": { "id": "teleport_slow_monster", "min_level": 6 }, - "cooldown": { "math": [ "5 + rand(10)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s glances at %3$s and the world lurches." - }, - { - "id": "psi_teleport3_instability", - "type": "spell", - "spell_data": { "id": "teleport_blink_attack_monster", "min_level": 4 }, - "cooldown": { "math": [ "10 + rand(20)" ] }, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s touches %3$s and the world around %3$s wavers." - }, - { - "type": "leap", - "cooldown": 1, - "move_cost": 50, - "allow_no_target": true, - "max_range": 16, - "message": "%1$s vanishes and reappears elsewhere!", - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PRIORITIZE_TARGETS", - "CLIMBS", - "HARDTOSHOOT", - "TELEPORT_IMMUNE" - ] + "extend": { + "special_attacks": [ + [ "PARROT_AT_DANGER", 10 ], + { + "type": "monster_attack", + "attack_type": "melee", + "id": "teleport_touch", + "move_cost": 65, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "accuracy": 6, + "damage_max_instance": [ { "damage_type": "psi_teleporter_teleporting_damage", "amount": 2, "armor_penetration": 10 } ], + "blockable": false, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "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!", + "miss_msg_npc": "%s reaches for but they dodge!" + }, + { + "id": "psi_teleport3_slow", + "type": "spell", + "spell_data": { "id": "teleport_slow_monster", "min_level": 6 }, + "cooldown": { "math": [ "5 + rand(10)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s glances at %3$s and the world lurches." + }, + { + "id": "psi_teleport3_instability", + "type": "spell", + "spell_data": { "id": "teleport_blink_attack_monster", "min_level": 4 }, + "cooldown": { "math": [ "10 + rand(20)" ] }, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s touches %3$s and the world around %3$s wavers." + }, + { + "type": "leap", + "cooldown": 1, + "move_cost": 50, + "allow_no_target": true, + "max_range": 16, + "message": "%1$s vanishes and reappears elsewhere!", + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } } + } + ], + "flags": [ "CLIMBS", "HARDTOSHOOT", "TELEPORT_IMMUNE" ] + } }, { "id": "mon_feral_human_vita", "type": "MONSTER", "name": "feral mender", "description": "Other than the intense expression, this feral human looks to be the picture of health. They could have starred in a healthcare advertisement before the Cataclysm. Only the jagged bit of wood clutched like a club indicates something is wrong.", + "copy-from": "mon_feral_psion_default", + "proportional": { "hp": 1.2 }, "//": "HP and regeneration due to vitakinetic powers", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 125, - "speed": 100, "material": [ "flesh" ], "color": "green", "symbol": "@", - "aggression": 30, "morale": 45, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, "regen_morale": true, - "armor": { "bash": 5, "cut": 3, "stab": 3, "bullet": 5 }, - "regenerates": 5, - "regeneration_modifiers": [ [ "effect_vitakin_hurt", -2 ], [ "effect_psi_null", -5 ] ], + "regenerates": 2, + "regeneration_modifiers": [ [ "effect_vitakin_hurt", -1 ], [ "effect_psi_null", -2 ] ], "bleed_rate": 0, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_vita", "zombify_into": "mon_zombie_survivor", - "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], "upgrades": { "half_life": 45, "into": "mon_feral_human_vita2" }, - "special_attacks": [ - { "id": "feral_weapon_pipe" }, - { - "type": "monster_attack", - "attack_type": "melee", - "id": "mon_vitakinetic_weakness", - "cooldown": { "math": [ "7 + rand(14)" ] }, - "move_cost": 60, - "damage_max_instance": [ { "damage_type": "biological", "amount": 0 } ], - "dodgeable": true, - "blockable": true, - "effects": [ { "id": "effect_vitakinetic_health_down", "duration": [ 620000, 1620000 ] } ], - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "hit_dmg_u": "%1$s touches you and you feel weaker!", - "hit_dmg_npc": "%1$s touches and they flinch!", - "miss_msg_u": "%1$s tries to touch you, but you dodge!", - "miss_msg_npc": "%1$s tries to touch , but they dodge!", - "no_dmg_msg_u": "%1$s touches you but only hits your armor.", - "no_dmg_msg_npc": "%1$s touches but only hits their armor." - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PATH_AVOID_FIRE", - "PRIORITIZE_TARGETS", - "NO_FUNG_DMG" - ] + "extend": { + "special_attacks": [ + { "id": "feral_weapon_pipe" }, + { + "type": "monster_attack", + "attack_type": "melee", + "id": "mon_vitakinetic_weakness", + "cooldown": { "math": [ "7 + rand(14)" ] }, + "accuracy": 4, + "move_cost": 60, + "damage_max_instance": [ { "damage_type": "biological", "amount": 0 } ], + "dodgeable": true, + "blockable": true, + "effects": [ { "id": "effect_vitakinetic_health_down", "duration": [ 620000, 1620000 ] } ], + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "hit_dmg_u": "%1$s touches you and you feel weaker!", + "hit_dmg_npc": "%1$s touches and they flinch!", + "miss_msg_u": "%1$s tries to touch you, but you dodge!", + "miss_msg_npc": "%1$s tries to touch , but they dodge!", + "no_dmg_msg_u": "%1$s touches you but only hits your armor.", + "no_dmg_msg_npc": "%1$s touches but only hits their armor." + } + ], + "flags": [ "NO_FUNG_DMG", "WIELDED_WEAPON" ] + } }, { "id": "mon_feral_human_vita2", "type": "MONSTER", "name": "feral regenerator", "description": "This feral human doesn't even have bloodshot eyes. Their skin positively glows, and as you watch them brush past a jagged chunk of wood to get to you, the wound they receive immediately stops bleeding and rapidly begins to close.", - "default_faction": "zombie", - "looks_like": "chud", - "bodytype": "human", - "species": [ "FERAL" ], - "volume": "62500 ml", - "weight": "81500 g", - "hp": 150, - "speed": 100, - "material": [ "flesh" ], + "copy-from": "mon_feral_psion_default", + "proportional": { "hp": 1.45 }, "color": "green", "symbol": "@", - "aggression": 30, "morale": 45, - "melee_skill": 3, - "melee_dice": 1, - "melee_dice_sides": 6, - "weakpoint_sets": [ "wps_humanoid_body" ], - "families": [ "prof_gross_anatomy", "prof_intro_biology", "prof_physiology" ], - "dodge": 3, "regen_morale": true, - "armor": { "bash": 5, "cut": 3, "stab": 3, "bullet": 5 }, "regenerates": 5, "regeneration_modifiers": [ [ "effect_vitakin_hurt", -2 ], [ "effect_psi_null", -5 ], [ "effect_feral_regeneration", 5 ] ], "bleed_rate": 0, - "harvest": "human", - "dissect": "dissect_human_sample_single", - "vision_day": 45, - "vision_night": 3, - "path_settings": { "max_dist": 45, "allow_open_doors": true, "avoid_traps": true, "avoid_sharp": true }, "death_drops": "feral_humans_death_drops_vita", "zombify_into": "mon_zombie_survivor", "anger_triggers": [ "FRIEND_DIED", "FRIEND_ATTACKED", "HURT" ], - "special_attacks": [ - { "id": "feral_weapon_pipe" }, - { - "type": "monster_attack", - "attack_type": "melee", - "id": "mon_vitakinetic_laceration", - "cooldown": { "math": [ "6 + rand(12)" ] }, - "move_cost": 60, - "damage_max_instance": [ { "damage_type": "biological", "amount": 15 } ], - "effects": [ - { "id": "bleed", "duration": [ 60, 120 ], "intensity": [ 1, 10 ], "chance": 50, "affect_hit_bp": true }, - { "id": "psi_vitakinetic_degeneration", "duration": [ 600, 2400 ] } - ], - "dodgeable": true, - "blockable": true, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "hit_dmg_u": "%1$s touches you and wounds open on your flesh!", - "hit_dmg_npc": "%1$s touches and wounds open on their flesh!", - "miss_msg_u": "%1$s tries to touch you, but you dodge!", - "miss_msg_npc": "%1$s tries to touch , but they dodge!", - "no_dmg_msg_u": "%1$s touches you but only hits your armor.", - "no_dmg_msg_npc": "%1$s touches but only hits their armor." - }, - { - "type": "monster_attack", - "attack_type": "melee", - "id": "mon_vitakinetic_weakness_2", - "cooldown": { "math": [ "7 + rand(14)" ] }, - "move_cost": 60, - "damage_max_instance": [ { "damage_type": "biological", "amount": 0 } ], - "dodgeable": true, - "blockable": true, - "effects": [ { "id": "effect_vitakinetic_healing_down", "duration": [ 920000, 2120000 ] } ], - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "hit_dmg_u": "%1$s touches you and you feel weaker!", - "hit_dmg_npc": "%1$s touches and they flinch!", - "miss_msg_u": "%1$s tries to touch you, but you dodge!", - "miss_msg_npc": "%1$s tries to touch , but they dodge!", - "no_dmg_msg_u": "%1$s touches you but only hits your armor.", - "no_dmg_msg_npc": "%1$s touches but only hits their armor." - }, - { - "id": "psi_vitakin2_regeneration", - "type": "spell", - "spell_data": { "id": "vitakinetic_regeneration_monster" }, - "cooldown": { "math": [ "10 + rand(20)" ] }, - "allow_no_target": true, - "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, - "monster_message": "%1$s closes their eyes and their wounds begin healing at a rapid pace!" - } - ], - "flags": [ - "SEES", - "HEARS", - "SMELLS", - "WARM", - "BASHES", - "GROUP_BASH", - "HUMAN", - "CAN_OPEN_DOORS", - "PATH_AVOID_DANGER", - "PATH_AVOID_FIRE", - "PRIORITIZE_TARGETS", - "NO_FUNG_DMG" - ] + "extend": { + "special_attacks": [ + { "id": "feral_weapon_pipe" }, + { + "type": "monster_attack", + "attack_type": "melee", + "id": "mon_vitakinetic_laceration", + "cooldown": { "math": [ "6 + rand(12)" ] }, + "accuracy": 6, + "move_cost": 60, + "damage_max_instance": [ { "damage_type": "biological", "amount": 15 } ], + "effects": [ + { "id": "bleed", "duration": [ 60, 120 ], "intensity": [ 1, 10 ], "chance": 50, "affect_hit_bp": true }, + { "id": "psi_vitakinetic_degeneration", "duration": [ 600, 2400 ] } + ], + "dodgeable": true, + "blockable": true, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "hit_dmg_u": "%1$s touches you and wounds open on your flesh!", + "hit_dmg_npc": "%1$s touches and wounds open on their flesh!", + "miss_msg_u": "%1$s tries to touch you, but you dodge!", + "miss_msg_npc": "%1$s tries to touch , but they dodge!", + "no_dmg_msg_u": "%1$s touches you but only hits your armor.", + "no_dmg_msg_npc": "%1$s touches but only hits their armor." + }, + { + "type": "monster_attack", + "attack_type": "melee", + "id": "mon_vitakinetic_weakness_2", + "cooldown": { "math": [ "7 + rand(14)" ] }, + "accuracy": 6, + "move_cost": 60, + "damage_max_instance": [ { "damage_type": "biological", "amount": 0 } ], + "dodgeable": true, + "blockable": true, + "effects": [ { "id": "effect_vitakinetic_healing_down", "duration": [ 920000, 2120000 ] } ], + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "hit_dmg_u": "%1$s touches you and you feel weaker!", + "hit_dmg_npc": "%1$s touches and they flinch!", + "miss_msg_u": "%1$s tries to touch you, but you dodge!", + "miss_msg_npc": "%1$s tries to touch , but they dodge!", + "no_dmg_msg_u": "%1$s touches you but only hits your armor.", + "no_dmg_msg_npc": "%1$s touches but only hits their armor." + }, + { + "id": "psi_vitakin2_regeneration", + "type": "spell", + "spell_data": { "id": "vitakinetic_regeneration_monster" }, + "cooldown": { "math": [ "10 + rand(20)" ] }, + "allow_no_target": true, + "condition": { "not": { "u_has_flag": "NO_PSIONICS" } }, + "monster_message": "%1$s closes their eyes and their wounds begin healing at a rapid pace!" + } + ], + "flags": [ "NO_FUNG_DMG", "WIELDED_WEAPON" ] + } } ] From 0b1e4c0b03822d20a9cf2db3869d7e9afcb7c10a Mon Sep 17 00:00:00 2001 From: Standing-Storm <120433252+Standing-Storm@users.noreply.github.com> Date: Wed, 23 Oct 2024 10:42:56 -0500 Subject: [PATCH 13/14] [Xedra Evolved] Lo Ra'ab (#77266) * Check for LILIN_TRAITS * Create eocs.json * Update data/mods/Xedra_Evolved/obsoletion_and_migration/eocs.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Linting * Kick tests --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- data/mods/Xedra_Evolved/mutations/xe_lilin_eocs.json | 3 ++- .../Xedra_Evolved/obsoletion_and_migration/eocs.json | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 data/mods/Xedra_Evolved/obsoletion_and_migration/eocs.json diff --git a/data/mods/Xedra_Evolved/mutations/xe_lilin_eocs.json b/data/mods/Xedra_Evolved/mutations/xe_lilin_eocs.json index 8acb36789cb26..d55f1e6f499a9 100644 --- a/data/mods/Xedra_Evolved/mutations/xe_lilin_eocs.json +++ b/data/mods/Xedra_Evolved/mutations/xe_lilin_eocs.json @@ -40,7 +40,8 @@ "if": { "and": [ { "math": [ "u_vitamin('lilin_ruach_vitamin')", "==", "0" ] }, - { "not": { "u_has_effect": "effect_lilin_no_ruach" } } + { "not": { "u_has_effect": "effect_lilin_no_ruach" } }, + { "u_has_trait": "LILIN_TRAITS" } ] }, "then": { "u_add_effect": "effect_lilin_no_ruach", "duration": "PERMANENT", "intensity": 1 } diff --git a/data/mods/Xedra_Evolved/obsoletion_and_migration/eocs.json b/data/mods/Xedra_Evolved/obsoletion_and_migration/eocs.json new file mode 100644 index 0000000000000..6f8958360d816 --- /dev/null +++ b/data/mods/Xedra_Evolved/obsoletion_and_migration/eocs.json @@ -0,0 +1,10 @@ +[ + { + "type": "effect_on_condition", + "id": "EOC_NON_LILIN_RAAB_UPDATE", + "eoc_type": "EVENT", + "required_event": "game_load", + "condition": { "not": { "u_has_trait": "LILIN_TRAITS" } }, + "effect": [ { "u_lose_effect": "effect_lilin_no_ruach" } ] + } +] From 21859a5c286f8343b744b861f0c213d8fd2998b0 Mon Sep 17 00:00:00 2001 From: John Candlebury Date: Wed, 23 Oct 2024 13:53:42 -0600 Subject: [PATCH 14/14] Aftershock: Suit batteries (#77254) * Suit batteries * Update data/mods/Aftershock/items/battery.json --- .../itemgroups/clothing/winter_outfits.json | 6 ++++- .../itemgroups/loot_corpse_groups.json | 1 + .../Aftershock/items/armor/winter_suits.json | 8 +++---- data/mods/Aftershock/items/battery.json | 23 +++++++++++++++++++ data/mods/Aftershock/items/tool_armor.json | 4 ++-- .../augustmoon_tool_trader.json | 1 + 6 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 data/mods/Aftershock/items/battery.json diff --git a/data/mods/Aftershock/itemgroups/clothing/winter_outfits.json b/data/mods/Aftershock/itemgroups/clothing/winter_outfits.json index 2b6d0b64c5191..792f89a6618c7 100644 --- a/data/mods/Aftershock/itemgroups/clothing/winter_outfits.json +++ b/data/mods/Aftershock/itemgroups/clothing/winter_outfits.json @@ -32,7 +32,11 @@ "type": "item_group", "//": "The matching frontier-cryosuit set. Includes suit, mask and possible future accessories", "subtype": "collection", - "entries": [ { "item": "afs_frontier_cryo" }, { "item": "afs_frontier_cryomask", "prob": 90 } ] + "entries": [ + { "item": "afs_frontier_cryo" }, + { "item": "afs_frontier_cryomask", "prob": 90 }, + { "item": "afs_heavy_suit_battery_cell", "count": [ 1, 2 ], "prob": 25, "charges": [ 0, 1000 ] } + ] }, { "id": "afs_cryopod_g", diff --git a/data/mods/Aftershock/itemgroups/loot_corpse_groups.json b/data/mods/Aftershock/itemgroups/loot_corpse_groups.json index 0011c84ad73b6..e3e0b30814b87 100644 --- a/data/mods/Aftershock/itemgroups/loot_corpse_groups.json +++ b/data/mods/Aftershock/itemgroups/loot_corpse_groups.json @@ -13,6 +13,7 @@ ] }, { "group": "afs_survivor_weapon_set", "prob": 80 }, + { "item": "afs_heavy_suit_battery_cell", "count": [ 1, 2 ], "prob": 80, "charges": [ 100, 1000 ] }, { "group": "afs_tools_scavenging", "prob": 30 }, { "group": "tools_survival", "prob": 80, "count": [ 1, 3 ] }, { "group": "afs_cheap_food", "prob": 30, "count": [ 2, 6 ] }, diff --git a/data/mods/Aftershock/items/armor/winter_suits.json b/data/mods/Aftershock/items/armor/winter_suits.json index 2740f3764f5aa..2107b58c9477f 100644 --- a/data/mods/Aftershock/items/armor/winter_suits.json +++ b/data/mods/Aftershock/items/armor/winter_suits.json @@ -104,8 +104,8 @@ { "pocket_type": "MAGAZINE_WELL", "rigid": true, - "flag_restriction": [ "BATTERY_MEDIUM" ], - "default_magazine": "medium_battery_cell" + "flag_restriction": [ "BATTERY_HEAVY" ], + "default_magazine": "afs_heavy_suit_battery_cell" } ], "warmth": 20, @@ -169,8 +169,8 @@ { "pocket_type": "MAGAZINE_WELL", "rigid": true, - "flag_restriction": [ "BATTERY_MEDIUM" ], - "default_magazine": "medium_battery_cell" + "flag_restriction": [ "BATTERY_HEAVY" ], + "default_magazine": "afs_heavy_suit_battery_cell" } ], "warmth": 20, diff --git a/data/mods/Aftershock/items/battery.json b/data/mods/Aftershock/items/battery.json new file mode 100644 index 0000000000000..feb19c629c83b --- /dev/null +++ b/data/mods/Aftershock/items/battery.json @@ -0,0 +1,23 @@ +[ + { + "id": "afs_heavy_suit_battery_cell", + "type": "MAGAZINE", + "category": "tool_magazine", + "name": { "str": "suit battery", "str_pl": "suit batteries" }, + "description": "A heavy battery cell, compatible with most industrial equipment but purposefully designed to power EVA suits It's a bit too big to fit in most portable tools.", + "ascii_picture": "heavy_plus_battery_cell", + "weight": "880 g", + "volume": "900 ml", + "longest_side": "113 mm", + "price": "200 USD", + "price_postapoc": "200 USD", + "material": [ { "type": "budget_steel", "portion": 99 }, { "type": "plastic", "portion": 1 } ], + "symbol": "=", + "color": "yellow", + "ammo_type": [ "battery" ], + "capacity": 1000, + "looks_like": "battery", + "flags": [ "NO_SALVAGE", "NO_UNLOAD", "NO_RELOAD", "RECHARGE", "BATTERY_HEAVY" ], + "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "battery": 1000 } } ] + } +] diff --git a/data/mods/Aftershock/items/tool_armor.json b/data/mods/Aftershock/items/tool_armor.json index 6d858e83e79fd..c6a362a63741b 100644 --- a/data/mods/Aftershock/items/tool_armor.json +++ b/data/mods/Aftershock/items/tool_armor.json @@ -20,8 +20,8 @@ { "pocket_type": "MAGAZINE_WELL", "rigid": true, - "flag_restriction": [ "BATTERY_MEDIUM" ], - "default_magazine": "medium_battery_cell" + "flag_restriction": [ "BATTERY_HEAVY" ], + "default_magazine": "afs_heavy_suit_battery_cell" } ], "use_action": { diff --git a/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_tool_trader.json b/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_tool_trader.json index 9bc7868a31f73..8eadfd67b4e83 100644 --- a/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_tool_trader.json +++ b/data/mods/Aftershock/npcs/Augustmoon_Salvors/augustmoon_tool_trader.json @@ -36,6 +36,7 @@ { "group": "afs_tools_scavenging", "count": [ 6, 12 ] }, { "group": "afs_tools_pocket", "count": [ 5, 10 ] }, { "item": "afs_40g_plasma_civ", "count": [ 2, 5 ] }, + { "item": "afs_heavy_suit_battery_cell", "count": [ 2, 5 ] }, { "group": "afs_tools_welding_consumable", "count": [ 6, 8 ] }, { "group": "afs_augustmoon_batteries_disposable", "count": [ 5, 10 ] }, { "group": "afs_augustmoon_batteries_rechargeable", "count": [ 2, 3 ], "prob": 20 }