From 41469cfa06df24c810b609823d732c54caf93085 Mon Sep 17 00:00:00 2001 From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Date: Fri, 12 Apr 2024 15:08:48 -0400 Subject: [PATCH] Evil Cyborgs - Non-Engineer Emag/Malf Modules (#24638) * Evil Janitor Cyborg * Evil Medical Cyborg * Little less cyanide * Evil Service Borg * Combat Cyborg Firmware Upgrade cost adjustment * Minor code fixes * Updated Energy Type * Spacing Changes * Evil Mining Borg pt1 * Sonic Jackhammer Force, Functions as Combat and Utility mining module * Moved guitar * Moved KA * Naming, Inheritance changes * Fix landmine stack icon * Landmine Repath, RSG Magazine Length and KA Overheat changes * Service Borg Shotgun - Lasershot, Ammo Cap Nerf, No more slug * REALLY got rid of compact slugs * RSG - 2u Toxin, 20 Brute heavy syringes * Syringe Gun Fire Rate * Changed syringe creation, moved syringe cannon off syringe gun * Purged syndie hypo, new emag hypo pierces armor/suits --- .../gamemodes/malfunction/Malf_Modules.dm | 24 ++-- code/game/objects/items/weapons/caution.dm | 26 ++++ .../objs/items/instrument_items.dm | 6 + code/modules/mining/equipment/mining_tools.dm | 1 + .../mob/living/silicon/robot/robot_modules.dm | 111 ++++++++++++++---- .../projectiles/ammunition/ammo_casings.dm | 1 - .../projectiles/ammunition/magazines.dm | 5 + .../guns/energy/kinetic_accelerator.dm | 17 +++ .../projectiles/guns/projectile/shotgun.dm | 10 ++ code/modules/projectiles/guns/syringe_gun.dm | 2 + .../modules/projectiles/projectile/bullets.dm | 3 + .../reagents/reagent_containers/borghydro.dm | 2 + 12 files changed, 173 insertions(+), 35 deletions(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index b399ca1bde4..6c418ff32b7 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -813,26 +813,24 @@ AI.cracked_camera = TRUE QDEL_NULL(AI.builtInCamera) -/datum/AI_Module/engi_upgrade - module_name = "Engineering Cyborg Emitter Upgrade" - mod_pick_name = "emitter" - description = "Downloads firmware that activates the built in emitter in all engineering cyborgs linked to you. Cyborgs built after this upgrade will have it pre-installed." - cost = 50 // IDK look into this +/datum/AI_Module/borg_upgrade + module_name = "Combat Cyborg Firmware Upgrade" + mod_pick_name = "combatborgs" + description = "Downloads firmware that activates built-in combat hardware present in all cyborgs. Cyborgs built after this is used will come with the hardware activated." + cost = 70 // IDK look into this one_purchase = TRUE upgrade = TRUE - unlock_text = "Firmware downloaded. Bugs removed. Built in emitters operating at 73% efficiency." + unlock_text = "Firmware downloaded. Bugs removed. Combat subsystems operating at 73% efficiency." unlock_sound = 'sound/items/rped.ogg' -/datum/AI_Module/engi_upgrade/upgrade(mob/living/silicon/ai/AI) - AI.purchased_modules += /obj/item/robot_module/engineering - log_game("[key_name(usr)] purchased emitters for all engineering cyborgs.") - message_admins("[key_name_admin(usr)] purchased emitters for all engineering cyborgs!") +/datum/AI_Module/borg_upgrade/upgrade(mob/living/silicon/ai/AI) + AI.purchased_modules = list(/obj/item/robot_module/engineering, /obj/item/robot_module/janitor, /obj/item/robot_module/medical, /obj/item/robot_module/miner, /obj/item/robot_module/butler) + log_game("[key_name(usr)] purchased combat upgrades for all cyborgs.") + message_admins("[key_name_admin(usr)] purchased combat upgrades for all cyborgs!") for(var/mob/living/silicon/robot/R in AI.connected_robots) - if(!istype(R.module, /obj/item/robot_module/engineering)) - continue R.module.malfhacked = TRUE R.module.rebuild_modules() - to_chat(R, "New firmware downloaded. Emitter is now online.") + to_chat(R, "New firmware downloaded. Combat upgrades are now online.") /datum/AI_Module/repair_cyborg module_name = "Repair Cyborgs" diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm index fb1dd7c72fe..a32c548d648 100644 --- a/code/game/objects/items/weapons/caution.dm +++ b/code/game/objects/items/weapons/caution.dm @@ -66,3 +66,29 @@ l.droplimb(0, DROPLIMB_SHARP) if(r) r.droplimb(0, DROPLIMB_SHARP) + +/obj/item/stack/cyborg_mine //Malf module + name = "proximity mine dispenser" + icon = 'icons/obj/janitor.dmi' + icon_state = "caution" + energy_type = /datum/robot_storage/energy/janitor/landmine + is_cyborg = TRUE + +/obj/item/stack/caution/proximity_sign/malf/afterattack(atom/target, mob/user) + if(!check_allowed_items(target, 1)) + return + var/turf/T = get_turf(target) + + if(is_blocked_turf(T, TRUE)) //can't put mines on a tile that has dense stuff + to_chat(user, "The space is occupied! You cannot place a mine there!") + return + if(!use(1)) //Can't place a landmine if you don't have a landmine + to_chat(user, "[src] is out of landmines! It can be refilled at a cyborg charger.") + return + playsound(src.loc, 'sound/machines/click.ogg', 20, TRUE) + var/obj/item/caution/proximity_sign/M = new /obj/item/caution/proximity_sign(get_turf(target), src) + M.timing = TRUE + START_PROCESSING(SSobj, M) + to_chat(user, "You place a landmine with [src]. You have 15 seconds until it is armed.") + return M + diff --git a/code/modules/instruments/objs/items/instrument_items.dm b/code/modules/instruments/objs/items/instrument_items.dm index ec41f9578a7..d20fd278f32 100644 --- a/code/modules/instruments/objs/items/instrument_items.dm +++ b/code/modules/instruments/objs/items/instrument_items.dm @@ -42,6 +42,12 @@ hitsound = 'sound/weapons/guitarslam.ogg' allowed_instrument_ids = "guitar" +/// This is a special guitar for the emagged service borg that hits pretty hard and can still play music. Clonk. +/obj/item/instrument/guitar/cyborg + name = "steel-reinforced guitar" + desc = "This guitar has robust metal plating inside to give it some extra kick." + force = 20 + /obj/item/instrument/eguitar name = "electric guitar" desc = "Makes all your shredding needs possible." diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 7fafc804e93..8a9bb832b88 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -122,6 +122,7 @@ hitsound = 'sound/weapons/sonic_jackhammer.ogg' usesound = 'sound/weapons/sonic_jackhammer.ogg' toolspeed = 0.1 //the epitome of powertools. extremely fast mining, laughs at puny walls + force = 20 //This thing breaks rwalls, it should be able to hit harder than a DIY bone pickaxe. /obj/item/shovel name = "shovel" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index e812e38165f..8a2af85852e 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -357,8 +357,11 @@ /obj/item/stack/nanopaste/cyborg, /obj/item/gripper_medical ) - emag_override_modules = list(/obj/item/reagent_containers/spray/cyborg_facid) - special_rechargables = list(/obj/item/reagent_containers/spray/cyborg_facid, /obj/item/extinguisher/mini) + malf_modules = list(/obj/item/gun/syringemalf) + special_rechargables = list( + /obj/item/extinguisher/mini, + /obj/item/gun/syringemalf + ) // Disable safeties on the borg's defib. /obj/item/robot_module/medical/emag_act(mob/user) @@ -376,6 +379,50 @@ F.emag_act() return ..() +/// Malf Syringe Gun +/obj/item/gun/syringemalf + name = "plasma syringe cannon" + desc = "A syringe gun integrated into a medical cyborg's chassis. Fires heavy-duty plasma syringes tipped in poison." + icon_state = "rapidsyringegun" + throw_speed = 3 + throw_range = 7 + force = 4 + fire_sound = 'sound/items/syringeproj.ogg' + fire_delay = 0.75 + var/max_syringes = 14 + var/current_syringes = 14 + +//Preload Syringes +/obj/item/gun/syringemalf/Initialize(mapload) + ..() + chambered = new /obj/item/ammo_casing/syringegun(src) + process_chamber() + +//Recharge syringes in a recharger +/obj/item/gun/syringemalf/cyborg_recharge(coeff, emagged) + if(current_syringes + (chambered.BB ? 1 : 0) < max_syringes) + current_syringes++ + process_chamber() + +//Cannot manually remove syringes +/obj/item/gun/syringemalf/attack_self(mob/living/user) + return + +//Load syringe into the chamber +/obj/item/gun/syringemalf/process_chamber() + if(!current_syringes || chambered?.BB) + return + + chambered.BB = new /obj/item/projectile/bullet/dart/syringe/heavyduty(src) + chambered.BB.reagents.add_reagent_list(list("toxin" = 2)) + chambered.BB.name = "heavy duty syringe" + current_syringes-- + +/obj/item/gun/syringemalf/examine(mob/user) + . = ..() + var/num_syringes = current_syringes + (chambered.BB ? 1 : 0) + . += "Can hold [max_syringes] syringe\s. Has [num_syringes] syringe\s remaining." + // Fluorosulphuric acid spray bottle. /obj/item/reagent_containers/spray/cyborg_facid name = "Polyacid spray" @@ -470,10 +517,12 @@ /obj/item/extinguisher/mini ) emag_override_modules = list(/obj/item/reagent_containers/spray/cyborg_lube) - emag_modules = list(/obj/item/restraints/handcuffs/cable/zipties/cyborg) + emag_modules = list(/obj/item/reagent_containers/spray/cyborg_facid, /obj/item/malfbroom) + malf_modules = list(/obj/item/stack/cyborg_mine) special_rechargables = list( /obj/item/lightreplacer, /obj/item/reagent_containers/spray/cyborg_lube, + /obj/item/reagent_containers/spray/cyborg_facid, /obj/item/extinguisher/mini ) @@ -514,6 +563,30 @@ cleaned_human.clean_blood() to_chat(cleaned_human, "[src] cleans your face!") + +/obj/item/malfbroom + name = "cyborg combat broom" + desc = "A steel-core push broom for the hostile cyborg. The firm bristles make it more suitable for fighting than cleaning." + icon = 'icons/obj/janitor.dmi' + icon_state = "broom0" + base_icon_state = "broom" + attack_verb = list("smashed", "slammed", "whacked", "thwacked", "swept") + force = 20 + +/obj/item/malfbroom/attack(mob/target, mob/user) + if(!ishuman(target)) + return ..() + var/mob/living/carbon/human/H = target + if(H.stat != CONSCIOUS || IS_HORIZONTAL(H)) + return ..() + H.visible_message("[user] sweeps [H]'s legs out from under [H.p_them()]!", \ + "[user] sweeps your legs out from under you!", \ + "You hear sweeping.") + playsound(get_turf(user), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) + H.apply_damage(20, BRUTE) + H.KnockDown(4 SECONDS) + add_attack_logs(user, H, "Leg swept with cyborg combat broom", ATKLOG_ALL) + // Service cyborg module. /obj/item/robot_module/butler name = "service robot module" @@ -535,10 +608,12 @@ /obj/item/reagent_containers/drinks/shaker ) emag_override_modules = list(/obj/item/reagent_containers/drinks/cans/beer/sleepy_beer) - emag_modules = list(/obj/item/restraints/handcuffs/cable/zipties/cyborg) + emag_modules = list(/obj/item/restraints/handcuffs/cable/zipties/cyborg, /obj/item/instrument/guitar/cyborg) + malf_modules = list(/obj/item/gun/projectile/shotgun/automatic/combat/cyborg) special_rechargables = list( /obj/item/reagent_containers/condiment/enzyme, - /obj/item/reagent_containers/drinks/cans/beer/sleepy_beer + /obj/item/reagent_containers/drinks/cans/beer/sleepy_beer, + /obj/item/gun/projectile/shotgun/automatic/combat/cyborg ) @@ -595,24 +670,10 @@ /obj/item/gun/energy/kinetic_accelerator/cyborg, /obj/item/gps/cyborg ) - emag_modules = list(/obj/item/borg/stun, /obj/item/pickaxe/drill/cyborg/diamond, /obj/item/restraints/handcuffs/cable/zipties/cyborg) + emag_modules = list(/obj/item/pickaxe/drill/jackhammer) + malf_modules = list(/obj/item/gun/energy/kinetic_accelerator/cyborg/malf) special_rechargables = list(/obj/item/extinguisher/mini, /obj/item/weldingtool/mini) -// Replace their normal drill with a diamond drill. -/obj/item/robot_module/miner/emag_act() - . = ..() - for(var/obj/item/pickaxe/drill/cyborg/D in modules) - // Make sure we don't remove the diamond drill If they already have a diamond drill from the borg upgrade. - if(!istype(D, /obj/item/pickaxe/drill/cyborg/diamond)) - qdel(D) - basic_modules -= D // Remove it from this list so it doesn't get added in the rebuild. - -// Readd the normal drill -/obj/item/robot_module/miner/unemag() - var/obj/item/pickaxe/drill/cyborg/C = new(src) - basic_modules += C - return ..() - // This makes it so others can crowbar out KA upgrades from the miner borg. /obj/item/robot_module/miner/handle_custom_removal(component_id, mob/living/user, obj/item/W) if(component_id == "KA modkits") @@ -957,6 +1018,13 @@ /datum/robot_storage/energy/medical/nanopaste/syndicate max_amount = 25 +//Energy stack for landmines +/datum/robot_storage/energy/janitor/landmine + name = "Landmine Synthesizer" + statpanel_name = "Landmines" + max_amount = 4 + recharge_rate = 0.2 + /// This datum is an alternative to the energy storages, instead being recharged in different ways /datum/robot_storage/material name = "Generic material storage" @@ -986,3 +1054,4 @@ statpanel_name = "Metal" stack = /obj/item/stack/sheet/metal add_to_storage = TRUE + diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 7d541fcfe80..7e43f0ada91 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -169,7 +169,6 @@ muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG - /obj/item/ammo_casing/shotgun/buckshot name = "buckshot shell" desc = "A 12 gauge buckshot shell. Fires a spread of lethal shot." diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 727f3d1a325..f1e7fe2fd48 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -117,6 +117,11 @@ ammo_type = /obj/item/ammo_casing/shotgun/beanbag max_ammo = 6 +/obj/item/ammo_box/magazine/internal/shot/malf + name = "cyborg shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/lasershot + max_ammo = 8 + /obj/item/ammo_box/magazine/internal/shot/dual name = "double-barrel shotgun internal magazine" max_ammo = 2 diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 607f01ab514..9502b94bdb3 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -79,6 +79,15 @@ max_mod_capacity = 80 icon_state = "kineticgun_b" +/obj/item/gun/energy/kinetic_accelerator/cyborg/malf + name = "kinetic accelerator cannon" + desc = "A cyborg-modified kinetic accelerator that operates in pressurized environments, but cannot be upgraded and fires slowly." + icon_state = "kineticgun_h" + item_state = "kineticgun_h" + max_mod_capacity = 0 + ammo_type = list(/obj/item/ammo_casing/energy/kinetic/malf) + overheat_time = 2 SECONDS + /obj/item/gun/energy/kinetic_accelerator/minebot trigger_guard = TRIGGER_GUARD_ALLOW_ALL overheat_time = 20 @@ -185,6 +194,9 @@ var/obj/item/gun/energy/kinetic_accelerator/KA = loc KA.modify_projectile(BB) +//Malf casing +/obj/item/ammo_casing/energy/kinetic/malf + projectile_type = /obj/item/projectile/kinetic/malf //Projectiles /obj/item/projectile/kinetic @@ -199,6 +211,11 @@ var/pressure_decrease = 0.25 var/obj/item/gun/energy/kinetic_accelerator/kinetic_gun +/obj/item/projectile/kinetic/malf + pressure_decrease = 1 + color = "#FFFFFF" + icon_state = "ka_tracer" + /obj/item/projectile/kinetic/pod range = 4 diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 7e80e0f776b..5558b2ed2fd 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -320,6 +320,16 @@ w_class = WEIGHT_CLASS_BULKY execution_speed = 5 SECONDS +/// Service Malfunction Borg Combat Shotgun Variant +/obj/item/gun/projectile/shotgun/automatic/combat/cyborg + name = "cyborg shotgun" + desc = "Get those organics off your station. Holds eight shots. Can only reload in a recharge station." + mag_type = /obj/item/ammo_box/magazine/internal/shot/malf + +/obj/item/gun/projectile/shotgun/automatic/combat/cyborg/cyborg_recharge(coeff, emagged) + if(magazine.ammo_count() < magazine.max_ammo) + magazine.stored_ammo.Add(new /obj/item/ammo_casing/shotgun/lasershot) + //Dual Feed Shotgun /obj/item/gun/projectile/shotgun/automatic/dual_tube diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 4e8a7ccc6b6..70a459e20a8 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -413,3 +413,5 @@ user.adjustStaminaLoss(20, FALSE) user.adjustOxyLoss(20) return ..() + + diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 406aa34e3e3..6e6bfaece4d 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -256,6 +256,9 @@ icon = 'icons/obj/chemical.dmi' icon_state = "syringeproj" +/obj/item/projectile/bullet/dart/syringe/heavyduty + damage = 20 + /obj/item/projectile/bullet/dart/syringe/pierce_ignore piercing = TRUE diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index ba94c399e5c..8ef267a08e4 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -127,9 +127,11 @@ /obj/item/reagent_containers/borghypo/emag_act(mob/user) if(!emagged) emagged = TRUE + bypass_protection = TRUE reagent_ids += reagent_ids_emagged return emagged = FALSE + bypass_protection = FALSE reagent_ids -= reagent_ids_emagged /obj/item/reagent_containers/borghypo/basic