diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 93dd4a0555a..11d34afc903 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -93,6 +93,7 @@
var/humans_need_surnames = 0
var/allow_ai = 0 // allow ai job
var/forbid_secborg = 0 // disallow secborg module to be chosen.
+ var/forbid_peaceborg = 0
var/panic_bunker = 0 // prevents new people it hasn't seen before from connecting
var/notify_new_player_age = 0 // how long do we notify admins of a new player
var/irc_first_connection_alert = 0 // do we notify the irc channel when somebody is connecting for the first time?
@@ -560,6 +561,8 @@
config.allow_ai = 1
if("disable_secborg")
config.forbid_secborg = 1
+ if("disable_peaceborg")
+ config.forbid_peaceborg = 1
if("silent_ai")
config.silent_ai = 1
if("silent_borg")
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index a674ccb0d69..72344703528 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -20,7 +20,106 @@
"[user] has prodded you with [src]!")
add_logs(user, M, "stunned", src, "(INTENT: [uppertext(user.a_intent)])")
+/obj/item/borg/cyborghug
+ name = "Hugging Module"
+ icon_state = "hugmodule"
+ desc = "For when a someone really needs a hug."
+ var/mode = 0 //0 = Hugs 1 = "Hug" 2 = Shock 3 = CRUSH
+ var/ccooldown = 0
+ var/scooldown = 0
+/obj/item/borg/cyborghug/attack_self(mob/living/user)
+ if(isrobot(user))
+ var/mob/living/silicon/robot/P = user
+ if(P.emagged)
+ if(mode < 3)
+ mode++
+ else
+ mode = 0
+ else if(mode < 1)
+ mode++
+ else
+ mode = 0
+ switch(mode)
+ if(0)
+ user << "Power reset. Hugs!"
+ if(1)
+ user << "Power increased!"
+ if(2)
+ user << "BZZT. Electrifying arms..."
+ if(3)
+ user << "ERROR: ARM ACTUATORS OVERLOADED."
+
+/obj/item/borg/cyborghug/attack(mob/living/M, mob/living/silicon/robot/user)
+ switch(mode)
+ if(0)
+ if(M.health >= 0)
+ if(ishuman(M))
+ if(M.lying)
+ user.visible_message("[user] shakes [M] trying to get \him up!", \
+ "You shake [M] trying to get \him up!")
+ else
+ user.visible_message("[user] hugs [M] to make \him feel better!", \
+ "You hug [M] to make \him feel better!")
+ if(M.resting)
+ M.resting = 0
+ M.update_canmove()
+ else
+ user.visible_message("[user] pets [M]!", \
+ "You pet [M]!")
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ if(1)
+ if(M.health >= 0)
+ if(ishuman(M))
+ if(M.lying)
+ user.visible_message("[user] shakes [M] trying to get \him up!", \
+ "You shake [M] trying to get \him up!")
+ else
+ user.visible_message("[user] hugs [M] in a firm bear-hug! [M] looks uncomfortable...", \
+ "You hug [M] firmly to make \him feel better! [M] looks uncomfortable...")
+ if(M.resting)
+ M.resting = 0
+ M.update_canmove()
+ else
+ user.visible_message("[user] bops [M] on the head!", \
+ "You bop [M] on the head!")
+ playsound(loc, 'sound/weapons/tap.ogg', 50, 1, -1)
+ if(2)
+ if(!scooldown)
+ if(M.health >= 0)
+ if(ishuman(M))
+ M.electrocute_act(5, "[user]", safety = 1)
+ user.visible_message("[user] electrocutes [M] with their touch!", \
+ "You electrocute [M] with your touch!")
+ M.update_canmove()
+ else
+ if(!isrobot(M))
+ M.adjustFireLoss(10)
+ user.visible_message("[user] shocks [M]!", \
+ "You shock [M]!")
+ else
+ user.visible_message("[user] shocks [M]. It does not seem to have an effect", \
+ "You shock [M] to no effect.")
+ playsound(loc, 'sound/effects/sparks2.ogg', 50, 1, -1)
+ user.cell.charge -= 400
+ scooldown = 1
+ spawn(10)
+ scooldown = 0
+ if(3)
+ if(!ccooldown)
+ if(M.health >= 0)
+ if(ishuman(M))
+ user.visible_message("[user] crushes [M] in their grip!", \
+ "You crush [M] in your grip!")
+ else
+ user.visible_message("[user] crushes [M]!", \
+ "You crush [M]!")
+ playsound(loc, 'sound/weapons/smash.ogg', 50, 1, -1)
+ M.adjustBruteLoss(10)
+ user.cell.charge -= 300
+ ccooldown = 1
+ spawn(10)
+ ccooldown = 0
/obj/item/borg/charger
name = "power connector"
@@ -146,8 +245,75 @@
user << "You stop charging [target]."
+/obj/item/device/harmalarm
+ name = "Sonic Harm Prevention Tool"
+ desc = "Releases a harmless blast that confuses most organics. For when the harm is JUST TOO MUCH"
+ icon_state = "megaphone"
+ var/cooldown = 0
+ var/emagged = 0
+/obj/item/device/harmalarm/emag_act(mob/user)
+ emagged = !emagged
+ if(emagged)
+ user << "You short out the safeties on the [src]!"
+ else
+ user << "You reset the safeties on the [src]!"
+/obj/item/device/harmalarm/attack_self(mob/user)
+ var/safety = !emagged
+ if(cooldown > world.time)
+ user << "The device is still recharging!"
+ return
+
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ if(R.cell.charge < 1200)
+ user << "You don't have enough charge to do this!"
+ return
+ R.cell.charge -= 1000
+ if(R.emagged)
+ safety = 0
+
+ if(safety == 1)
+ user.visible_message("[user] blares out a near-deafening siren from its speakers!", \
+ "The siren pierces your hearing and confuses you!", \
+ "The siren pierces your hearing!")
+ for(var/mob/living/M in get_hearers_in_view(9, user))
+ if(iscarbon(M))
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
+ continue
+ M.confused += 6
+ M << "HUMAN HARM"
+ playsound(get_turf(src), 'sound/AI/harmalarm.ogg', 70, 3)
+ cooldown = world.time + 200
+ log_game("[user.ckey]([user]) used a Cyborg Harm Alarm in ([user.x],[user.y],[user.z])")
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ R.connected_ai << "
NOTICE - Peacekeeping 'HARM ALARM' used by: [user]
"
+
+ return
+
+ if(safety == 0)
+ user.visible_message("[user] blares out a sonic screech from its speakers!", \
+ "You hear a sharp screech before your thoughts are interrupted and you collapse, your ears ringing!", \
+ "You hear a sonic screech and collapse, your ears riniging!")
+ for(var/mob/living/M in get_hearers_in_view(9, user))
+ if(iscarbon(M))
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(istype(H.ears, /obj/item/clothing/ears/earmuffs))
+ continue
+ M.confused += 15
+ M.Weaken(2)
+ M.stuttering += 30
+ M.adjustEarDamage(0, 20)
+ M.Jitter(25)
+ M << "BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZT"
+ playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 130, 3)
+ cooldown = world.time + 600
+ log_game("[user.ckey]([user]) used an emagged Cyborg Harm Alarm in ([user.x],[user.y],[user.z])")
/**********************************************************************
HUD/SIGHT things
diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm
index ba891f89d78..72969f4abbf 100644
--- a/code/game/objects/items/weapons/RSF.dm
+++ b/code/game/objects/items/weapons/RSF.dm
@@ -112,3 +112,71 @@ RSF
matter--
user << "The RSF now holds [matter]/30 fabrication-units."
desc = "A RSF. It currently holds [matter]/30 fabrication-units."
+
+/obj/item/weapon/cookiesynth
+ name = "Cookie Synthesizer"
+ desc = "A self-recharging device used to rapidly deploy cookies."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "rcd"
+ var/matter = 10
+ var/toxin = 0
+ var/emagged = 0
+ w_class = 3
+
+/obj/item/weapon/cookiesynth/New()
+ desc = "A self recharging cookie fabricator. It currently holds [matter]/10 cookie-units."
+
+/obj/item/weapon/cookiesynth/attackby()
+ return
+
+/obj/item/weapon/cookiesynth/emag_act(mob/user)
+ emagged = !emagged
+ if(emagged)
+ user << "You short out the [src]'s reagent safety checker!"
+ else
+ user << "You reset the [src]'s reagent safety checker!"
+ toxin = 0
+
+/obj/item/weapon/cookiesynth/attack_self(mob/user)
+ var/mob/living/silicon/robot/P = null
+ if(isrobot(user))
+ P = user
+ if(emagged&&!toxin)
+ toxin = 1
+ user << "Cookie Synthesizer Hacked"
+ else if(P.emagged&&!toxin)
+ toxin = 1
+ user << "Cookie Synthesizer Hacked"
+ else
+ toxin = 0
+ user << "Cookie Synthesizer Reset"
+
+/obj/item/weapon/cookiesynth/process()
+ if (matter < 10)
+ matter++
+
+/obj/item/weapon/cookiesynth/afterattack(atom/A, mob/user, proximity)
+ if(!proximity)
+ return
+ if (!(istype(A, /obj/structure/table) || istype(A, /turf/open/floor)))
+ return
+ if(matter < 1)
+ user << "The [src] doesn't have enough matter left. Wait for it to recharge!"
+ return
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ if(!R.cell || R.cell.charge < 400)
+ user << "You do not have enough power to use [src]."
+ return
+ var/turf/T = get_turf(A)
+ playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
+ user << "Fabricating Cookie.."
+ var/obj/item/weapon/reagent_containers/food/snacks/cookie/S = new /obj/item/weapon/reagent_containers/food/snacks/cookie(T)
+ if(toxin)
+ S.reagents.add_reagent("chloralhydrate2", 10)
+ if (isrobot(user))
+ var/mob/living/silicon/robot/R = user
+ R.cell.charge -= 100
+ else
+ matter--
+ desc = "A self recharging cookie fabricator. It currently holds [matter]/10 cookie-units."
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 103e0b3f07c..bd261f6a22c 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -305,6 +305,9 @@
/obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
Crossed(user) //honk
+/obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg
+ breakouttime = 20 // Cyborgs shouldn't have a strong restraint
+
/obj/item/weapon/restraints/legcuffs/bola
name = "bola"
desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly."
diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm
index 97a9278a63d..236bad8dc28 100644
--- a/code/game/objects/items/weapons/holosign_creator.dm
+++ b/code/game/objects/items/weapons/holosign_creator.dm
@@ -74,6 +74,45 @@
creation_time = 30
max_signs = 6
+/obj/item/weapon/holosign_creator/cyborg
+ name = "Energy Barrier Projector"
+ desc = "A holographic projector that creates fragile energy fields"
+ creation_time = 5
+ max_signs = 9
+ holosign_type = /obj/effect/overlay/holograph/barrier/cyborg
+ var/shock = 0
+
+/obj/item/weapon/holosign_creator/cyborg/attack_self(mob/user)
+ if(isrobot(user))
+ var/mob/living/silicon/robot/R = user
+
+ if(shock)
+ user <<"You clear all active holograms, and reset your projector to normal."
+ holosign_type = /obj/effect/overlay/holograph/barrier/cyborg
+ creation_time = 5
+ if(signs.len)
+ for(var/H in signs)
+ qdel(H)
+ shock = 0
+ return
+ else if(R.emagged&&!shock)
+ user <<"You clear all active holograms, and overload your energy projector!"
+ holosign_type = /obj/effect/overlay/holograph/barrier/cyborg/hacked
+ creation_time = 30
+ if(signs.len)
+ for(var/H in signs)
+ qdel(H)
+ shock = 1
+ return
+ else
+ if(signs.len)
+ for(var/H in signs)
+ qdel(H)
+ user << "You clear all active holograms."
+ if(signs.len)
+ for(var/H in signs)
+ qdel(H)
+ user << "You clear all active holograms."
/obj/effect/overlay/holograph
icon = 'icons/effects/effects.dmi'
@@ -185,3 +224,36 @@
/obj/effect/overlay/holograph/barrier/engineering
icon_state = "holosign_engi"
+
+/obj/effect/overlay/holograph/barrier/cyborg
+ name = "Energy Field"
+ desc = "A fragile energy field that blocks movement"
+ density = 1
+ holo_integrity = 1
+
+/obj/effect/overlay/holograph/barrier/CanPass()
+ return 0
+
+/obj/effect/overlay/holograph/barrier/cyborg/hacked
+ name = "Charged Energy Field"
+ desc = "A powerful energy field that blocks movement. Energy arcs off it"
+ holo_integrity = 3
+ var/shockcd = 0
+
+/obj/effect/overlay/holograph/barrier/cyborg/hacked/attack_hand(mob/living/user)
+ if(!shockcd)
+ if(ismob(user))
+ var/mob/living/M = user
+ M.electrocute_act(15,"Energy Barrier", safety=1)
+ shockcd = 1
+ spawn(10)
+ shockcd = 0
+
+/obj/effect/overlay/holograph/barrier/cyborg/hacked/Bumped(atom/user)
+ if(!shockcd)
+ if(ismob(user))
+ var/mob/living/M = user
+ M.electrocute_act(15,"Energy Barrier", safety=1)
+ shockcd = 1
+ spawn(10)
+ shockcd = 0
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 0ac2332ed47..20d3ffd0b91 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -167,6 +167,8 @@
return
var/list/modulelist = list("Standard", "Engineering", "Medical", "Miner", "Janitor","Service")
+ if(!config.forbid_peaceborg)
+ modulelist += "Peacekeeper"
if(!config.forbid_secborg)
modulelist += "Security"
@@ -235,6 +237,16 @@
status_flags &= ~CANPUSH
feedback_inc("cyborg_security",1)
+ if("Peacekeeper") //Secborg sprites untill someone gives me some to update with
+ module = new /obj/item/weapon/robot_module/peacekeeper(src)
+ hands.icon_state = "standard"
+ icon_state = "peaceborg"
+ animation_length = 54
+ modtype = "Peace"
+ src << "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you."
+ status_flags &= ~CANPUSH
+ feedback_inc("cyborg_peacekeeper",1) //I'm assuming this is for logging.
+
if("Engineering")
module = new /obj/item/weapon/robot_module/engineering(src)
hands.icon_state = "engineer"
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 45257c61186..cfb56c69017 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -131,6 +131,7 @@
modules += new /obj/item/weapon/crowbar/cyborg(src)
modules += new /obj/item/device/healthanalyzer(src)
modules += new /obj/item/toy/crayon/spraycan/borg(src)
+ modules += new /obj/item/borg/cyborghug(src)
emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
fix_modules()
@@ -155,6 +156,7 @@
modules += new /obj/item/weapon/circular_saw(src)
modules += new /obj/item/weapon/extinguisher/mini(src)
modules += new /obj/item/roller/robo(src)
+ modules += new /obj/item/borg/cyborghug(src)
add_module(new /obj/item/stack/medical/gauze/cyborg())
@@ -219,6 +221,32 @@
else
T.charge_tick = 0
+/obj/item/weapon/robot_module/peacekeeper
+ name = "peacekeeper robot module"
+
+/obj/item/weapon/robot_module/peacekeeper/New()
+ ..()
+ modules += new /obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg(src)
+ modules += new /obj/item/weapon/cookiesynth(src)
+ modules += new /obj/item/device/harmalarm(src)
+ modules += new /obj/item/weapon/reagent_containers/borghypo/peace(src)
+ modules += new /obj/item/weapon/holosign_creator/cyborg(src)
+ modules += new /obj/item/borg/cyborghug(src)
+ modules += new /obj/item/weapon/extinguisher(src)
+
+ emag = new /obj/item/weapon/reagent_containers/borghypo/peace/hacked(src)
+
+/obj/item/weapon/robot_module/peacekeeper/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
+ ..()
+ var/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/T = locate(/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg) in get_usable_modules()
+ if(T)
+ if(T.power_supply.charge < T.power_supply.maxcharge)
+ var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
+ T.power_supply.give(S.e_cost * coeff)
+ T.update_icon()
+ else
+ T.charge_tick = 0
+
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
var/obj/item/weapon/reagent_containers/spray/drying_agent
@@ -372,4 +400,4 @@
/datum/robot_energy_storage/medical
max_energy = 2500
recharge_rate = 250
- name = "Medical Synthesizer"
+ name = "Medical Synthesizer"
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 3d245ea9956..62b3ba8a669 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -167,6 +167,10 @@ obj/item/ammo_casing/energy/net
projectile_type = /obj/item/projectile/energy/trap
select_name = "snare"
+/obj/item/ammo_casing/energy/trap/cyborg
+ projectile_type = /obj/item/projectile/energy/trap/cyborg
+ e_cost = 50
+
/obj/item/ammo_casing/energy/instakill
projectile_type = /obj/item/projectile/beam/instakill
e_cost = 0
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 528ecc04816..f69cadac134 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -48,6 +48,22 @@
can_flashlight = 0
ammo_x_offset = 1
+/obj/item/weapon/gun/energy/gun/dragnet/snare
+ name = "Energy Snare Launcher"
+ desc = "Fires an energy snare that slows the target down"
+ ammo_type = list(/obj/item/ammo_casing/energy/trap)
+
+/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg
+ can_charge = 0
+ ammo_type = list(/obj/item/ammo_casing/energy/trap/cyborg)
+
+/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/newshot()
+ ..()
+ robocharge()
+
+/obj/item/weapon/gun/energy/gun/dragnet/snare/cyborg/emp_act()
+ return
+
/obj/item/weapon/gun/energy/gun/turret
name = "hybrid turret gun"
desc = "A heavy hybrid energy cannon with two settings: Stun and kill."
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 2b081c5f1bd..d5300383dbd 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -124,7 +124,7 @@
damage = 10
weaken = 4
stun = 4
-
+
/obj/item/projectile/bullet/honker
damage = 0
weaken = 5
@@ -135,7 +135,7 @@
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "banana"
range = 200
-
+
/obj/item/projectile/bullet/honker/New()
..()
SpinAnimation()
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 4dde9cc6fc8..3cd537d41ad 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -111,6 +111,32 @@
new/obj/item/weapon/restraints/legcuffs/beartrap/energy(loc)
..()
+/obj/item/projectile/energy/trap/cyborg
+ name = "Energy Bola"
+ icon_state = "e_snare"
+ nodamage = 1
+ weaken = 0
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 10
+
+/obj/item/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = 0)
+ if(!ismob(target) || blocked >= 100)
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
+ sparks.set_up(1, 1, src)
+ sparks.start()
+ qdel(src)
+ if(iscarbon(target))
+ var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target))
+ B.Crossed(target)
+ spawn(10)
+ qdel(src)
+ ..()
+
+/obj/item/projectile/energy/trap/cyborg/on_range()
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
+ sparks.set_up(1, 1, src)
+ sparks.start()
+ qdel(src)
/obj/item/projectile/energy/declone
name = "radiation beam"
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 966481e1b2d..12016ff0618 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -267,6 +267,20 @@
. = 1
..()
+/datum/reagent/toxin/chloralhydrate/delayed
+ id = "chloralhydrate2"
+
+/datum/reagent/toxin/chloralhydrate/delayed/on_mob_life(mob/living/M)
+ switch(current_cycle)
+ if(1 to 10)
+ return
+ if(10 to 20)
+ M.confused += 1
+ M.drowsyness += 1
+ if(20 to INFINITY)
+ M.Sleeping(2, 0)
+ ..()
+
/datum/reagent/toxin/beer2 //disguised as normal beer for use by emagged brobots
name = "Beer"
id = "beer2"
@@ -707,3 +721,31 @@
M.adjustFireLoss(current_cycle/10, 0) // I rode a tank, held a general's rank
. = 1 // When the blitzkrieg raged and the bodies stank
..() // Pleased to meet you, hope you guess my name
+
+/datum/reagent/toxin/peaceborg/confuse
+ name = "Dizzying Solution"
+ id = "dizzysolution"
+ description = "Makes the target off balance and dizzy"
+ toxpwr = 0
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
+
+/datum/reagent/toxin/peaceborg/confuse/on_mob_life(mob/living/M)
+ M.confused += 1
+ M.Dizzy(1)
+ if(prob(20))
+ M << "You feel confused and disorientated."
+ ..()
+
+/datum/reagent/toxin/peaceborg/tire
+ name = "Tiring Solution"
+ id = "tiresolution"
+ description = "An extremely weak stamina-toxin that tires out the target. Completely harmless."
+ toxpwr = 0
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
+
+/datum/reagent/toxin/peaceborg/tire/on_mob_life(mob/living/M)
+ if(M.staminaloss < 50)
+ M.adjustStaminaLoss(10)
+ if(prob(30))
+ M << "You should sit down and take a rest..."
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 679999b573c..e6188a387f5 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -207,3 +207,13 @@ Borg Shaker
recharge_time = 3
reagent_ids = list("beer2")
+
+/obj/item/weapon/reagent_containers/borghypo/peace
+ name = "Peace Hypospray"
+
+ reagent_ids = list("dizzysolution","tiresolution")
+
+/obj/item/weapon/reagent_containers/borghypo/peace/hacked
+ desc = "Everything's peaceful in death!"
+ icon_state = "borghypo_s"
+ reagent_ids = list("dizzysolution","tiresolution","tirizene","sulfonal","sodium_thiopental","cyanide","neurotoxin2")
\ No newline at end of file
diff --git a/config/admins.txt b/config/admins.txt
index 6c712096834..b650f5e1d67 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -8,6 +8,7 @@
# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. #
###############################################################################################
Optimumtact = Host
+kevinz000 = Host
kingofkosmos = Game Master
MrStonedOne = Game Master
microscopics = Game Master
diff --git a/config/game_options.txt b/config/game_options.txt
index 914a64e3bcf..eea6aaa7b11 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -197,9 +197,12 @@ EVENTS_MIN_PLAYERS_MUL 1
ALLOW_AI
### Secborg ###
-## Uncomment to prevent the secborg module from being chosen
+## Uncomment to prevent the security cyborg module from being chosen
#DISABLE_SECBORG
+### Peacekeeper Borg ###
+## Uncomment to prevent the peacekeeper cyborg module from being chosen
+#DISABLE_PEACEBORG
### AWAY MISSIONS ###
diff --git a/icons/mob/robot_items.dmi b/icons/mob/robot_items.dmi
index 0ac3137707f..e3c81e501ee 100644
Binary files a/icons/mob/robot_items.dmi and b/icons/mob/robot_items.dmi differ
diff --git a/icons/mob/robot_transformations.dmi b/icons/mob/robot_transformations.dmi
index 1cedece909f..f389bb60a02 100644
Binary files a/icons/mob/robot_transformations.dmi and b/icons/mob/robot_transformations.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 9f1ea3d8562..a7d98d699c5 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/sound/AI/harmalarm.ogg b/sound/AI/harmalarm.ogg
new file mode 100644
index 00000000000..b9107f6e44d
Binary files /dev/null and b/sound/AI/harmalarm.ogg differ