diff --git a/data/mods/Aftershock/EOC/hacking_eoc.json b/data/mods/Aftershock/EOC/hacking_eoc.json index 9695a42489465..cf04706e25d19 100644 --- a/data/mods/Aftershock/EOC/hacking_eoc.json +++ b/data/mods/Aftershock/EOC/hacking_eoc.json @@ -28,14 +28,20 @@ { "type": "effect_on_condition", "id": "EOC_afs_hack_unlock", - "condition": { "and": [ { "expects_vars": [ "furn_pos", "difficulty" ] }, { "u_has_effect": "afs_hack_done" } ] }, + "condition": { "and": [ { "expects_vars": [ "furn_pos", "difficulty", "t_radius" ] }, { "u_has_effect": "afs_hack_done" } ] }, "effect": [ { "run_eocs": [ { "id": "_EOC_afs_hack_unlock", "condition": { "roll_contested": { "math": [ "afs_hack_skill(1)" ] }, "die_size": 4, "difficulty": { "context_val": "difficulty" } }, - "effect": [ { "u_transform_radius": 0, "ter_furn_transform": "afs_multi_unlock", "target_var": { "context_val": "furn_pos" } } ], + "effect": [ + { + "u_transform_radius": { "context_val": "t_radius" }, + "ter_furn_transform": "afs_multi_unlock", + "target_var": { "context_val": "furn_pos" } + } + ], "false_effect": { "u_message": "You fail to override the device." } } ] @@ -45,7 +51,9 @@ { "type": "effect_on_condition", "id": "EOC_start_lock_hack", - "condition": { "and": [ { "expects_vars": [ "furn_pos", "t_delay", "difficulty" ] }, { "test_eoc": "EOC_CONDITION_can_hack" } ] }, + "condition": { + "and": [ { "expects_vars": [ "furn_pos", "t_delay", "difficulty", "t_radius" ] }, { "test_eoc": "EOC_CONDITION_can_hack" } ] + }, "effect": [ { "math": [ "_t_delay", "=", "afs_hack_time_adjust(_t_delay, time('20s'), time('2m'))" ] }, { "u_message": "You connect to the lock controller." }, @@ -53,7 +61,11 @@ { "queue_eoc_with": "EOC_afs_hack_unlock", "time_in_future": { "context_val": "t_delay" }, - "variables": { "furn_pos": { "context_val": "furn_pos" }, "difficulty": { "context_val": "difficulty" } } + "variables": { + "furn_pos": { "context_val": "furn_pos" }, + "difficulty": { "context_val": "difficulty" }, + "t_radius": { "context_val": "t_radius" } + } } ], "false_effect": { "u_message": "You need either an electrohack or working computer to attempt a hack.", "popup": true } diff --git a/data/mods/Aftershock/flags.json b/data/mods/Aftershock/flags.json index 68106dc731473..f108096478a3d 100644 --- a/data/mods/Aftershock/flags.json +++ b/data/mods/Aftershock/flags.json @@ -4,6 +4,11 @@ "type": "json_flag", "info": "This item is an access card for ancient industrial locations." }, + { + "id": "OLD_ENFORCER_CARD", + "type": "json_flag", + "info": "This item is an access card for ancient police locations." + }, { "id": "HEAVY_TOOL", "type": "json_flag" diff --git a/data/mods/Aftershock/itemgroups/clothing/armor_sets.json b/data/mods/Aftershock/itemgroups/clothing/armor_sets.json index a9269a5300a18..fa07a9314d602 100644 --- a/data/mods/Aftershock/itemgroups/clothing/armor_sets.json +++ b/data/mods/Aftershock/itemgroups/clothing/armor_sets.json @@ -79,5 +79,12 @@ { "item": "armguard_scrap", "prob": 40 }, { "item": "cuirass_lightplate", "prob": 90 } ] + }, + { + "type": "item_group", + "id": "afs_police_armor", + "//": "If specific aftershock police armor is added please add to this group. Until then it refers to civilian armors.", + "subtype": "collection", + "entries": [ { "group": "afs_armor_spaceship_crew_g", "prob": 60 }, { "group": "civilian_body_armor", "prob": 40 } ] } ] diff --git a/data/mods/Aftershock/itemgroups/clothing/winter_outfits.json b/data/mods/Aftershock/itemgroups/clothing/winter_outfits.json index 7cdae58840531..2b6d0b64c5191 100644 --- a/data/mods/Aftershock/itemgroups/clothing/winter_outfits.json +++ b/data/mods/Aftershock/itemgroups/clothing/winter_outfits.json @@ -13,6 +13,13 @@ "subtype": "distribution", "items": [ { "group": "afs_frontier_cryo_g", "prob": 20 }, { "group": "afs_cryopod_g", "prob": 1 } ] }, + { + "//": "A group for any police-flavour advanced civilian piece of clothing", + "id": "afs_wintersuit_police_advanced", + "type": "item_group", + "subtype": "distribution", + "items": [ { "group": "afs_magellan_g", "prob": 2 } ] + }, { "//": "A group for any science-flavour advanced civilian piece of clothing", "id": "afs_wintersuit_science_advanced", diff --git a/data/mods/Aftershock/itemgroups/item_groups.json b/data/mods/Aftershock/itemgroups/item_groups.json index 41e5067b11800..aef2ac38a4bba 100644 --- a/data/mods/Aftershock/itemgroups/item_groups.json +++ b/data/mods/Aftershock/itemgroups/item_groups.json @@ -592,5 +592,12 @@ "type": "item_group", "subtype": "distribution", "entries": [ { "item": "afs_glass_device" }, { "item": "afs_glass_AR_device" } ] + }, + { + "id": "afs_police_evidence_locker", + "type": "item_group", + "subtype": "distribution", + "//": "Refers directly to the existing evidence group but we can add whatever we want to layer on top of that.", + "entries": [ { "group": "cop_evidence" } ] } ] diff --git a/data/mods/Aftershock/itemgroups/robot_storage.json b/data/mods/Aftershock/itemgroups/robot_storage.json index a185cb44e324a..7f5676979bd42 100644 --- a/data/mods/Aftershock/itemgroups/robot_storage.json +++ b/data/mods/Aftershock/itemgroups/robot_storage.json @@ -12,5 +12,19 @@ "//": "Small Consumer and commercial grade robots that can (probably) fit in the reinforced display cases.", "subtype": "distribution", "items": [ [ "bot_light_hack", 20 ], [ "bot_skitterbot_rat", 10 ], [ "bot_eyebot_heater", 5 ], [ "bot_skitterbot_hunter", 5 ] ] + }, + { + "id": "afs_police_bot_storage", + "type": "item_group", + "//": "TODO: Apparently these items are all being migrated currently. Police Robots found in enforcer stations and departments.", + "subtype": "distribution", + "items": [ + [ "afs_bot_riotbot", 5 ], + [ "afs_bot_copbot", 15 ], + [ "afs_bot_eyebot", 20 ], + [ "afs_broken_riotbot", 10 ], + [ "afs_broken_copbot", 70 ], + [ "afs_broken_eyebot", 100 ] + ] } ] diff --git a/data/mods/Aftershock/itemgroups/tool_groups.json b/data/mods/Aftershock/itemgroups/tool_groups.json index 3193713a4e1e4..cb92f627e2b08 100644 --- a/data/mods/Aftershock/itemgroups/tool_groups.json +++ b/data/mods/Aftershock/itemgroups/tool_groups.json @@ -144,6 +144,13 @@ { "item": "afs_wrist_computer", "prob": 20 } ] }, + { + "type": "item_group", + "id": "afs_police_hacker_gear", + "//": "specialized tools used specifcally by cyber security specialists. Currently difers to the programming group but if advanced hacking tools get made they should be placed here.", + "subtype": "collection", + "items": [ { "group": "afs_tools_programing", "prob": 60 }, { "group": "afs_consumer_vr", "prob": 20 } ] + }, { "type": "item_group", "id": "afs_tools_agricultural_hazardous", diff --git a/data/mods/Aftershock/itemgroups/weapons/armories.json b/data/mods/Aftershock/itemgroups/weapons/armories.json index 65e08e1e5fcae..7575acae309b0 100644 --- a/data/mods/Aftershock/itemgroups/weapons/armories.json +++ b/data/mods/Aftershock/itemgroups/weapons/armories.json @@ -107,5 +107,17 @@ [ "afs_gibs_shotgun", 20 ], [ "afs_raketa_shotgun", 20 ] ] + }, + { + "id": "afs_police_armory", + "type": "item_group", + "subtype": "distribution", + "items": [ { "group": "afs_civilian_armory", "prob": 3 }, { "item": "tazer", "prob": 5 } ] + }, + { + "id": "afs_police_anti_robot_armory", + "type": "item_group", + "subtype": "collection", + "items": [ { "group": "afs_swat_emp", "prob": 3 }, { "group": "afs_civilian_laser_mag", "prob": 1 } ] } ] diff --git a/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json b/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json index 0a34bcfb36df0..dc04717c2b085 100644 --- a/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json +++ b/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json @@ -144,5 +144,12 @@ "subtype": "distribution", "copy-from": "ammo_rifle_common", "extend": { "items": [ { "group": "afs_any_laser_mag", "prob": 100 }, { "group": "afs_any_plasma_mag", "prob": 50 } ] } + }, + { + "type": "item_group", + "id": "afs_swat_emp", + "//": "Anti-Robot weapons for police force", + "subtype": "distribution", + "items": [ [ "afs_xm34", 5 ] ] } ] diff --git a/data/mods/Aftershock/itemgroups/weapons/grenade_groups.json b/data/mods/Aftershock/itemgroups/weapons/grenade_groups.json index 1a78fa1bf03ed..24c0c8bb191d2 100644 --- a/data/mods/Aftershock/itemgroups/weapons/grenade_groups.json +++ b/data/mods/Aftershock/itemgroups/weapons/grenade_groups.json @@ -14,5 +14,15 @@ { "item": "scrambler", "count": [ 1, 3 ] }, { "item": "grenade_emp", "count": [ 1, 3 ] } ] + }, + { + "id": "afs_anti_robot_grenades", + "type": "item_group", + "subtype": "distribution", + "entries": [ + { "item": "afs_electroshock_grenade_1", "count": [ 1, 3 ] }, + { "item": "scrambler", "count": [ 1, 3 ] }, + { "item": "grenade_emp", "count": [ 1, 3 ] } + ] } ] diff --git a/data/mods/Aftershock/items/corpses.json b/data/mods/Aftershock/items/corpses.json index 8575c2f72dc39..0d36461396abd 100644 --- a/data/mods/Aftershock/items/corpses.json +++ b/data/mods/Aftershock/items/corpses.json @@ -190,7 +190,7 @@ { "type": "GENERIC", "id": "broken_eyebot_heater", - "copy-from": "broken_eyebot", + "copy-from": "afs_broken_eyebot", "color": "pink", "name": "broken floating heater", "description": "A broken floating heater, now cold and motionless. Could be stripped down or re-crafted." @@ -317,7 +317,7 @@ }, { "type": "GENERIC", - "id": "broken_eyebot", + "id": "afs_broken_eyebot", "symbol": ",", "color": "green", "name": { "str": "broken eyebot" }, @@ -334,7 +334,7 @@ }, { "type": "GENERIC", - "id": "broken_copbot", + "id": "afs_broken_copbot", "symbol": ",", "color": "green", "name": { "str": "broken police bot" }, @@ -351,7 +351,7 @@ }, { "type": "GENERIC", - "id": "broken_riotbot", + "id": "afs_broken_riotbot", "symbol": ",", "color": "green", "name": { "str": "broken riot control bot" }, diff --git a/data/mods/Aftershock/items/id_cards.json b/data/mods/Aftershock/items/id_cards.json index ad41e586a0b72..bf941dffb9afa 100644 --- a/data/mods/Aftershock/items/id_cards.json +++ b/data/mods/Aftershock/items/id_cards.json @@ -76,5 +76,21 @@ "volume": "5 ml", "category": "keys", "to_hit": -3 + }, + { + "type": "GENERIC", + "id": "enforcer_master_keycard", + "symbol": ",", + "color": "blue", + "name": { "str": "Enforcer master key" }, + "description": "Issued only to the highest echelons of Mercurial corporate security, these cards provide unfettered access to all enforcer prefab facilites built before the year 2152. A lucrative find for any salvor on Salus IV.", + "price": "8 kUSD", + "flags": [ "OLD_ENFORCER_CARD" ], + "price_postapoc": "8 kUSD", + "material": [ "plastic" ], + "weight": "6 g", + "volume": "5 ml", + "category": "keys", + "to_hit": -3 } ] diff --git a/data/mods/Aftershock/items/inactiverobot.json b/data/mods/Aftershock/items/inactiverobot.json index 90d9d141bfb45..3a5d171dfba81 100644 --- a/data/mods/Aftershock/items/inactiverobot.json +++ b/data/mods/Aftershock/items/inactiverobot.json @@ -472,7 +472,7 @@ "abstract": "bot_eyebot_base", "type": "TOOL", "name": "inactive eyebot", - "looks_like": "broken_eyebot", + "looks_like": "afs_broken_eyebot", "price": "100 USD", "price_postapoc": "100 USD", "material": [ "steel", "plastic" ], @@ -525,8 +525,8 @@ "melee_damage": { "bash": 8 } }, { - "id": "bot_eyebot", - "looks_like": "broken_eyebot", + "id": "afs_bot_eyebot", + "looks_like": "afs_broken_eyebot", "type": "TOOL", "name": { "str": "inactive eyebot" }, "description": "An inactive eyebot. Using this item involves turning it on and launching the UAV. If reprogrammed and rewired successfully, the eyebot will then keep watch for intruders.", @@ -552,8 +552,8 @@ "melee_damage": { "bash": 8 } }, { - "id": "bot_copbot", - "looks_like": "broken_copbot", + "id": "afs_bot_copbot", + "looks_like": "afs_broken_copbot", "type": "TOOL", "name": { "str": "inactive police bot" }, "description": "An inactive police robot. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully, the police bot will then identify you as law enforcement, roam around or follow you, and attempt to detain lawbreakers.", @@ -579,8 +579,8 @@ "melee_damage": { "bash": 8 } }, { - "id": "bot_riotbot", - "looks_like": "broken_riotbot", + "id": "afs_bot_riotbot", + "looks_like": "afs_broken_riotbot", "type": "TOOL", "name": { "str": "inactive riot control bot" }, "description": "An inactive riot control bot. Using this item involves placing it on the ground and turning it on. If reprogrammed and rewired successfully, the robot will bring order and peace to the horde.", diff --git a/data/mods/Aftershock/maps/city_buildings.json b/data/mods/Aftershock/maps/city_buildings.json index 6df2287332db9..9fb976a1daac3 100644 --- a/data/mods/Aftershock/maps/city_buildings.json +++ b/data/mods/Aftershock/maps/city_buildings.json @@ -152,6 +152,16 @@ ], "locations": [ "land" ] }, + { + "id": "afs_enforcer_station_1", + "type": "city_building", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "afs_enforcer_station_a1_south" }, + { "point": [ 0, 0, 1 ], "overmap": "afs_enforcer_station_a1_floor2_south" }, + { "point": [ 0, 0, 2 ], "overmap": "afs_enforcer_station_a1_roof_south" } + ], + "locations": [ "land" ] + }, { "id": "afs_habitat_block_1", "type": "city_building", diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json b/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json index d5f72fa303d69..7817edfb76fa5 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/furniture_habitat.json @@ -254,7 +254,7 @@ { "math": [ "_t_delay", "=", "time('20 m')" ] }, { "run_eoc_with": "EOC_start_lock_hack", - "variables": { "furn_pos": { "context_val": "pos" }, "t_delay": { "context_val": "t_delay" }, "difficulty": "9" }, + "variables": { "furn_pos": { "context_val": "pos" }, "t_delay": { "context_val": "t_delay" }, "difficulty": "9", "t_radius": "0" }, "alpha_talker": "avatar" } ] @@ -295,7 +295,7 @@ { "math": [ "_t_delay", "=", "time('20 m')" ] }, { "run_eoc_with": "EOC_start_lock_hack", - "variables": { "furn_pos": { "context_val": "pos" }, "t_delay": { "context_val": "t_delay" }, "difficulty": "10" }, + "variables": { "furn_pos": { "context_val": "pos" }, "t_delay": { "context_val": "t_delay" }, "difficulty": "10", "t_radius": "0" }, "alpha_talker": "avatar" } ] @@ -364,5 +364,90 @@ { "item": "sheet_metal_small", "count": [ 2, 10 ] } ] } + }, + { + "type": "furniture", + "id": "f_hacker_chair", + "name": "Net Breacher recliner", + "symbol": "H", + "description": "A reclined metal chair adorned with soft fabric padding. A number of cables dangle from the headrest, waiting to be connected to a bionic interface. In the past, this state-of-the-art equipment would have served as a hypercloud access point for cyber security specialists.", + "looks_like": "f_armchair", + "color": "green", + "move_cost_mod": 1, + "coverage": 45, + "comfort": 4, + "floor_bedding_warmth": 500, + "required_str": 12, + "deconstruct": { + "items": [ + { "item": "pipe", "count": [ 1, 2 ] }, + { "item": "sheet_metal", "count": [ 1, 2 ] }, + { "item": "sheet_metal_small", "count": [ 2, 10 ] }, + { "item": "nuts_bolts", "charges": [ 2, 8 ] }, + { "item": "sheet_cotton", "count": [ 6, 10 ] }, + { "item": "cotton_patchwork", "count": [ 2, 7 ] }, + { "item": "afs_circuitry_1", "count": [ 1, 6 ], "prob": 80 }, + { "item": "afs_circuitry_2", "count": [ 1, 3 ], "prob": 60 }, + { "item": "afs_neural_io_1", "count": [ 1, 6 ], "prob": 80 }, + { "item": "afs_neural_io_2", "count": [ 1, 3 ], "prob": 60 } + ] + }, + "flags": [ "TRANSPARENT", "FLAMMABLE_ASH", "ORGANIC", "MOUNTABLE", "CAN_SIT", "ALIGN_WORKBENCH", "SMALL_HIDE" ], + "bash": { + "str_min": 30, + "str_max": 80, + "sound": "smash!", + "sound_fail": "whump.", + "items": [ + { "item": "scrap", "count": [ 8, 24 ] }, + { "item": "sheet_metal_small", "count": [ 2, 10 ] }, + { "item": "nuts_bolts", "charges": [ 2, 8 ] }, + { "item": "sheet_cotton", "count": [ 6, 10 ] }, + { "item": "cotton_patchwork", "count": [ 2, 7 ] }, + { "item": "afs_circuitry_1", "count": [ 1, 4 ], "prob": 50 }, + { "item": "afs_circuitry_2", "count": [ 1, 2 ], "prob": 20 }, + { "item": "afs_neural_io_1", "count": [ 1, 4 ], "prob": 50 }, + { "item": "afs_neural_io_2", "count": 1, "prob": 20 } + ] + } + }, + { + "type": "furniture", + "id": "f_security_panel", + "name": "security override panel", + "symbol": "e", + "description": "A slim wall mounted metal panel covering an electronic interface to manually override nearby security systems.", + "color": "blue", + "move_cost_mod": 1, + "required_str": -1, + "flags": [ "TRANSPARENT" ], + "examine_action": { + "type": "effect_on_condition", + "effect_on_conditions": [ + { + "id": "EOC_unlock_afs_security_panel", + "effect": [ + { "math": [ "_t_delay", "=", "time('20 m')" ] }, + { + "run_eoc_with": "EOC_start_lock_hack", + "variables": { "furn_pos": { "context_val": "pos" }, "t_delay": { "context_val": "t_delay" }, "difficulty": "10", "t_radius": "6" }, + "alpha_talker": "avatar" + } + ] + } + ] + }, + "bash": { + "str_min": 6, + "str_max": 30, + "sound": "smash!", + "sound_fail": "whump.", + "items": [ + { "item": "cable", "charges": [ 1, 2 ] }, + { "item": "plastic_chunk", "count": [ 1, 2 ] }, + { "item": "scrap", "count": [ 1, 2 ] }, + { "item": "steel_chunk", "count": [ 0, 1 ] } + ] + } } ] diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_card_readers.json b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_card_readers.json index ef8989e8669c7..6bb33136f5070 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_card_readers.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_card_readers.json @@ -21,5 +21,28 @@ "success_msg": "You opened the door!", "redundant_msg": "The door is already open." } + }, + { + "type": "terrain", + "id": "t_afs_enforcer_card_reader", + "name": "Old Enforcer Card Reader", + "description": "A smartcard based lock system once fitted to corporate police prefab facilities. While an original key would be impossible to find, the machine is ancient and obsolete, and it can be hacked or masterkeys can be obtained to bypass it.", + "symbol": "6", + "color": "blue", + "copy-from": "t_card_science_maintenance_blue", + "looks_like": "t_card_science_maintenance_blue", + "examine_action": { + "type": "cardreader", + "flags": [ "OLD_ENFORCER_CARD" ], + "consume_card": false, + "allow_hacking": true, + "despawn_monsters": false, + "radius": 3, + "terrain_changes": { "t_door_metal_locked": "t_door_metal_c" }, + "query": true, + "query_msg": "Are you sure you want to open this door?", + "success_msg": "You opened the door!", + "redundant_msg": "The door is already open." + } } ] diff --git a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_habitat_doors.json b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_habitat_doors.json index 9b3e80cb72af3..fd056c8a68819 100644 --- a/data/mods/Aftershock/maps/furniture_and_terrain/terrain_habitat_doors.json +++ b/data/mods/Aftershock/maps/furniture_and_terrain/terrain_habitat_doors.json @@ -46,5 +46,59 @@ { "item": "hinge", "count": [ 1, 3 ] } ] } + }, + { + "type": "terrain", + "id": "t_afs_security_door_frame", + "name": "open security gate", + "description": "A metal floor adorned with hazard lines indicating the presence of a security gate.", + "symbol": ".", + "looks_like": "t_door_frame", + "color": "dark_gray", + "move_cost": 2, + "connect_groups": "WALL", + "connects_to": "WALL", + "flags": [ "TRANSPARENT", "FLAT", "ROAD", "SUPPORTS_ROOF" ], + "bash": { + "str_min": 18, + "str_max": 75, + "sound": "metal screeching!", + "sound_fail": "clang!", + "ter_set": "t_null", + "items": [ { "item": "spike", "count": [ 2, 4 ] }, { "item": "scrap", "count": [ 3, 6 ] } ] + } + }, + { + "type": "terrain", + "id": "t_afs_security_gate_closed", + "name": "closed security gate", + "description": "An extremely resilient gate made of assorted steel, carved and pounded into shape.", + "symbol": "+", + "looks_like": "t_door_metal_c", + "color": "cyan", + "move_cost": 0, + "coverage": 95, + "roof": "t_metal_roof", + "connect_groups": "WALL", + "connects_to": "WALL", + "rotates_to": "INDOORFLOOR", + "flags": [ "NOITEM", "DOOR", "LOCKED", "SUPPORTS_ROOF" ], + "oxytorch": { + "result": "t_mdoor_frame", + "duration": "14 seconds", + "byproducts": [ { "item": "steel_plate", "count": [ 0, 1 ] }, { "item": "steel_chunk", "count": [ 3, 8 ] } ] + }, + "bash": { + "str_min": 80, + "str_max": 250, + "sound": "metal screeching!", + "sound_fail": "clang!", + "ter_set": "t_mdoor_lab_frame", + "items": [ + { "item": "scrap", "count": [ 12, 24 ] }, + { "item": "steel_plate", "prob": 75 }, + { "item": "hinge", "count": [ 1, 3 ] } + ] + } } ] diff --git a/data/mods/Aftershock/maps/mapgen/police_station.json b/data/mods/Aftershock/maps/mapgen/police_station.json new file mode 100644 index 0000000000000..fb9967ab33948 --- /dev/null +++ b/data/mods/Aftershock/maps/mapgen/police_station.json @@ -0,0 +1,365 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "afs_enforcer_station_a1" ], + "object": { + "fill_ter": "t_metal_floor", + "rows": [ + " ", + " //=///=///////=////#// ", + " /h.v/v.h/<>/❶-@.~-@.~- ", + " /:/:/.'k/../❺-@..-@..- ", + " =...//://../:-...-...- ", + " /á..:...'....-))!-))!- ", + " /á'b/...'.%....'...'.) ", + " /á.b/.///!//...'...'.) ", + " //:////ää.ä/..--!---!- ", + " /...'%/â..ä/..-.'.)k.- ", + " /F.h.h/â'.â/..-.y.)c'- ", + " =o.yyy/fh.â/''-hyh)k.- ", + " /jUh.h/ffââ/..-------- ", + " /==/==//////..-éé.ééé- ", + " [™£™™£/3.4.:..1...'.é- ", + " [™£❷£™/.'../..2ééyy.é- ", + " [™™❻™™/3..5/..-----.é- ", + " [£™❷£™/====/==/£™£---- ", + " [™£™™™™£™£™£™™£™™£™™™[ ", + " [™™666£™™™™£™£7™7™™™£[ ", + " [£™666™£™™™[[[[™£™[[[[ ", + " [™£™£™™™££™[ [£™™[ ", + " [[[[[[[[[[[[ [[[[[ ", + " " + ], + "palettes": [ + "afs_habitat_structure", + "afs_habitat_exterior", + "afs_habitat_residential_furnishing", + "afs_habitat_life_support", + "afs_enforcer_station_a1_parrameter_palette" + ], + "terrain": { "1": "t_door_metal_locked", "2": "t_afs_enforcer_card_reader", " ": "t_open_air" }, + "furniture": { + "3": "f_treadmill", + "4": "f_punching_bag", + "5": "f_exercise", + "6": "f_solar_unit", + "7": "f_small_satelitte_dish", + "á": "f_locker", + "â": "f_rack", + "ä": "f_table", + "é": "f_locker" + }, + "items": { + "á": { "item": "afs_wintersuit_police_advanced", "chance": 30 }, + "â": { "item": "afs_tools_robot_maintenance", "chance": 30, "repeat": [ 1, 2 ] }, + "ë": { "item": "afs_police_bot_storage", "chance": 20 }, + "é": { "item": "afs_police_evidence_locker", "chance": 60, "repeat": [ 1, 12 ] } + }, + "place_nested": [ + { "chunks": [ { "param": "lightstatus", "fallback": "null" } ], "x": 0, "y": 0 }, + { + "chunks": [ + { + "switch": { "param": "enemies", "fallback": "afs_enforcer_station_a1_floor2_moxies" }, + "cases": { + "afs_enforcer_station_a1_floor1_moxies": "afs_enforcer_station_a1_floor2_moxies", + "afs_enforcer_station_a1_floor1_robots": "afs_enforcer_station_a1_floor2_robots" + } + } + ], + "x": 0, + "y": 0 + } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "afs_enforcer_station_a1_roof" ], + "object": { + "fill_ter": "t_metal_floor", + "rows": [ + " ", + " [[[[[[[[[[[[[[[[[[[[[[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [££££££££££££££££££££[ ", + " [[[[[[[[[[[[£££££££££[ ", + " [£££££££££[ ", + " [£££££££££[ ", + " [££[[[[[££[ ", + " [[[[ [[[[ ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "afs_habitat_structure", "afs_habitat_exterior" ], + "terrain": { " ": "t_open_air" } + } + }, + { + "type": "palette", + "id": "afs_enforcer_station_a1_parrameter_palette", + "parameters": { + "enemies": { + "type": "nested_mapgen_id", + "default": { "distribution": [ "afs_enforcer_station_a1_floor1_moxies", "afs_enforcer_station_a1_floor1_robots" ] } + }, + "lightstatus": { "type": "nested_mapgen_id", "default": { "distribution": [ "afs_map_lights_on", "null" ] } } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_enforcer_station_a1_floor1_moxies", + "object": { + "mapgensize": [ 24, 24 ], + "place_monster": [ { "group": "AFS_GROUP_RUIN_MOXIE", "x": [ 0, 23 ], "y": [ 0, 23 ], "pack_size": [ 1, 5 ], "chance": 50 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_enforcer_station_a1_floor1_robots", + "object": { + "mapgensize": [ 24, 24 ], + "place_monster": [ { "group": "GROUP_ROBOT_COPS_HOSTILE", "x": [ 0, 23 ], "y": [ 0, 23 ], "pack_size": [ 2, 5 ], "chance": 70 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_enforcer_station_a1_floor2_moxies", + "object": { + "mapgensize": [ 24, 24 ], + "place_monster": [ { "group": "AFS_GROUP_RUIN_MOXIE", "x": [ 2, 21 ], "y": [ 2, 19 ], "z": 1, "pack_size": [ 1, 5 ], "chance": 50 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_enforcer_station_a1_floor2_robots", + "object": { + "mapgensize": [ 24, 24 ], + "place_monster": [ { "group": "GROUP_ROBOT_COPS_HOSTILE", "x": [ 2, 21 ], "y": [ 2, 19 ], "z": 1, "pack_size": [ 1, 4 ], "chance": 70 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_enforcer_station_a1_armory_unlooted", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " á yy ", + " á â ", + " á â ", + " yy ", + " ä ", + " é ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "afs_habitat_residential_furnishing" ], + "furniture": { "á": "f_locker", "â": "f_locker", "ä": "f_locker", "é": "f_locker" }, + "items": { + "á": { "item": "afs_police_armor", "chance": 80, "repeat": [ 1, 4 ] }, + "â": { "item": "afs_police_armory", "chance": 80, "repeat": [ 8, 18 ] }, + "ä": { "item": "afs_anti_robot_grenades", "chance": 60, "repeat": [ 2, 4 ] }, + "é": { "item": "afs_police_anti_robot_armory", "chance": 40, "repeat": [ 3, 8 ] } + } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_enforcer_station_a1_armory_looted", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " 2 ", + " 1 yy ", + " 1 1 ", + " 1 1 ", + " yy ", + " 1 ", + " 1 ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "afs_habitat_residential_furnishing" ], + "terrain": { "2": "t_mdoor_frame" }, + "furniture": { "1": "f_locker" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_enforcer_station_a1_garage_open", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " 111111 ", + " " + ], + "terrain": { "1": "t_afs_security_door_frame" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_enforcer_station_a1_garage_patrol_car", + "object": { + "mapgensize": [ 24, 24 ], + "place_vehicles": [ { "vehicle": "policecar_atomic", "x": 7, "y": 18, "chance": 20, "rotation": 90 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "afs_enforcer_station_a1_garage_cycles", + "object": { + "mapgensize": [ 24, 24 ], + "place_vehicles": [ + { "vehicle": "light_cycle", "x": 5, "y": 18, "chance": 10, "rotation": 90 }, + { "vehicle": "light_cycle", "x": 8, "y": 18, "chance": 10, "rotation": 90 } + ] + } + } +] diff --git a/data/mods/Aftershock/maps/overmap_terrain.json b/data/mods/Aftershock/maps/overmap_terrain.json index 5fecefb8222f5..ddfb99f9ace0b 100644 --- a/data/mods/Aftershock/maps/overmap_terrain.json +++ b/data/mods/Aftershock/maps/overmap_terrain.json @@ -496,6 +496,16 @@ "mondensity": 2, "flags": [ "SIDEWALK" ] }, + { + "type": "overmap_terrain", + "name": "Enforcer Station", + "id": [ "afs_enforcer_station_a1", "afs_enforcer_station_a1_floor2", "afs_enforcer_station_a1_roof" ], + "sym": "E", + "color": "blue", + "see_cost": 3, + "mondensity": 3, + "flags": [ "SIDEWALK" ] + }, { "type": "overmap_terrain", "id": [ "afs_pwr_sub_s", "afs_pwr_sub_s_roof" ], diff --git a/data/mods/Aftershock/migration.json b/data/mods/Aftershock/migration.json index dbd0d9f9af3a2..0223fb0c0685d 100644 --- a/data/mods/Aftershock/migration.json +++ b/data/mods/Aftershock/migration.json @@ -20,5 +20,35 @@ "type": "bionic_migration", "//": "obsoleted from base game as part of https://github.com/CleverRaven/Cataclysm-DDA/pull/70989", "from": "bio_trickle" + }, + { + "id": [ "bot_eyebot" ], + "type": "MIGRATION", + "replace": "afs_bot_eyebot" + }, + { + "id": [ "broken_eyebot" ], + "type": "MIGRATION", + "replace": "afs_broken_eyebot" + }, + { + "id": [ "bot_copbot" ], + "type": "MIGRATION", + "replace": "afs_bot_copbot" + }, + { + "id": [ "broken_copbot" ], + "type": "MIGRATION", + "replace": "afs_broken_copbot" + }, + { + "id": [ "bot_riotbot" ], + "type": "MIGRATION", + "replace": "afs_bot_riotbot" + }, + { + "id": [ "broken_riotbot" ], + "type": "MIGRATION", + "replace": "afs_broken_riotbot" } ] diff --git a/data/mods/Aftershock/mobs/monster_groups/robot_monster_groups.json b/data/mods/Aftershock/mobs/monster_groups/robot_monster_groups.json index 9a53f366cbc68..3de8db8ce76e0 100644 --- a/data/mods/Aftershock/mobs/monster_groups/robot_monster_groups.json +++ b/data/mods/Aftershock/mobs/monster_groups/robot_monster_groups.json @@ -53,5 +53,16 @@ { "monster": "mon_skitterbot", "weight": 200, "cost_multiplier": 20 }, { "monster": "mon_scavbot_needle", "weight": 3, "cost_multiplier": 70 } ] + }, + { + "type": "monstergroup", + "name": "GROUP_ROBOT_COPS_HOSTILE", + "default": "mon_manhack", + "monsters": [ + { "monster": "mon_skitterbot", "weight": 200, "cost_multiplier": 20 }, + { "monster": "mon_afs_eyebot", "weight": 200, "cost_multiplier": 4 }, + { "monster": "mon_afs_copbot", "weight": 100, "cost_multiplier": 70 }, + { "monster": "mon_afs_riotbot", "weight": 50, "cost_multiplier": 100 } + ] } ] diff --git a/data/mods/Aftershock/mobs/robots.json b/data/mods/Aftershock/mobs/robots.json index 0fde0b07008a4..87454983751c0 100644 --- a/data/mods/Aftershock/mobs/robots.json +++ b/data/mods/Aftershock/mobs/robots.json @@ -749,7 +749,7 @@ ] }, { - "id": "mon_eyebot", + "id": "mon_afs_eyebot", "type": "MONSTER", "name": { "str": "eyebot" }, "description": "A quadcopter drone largely comprised of a high-resolution camera lens and a speaker, this robot hovers above the ground, documenting the carnage and mayhem around it. While it is no longer able to report to a central authority, it's likely that some of its automated alert systems are still functional, given that the thing seems to have an operational charging station somewhere.", @@ -766,7 +766,7 @@ "morale": 100, "melee_damage": [ { "damage_type": "cut", "amount": 0 } ], "dodge": 3, - "revert_to_itype": "bot_eyebot", + "revert_to_itype": "afs_bot_eyebot", "special_attacks": [ [ "PHOTOGRAPH", 30 ] ], "death_drops": { "groups": [ [ "robots", 4 ], [ "eyebot", 1 ] ] }, "death_function": { "corpse_type": "BROKEN" }, @@ -774,7 +774,7 @@ "armor": { "bash": 8, "cut": 10, "bullet": 8 } }, { - "id": "mon_copbot", + "id": "mon_afs_copbot", "type": "MONSTER", "name": { "str": "police bot" }, "description": "One of the many models of armored law enforcement robots employed shortly before the collapse of civilization. Solar powered like many other robots, it maintains its programmed pursuit of law and order, propelled on a trio of omni wheels.", @@ -797,7 +797,7 @@ "dodge": 8, "vision_day": 50, "path_settings": { "max_dist": 5 }, - "revert_to_itype": "bot_copbot", + "revert_to_itype": "afs_bot_copbot", "special_attacks": [ [ "COPBOT", 3 ] ], "death_drops": { "groups": [ [ "robots", 4 ], [ "copbot", 1 ] ] }, "death_function": { "corpse_type": "BROKEN" }, @@ -815,7 +815,7 @@ "armor": { "bash": 12, "cut": 8, "bullet": 6 } }, { - "id": "mon_riotbot", + "id": "mon_afs_riotbot", "type": "MONSTER", "name": { "str": "riot control bot" }, "description": "A nonviolent riot-control bot, designed to suppress riots and make mass arrests of those participating. Though its relaxation gas is by far its best-known weapon, it carries a blinding spotlight and a low-powered stungun for self-defense--in addition to a supply of electronic handcuffs.", @@ -835,7 +835,7 @@ "dodge": 8, "vision_day": 50, "path_settings": { "max_dist": 5 }, - "revert_to_itype": "bot_riotbot", + "revert_to_itype": "afs_bot_riotbot", "special_attacks": [ [ "RIOTBOT", 1 ] ], "special_when_hit": [ "ZAPBACK", 100 ], "death_drops": { "groups": [ [ "robots", 4 ], [ "copbot", 1 ] ] }, diff --git a/data/mods/Aftershock/mobs/scavbots.json b/data/mods/Aftershock/mobs/scavbots.json index 772c4ea128aa7..d71b7a36d5907 100644 --- a/data/mods/Aftershock/mobs/scavbots.json +++ b/data/mods/Aftershock/mobs/scavbots.json @@ -81,7 +81,7 @@ { "id": "mon_eyebot_heater", "type": "MONSTER", - "copy-from": "mon_eyebot", + "copy-from": "mon_afs_eyebot", "name": "floating heater", "color": "pink", "luminance": 8, diff --git a/data/mods/Aftershock/recipes/deconstruction/robot.json b/data/mods/Aftershock/recipes/deconstruction/robot.json index 018a0c011f321..afffb4381c9a0 100644 --- a/data/mods/Aftershock/recipes/deconstruction/robot.json +++ b/data/mods/Aftershock/recipes/deconstruction/robot.json @@ -23,7 +23,7 @@ ] }, { - "result": "broken_eyebot", + "result": "afs_broken_eyebot", "type": "uncraft", "activity_level": "LIGHT_EXERCISE", "skill_used": "electronics", diff --git a/data/mods/Aftershock/ter_fur_transform.json b/data/mods/Aftershock/ter_fur_transform.json index c24029cb23c83..03d5a4267b1fc 100644 --- a/data/mods/Aftershock/ter_fur_transform.json +++ b/data/mods/Aftershock/ter_fur_transform.json @@ -23,6 +23,12 @@ "valid_terrain": [ "t_afs_door_metal_elocked" ], "message": "The door's PIN pad chimes happily as the locking mechanism releases.", "message_good": true + }, + { + "result": "t_afs_security_door_frame", + "valid_terrain": [ "t_afs_security_gate_closed" ], + "message": "The security gate recedes into the cieling.", + "message_good": true } ] }, diff --git a/data/mods/Aftershock/vehicles/vehicles.json b/data/mods/Aftershock/vehicles/vehicles.json index f1ac793a0322d..af196bc87c53b 100644 --- a/data/mods/Aftershock/vehicles/vehicles.json +++ b/data/mods/Aftershock/vehicles/vehicles.json @@ -312,5 +312,83 @@ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }, { "x": 0, "y": 1, "chance": 5, "item_groups": [ "female_underwear" ] } ] + }, + { + "id": "policecar_atomic", + "type": "vehicle", + "name": "Enforcer Patrol Car", + "blueprint": [ + [ "-o++o-" ], + [ "+=##'|" ], + [ "+=##'|" ], + [ "-o++o-" ] + ], + "parts": [ + { + "x": 0, + "y": 0, + "parts": [ + "frame#cross", + "seat#windshield_front", + "seatbelt", + "controls", + "integrated_heater_small", + "integrated_cooler", + "stereo" + ] + }, + { "x": 0, "y": 0, "parts": [ "dashboard", "vehicle_alarm", "horn_car" ] }, + { "x": 0, "y": 0, "parts": [ "roof" ] }, + { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] }, + { "x": 0, "y": 1, "parts": [ "frame#cross", "seat#windshield_front", "seatbelt", "roof" ] }, + { "x": 0, "y": 2, "parts": [ "frame#vertical_right", "door#ne" ] }, + { "x": 1, "y": -1, "parts": [ "frame#vertical_T_left", "windshield#wheel_left" ] }, + { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, + { "x": 1, "y": 0, "parts": [ "frame#horizontal_2", "windshield#cover_left" ] }, + { "x": 1, "y": 1, "parts": [ "frame#horizontal_2", "windshield#cover_right" ] }, + { "x": 1, "y": 2, "parts": [ "frame#vertical_T_right", "windshield#wheel_right" ] }, + { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] }, + { "x": 2, "y": -1, "parts": [ "frame#nw", "halfboard#nw", "headlight" ] }, + { "x": 2, "y": 0, "parts": [ "frame#horizontal", "halfboard#horizontal_front" ] }, + { "x": 2, "y": 0, "parts": [ "engine_electric_large", "storage_battery", "plating_steel" ] }, + { "x": 2, "y": 1, "parts": [ "hdframe#horizontal", "minireactor", "halfboard#horizontal_front" ] }, + { "x": 2, "y": 1, "parts": [ "plating_steel" ] }, + { "x": 2, "y": 2, "parts": [ "frame#ne", "halfboard#ne", "headlight" ] }, + { "x": -1, "y": -1, "parts": [ "frame#vertical_left", "door#sw" ] }, + { "x": -1, "y": 0, "parts": [ "frame#cross", "seat_back#left", "seatbelt", "roof", "light_red" ] }, + { "x": -1, "y": 1, "parts": [ "frame#cross", "seat_back#right", "seatbelt", "roof", "light_blue" ] }, + { "x": -1, "y": 2, "parts": [ "frame#vertical_right", "door#se" ] }, + { "x": -2, "y": -1, "parts": [ "frame#vertical_left", "halfboard#wheel_left", "wheel_mount_medium", "wheel" ] }, + { "x": -2, "y": 0, "parts": [ "frame#cross", "trunk", "muffler", "roof" ] }, + { "x": -2, "y": 1, "parts": [ "frame#cross", "robot_cargo", "roof" ] }, + { "x": -2, "y": 2, "parts": [ "frame#vertical_right", "halfboard#wheel_right", "wheel_mount_medium", "wheel" ] }, + { "x": -3, "y": -1, "parts": [ "frame#sw", "halfboard#sw" ] }, + { "x": -3, "y": 0, "parts": [ "frame#horizontal_rear", "door_trunk" ] }, + { "x": -3, "y": 1, "parts": [ "frame#horizontal_rear", "door_trunk" ] }, + { "x": -3, "y": 2, "parts": [ "frame#se", "halfboard#se" ] } + ], + "items": [ + { "x": -2, "y": 0, "chance": 5, "item_groups": [ "tools_entry" ] }, + { "x": -2, "y": 0, "chance": 5, "item_groups": [ "full_1st_aid" ] }, + { "x": -2, "y": 0, "chance": 3, "item_groups": [ "afs_anti_robot_grenades" ] }, + { "x": -2, "y": 0, "chance": 100, "item_groups": [ "spare_tire_kit_small_jack" ] }, + { "x": -2, "y": 0, "chance": 1, "item_groups": [ "afs_police_bot_storage" ] } + ] + }, + { + "id": "light_cycle", + "type": "vehicle", + "name": "Light Cycle", + "blueprint": [ "o#>o" ], + "parts": [ + { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2", "saddle#motor", "motorcycle_kickstand" ] }, + { "x": 1, "y": 0, "parts": [ "frame_handle" ] }, + { "x": -1, "y": 0, "parts": [ "xlframe#vertical", "wheel_mount_light", "wheel_motorbike#rear" ] }, + { "x": 2, "y": 0, "parts": [ "xlframe#vertical", "wheel_mount_light_steerable", "wheel_motorbike" ] }, + { "x": 0, "y": 0, "parts": [ "controls", "controls_electronic", "vehicle_alarm" ] }, + { "x": 0, "y": 0, "parts": [ "horn_car", "engine_electric" ] }, + { "x": 1, "y": 0, "parts": [ "motorcycle_headlight", "battery_car", "light_blue" ] }, + { "x": -1, "y": 0, "parts": [ "muffler" ] } + ] } ] diff --git a/data/mods/aftershock_exoplanet/region_settings.json b/data/mods/aftershock_exoplanet/region_settings.json index 924abdf07691e..3b14fb3a34318 100644 --- a/data/mods/aftershock_exoplanet/region_settings.json +++ b/data/mods/aftershock_exoplanet/region_settings.json @@ -45,7 +45,8 @@ "afs_augmentation_clinic_1": 400, "afs_astrobiology_lab": 400, "afs_general_store_1": 400, - "afs_city_urban_farm_small": 300 + "afs_city_urban_farm_small": 300, + "afs_enforcer_station_1": 100 } }, "weather": {