From 8dbb9f68e931b577d3e07df5f66e6ab287e8520b Mon Sep 17 00:00:00 2001 From: CHOMPStation2StaffMirrorBot <94713762+CHOMPStation2StaffMirrorBot@users.noreply.github.com> Date: Sun, 13 Apr 2025 11:35:12 -0700 Subject: [PATCH] [MIRROR] some robot file splitting (#10643) Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com> --- .../game/objects/items/stacks/matter_synth.dm | 3 + .../robot/dogborg/dog_defense_modules.dm | 84 ++++++++ .../{dog_modules_vr.dm => dog_modules.dm} | 168 +-------------- .../silicon/robot/dogborg/dog_modules_yw.dm | 52 ----- .../{dog_sleeper_vr.dm => dog_sleeper.dm} | 196 ----------------- .../robot/dogborg/dog_sleeper_types.dm | 198 ++++++++++++++++++ .../silicon/robot/dogborg/dog_weapons.dm | 76 +++++++ .../silicon/robot/robot_modules/station.dm | 9 + .../ChemDispenser/ChemDispenserSettings.tsx | 2 +- .../interfaces/RobotChoose/SpriteSection.tsx | 2 +- .../tgui/interfaces/common/ComplexModal.tsx | 15 +- vorestation.dme | 8 +- 12 files changed, 390 insertions(+), 423 deletions(-) create mode 100644 code/modules/mob/living/silicon/robot/dogborg/dog_defense_modules.dm rename code/modules/mob/living/silicon/robot/dogborg/{dog_modules_vr.dm => dog_modules.dm} (73%) delete mode 100644 code/modules/mob/living/silicon/robot/dogborg/dog_modules_yw.dm rename code/modules/mob/living/silicon/robot/dogborg/{dog_sleeper_vr.dm => dog_sleeper.dm} (79%) create mode 100644 code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_types.dm create mode 100644 code/modules/mob/living/silicon/robot/dogborg/dog_weapons.dm diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm index 02c6518374..32c657134a 100644 --- a/code/game/objects/items/stacks/matter_synth.dm +++ b/code/game/objects/items/stacks/matter_synth.dm @@ -59,3 +59,6 @@ /datum/matter_synth/cloth name = "Cloth Synthesizer" + +/datum/matter_synth/beacon + name = "Beacon Synthesizer" diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_defense_modules.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_defense_modules.dm new file mode 100644 index 0000000000..f46e35809f --- /dev/null +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_defense_modules.dm @@ -0,0 +1,84 @@ + +/obj/item/shield_projector/line/exploborg + name = "expirmental shield projector" + description_info = "This creates a shield in a straight line perpendicular to the direction where the user was facing when it was activated. \ + The shield allows projectiles to leave from inside but blocks projectiles from outside. Everything else can pass through the shield freely, \ + including other people and thrown objects. The shield also cannot block certain effects which take place over an area, such as flashbangs or explosions." + shield_health = 90 + max_shield_health = 90 + shield_regen_amount = 25 + line_length = 7 // How long the line is. Recommended to be an odd number. + offset_from_center = 2 // How far from the projector will the line's center be. + +// To repair a single module +/obj/item/self_repair_system + name = "plating repair system" + desc = "A nanite control system to repair damaged armour plating and wiring while not moving. Destroyed armour can't be restored." + icon = 'icons/obj/robot_component.dmi' + icon_state = "armor" + var/repair_time = 25 + var/repair_amount = 2.5 + var/power_tick = 25 + var/disabled_icon = "armor" + var/active_icon = "armor_broken" + var/list/target_components = list("armour") + var/repairing = FALSE + flags = NOBLUDGEON + +/obj/item/self_repair_system/attack_self(mob/user) + if(repairing) + return + var/mob/living/silicon/robot/R = user + var/destroyed_components = FALSE + var/list/repairable_components = list() + for(var/target_component in target_components) + var/datum/robot_component/C = R.components[target_component] + if(!C) + continue + if(istype(C.wrapped, /obj/item/broken_device)) + destroyed_components = TRUE + else if (C.brute_damage != 0 || C.electronics_damage != 0) + repairable_components += C + if(!repairable_components.len && destroyed_components) + to_chat(R, span_warning("Repair system initialization failed. Can't repair destroyed [target_components.len == 1 ? "[R.components[target_components[1]]]'s" : "component's"] plating or wiring.")) + return + if(!repairable_components.len) + to_chat(R, span_warning("No brute or burn damage detected [target_components.len == 1 ? "in [R.components[target_components[1]]]" : ""].")) + return + if(destroyed_components) + to_chat(R, span_warning("WARNING! Destroyed modules detected. Those can not be repaired!")) + icon_state = active_icon + update_icon() + repairing = TRUE + for(var/datum/robot_component/C in repairable_components) + to_chat(R, span_notice("Repair system initializated. Repairing plating and wiring of [C].")) + src.self_repair(R, C, repair_time, repair_amount) + repairing = FALSE + icon_state = disabled_icon + update_icon() + +/obj/item/self_repair_system/proc/self_repair(mob/living/silicon/robot/R, datum/robot_component/C, var/tick_delay, var/heal_per_tick) + if(!C || !R.cell) + return + if(C.brute_damage == 0 && C.electronics_damage == 0) + to_chat(R, span_notice("Repair of [C] completed.")) + return + if(!R.use_direct_power(power_tick, 500)) //We don't want to drain ourselves too far down during exploration + to_chat(R, span_warning("Not enough power to initialize the repair system.")) + return + if(do_after(R, tick_delay)) + if(!C) + return + C.brute_damage -= min(C.brute_damage, heal_per_tick) + C.electronics_damage -= min(C.electronics_damage, heal_per_tick) + R.updatehealth() + src.self_repair(R, C, tick_delay, heal_per_tick) + +// To repair multiple modules +/obj/item/self_repair_system/advanced + name = "self repair system" + desc = "A nanite control system to repair damaged components while not moving. Destroyed components can't be restored." + target_components = list("actuator", "radio", "power cell", "diagnosis unit", "camera", "comms", "armour") + power_tick = 10 + repair_time = 15 + repair_amount = 3 diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm similarity index 73% rename from code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm rename to code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm index 1a7e943bd5..b6e738abec 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm @@ -301,17 +301,6 @@ enabled = FALSE icon_state = "scrub0" -/obj/item/gun/energy/taser/mounted/cyborg/ertgun //Not a taser, but it's being used as a base so it takes energy and actually works. - name = "disabler" - desc = "A small and nonlethal gun produced by NT.." - icon = 'icons/mob/dogborg_vr.dmi' - icon_state = "ertgunstun" - fire_sound = 'sound/weapons/eLuger.ogg' - projectile_type = /obj/item/projectile/beam/disable - charge_cost = 240 //Normal cost of a taser. It used to be 1000, but after some testing it was found that it would sap a borg's battery to quick - recharge_time = 1 //Takes ten ticks to recharge a laser, so don't waste them all! - //cell_type = null //Same cell as a taser until edits are made. - /obj/item/lightreplacer/dogborg name = "light replacer" desc = "A device to automatically replace lights. This version is capable to produce a few replacements using your internal matter reserves." @@ -558,7 +547,7 @@ range = custom_range to_chat(user, span_notice("Scanner will now look up to [range] tile(s) away.")) -//CHOMPEDIT Enable +//CHOMPEnable Start /obj/item/robot_tongue/examine(user) . = ..() if(Adjacent(user)) @@ -566,157 +555,4 @@ . += span_notice("[src] is wet. Just like it should be.") if(water.energy < 5) . += span_notice("[src] is dry.") -//CHOMPEDIT Enable - -/obj/item/shield_projector/line/exploborg - name = "expirmental shield projector" - description_info = "This creates a shield in a straight line perpendicular to the direction where the user was facing when it was activated. \ - The shield allows projectiles to leave from inside but blocks projectiles from outside. Everything else can pass through the shield freely, \ - including other people and thrown objects. The shield also cannot block certain effects which take place over an area, such as flashbangs or explosions." - shield_health = 90 - max_shield_health = 90 - shield_regen_amount = 25 - line_length = 7 // How long the line is. Recommended to be an odd number. - offset_from_center = 2 // How far from the projector will the line's center be. - -// To repair a single module -/obj/item/self_repair_system - name = "plating repair system" - desc = "A nanite control system to repair damaged armour plating and wiring while not moving. Destroyed armour can't be restored." - icon = 'icons/obj/robot_component.dmi' - icon_state = "armor" - var/repair_time = 25 - var/repair_amount = 2.5 - var/power_tick = 25 - var/disabled_icon = "armor" - var/active_icon = "armor_broken" - var/list/target_components = list("armour") - var/repairing = FALSE - -/obj/item/self_repair_system/New() - ..() - flags |= NOBLUDGEON - -/obj/item/self_repair_system/attack_self(mob/user) - if(repairing) - return - var/mob/living/silicon/robot/R = user - var/destroyed_components = FALSE - var/list/repairable_components = list() - for(var/target_component in target_components) - var/datum/robot_component/C = R.components[target_component] - if(!C) - continue - if(istype(C.wrapped, /obj/item/broken_device)) - destroyed_components = TRUE - else if (C.brute_damage != 0 || C.electronics_damage != 0) - repairable_components += C - if(!repairable_components.len && destroyed_components) - to_chat(R, span_warning("Repair system initialization failed. Can't repair destroyed [target_components.len == 1 ? "[R.components[target_components[1]]]'s" : "component's"] plating or wiring.")) - return - if(!repairable_components.len) - to_chat(R, span_warning("No brute or burn damage detected [target_components.len == 1 ? "in [R.components[target_components[1]]]" : ""].")) - return - if(destroyed_components) - to_chat(R, span_warning("WARNING! Destroyed modules detected. Those can not be repaired!")) - icon_state = active_icon - update_icon() - repairing = TRUE - for(var/datum/robot_component/C in repairable_components) - to_chat(R, span_notice("Repair system initializated. Repairing plating and wiring of [C].")) - src.self_repair(R, C, repair_time, repair_amount) - repairing = FALSE - icon_state = disabled_icon - update_icon() - -/obj/item/self_repair_system/proc/self_repair(mob/living/silicon/robot/R, datum/robot_component/C, var/tick_delay, var/heal_per_tick) - if(!C || !R.cell) - return - if(C.brute_damage == 0 && C.electronics_damage == 0) - to_chat(R, span_notice("Repair of [C] completed.")) - return - if(!R.use_direct_power(power_tick, 500)) //We don't want to drain ourselves too far down during exploration - to_chat(R, span_warning("Not enough power to initialize the repair system.")) - return - if(do_after(R, tick_delay)) - if(!C) - return - C.brute_damage -= min(C.brute_damage, heal_per_tick) - C.electronics_damage -= min(C.electronics_damage, heal_per_tick) - R.updatehealth() - src.self_repair(R, C, tick_delay, heal_per_tick) - -// To repair multiple modules -/obj/item/self_repair_system/advanced - name = "self repair system" - desc = "A nanite control system to repair damaged components while not moving. Destroyed components can't be restored." - target_components = list("actuator", "radio", "power cell", "diagnosis unit", "camera", "comms", "armour") - power_tick = 10 - repair_time = 15 - repair_amount = 3 - -// Robot Weapons -/obj/item/gun/energy/robotic/flare - name = "flare gun" - desc = "A flare-gun" - projectile_type = /obj/item/projectile/energy/flash/flare - fire_sound = 'sound/weapons/tablehit1.ogg' - icon = 'icons/obj/gun.dmi' - icon_state = "taser" - charge_cost = 480 - borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_TASER - -/obj/item/gun/energy/robotic/smallmedigun - name = "borg directed restoration system" - desc = "An adapted version of the BL-3 'Phoenix, for expiremental useage in borgs." - projectile_type = /obj/item/projectile/beam/medical_cell/borg - accept_cell_type = /obj/item/cell/device - cell_type = /obj/item/cell/device/weapon - charge_cost = 600 - fire_delay = 6 - force = 5 - icon_state = "medbeam" - icon = 'icons/obj/gun_vr.dmi' - accuracy = 100 - fire_sound = 'sound/weapons/eluger.ogg' - self_recharge = 1 - use_external_power = 1 - -/obj/item/projectile/beam/medical_cell/borg - range = 4 - -/obj/item/projectile/beam/medical_cell/borg/on_hit(var/mob/living/carbon/human/target) - if(istype(target, /mob/living/carbon/human)) - if(target.stat != DEAD) - target.adjustBruteLoss(-3.75) - target.adjustFireLoss(-3.75) - else - return 1 - -/obj/item/melee/robotic/blade/explotailspear - name = "energy tail" - desc = "A glowing tail spear with a moderate range. It appears to be extremely sharp." - force = 45 - armor_penetration = 25 //30 to try and make it not useless against armored mobs but not fully nullify it. - reach = 3 - projectile_parry_chance = 15. - -/obj/item/melee/robotic/jaws/big/explojaws - name = "explo jaws" - desc = "Highly lethal jaws for close range combat." - force = 60 - armor_penetration = 25 //To try and make it not useless against armored mobs but not fully nullify it - projectile_parry_chance = 15 - -/obj/item/gun/energy/robotic/phasegun - name = "EW26 Artemis Mounted" - desc = "The RayZar EW26 Artemis, also known as the 'phase carbine', is a downsized energy-based weapon specifically designed for use against wildlife. This one has a safety interlock that prevents firing while in proximity to the facility." - description_fluff = "RayZar is Ward-Takahashi’s main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market." - icon = 'icons/obj/gun.dmi' - icon_state = "phasecarbine" - charge_cost = 160 - recharge_time = 16 - projectile_type = /obj/item/projectile/energy/phase - use_external_power = 1 - self_recharge = 1 - borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_LASER +// CHOMPEnable End diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_yw.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_yw.dm deleted file mode 100644 index 23f2457c5c..0000000000 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_yw.dm +++ /dev/null @@ -1,52 +0,0 @@ -/*TEST*/ -/******/ - -/obj/item/dogborg/pounce_module - name = "pounce module" - icon = 'icons/mob/dogborg_vr.dmi' - icon_state = "pounce" - desc = "Routine to allow pouncing" - throwforce = 0 //This shouldn't be thrown in the first place. - w_class = ITEMSIZE_NORMAL - -/obj/item/dogborg/pounce_module/New() - ..() - flags |= NOBLUDGEON //No more attack messages - -/obj/item/dogborg/pounce_module/attack_self(mob/user) - return - -/obj/item/dogborg/pounce_module/afterattack(atom/target, mob/user as mob, proximity) - if(proximity && ishuman(target)) - user.visible_message(span_notice("\the [user] pounces at \the [target]'s face!"), span_notice("You pounce at \the [target]!")) - var/mob/living/L = target - L.Weaken(10) - user.loc = target.loc - return - return - -/* Not needed anymore because we have removed boozeborg from the _vr file that Yawn wanted to put it in and restored the _ch file we had for this found in /code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm. -/mob/living/silicon/robot/proc/reskin_booze() - set name = "Change Drink Color" - set category = "Abilities.Silicon" //ChompEDIT - TGPanel - set desc = "Choose the color of drink displayed inside you." - - var/mob/M = usr - var/list/options = list() - options["Beer"] = "Beer Buddy" - options["Curacao"] = "Brilliant Blue" - options["Coffee"] = "Caffine Dispenser" - options["Space Mountain Wind"] = "Gamer Juice Maker" - options["Whiskey Soda"] = "Liqour Licker" - options["Grape Soda"] = "The Grapist" - options["Demon's Blood"] = "Vampire's Aid" - options["Slav Vodka"] = "Vodka Komrade" - var/choice = input(M,"Choose your drink!") in options - if(src && choice && !M.stat && in_range(M,src)) - icontype = options[choice] - var/active_sound = 'sound/effects/bubbles.ogg' - playsound(src.loc, "[active_sound]", 100, 0, 4) - to_chat(M, "Your Tank now displays [choice]. Drink up and enjoy!") - updateicon() - return 1 -*/ diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm similarity index 79% rename from code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm rename to code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm index cdca067c82..4db6a77d8d 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm @@ -735,200 +735,4 @@ STOP_PROCESSING(SSobj, src) return -/obj/item/dogborg/sleeper/K9 //The K9 portabrig - name = "Brig-Belly" - desc = "A mounted portable-brig that holds criminals for processing or 'processing'." - icon_state = "sleeperb" - injection_chems = null //So they don't have all the same chems as the medihound! - stabilizer = TRUE - medsensor = FALSE - -/obj/item/dogborg/sleeper/compactor //Janihound gut. - name = "Garbage Processor" - desc = "A mounted garbage compactor unit with fuel processor, capable of processing any kind of contaminant." - icon_state = "compactor" - injection_chems = null //So they don't have all the same chems as the medihound! - compactor = TRUE - recycles = TRUE - max_item_count = 25 - stabilizer = FALSE - medsensor = FALSE - -/obj/item/dogborg/sleeper/compactor/analyzer //sci-borg gut. - name = "Digestive Analyzer" - desc = "A mounted destructive analyzer unit with fuel processor, for 'deep scientific analysis'." - icon_state = "analyzer" - max_item_count = 10 - startdrain = 100 - analyzer = TRUE - recycles = FALSE - -/obj/item/dogborg/sleeper/compactor/decompiler - name = "Matter Decompiler" - desc = "A mounted matter decompiling unit with fuel processor, for recycling anything and everyone." - icon_state = "decompiler" - max_item_count = 10 - decompiler = TRUE - recycles = TRUE -/* -/obj/item/dogborg/sleeper/compactor/delivery //Unfinished and unimplemented, still testing. - name = "Cargo Belly" - desc = "A mounted cargo bay unit for tagged deliveries." - icon_state = "decompiler" - max_item_count = 20 - delivery = TRUE - recycles = FALSE -*/ -/obj/item/dogborg/sleeper/compactor/supply //Miner borg belly - name = "Supply Storage" - desc = "A mounted survival unit with fuel processor, helpful with both deliveries and assisting injured miners." - icon_state = "sleeperc" - injection_chems = list(REAGENT_ID_GLUCOSE,REAGENT_ID_INAPROVALINE,REAGENT_ID_TRICORDRAZINE) - max_item_count = 20 - ore_storage = TRUE - var/list/stored_ore = list( - ORE_SAND = 0, - ORE_HEMATITE = 0, - ORE_CARBON = 0, - ORE_COPPER = 0, - ORE_TIN = 0, - ORE_VOPAL = 0, - ORE_PAINITE = 0, - ORE_QUARTZ = 0, - ORE_BAUXITE = 0, - ORE_PHORON = 0, - ORE_SILVER = 0, - ORE_GOLD = 0, - ORE_MARBLE = 0, - ORE_URANIUM = 0, - ORE_DIAMOND = 0, - ORE_PLATINUM = 0, - ORE_LEAD = 0, - ORE_MHYDROGEN = 0, - ORE_VERDANTIUM = 0, - ORE_RUTILE = 0) - medsensor = FALSE - -/obj/item/dogborg/sleeper/compactor/supply/Entered(atom/movable/thing, atom/OldLoc) - . = ..() - if(istype(thing, /obj/item/ore)) - var/obj/item/ore/ore = thing - stored_ore[ore.material]++ - current_capacity++ - qdel(ore) - -/obj/structure/ore_box/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/dogborg/sleeper/compactor/supply)) - var/obj/item/dogborg/sleeper/compactor/supply/S = W - for(var/ore in S.stored_ore) - if(S.stored_ore[ore] > 0) - var/ore_amount = S.stored_ore[ore] // How many ores does the satchel have? - stored_ore[ore] += ore_amount // Add the ore to the machine. - S.stored_ore[ore] = 0 // Set the value of the ore in the satchel to 0. - S.current_capacity = 0 // Set the amount of ore in the satchel to 0. - to_chat(user, span_notice("You empty the satchel into the box.")) - return - ..() //CHOMPEdit End - -/obj/item/dogborg/sleeper/compactor/brewer - name = "Brew Belly" - desc = "A mounted drunk tank unit with fuel processor, for putting away particularly rowdy patrons." - icon_state = "brewer" - injection_chems = null //So they don't have all the same chems as the medihound! - max_item_count = 10 - recycles = FALSE - stabilizer = TRUE - medsensor = FALSE - -/obj/item/dogborg/sleeper/compactor/generic - name = "Internal Cache" - desc = "An internal storage of no particularly specific purpose.." - icon_state = "sleeperd" - max_item_count = 10 - recycles = FALSE - -/obj/item/dogborg/sleeper/compactor/brewer/inject_chem(mob/user, chem) //CHOMP Addition Start - if(patient && patient.reagents) - if((chem in injection_chems) + REAGENT_ID_INAPROVALINE) - if(hound.cell.charge < 200) //This is so borgs don't kill themselves with it. - to_chat(hound, span_notice("You don't have enough power to synthesize fluids.")) - return - else if(patient.reagents.get_reagent_amount(chem) + 10 >= 50) //Preventing people from accidentally killing themselves by trying to inject too many chemicals! - to_chat(hound, span_notice("Your stomach is currently too full of fluids to secrete more fluids of this kind.")) - else if(patient.reagents.get_reagent_amount(chem) + 10 <= 50) //No overdoses for you - patient.reagents.add_reagent(chem, inject_amount) - drain(100) //-100 charge per injection - var/units = round(patient.reagents.get_reagent_amount(chem)) - to_chat(hound, span_notice("Injecting [units] unit\s into occupant.")) //If they were immersed, the reagents wouldn't leave with them. - -//CHOMP Addition end - -/obj/item/dogborg/sleeper/K9/ert - name = "Emergency Storage" - desc = "A mounted 'emergency containment cell'." - icon_state = "sleeperert" - injection_chems = list(REAGENT_ID_INAPROVALINE, REAGENT_ID_TRAMADOL) // short list - -/obj/item/dogborg/sleeper/trauma //Trauma borg belly - name = "Recovery Belly" - desc = "A downgraded model of the sleeper belly, intended primarily for post-surgery recovery." - icon_state = "sleeper" - injection_chems = list(REAGENT_ID_INAPROVALINE, REAGENT_ID_DEXALIN, REAGENT_ID_TRICORDRAZINE, REAGENT_ID_SPACEACILLIN, REAGENT_ID_OXYCODONE) - -/obj/item/dogborg/sleeper/lost - name = "Multipurpose Belly" - desc = "A multipurpose belly, capable of functioning as both sleeper and processor." - icon_state = "sleeperlost" - injection_chems = list(REAGENT_ID_TRICORDRAZINE, REAGENT_ID_BICARIDINE, REAGENT_ID_DEXALIN, REAGENT_ID_ANTITOXIN, REAGENT_ID_TRAMADOL, REAGENT_ID_SPACEACILLIN) - compactor = TRUE - max_item_count = 25 - stabilizer = TRUE - medsensor = TRUE - -/obj/item/dogborg/sleeper/syndie - name = "Combat Triage Belly" - desc = "A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves. This one is for more extreme combat scenarios." - icon_state = "sleepersyndiemed" - injection_chems = list(REAGENT_ID_HEALINGNANITES, REAGENT_ID_HYPERZINE, REAGENT_ID_TRAMADOL, REAGENT_ID_OXYCODONE, REAGENT_ID_SPACEACILLIN, REAGENT_ID_PERIDAXON, REAGENT_ID_OSTEODAXON, REAGENT_ID_MYELAMINE, REAGENT_ID_SYNTHBLOOD) - digest_multiplier = 2 - -/obj/item/dogborg/sleeper/K9/syndie - name = "Cell-Belly" - desc = "A mounted portable cell that holds anyone you wish for processing or 'processing'." - icon_state = "sleepersyndiebrig" - digest_multiplier = 3 - -/obj/item/dogborg/sleeper/compactor/syndie - name = "Advanced Matter Decompiler" - desc = "A mounted matter decompiling unit with fuel processor, for recycling anything and everyone in your way." - icon_state = "sleepersyndieeng" - max_item_count = 35 - digest_multiplier = 3 - -/obj/item/dogborg/sleeper/command //Command borg belly - name = "Bluespace Filing Belly" - desc = "A mounted bluespace storage unit for carrying paperwork" - icon_state = "sleeperd" - injection_chems = null - compactor = TRUE - recycles = FALSE - max_item_count = 25 - medsensor = FALSE - -/obj/item/dogborg/sleeper/compactor/honkborg - name = "Jiggles Von Hungertron" - desc = "You've heard of Giggles Von Honkerton for the back, now get ready for Jiggles Von Hungertron for the front." - icon_state = "clowngut" - recycles = FALSE - -/obj/item/dogborg/sleeper/exploration - name = "Store-Belly" - desc = "Equipment for a ExploreHound unit. A mounted portable-storage device that holds supplies/person." - icon_state = "sleeperlost" - injection_chems = list(REAGENT_ID_INAPROVALINE) // Only to stabilize during extractions - compactor = TRUE - max_item_count = 4 - medsensor = FALSE - recycles = TRUE - #undef SLEEPER_INJECT_COST diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_types.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_types.dm new file mode 100644 index 0000000000..236b705a32 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_types.dm @@ -0,0 +1,198 @@ +/obj/item/dogborg/sleeper/K9 //The K9 portabrig + name = "Brig-Belly" + desc = "A mounted portable-brig that holds criminals for processing or 'processing'." + icon_state = "sleeperb" + injection_chems = null //So they don't have all the same chems as the medihound! + stabilizer = TRUE + medsensor = FALSE + +/obj/item/dogborg/sleeper/compactor //Janihound gut. + name = "Garbage Processor" + desc = "A mounted garbage compactor unit with fuel processor, capable of processing any kind of contaminant." + icon_state = "compactor" + injection_chems = null //So they don't have all the same chems as the medihound! + compactor = TRUE + recycles = TRUE + max_item_count = 25 + stabilizer = FALSE + medsensor = FALSE + +/obj/item/dogborg/sleeper/compactor/analyzer //sci-borg gut. + name = "Digestive Analyzer" + desc = "A mounted destructive analyzer unit with fuel processor, for 'deep scientific analysis'." + icon_state = "analyzer" + max_item_count = 10 + startdrain = 100 + analyzer = TRUE + recycles = FALSE + +/obj/item/dogborg/sleeper/compactor/decompiler + name = "Matter Decompiler" + desc = "A mounted matter decompiling unit with fuel processor, for recycling anything and everyone." + icon_state = "decompiler" + max_item_count = 10 + decompiler = TRUE + recycles = TRUE +/* +/obj/item/dogborg/sleeper/compactor/delivery //Unfinished and unimplemented, still testing. + name = "Cargo Belly" + desc = "A mounted cargo bay unit for tagged deliveries." + icon_state = "decompiler" + max_item_count = 20 + delivery = TRUE + recycles = FALSE +*/ + +//CHOMPEdit Start +/obj/item/dogborg/sleeper/compactor/supply //Miner borg belly + name = "Supply Storage" + desc = "A mounted survival unit with fuel processor, helpful with both deliveries and assisting injured miners." + icon_state = "sleeperc" + injection_chems = list(REAGENT_ID_GLUCOSE,REAGENT_ID_INAPROVALINE,REAGENT_ID_TRICORDRAZINE) + max_item_count = 20 + ore_storage = TRUE + var/list/stored_ore = list( + ORE_SAND = 0, + ORE_HEMATITE = 0, + ORE_CARBON = 0, + ORE_COPPER = 0, + ORE_TIN = 0, + ORE_VOPAL = 0, + ORE_PAINITE = 0, + ORE_QUARTZ = 0, + ORE_BAUXITE = 0, + ORE_PHORON = 0, + ORE_SILVER = 0, + ORE_GOLD = 0, + ORE_MARBLE = 0, + ORE_URANIUM = 0, + ORE_DIAMOND = 0, + ORE_PLATINUM = 0, + ORE_LEAD = 0, + ORE_MHYDROGEN = 0, + ORE_VERDANTIUM = 0, + ORE_RUTILE = 0) + medsensor = FALSE + +/obj/item/dogborg/sleeper/compactor/supply/Entered(atom/movable/thing, atom/OldLoc) + . = ..() + if(istype(thing, /obj/item/ore)) + var/obj/item/ore/ore = thing + stored_ore[ore.material]++ + current_capacity++ + qdel(ore) + +/obj/structure/ore_box/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/dogborg/sleeper/compactor/supply)) + var/obj/item/dogborg/sleeper/compactor/supply/S = W + for(var/ore in S.stored_ore) + if(S.stored_ore[ore] > 0) + var/ore_amount = S.stored_ore[ore] // How many ores does the satchel have? + stored_ore[ore] += ore_amount // Add the ore to the machine. + S.stored_ore[ore] = 0 // Set the value of the ore in the satchel to 0. + S.current_capacity = 0 // Set the amount of ore in the satchel to 0. + to_chat(user, span_notice("You empty the satchel into the box.")) + return + ..() +//CHOMPEdit End + +/obj/item/dogborg/sleeper/compactor/brewer + name = "Brew Belly" + desc = "A mounted drunk tank unit with fuel processor, for putting away particularly rowdy patrons." + icon_state = "brewer" + injection_chems = null //So they don't have all the same chems as the medihound! + max_item_count = 10 + recycles = FALSE + stabilizer = TRUE + medsensor = FALSE + +/obj/item/dogborg/sleeper/compactor/generic + name = "Internal Cache" + desc = "An internal storage of no particularly specific purpose.." + icon_state = "sleeperd" + max_item_count = 10 + recycles = FALSE + +// CHOMPAdd Start +/obj/item/dogborg/sleeper/compactor/brewer/inject_chem(mob/user, chem) + if(patient && patient.reagents) + if((chem in injection_chems) + REAGENT_ID_INAPROVALINE) + if(hound.cell.charge < 200) //This is so borgs don't kill themselves with it. + to_chat(hound, span_notice("You don't have enough power to synthesize fluids.")) + return + else if(patient.reagents.get_reagent_amount(chem) + 10 >= 50) //Preventing people from accidentally killing themselves by trying to inject too many chemicals! + to_chat(hound, span_notice("Your stomach is currently too full of fluids to secrete more fluids of this kind.")) + else if(patient.reagents.get_reagent_amount(chem) + 10 <= 50) //No overdoses for you + patient.reagents.add_reagent(chem, inject_amount) + drain(100) //-100 charge per injection + var/units = round(patient.reagents.get_reagent_amount(chem)) + to_chat(hound, span_notice("Injecting [units] unit\s into occupant.")) //If they were immersed, the reagents wouldn't leave with them. +// CHOMPAdd End + +/obj/item/dogborg/sleeper/K9/ert + name = "Emergency Storage" + desc = "A mounted 'emergency containment cell'." + icon_state = "sleeperert" + injection_chems = list(REAGENT_ID_INAPROVALINE, REAGENT_ID_TRAMADOL) // short list + +/obj/item/dogborg/sleeper/trauma //Trauma borg belly + name = "Recovery Belly" + desc = "A downgraded model of the sleeper belly, intended primarily for post-surgery recovery." + icon_state = "sleeper" + injection_chems = list(REAGENT_ID_INAPROVALINE, REAGENT_ID_DEXALIN, REAGENT_ID_TRICORDRAZINE, REAGENT_ID_SPACEACILLIN, REAGENT_ID_OXYCODONE) + +/obj/item/dogborg/sleeper/lost + name = "Multipurpose Belly" + desc = "A multipurpose belly, capable of functioning as both sleeper and processor." + icon_state = "sleeperlost" + injection_chems = list(REAGENT_ID_TRICORDRAZINE, REAGENT_ID_BICARIDINE, REAGENT_ID_DEXALIN, REAGENT_ID_ANTITOXIN, REAGENT_ID_TRAMADOL, REAGENT_ID_SPACEACILLIN) + compactor = TRUE + max_item_count = 25 + stabilizer = TRUE + medsensor = TRUE + +/obj/item/dogborg/sleeper/syndie + name = "Combat Triage Belly" + desc = "A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves. This one is for more extreme combat scenarios." + icon_state = "sleepersyndiemed" + injection_chems = list(REAGENT_ID_HEALINGNANITES, REAGENT_ID_HYPERZINE, REAGENT_ID_TRAMADOL, REAGENT_ID_OXYCODONE, REAGENT_ID_SPACEACILLIN, REAGENT_ID_PERIDAXON, REAGENT_ID_OSTEODAXON, REAGENT_ID_MYELAMINE, REAGENT_ID_SYNTHBLOOD) + digest_multiplier = 2 + +/obj/item/dogborg/sleeper/K9/syndie + name = "Cell-Belly" + desc = "A mounted portable cell that holds anyone you wish for processing or 'processing'." + icon_state = "sleepersyndiebrig" + digest_multiplier = 3 + +/obj/item/dogborg/sleeper/compactor/syndie + name = "Advanced Matter Decompiler" + desc = "A mounted matter decompiling unit with fuel processor, for recycling anything and everyone in your way." + icon_state = "sleepersyndieeng" + max_item_count = 35 + digest_multiplier = 3 + +/obj/item/dogborg/sleeper/command //Command borg belly + name = "Bluespace Filing Belly" + desc = "A mounted bluespace storage unit for carrying paperwork" + icon_state = "sleeperd" + injection_chems = null + compactor = TRUE + recycles = FALSE + max_item_count = 25 + medsensor = FALSE + +/obj/item/dogborg/sleeper/compactor/honkborg + name = "Jiggles Von Hungertron" + desc = "You've heard of Giggles Von Honkerton for the back, now get ready for Jiggles Von Hungertron for the front." + icon_state = "clowngut" + recycles = FALSE + +/obj/item/dogborg/sleeper/exploration + name = "Store-Belly" + desc = "Equipment for a ExploreHound unit. A mounted portable-storage device that holds supplies/person." + icon_state = "sleeperlost" + injection_chems = list(REAGENT_ID_INAPROVALINE) // Only to stabilize during extractions + compactor = TRUE + max_item_count = 4 + medsensor = FALSE + recycles = TRUE diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_weapons.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_weapons.dm new file mode 100644 index 0000000000..e6c65b0411 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_weapons.dm @@ -0,0 +1,76 @@ +// Robot Weapons +/obj/item/gun/energy/taser/mounted/cyborg/ertgun //Not a taser, but it's being used as a base so it takes energy and actually works. + name = "disabler" + desc = "A small and nonlethal gun produced by NT.." + icon = 'icons/mob/dogborg_vr.dmi' + icon_state = "ertgunstun" + fire_sound = 'sound/weapons/eLuger.ogg' + projectile_type = /obj/item/projectile/beam/disable + charge_cost = 240 //Normal cost of a taser. It used to be 1000, but after some testing it was found that it would sap a borg's battery to quick + recharge_time = 1 //Takes ten ticks to recharge a laser, so don't waste them all! + //cell_type = null //Same cell as a taser until edits are made. + +/obj/item/gun/energy/robotic/flare + name = "flare gun" + desc = "A flare-gun" + projectile_type = /obj/item/projectile/energy/flash/flare + fire_sound = 'sound/weapons/tablehit1.ogg' + icon = 'icons/obj/gun.dmi' + icon_state = "taser" + charge_cost = 480 + borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_TASER + +/obj/item/gun/energy/robotic/smallmedigun + name = "borg directed restoration system" + desc = "An adapted version of the BL-3 'Phoenix, for expiremental useage in borgs." + projectile_type = /obj/item/projectile/beam/medical_cell/borg + accept_cell_type = /obj/item/cell/device + cell_type = /obj/item/cell/device/weapon + charge_cost = 600 + fire_delay = 6 + force = 5 + icon_state = "medbeam" + icon = 'icons/obj/gun_vr.dmi' + accuracy = 100 + fire_sound = 'sound/weapons/eluger.ogg' + self_recharge = 1 + use_external_power = 1 + +/obj/item/projectile/beam/medical_cell/borg + range = 4 + +/obj/item/projectile/beam/medical_cell/borg/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + if(target.stat != DEAD) + target.adjustBruteLoss(-3.75) + target.adjustFireLoss(-3.75) + else + return 1 + +/obj/item/melee/robotic/blade/explotailspear + name = "energy tail" + desc = "A glowing tail spear with a moderate range. It appears to be extremely sharp." + force = 45 + armor_penetration = 25 //30 to try and make it not useless against armored mobs but not fully nullify it. + reach = 3 + projectile_parry_chance = 15. + +/obj/item/melee/robotic/jaws/big/explojaws + name = "explo jaws" + desc = "Highly lethal jaws for close range combat." + force = 60 + armor_penetration = 25 //To try and make it not useless against armored mobs but not fully nullify it + projectile_parry_chance = 15 + +/obj/item/gun/energy/robotic/phasegun + name = "EW26 Artemis Mounted" + desc = "The RayZar EW26 Artemis, also known as the 'phase carbine', is a downsized energy-based weapon specifically designed for use against wildlife. This one has a safety interlock that prevents firing while in proximity to the facility." + description_fluff = "RayZar is Ward-Takahashi’s main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market." + icon = 'icons/obj/gun.dmi' + icon_state = "phasecarbine" + charge_cost = 160 + recharge_time = 16 + projectile_type = /obj/item/projectile/energy/phase + use_external_power = 1 + self_recharge = 1 + borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_LASER diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 95a4513676..7ed06e9aa1 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -775,6 +775,15 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/vac_attachment(src) //CHOMPAdd src.emag += new /obj/item/kinetic_crusher/machete/dagger(src) + var/datum/matter_synth/beacon = new /datum/matter_synth/beacon(10000) + synths += beacon + + var/obj/item/stack/marker_beacon/MB = new /obj/item/stack/marker_beacon(src) + MB.uses_charge = 1 + MB.charge_costs = list(500) + MB.synths = list(beacon) + src.modules += MB + src.modules += new /obj/item/dogborg/sleeper/compactor/supply(src) src.emag += new /obj/item/dogborg/pounce(src) diff --git a/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserSettings.tsx b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserSettings.tsx index 86406f462b..c14cb7167b 100644 --- a/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserSettings.tsx +++ b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserSettings.tsx @@ -43,7 +43,7 @@ export const ChemDispenserSettings = (props) => { value={amount} minValue={1} maxValue={120} - onDrag={(e, value) => + onChange={(e, value) => act('amount', { amount: value, }) diff --git a/tgui/packages/tgui/interfaces/RobotChoose/SpriteSection.tsx b/tgui/packages/tgui/interfaces/RobotChoose/SpriteSection.tsx index c95af95fa5..69f457b4d2 100644 --- a/tgui/packages/tgui/interfaces/RobotChoose/SpriteSection.tsx +++ b/tgui/packages/tgui/interfaces/RobotChoose/SpriteSection.tsx @@ -31,7 +31,7 @@ export const SpriteSection = (props: { scrollable width="30%" buttons={ - + { if (bodyOverrides[id]) { modalBody = bodyOverrides[id](modal); } else if (type === 'input') { - let curValue = modal.value; + const lastValue = useRef(modal.value); + const [curValue, setCurValue] = useState(modal.value); + + if (lastValue.current !== modal.value) { + lastValue.current = modal.value; + setCurValue(modal.value); + } + modalOnEnter = (e) => modalAnswer(id, curValue, {}); modalBody = ( { - curValue = val; + setCurValue(val); }} /> ); diff --git a/vorestation.dme b/vorestation.dme index 38fbee8a6f..4f7390eb34 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3420,9 +3420,11 @@ #include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" #include "code\modules\mob\living\silicon\robot\robot_ui.dm" #include "code\modules\mob\living\silicon\robot\robot_ui_module.dm" -#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm" -#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_yw.dm" -#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_defense_modules.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_types.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_weapons.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"