From b84853dc75d9eb3c364e23c42a3ab1ce98ed6188 Mon Sep 17 00:00:00 2001 From: VGCrow <56963648+Vgoloshivskiy@users.noreply.github.com> Date: Sat, 17 Aug 2024 20:11:48 +0300 Subject: [PATCH] [CR] Possibility to fix experimental cyborgs at Rubic's Castle (#74054) * EasyFixCyborgs Added possibility to fix cyborgs at Rubic's * grammar fix * Update data/json/npcs/classes.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update data/json/npcs/exodii/exodii_merchant_talk.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix json with autoformatter * Changed to item group list * lint * resolve comment issue + some translation * Update data/json/npcs/exodii/exodii_merchant_talk.json Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix i think * Apply suggestions from code review * fix text * Apply suggestions from code review Audit CBMs in prototype cyborg recovery. * Update data/json/npcs/classes.json * Apply suggestions from code review --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Maleclypse <54345792+Maleclypse@users.noreply.github.com> Co-authored-by: Kevin Granade --- data/json/npcs/classes.json | 24 ++ .../npcs/exodii/exodii_merchant_itemlist.json | 35 +++ .../npcs/exodii/exodii_merchant_talk.json | 245 ++++++++++++++++++ .../BAR_ENCOUNTER_MERCENARIES/NPC_BEMS.json | 22 ++ 4 files changed, 326 insertions(+) diff --git a/data/json/npcs/classes.json b/data/json/npcs/classes.json index 88874f5d4bec7..215178ad88c9c 100644 --- a/data/json/npcs/classes.json +++ b/data/json/npcs/classes.json @@ -634,6 +634,30 @@ { "id": "bio_torsionratchet", "chance": 100 } ] }, + { + "type": "npc_class", + "id": "NC_CYBORG_RESCUE", + "name": { "str": "Cyborg" }, + "job_description": "I'm transhuman above and beyond.", + "traits": [ { "group": "BG_survival_story_CYBORG" }, { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], + "skills": [ + { "skill": "ALL", "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 4, 2 ] }, { "rng": [ -4, -1 ] } ] } ] } } + ], + "common": false, + "worn_override": "NC_ANCILLA_GRUNT_worn", + "carry_override": "NC_ANCILLA_GRUNT_carry", + "weapon_override": "EMPTY_GROUP", + "bionics": [ + { "id": "bio_armor_head", "chance": 100 }, + { "id": "bio_armor_torso", "chance": 100 }, + { "id": "bio_armor_arms", "chance": 100 }, + { "id": "bio_armor_legs", "chance": 100 }, + { "id": "bio_armor_eyes", "chance": 100 }, + { "id": "bio_power_storage", "chance": 100 }, + { "id": "bio_painkiller", "chance": 16 }, + { "id": "bio_power_storage_mkII", "chance": 90 } + ] + }, { "type": "npc_class", "id": "NC_CITY_COP", diff --git a/data/json/npcs/exodii/exodii_merchant_itemlist.json b/data/json/npcs/exodii/exodii_merchant_itemlist.json index 4ab3d17b5e9e8..700e5057fd28c 100644 --- a/data/json/npcs/exodii/exodii_merchant_itemlist.json +++ b/data/json/npcs/exodii/exodii_merchant_itemlist.json @@ -324,6 +324,41 @@ [ "bio_geiger", 5 ] ] }, + { + "id": "bionics_pulled_out_prototype", + "type": "item_group", + "items": [ + { "item": "bio_power_storage", "prob": 100, "count": [ 1, 5 ] }, + { "item": "bio_power_storage_mkII", "prob": 8, "count": [ 1, 2 ] }, + { "item": "bio_armor_arms", "prob": 60, "count": 1 }, + { "item": "bio_armor_eyes", "prob": 60, "count": 1 }, + { "item": "bio_armor_head", "prob": 60, "count": 1 }, + { "item": "bio_armor_legs", "prob": 60, "count": 1 }, + { "item": "bio_armor_torso", "prob": 60, "count": 1 }, + { "item": "bio_batteries", "prob": 11, "count": 1 }, + { "item": "bio_blood_anal", "prob": 4, "count": 1 }, + { "item": "bio_blood_filter", "prob": 5, "count": 1 }, + { "item": "bio_cable", "prob": 30, "count": 1 }, + { "item": "bio_climate", "prob": 10, "count": 1 }, + { "item": "bio_dex_enhancer", "prob": 8, "count": 1 }, + { "item": "bio_ears", "prob": 17, "count": 1 }, + { "item": "bio_sonar", "prob": 2, "count": 1 }, + { "item": "bio_evap", "prob": 8, "count": 1 }, + { "item": "bio_eye_enhancer", "prob": 2, "count": 1 }, + { "item": "bio_eye_optic", "prob": 2, "count": 1 }, + { "item": "bio_fitnessband", "prob": 16, "count": 1 }, + { "item": "bio_geiger", "prob": 18, "count": 1 }, + { "item": "bio_gills", "prob": 10, "count": 1 }, + { "item": "bio_ground_sonar", "prob": 9, "count": 1 }, + { "item": "bio_heat_absorb", "prob": 4, "count": 1 }, + { "item": "bio_heatsink", "prob": 6, "count": 1 }, + { "item": "bio_radio", "prob": 11, "count": 1 }, + { "item": "bio_sunglasses", "prob": 11, "count": 1 }, + { "item": "bio_ar", "prob": 22, "count": 1 }, + { "item": "bio_alarm", "prob": 26, "count": 1 }, + { "item": "bio_painkiller", "prob": 12, "count": 1 } + ] + }, { "type": "item_group", "id": "EXODII_CBM_tier1_fun", diff --git a/data/json/npcs/exodii/exodii_merchant_talk.json b/data/json/npcs/exodii/exodii_merchant_talk.json index 9dbc78d8fc929..6f8651a6479cd 100644 --- a/data/json/npcs/exodii/exodii_merchant_talk.json +++ b/data/json/npcs/exodii/exodii_merchant_talk.json @@ -184,6 +184,42 @@ "text": "Just popping in to say hi. See you later, alligator.", "condition": { "u_has_var": "general_meeting_u_met_Rubik", "value": "yes" }, "topic": "TALK_DONE" + }, + { + "text": "How is my buddy doing?", + "condition": { + "and": [ + { "math": [ "time_since(u_timer_exodii_cybor_rescue_operating)", "<", "time('1 d')" ] }, + { "u_has_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "yes" } + ] + }, + "topic": "TALK_EXODII_MERCHANT_Experiment_Cyborg_Rescue_Ongoing" + }, + { + "text": "How is my buddy doing?", + "condition": { + "and": [ + { "math": [ "time_since(u_timer_exodii_cybor_rescue_operating)", ">", "time('1 d')" ] }, + { "u_has_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "yes" } + ] + }, + "topic": "TALK_EXODII_MERCHANT_Experiment_Cyborg_Rescue_Complete" + }, + { + "text": "Fast, can you help this lad?", + "condition": { + "and": [ + { "u_has_var": "general_meeting_u_met_Rubik", "value": "yes" }, + { "not": { "u_has_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "yes" } }, + { + "or": [ + { "u_has_items": { "item": "bot_broken_cyborg", "count": 1 } }, + { "u_has_items": { "item": "bot_prototype_cyborg", "count": 1 } } + ] + } + ] + }, + "topic": "TALK_EXODII_MERCHANT_Experiment_Cyborg_Rescue" } ] }, @@ -402,6 +438,215 @@ { "text": "Actually, I changed my mind. I have to go.", "topic": "TALK_DONE" } ] }, + { + "id": "TALK_EXODII_MERCHANT_Experiment_Cyborg_Rescue_Ongoing", + "type": "talk_topic", + "dynamic_line": { "//~": "Nay, mate, still operating", "str": "Nah, mate, still operatin" }, + "responses": [ + { "text": "Never mind, I want to ask you something.", "topic": "TALK_EXODII_MERCHANT_Talk" }, + { "text": "Ok. See you later then.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_EXODII_MERCHANT_Experiment_Cyborg_Rescue_Complete", + "type": "talk_topic", + "dynamic_line": { "//~": "Give me a second, and I'll bring them here.", "str": "Gimme spek, 'n fetch 'em 'ere." }, + "responses": [ + { + "text": "Of course, it is time for us to talk.", + "condition": { "u_has_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "yank_out_all_bionics_from_prototype" }, + "effect": [ + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "no" }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "none" }, + { "u_spawn_item": "bionics_pulled_out_prototype", "use_item_group": true }, + { + "u_spawn_npc": "BEM_prototype_cyborg_with_yonked_bionics", + "real_count": 1, + "outdoor_only": false, + "min_radius": 1, + "max_radius": 3, + "spawn_message": "Rubic leads a person to you." + } + ], + "topic": "TALK_DONE" + }, + { + "text": "Of course, it is time for us to talk.", + "condition": { "u_has_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "repair_and_rescue_prototype" }, + "effect": [ + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "no" }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "none" }, + { + "u_spawn_npc": "BEM_prototype_cyborg_with_bionics", + "real_count": 1, + "outdoor_only": false, + "min_radius": 1, + "max_radius": 3, + "spawn_message": "Rubic leads a person to you." + } + ], + "topic": "TALK_DONE" + }, + { + "text": "Of course, it is time for us to talk.", + "condition": { "u_has_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "reverse_cybernization_prototype" }, + "effect": [ + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "no" }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "none" }, + { + "u_spawn_npc": "BEM_prototype_cyborg_with_yonked_bionics", + "real_count": 1, + "outdoor_only": false, + "min_radius": 1, + "max_radius": 3, + "spawn_message": "Rubic leads a person to you." + } + ], + "topic": "TALK_DONE" + }, + { + "text": "Let's see what I get.", + "condition": { "u_has_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "pull_out_from_rotten_cyborg" }, + "effect": [ + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "no" }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "none" }, + { "u_spawn_item": "ruined_chunks", "count": 20 }, + { "u_spawn_item": "bionics_pulled_out_prototype", "use_item_group": true } + ], + "topic": "TALK_DONE" + }, + { + "text": "It is time to put this body to rest.", + "condition": { "u_has_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "dress_up_rotten_cyborg" }, + "effect": [ + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "no" }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "none" }, + { "u_spawn_item": "corpse_generic_human" } + ], + "topic": "TALK_DONE" + }, + { "text": "Never mind, I want to ask you something.", "topic": "TALK_EXODII_MERCHANT_Talk" }, + { "text": "Actually, forget it.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_EXODII_MERCHANT_Experiment_Cyborg_Rescue", + "type": "talk_topic", + "dynamic_line": { "//~": "Let me see. Will do what I can for a coin.", "str": "Lemme poke. Will tass what ye can for a shiny." }, + "responses": [ + { + "text": "[Prototype Cyborg] Can you help this guy it seems like they have lost their mind?", + "condition": { "u_has_items": { "item": "bot_prototype_cyborg", "count": 1 } }, + "topic": "TALK_EXODII_MERCHANT_Experiment_Prototype_Cyborg_Rescue" + }, + { + "text": "[Broken Cyborg] Can you save my buddy who looks a bit rough around the edges, but they still haven't flatlined?", + "condition": { "u_has_items": { "item": "bot_broken_cyborg", "count": 1 } }, + "topic": "TALK_EXODII_MERCHANT_Experiment_Broken_Cyborg_Rescue" + }, + { "text": "Actually, forget it's not my problem.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_EXODII_MERCHANT_Experiment_Prototype_Cyborg_Rescue", + "type": "talk_topic", + "dynamic_line": { + "//~": "For this one I can pull out their cbm and give any working to you, or I can just take out broken bits so that they will still be able to use the rest of stuff in them. Alternatively why don't you just give them to me I surely can help them adjust to life as a cyborg.'", + "str": "Fer this 'un, I can yank out their bits 'n give 'em to ya, or I can jus' take out the busted pieces so they can still use th' rest o' stuff in 'em. Elsewise, why don't ya jest give 'im to me? I reckon I can turn 'im into a right useful worker." + }, + "responses": [ + { + "text": "[$300] Take everything from him and if there is something useful, put it aside for me.", + "condition": { "u_are_owed": 30000 }, + "effect": [ + { "u_consume_item": "bot_prototype_cyborg", "count": 1, "popup": true }, + { "u_spend_cash": 30000 }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "yes" }, + { "math": [ "u_timer_exodii_cybor_rescue_operating", "=", "time('now')" ] }, + { + "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", + "value": "yank_out_all_bionics_from_prototype" + } + ], + "topic": "TALK_EXODII_MERCHANT_Talk" + }, + { + "text": "[200$] Just remove broken bits so they can control themselves.", + "condition": { "u_are_owed": 20000 }, + "effect": [ + { "u_consume_item": "bot_prototype_cyborg", "count": 1, "popup": true }, + { "u_spend_cash": 20000 }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "yes" }, + { "math": [ "u_timer_exodii_cybor_rescue_operating", "=", "time('now')" ] }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "repair_and_rescue_prototype" } + ], + "topic": "TALK_EXODII_MERCHANT_Talk" + }, + { + "text": "[95$] Pull everything out, you can keep what works. Just bring my buddy back.", + "condition": { "u_are_owed": 9500 }, + "effect": [ + { "u_consume_item": "bot_prototype_cyborg", "count": 1, "popup": true }, + { "u_spend_cash": 9500 }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "yes" }, + { "math": [ "u_timer_exodii_cybor_rescue_operating", "=", "time('now')" ] }, + { + "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", + "value": "reverse_cybernization_prototype" + } + ], + "topic": "TALK_EXODII_MERCHANT_Talk" + }, + { + "text": "They are all yours. [Adds 200$]", + "effect": [ { "u_consume_item": "bot_prototype_cyborg", "count": 1, "popup": true }, { "u_spend_cash": -20000 } ], + "condition": { "u_has_items": { "item": "bot_prototype_cyborg", "count": 1 } }, + "topic": "TALK_DONE" + }, + { "text": "Actually, forget it's not my problem.", "topic": "TALK_DONE" } + ] + }, + { + "id": "TALK_EXODII_MERCHANT_Experiment_Broken_Cyborg_Rescue", + "type": "talk_topic", + "dynamic_line": { + "//~": "This one can't be saved too much brain rotted but i can salvage bits from them or repurpose them for walker, or just cut out rot and neural interface so you can bury them proper", + "str": "This 'unwon't be twitching', too much grey lost to dead. But ye can salvage bits from 'em or born 'em for a walker, or just cut out the rot 'n grey link so ya can miss 'em proper." + }, + "responses": [ + { + "text": "[200$] Pull out CBM if he can't use it, I can.", + "condition": { "u_are_owed": 20000 }, + "effect": [ + { "u_consume_item": "bot_prototype_cyborg", "count": 1, "popup": true }, + { "u_spend_cash": 20000 }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "yes" }, + { "math": [ "u_timer_exodii_cybor_rescue_operating", "=", "time('now')" ] }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "pull_out_from_rotten_cyborg" } + ], + "topic": "TALK_EXODII_MERCHANT_Talk" + }, + { + "text": "[25$] Pull everything out, you can keep what works. He deserves a burial.", + "condition": { "u_are_owed": 2500 }, + "effect": [ + { "u_consume_item": "bot_prototype_cyborg", "count": 1, "popup": true }, + { "u_spend_cash": 2500 }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing", "value": "yes" }, + { "math": [ "u_timer_exodii_cybor_rescue_operating", "=", "time('now')" ] }, + { "u_add_var": "dialogue_exodii_cybor_rescue_ongoing_current_type", "value": "dress_up_rotten_cyborg" } + ], + "topic": "TALK_EXODII_MERCHANT_Talk" + }, + { + "text": "They are all yours. [Adds 150$]", + "effect": [ { "u_consume_item": "bot_prototype_cyborg", "count": 1, "popup": true }, { "u_spend_cash": -15000 } ], + "condition": { "u_has_items": { "item": "bot_prototype_cyborg", "count": 1 } }, + "topic": "TALK_DONE" + }, + { "text": "Actually, forget it's not my problem.", "topic": "TALK_DONE" } + ] + }, { "id": "TALK_EXODII_MERCHANT_Talk_Intro1a", "type": "talk_topic", diff --git a/data/json/npcs/robofac/robofac_ancilla_npcs/BAR_ENCOUNTER_MERCENARIES/NPC_BEMS.json b/data/json/npcs/robofac/robofac_ancilla_npcs/BAR_ENCOUNTER_MERCENARIES/NPC_BEMS.json index a2ed266bbf90b..7b36ee0db5ade 100644 --- a/data/json/npcs/robofac/robofac_ancilla_npcs/BAR_ENCOUNTER_MERCENARIES/NPC_BEMS.json +++ b/data/json/npcs/robofac/robofac_ancilla_npcs/BAR_ENCOUNTER_MERCENARIES/NPC_BEMS.json @@ -10,6 +10,28 @@ "chat": "BEM_GUNRUNNER_1", "faction": "robofac_auxiliaries" }, + { + "type": "npc", + "id": "BEM_prototype_cyborg_with_yonked_bionics", + "//": "EOC-specific, should not spawn outside of trigger events.", + "name_suffix": "cyborg rescue", + "class": "NC_ANCILLA_GRUNT", + "attitude": 0, + "mission": 7, + "chat": "BGSS_CYBORG_1_STORY1", + "faction": "your_followers" + }, + { + "type": "npc", + "id": "BEM_prototype_cyborg_with_bionics", + "//": "EOC-specific, should not spawn outside of trigger events.", + "name_suffix": "kicking cyborg", + "class": "NC_CYBORG_RESCUE", + "attitude": 0, + "mission": 7, + "chat": "BGSS_CYBORG_1_STORY1", + "faction": "your_followers" + }, { "type": "npc", "id": "BEM_silent_veteran",