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