diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index 58eebf67064..c57b74659a2 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -1031,7 +1031,15 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
return
/atom/proc/ShiftClick(var/mob/M as mob)
- examine()
+
+ if(istype(M.machine, /obj/machinery/computer/security)) //No examining by looking through cameras
+ return
+ if(!istype(M, /mob/living))
+ return
+
+ if(( abs(src.x-M.x)<8 || abs(src.y-M.y)<8 ) && src.z == M.z ) //This should prevent non-observers to examine stuff from outside their view.
+ examine()
+
return
/atom/proc/AltClick()
diff --git a/code/game/chemistry.dm b/code/game/chemistry.dm
index b17ae1920df..51913fc584c 100644
--- a/code/game/chemistry.dm
+++ b/code/game/chemistry.dm
@@ -1,6 +1,6 @@
#define REGULATE_RATE 5
-/obj/item/weapon/smokebomb
+/*/obj/item/weapon/smokebomb
desc = "It is set to detonate in 2 seconds."
name = "smoke bomb"
icon = 'grenade.dmi'
@@ -179,7 +179,7 @@
prime()
return
return
-
+*/
/obj/item/weapon/storage/beakerbox
name = "Beaker Box"
icon_state = "beaker"
diff --git a/code/game/machinery/camera.dm b/code/game/machinery/camera.dm
index 10d4862a515..90db45601cb 100644
--- a/code/game/machinery/camera.dm
+++ b/code/game/machinery/camera.dm
@@ -285,7 +285,7 @@
else
user << "\blue Dismantling camera..."
if(do_after(user, 20))
- var/obj/item/weapon/chem_grenade/case = new /obj/item/weapon/chem_grenade(src.loc)
+ var/obj/item/weapon/grenade/chem_grenade/case = new /obj/item/weapon/grenade/chem_grenade(src.loc)
case.name = "Camera Assembly"
case.icon = 'monitors.dmi'
//JESUS WHAT THE FUCK EVERYTHING TO DO WITH CAMERAS IS TERRIBLE FUCK
@@ -314,7 +314,7 @@
playsound(loc, 'blade1.ogg', 50, 1)
playsound(loc, "sparks", 50, 1)
- var/obj/item/weapon/chem_grenade/case = new /obj/item/weapon/chem_grenade(loc)
+ var/obj/item/weapon/grenade/chem_grenade/case = new /obj/item/weapon/grenade/chem_grenade(loc)
case.name = "Camera Assembly"
case.icon = 'monitors.dmi'
case.icon_state = "cameracase"
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 84c939ad5c0..2f5ec34b07b 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -131,7 +131,7 @@
occupant:UI = UI // set interface preference
ghost.client.mob = src.occupant
-
+ src.occupant.attack_log |= ghost.attack_log //THE LEGACY MUST LIVE ON
src.occupant.hud_used = new/obj/hud( src.occupant )
// probably redundant because previous line calls mob/Login() which does this line of code
// but until this is proven useless keep it for safety - Doohl
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index ded641af19f..46eb906f82b 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -155,6 +155,9 @@
src.occupant.reagents.trans_to (newmeat, round (sourcetotalreagents / totalslabs, 1)) // Transfer all the reagents from the
allmeat[i] = newmeat
+ src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by [user]/[user.ckey]" //One shall not simply gib a mob unnoticed!
+ user.attack_log += "\[[time_stamp()]\] Gibbed [src.occupant]/[src.occupant.ckey]"
+ log_attack("\[[time_stamp()]\] [user]/[user.ckey] gibbed [src.occupant]/[src.occupant.ckey]")
src.occupant.death(1)
src.occupant.ghostize()
del(src.occupant)
diff --git a/code/game/machinery/morgue.dm b/code/game/machinery/morgue.dm
index 692888dcb36..b9163171b59 100644
--- a/code/game/machinery/morgue.dm
+++ b/code/game/machinery/morgue.dm
@@ -275,6 +275,9 @@
for (var/obj/item/W in M)
if (prob(10))
W.loc = src
+ M.attack_log += "\[[time_stamp()]\] Has been cremated by [user]/[user.ckey]" //One shall not simply cremate a mob unnoticed!
+ user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]"
+ log_attack("\[[time_stamp()]\] [user]/[user.ckey] gibbed [M]/[M.ckey]")
M.death(1)
M.ghostize()
del(M)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index dc8e9c0ddcf..79d65dc5cb0 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -21,7 +21,7 @@
//Quickfix for hiding nuke disks and people getting to centcomm until I can get the attack_hand() stuff to incorperate this.
for(var/obj/O in user.get_contents())
- if(istype(O, /obj/item/weapon/disk/nuclear) || istype(O, /obj/item/device/radio/beacon))
+ if(istype(O, /obj/item/weapon/disk/nuclear) || istype(O, /obj/item/device/radio/beacon) || istype(O, /obj/item/weapon/storage/backpack/holding))
user << "\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through."
return
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index b05365354e0..49d835deab4 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -303,7 +303,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
name = "SGL-6 Grenade Launcher"
icon_state = "mecha_grenadelnchr"
- projectile = /obj/item/weapon/flashbang
+ projectile = /obj/item/weapon/grenade/flashbang
fire_sound = 'bang.ogg'
projectiles = 6
missile_speed = 1.5
@@ -314,7 +314,7 @@
action(target)
if(!action_checks(target)) return
set_ready_state(0)
- var/obj/item/weapon/flashbang/F = new projectile(chassis.loc)
+ var/obj/item/weapon/grenade/flashbang/F = new projectile(chassis.loc)
playsound(chassis, fire_sound, 50, 1)
F.throw_at(target, missile_range, missile_speed)
projectiles--
@@ -326,7 +326,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve
name = "SOP-6 Grenade Launcher"
- projectile = /obj/item/weapon/flashbang/clusterbang
+ projectile = /obj/item/weapon/grenade/flashbang/clusterbang
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar
name = "Banana Mortar"
diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm
index 9a5a252aa90..5885ba13788 100644
--- a/code/game/objects/closets/secure/security.dm
+++ b/code/game/objects/closets/secure/security.dm
@@ -138,7 +138,7 @@
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/device/flash(src)
new /obj/item/weapon/pepperspray(src)
- new /obj/item/weapon/flashbang(src)
+ new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/melee/baton(src)
new /obj/item/weapon/gun/energy/taser(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
diff --git a/code/game/objects/grenades/chem_grenade.dm b/code/game/objects/grenades/chem_grenade.dm
new file mode 100644
index 00000000000..8624fbb4a53
--- /dev/null
+++ b/code/game/objects/grenades/chem_grenade.dm
@@ -0,0 +1,265 @@
+/obj/item/weapon/grenade/chem_grenade
+ name = "Grenade Casing"
+ icon_state = "chemg"
+ item_state = "flashbang"
+ w_class = 2.0
+ force = 2.0
+ var/stage = 0
+ var/state = 0
+ var/path = 0
+ var/motion = 0
+ var/direct = "SOUTH"
+ var/obj/item/weapon/circuitboard/circuit = null
+ var/list/beakers = new/list()
+ var/list/allowed_containers = list("/obj/item/weapon/reagent_containers/glass/beaker", "/obj/item/weapon/reagent_containers/glass/dispenser", "/obj/item/weapon/reagent_containers/glass/bottle")
+ var/affected_area = 3
+ New()
+ var/datum/reagents/R = new/datum/reagents(1000)
+ reagents = R
+ R.my_atom = src
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)//TODO:Have grenades use the new assembly things
+
+ if(istype(W,/obj/item/device/assembly_holder) && !stage && path != 2)
+ path = 1
+ user << "\blue You add [W] to the metal casing."
+ playsound(src.loc, 'Screwdriver2.ogg', 25, -3)
+ del(W) //Okay so we're not really adding anything here. cheating.
+ icon_state = initial(icon_state) +"_ass"
+ name = "unsecured grenade"
+ stage = 1
+ else if(istype(W,/obj/item/weapon/screwdriver) && stage == 1 && path != 2)
+ path = 1
+ if(beakers.len)
+ user << "\blue You lock the assembly."
+ playsound(src.loc, 'Screwdriver.ogg', 25, -3)
+ name = "grenade"
+ icon_state = initial(icon_state) +"_locked"
+ stage = 2
+ else
+ user << "\red You need to add at least one beaker before locking the assembly."
+ else if ((istype(W,/obj/item/weapon/reagent_containers/glass/beaker)||istype(W,/obj/item/weapon/reagent_containers/glass/dispenser)||istype(W,/obj/item/weapon/reagent_containers/glass/bottle)) && stage == 1 && path != 2)
+ path = 1
+ if(beakers.len == 2)
+ user << "\red The grenade can not hold more containers."
+ return
+ else
+ if(W.reagents.total_volume)
+ user << "\blue You add \the [W] to the assembly."
+ user.drop_item()
+ W.loc = src
+ beakers += W
+ else
+ user << "\red \the [W] is empty."
+
+ else if(path != 1)
+ if(!istype(src.loc,/turf))
+ user << "\red You need to put the canister on the ground to do that!"
+ else
+ switch(state)
+ if(0)
+ if(istype(W, /obj/item/weapon/wrench))
+ playsound(src.loc, 'Ratchet.ogg', 50, 1)
+ if(do_after(user, 20))
+ user << "\blue You wrench the canister in place."
+ src.name = "Camera Assembly"
+ src.anchored = 1
+ src.state = 1
+ path = 2
+ if(1)
+ if(istype(W, /obj/item/weapon/wrench))
+ playsound(src.loc, 'Ratchet.ogg', 50, 1)
+ if(do_after(user, 20))
+ user << "\blue You unfasten the canister."
+ src.name = "Grenade Casing"
+ src.anchored = 0
+ src.state = 0
+ path = 0
+ if(istype(W, /obj/item/device/multitool))
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+ user << "\blue You place the electronics inside the canister."
+ src.circuit = W
+ user.drop_item()
+ W.loc = src
+ if(istype(W, /obj/item/weapon/screwdriver) && circuit)
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ user << "\blue You screw the circuitry into place."
+ src.state = 2
+ if(istype(W, /obj/item/weapon/crowbar) && circuit)
+ playsound(src.loc, 'Crowbar.ogg', 50, 1)
+ user << "\blue You remove the circuitry."
+ src.state = 1
+ circuit.loc = src.loc
+ src.circuit = null
+ if(2)
+ if(istype(W, /obj/item/weapon/screwdriver) && circuit)
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ user << "\blue You unfasten the circuitry."
+ src.state = 1
+ if(istype(W, /obj/item/weapon/cable_coil))
+ if(W:amount >= 1)
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+ if(do_after(user, 20))
+ W:amount -= 1
+ if(!W:amount) del(W)
+ user << "\blue You add cabling to the canister."
+ src.state = 3
+ if(3)
+ if(istype(W, /obj/item/weapon/wirecutters))
+ playsound(src.loc, 'wirecutter.ogg', 50, 1)
+ user << "\blue You remove the cabling."
+ src.state = 2
+ var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
+ A.amount = 1
+ if(issignaler(W))
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+ user << "\blue You attach the wireless signaller unit to the circutry."
+ user.drop_item()
+ W.loc = src
+ src.state = 4
+ if(4)
+ if(istype(W, /obj/item/weapon/crowbar) && !motion)
+ playsound(src.loc, 'Crowbar.ogg', 50, 1)
+ user << "\blue You remove the remote signalling device."
+ src.state = 3
+ new /obj/item/device/assembly/signaler( src.loc, 1 )
+ if(isprox(W) && motion == 0)
+// if(W:amount >= 1)
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+// W:use(1)
+ user << "\blue You attach the proximity sensor."
+ user.drop_item()
+ W.loc = src
+ motion = 1
+ if(istype(W, /obj/item/weapon/crowbar) && motion)
+ playsound(src.loc, 'Crowbar.ogg', 50, 1)
+ user << "\blue You remove the proximity sensor."
+ new /obj/item/device/assembly/prox_sensor( src.loc, 1 )
+ motion = 0
+ if(istype(W, /obj/item/stack/sheet/glass))
+ if(W:amount >= 1)
+ playsound(src.loc, 'Deconstruct.ogg', 50, 1)
+ if(do_after(user, 20))
+ W:use(1)
+ user << "\blue You put in the glass lens."
+ src.state = 5
+ if(5)
+ if(istype(W, /obj/item/weapon/crowbar))
+ playsound(src.loc, 'Crowbar.ogg', 50, 1)
+ user << "\blue You remove the glass lens."
+ src.state = 4
+ new /obj/item/stack/sheet/glass( src.loc, 2 )
+ if(istype(W, /obj/item/weapon/screwdriver))
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ user << "\blue You connect the lense."
+ var/B
+ if(motion == 1)
+ B = new /obj/machinery/camera/motion( src.loc )
+ else
+ B = new /obj/machinery/camera( src.loc )
+ B:network = "SS13"
+ B:network = input(usr, "Which network would you like to connect this camera to?", "Set Network", "SS13")
+ direct = input(user, "Direction?", "Assembling Camera", null) in list( "NORTH", "EAST", "SOUTH", "WEST" )
+ B:dir = text2dir(direct)
+ del(src)
+
+ prime()
+ if(prob(reliability))
+ var/has_reagents = 0
+ for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
+ if(G.reagents.total_volume) has_reagents = 1
+
+ if(!has_reagents)
+ playsound(src.loc, 'Screwdriver2.ogg', 50, 1)
+ state = 0
+ return
+
+ playsound(src.loc, 'bamf.ogg', 50, 1)
+
+ for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
+ G.reagents.trans_to(src, G.reagents.total_volume)
+
+ if(src.reagents.total_volume) //The possible reactions didnt use up all reagents.
+ var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
+ steam.set_up(10, 0, get_turf(src))
+ steam.attach(src)
+ steam.start()
+
+ for(var/atom/A in view(affected_area, src.loc))
+ if( A == src ) continue
+ src.reagents.reaction(A, 1, 10)
+
+
+ invisibility = 100 //Why am i doing this?
+ spawn(50) //To make sure all reagents can work
+ del(src) //correctly before deleting the grenade.
+ else
+ icon_state = initial(icon_state) + "_locked"
+ crit_fail = 1
+ for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
+ G.loc = get_turf(src.loc)
+
+/obj/item/weapon/grenade/chem_grenade/large
+ name = "Large Chem Grenade"
+ desc = "An oversized grenade that affects a larger area."
+ icon_state = "large_grenade"
+ allowed_containers = list("/obj/item/weapon/reagent_containers/glass")
+ origin_tech = "combat=3;materials=3"
+ affected_area = 4
+
+/obj/item/weapon/grenade/chem_grenade/metalfoam
+ name = "Metal-Foam Grenade"
+ desc = "Used for emergency sealing of air breaches."
+ path = 1
+ stage = 2
+
+ New()
+ ..()
+ var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
+ var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
+
+ B1.reagents.add_reagent("aluminum", 30)
+ B2.reagents.add_reagent("foaming_agent", 10)
+ B2.reagents.add_reagent("pacid", 10)
+
+ beakers += B1
+ beakers += B2
+ icon_state = "grenade"
+
+/obj/item/weapon/grenade/chem_grenade/incendiary
+ name = "Incendiary Grenade"
+ desc = "Used for clearing rooms of living things."
+ path = 1
+ stage = 2
+
+ New()
+ ..()
+ var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
+ var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
+
+ B1.reagents.add_reagent("aluminum", 25)
+ B2.reagents.add_reagent("plasma", 25)
+ B2.reagents.add_reagent("acid", 25)
+
+ beakers += B1
+ beakers += B2
+ icon_state = "grenade"
+
+/obj/item/weapon/grenade/chem_grenade/cleaner
+ name = "Cleaner Grenade"
+ desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
+ stage = 2
+ path = 1
+
+ New()
+ ..()
+ var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
+ var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
+
+ B1.reagents.add_reagent("fluorosurfactant", 40)
+ B2.reagents.add_reagent("water", 40)
+ B2.reagents.add_reagent("cleaner", 10)
+
+ beakers += B1
+ beakers += B2
+ icon_state = "grenade"
diff --git a/code/game/objects/grenades/emgrenade.dm b/code/game/objects/grenades/emgrenade.dm
new file mode 100644
index 00000000000..3454f9b9fa9
--- /dev/null
+++ b/code/game/objects/grenades/emgrenade.dm
@@ -0,0 +1,11 @@
+/obj/item/weapon/grenade/empgrenade
+ name = "emp grenade"
+ icon_state = "emp"
+ item_state = "emp"
+ origin_tech = "materials=2;magnets=3"
+
+ prime()
+ ..()
+ if(empulse(src, 5, 7))
+ del(src)
+ return
diff --git a/code/game/objects/grenades/flashbang.dm b/code/game/objects/grenades/flashbang.dm
new file mode 100644
index 00000000000..f035327e919
--- /dev/null
+++ b/code/game/objects/grenades/flashbang.dm
@@ -0,0 +1,147 @@
+/obj/item/weapon/grenade/flashbang
+ name = "flashbang"
+ icon_state = "flashbang"
+ item_state = "flashbang"
+ origin_tech = "materials=2;combat=1"
+ var/banglet = 0
+
+ prime()
+ ..()
+ for(var/obj/structure/closet/L in view(get_turf(src), null))
+ if(locate(/mob/living/carbon/, L))
+ for(var/mob/living/carbon/M in L)
+ bang(get_turf(src), M)
+
+
+ for(var/mob/living/carbon/M in viewers(get_turf(src), null))
+ bang(get_turf(src), M)
+
+ for(var/obj/effect/blob/B in view(8,get_turf(src))) //Blob damage here
+ var/damage = round(30/(get_dist(B,get_turf(src))+1))
+ B.health -= damage
+ B.update_icon()
+ del(src)
+ return
+
+ proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged.
+ if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging
+ for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions.
+ S.active = 0 // -- Polymorph
+ S.icon_state = "shield0"
+
+ M << "\red BANG"
+ playsound(src.loc, 'bang.ogg', 25, 1)
+
+//Checking for protections
+ var/eye_safety = 0
+ var/ear_safety = 0
+ if(iscarbon(M))
+ eye_safety = M.eyecheck()
+ if(ishuman(M))
+ if(istype(M:ears, /obj/item/clothing/ears/earmuffs))
+ ear_safety += 2
+ if(HULK in M.mutations)
+ ear_safety += 1
+ if(istype(M:head, /obj/item/clothing/head/helmet))
+ ear_safety += 1
+
+//Flashing everyone
+ if(eye_safety < 1)
+ flick("e_flash", M.flash)
+ M.eye_stat += rand(1, 3)
+ M.Stun(2)
+ M.Weaken(10)
+
+
+
+//Now applying sound
+ if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M))
+ if(ear_safety > 0)
+ M.Stun(2)
+ M.Weaken(1)
+ else
+ M.Stun(10)
+ M.Weaken(3)
+ if ((prob(14) || (M == src.loc && prob(70))))
+ M.ear_damage += rand(1, 10)
+ else
+ M.ear_damage += rand(0, 5)
+ M.ear_deaf = max(M.ear_deaf,15)
+
+ else if(get_dist(M, T) <= 5)
+ if(!ear_safety)
+ M.Stun(8)
+ M.ear_damage += rand(0, 3)
+ M.ear_deaf = max(M.ear_deaf,10)
+
+ else if(!ear_safety)
+ M.Stun(4)
+ M.ear_damage += rand(0, 1)
+ M.ear_deaf = max(M.ear_deaf,5)
+
+//This really should be in mob not every check
+ if (M.eye_stat >= 20)
+ M << "\red Your eyes start to burn badly!"
+ M.disabilities |= NEARSIGHTED
+ if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
+ if (prob(M.eye_stat - 20 + 1))
+ M << "\red You can't see anything!"
+ M.sdisabilities |= BLIND
+ if (M.ear_damage >= 15)
+ M << "\red Your ears start to ring badly!"
+ if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
+ if (prob(M.ear_damage - 10 + 5))
+ M << "\red You can't hear anything!"
+ M.sdisabilities |= DEAF
+ else
+ if (M.ear_damage >= 5)
+ M << "\red Your ears start to ring!"
+ M.update_icons()
+
+
+/obj/item/weapon/grenade/flashbang/clusterbang
+ desc = "Use of this weapon may constiute a war crime in your area, consult your local captain."
+ name = "clusterbang"
+ icon = 'grenade.dmi'
+ icon_state = "clusterbang"
+ var/child = 0
+
+ prime()
+ //world << "Armed!"
+ var/numspawned = rand(4,8)
+ //world << numspawned
+ var/again = 0
+ if(!child)
+ for(var/more = numspawned,more > 0,more--)
+ if(prob(35))
+ again++
+ numspawned --
+
+ for(,numspawned > 0, numspawned--)
+ //world << "Spawned Flashbang!"
+ spawn(0)
+ var/obj/item/weapon/grenade/flashbang/F = new /obj/item/weapon/grenade/flashbang(src)
+ F.loc = src.loc
+ F.icon_state = "flashbang_active"
+ playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
+ F.active = 1
+ F.banglet = 1
+ var/stepdist = rand(1,3)
+ walk_away(F,src,stepdist)
+ var/dettime = rand(15,60)
+ spawn(dettime)
+ F.prime()
+
+ for(,again > 0, again--)
+ //world << "Spawned CFlashbang!"
+ spawn(0)
+ var/obj/item/weapon/grenade/flashbang/clusterbang/F = new /obj/item/weapon/grenade/flashbang/clusterbang(src)
+ F.loc = src.loc
+ F.active = 1
+ F.child = 1
+ F.icon_state = "clusterbang_active"
+ var/stepdist = rand(1,4)
+ walk_away(F,src,stepdist)
+ spawn(det_time)
+ F.prime()
+ return
diff --git a/code/game/objects/grenades/grenade.dm b/code/game/objects/grenades/grenade.dm
new file mode 100644
index 00000000000..1c74e265f78
--- /dev/null
+++ b/code/game/objects/grenades/grenade.dm
@@ -0,0 +1,87 @@
+/obj/item/weapon/grenade
+ var/det_time = 50
+ desc = "It is set to detonate in 5 seconds."
+ name = "grenade"
+ w_class = 2.0
+ icon = 'grenade.dmi'
+ icon_state = "grenade"
+ item_state = "grenade"
+ throw_speed = 4
+ throw_range = 20
+ flags = FPRINT | TABLEPASS | CONDUCT
+ slot_flags = SLOT_BELT
+ var/active = 0
+
+ proc/clown_check(var/mob/living/user)
+ if((CLUMSY in user.mutations) && prob(50))
+ user << "\red Huh? How does this thing work?!"
+ src.active = 1
+ src.icon_state = initial(icon_state) + "_active"
+ playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(5)
+ src.prime()
+ return 0
+ return 1
+
+ afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
+ if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container
+ if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..()
+ if((user.get_active_hand() == src) && (!active) && (clown_check(user)) && target.loc != src.loc)
+ user << "\red You prime the [name]! [det_time/10] seconds!"
+ src.active = 1
+ src.icon_state = initial(icon_state) + "_active"
+ playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(src.det_time)
+ src.prime()
+ return
+ user.dir = get_dir(user, target)
+ user.drop_item()
+ var/t = (isturf(target) ? target : target.loc)
+ walk_towards(src, t, 3)
+ return
+
+
+ attack_self(mob/user as mob)
+ if(!active)
+ if(clown_check(user))
+ user << "\red You prime the [name]! [det_time/10] seconds!"
+ src.active = 1
+ src.icon_state = initial(icon_state) + "_active"
+ add_fingerprint(user)
+ spawn(src.det_time)
+ src.prime()
+ return
+ return
+
+
+ proc/prime()
+ playsound(src.loc, 'Welder2.ogg', 25, 1)
+ var/turf/T = get_turf(src)
+ if(T)
+ T.hotspot_expose(700,125)
+
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (isscrewdriver(W))
+ switch(src.det_time)
+ if ("1")
+ src.det_time = 30
+ user.show_message("\blue You set the [name] for 3 second detonation time.")
+ if ("30")
+ src.det_time = 100
+ user.show_message("\blue You set the [name] for 10 second detonation time.")
+ if ("100")
+ src.det_time = 1
+ user.show_message("\blue You set the [name] for instant detonation.")
+ src.add_fingerprint(user)
+ src.desc = "It is set to detonate [det_time-1 ? "in [det_time/10] seconds." : "instantly."]"
+ ..()
+ return
+
+ attack_hand()
+ walk(src, null, null)
+ ..()
+ return
+
+ attack_paw(mob/user as mob)
+ return src.attack_hand(user)
diff --git a/code/game/objects/grenades/mustardbomb.dm b/code/game/objects/grenades/mustardbomb.dm
new file mode 100644
index 00000000000..8fbe7f933a6
--- /dev/null
+++ b/code/game/objects/grenades/mustardbomb.dm
@@ -0,0 +1,32 @@
+/obj/item/weapon/grenade/mustardbomb
+ desc = "It is set to detonate in 4 seconds."
+ name = "mustard gas bomb"
+ icon = 'grenade.dmi'
+ icon_state = "flashbang"
+ det_time = 40.0
+ item_state = "flashbang"
+ var/datum/effect/effect/system/mustard_gas_spread/mustard_gas
+
+ New()
+ ..()
+ src.mustard_gas = new /datum/effect/effect/system/mustard_gas_spread
+ src.mustard_gas.attach(src)
+ src.mustard_gas.set_up(5, 0, usr.loc)
+
+ prime()
+ playsound(src.loc, 'smoke.ogg', 50, 1, -3)
+ spawn(0)
+ src.mustard_gas.start()
+ sleep(10)
+ src.mustard_gas.start()
+ sleep(10)
+ src.mustard_gas.start()
+ sleep(10)
+ src.mustard_gas.start()
+ for(var/obj/effect/blob/B in view(8,src))
+ var/damage = round(30/(get_dist(B,src)+1))
+ B.health -= damage
+ B.update_icon()
+ sleep(100)
+ del(src)
+ return
diff --git a/code/game/objects/grenades/smokebomb.dm b/code/game/objects/grenades/smokebomb.dm
new file mode 100644
index 00000000000..44a3460f248
--- /dev/null
+++ b/code/game/objects/grenades/smokebomb.dm
@@ -0,0 +1,35 @@
+/obj/item/weapon/grenade/smokebomb
+ desc = "It is set to detonate in 2 seconds."
+ name = "smoke bomb"
+ icon = 'grenade.dmi'
+ icon_state = "flashbang"
+ det_time = 20
+ item_state = "flashbang"
+ flags = FPRINT | TABLEPASS | USEDELAY
+ slot_flags = SLOT_BELT
+ var/datum/effect/effect/system/bad_smoke_spread/smoke
+
+ New()
+ ..()
+ src.smoke = new /datum/effect/effect/system/bad_smoke_spread
+ src.smoke.attach(src)
+ src.smoke.set_up(10, 0, usr.loc)
+
+ prime()
+ playsound(src.loc, 'smoke.ogg', 50, 1, -3)
+ spawn(0)
+ src.smoke.start()
+ sleep(10)
+ src.smoke.start()
+ sleep(10)
+ src.smoke.start()
+ sleep(10)
+ src.smoke.start()
+
+ for(var/obj/effect/blob/B in view(8,src))
+ var/damage = round(30/(get_dist(B,src)+1))
+ B.health -= damage
+ B.update_icon()
+ sleep(80)
+ del(src)
+ return
diff --git a/code/game/objects/grenades/spawnergrenade.dm b/code/game/objects/grenades/spawnergrenade.dm
new file mode 100644
index 00000000000..fde1d9343b0
--- /dev/null
+++ b/code/game/objects/grenades/spawnergrenade.dm
@@ -0,0 +1,58 @@
+/obj/item/weapon/grenade/spawnergrenade
+ desc = "It is set to detonate in 5 seconds. It will unleash unleash an unspecified anomaly into the vicinity."
+ name = "delivery grenade"
+ icon = 'grenade.dmi'
+ icon_state = "delivery"
+ item_state = "flashbang"
+ origin_tech = "materials=3;magnets=4"
+ var/banglet = 0
+ var/spawner_type = null // must be an object path
+ var/deliveryamt = 1 // amount of type to deliver
+
+ prime() // Prime now just handles the two loops that query for people in lockers and people who can see it.
+
+ if(spawner_type && deliveryamt)
+ // Make a quick flash
+ var/turf/T = get_turf(src)
+ playsound(T, 'phasein.ogg', 100, 1)
+ for(var/mob/living/carbon/human/M in viewers(T, null))
+ if(M:eyecheck() <= 0)
+ flick("e_flash", M.flash) // flash dose faggots
+
+ for(var/i=1, i<=deliveryamt, i++)
+ var/atom/movable/x = new spawner_type
+ x.loc = T
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(x, pick(NORTH,SOUTH,EAST,WEST))
+
+ // Spawn some hostile syndicate critters
+ if(istype(x, /obj/effect/critter))
+ var/obj/effect/critter/C = x
+
+ C.atkcarbon = 1
+ C.atksilicon = 1
+ C.atkmech = 0
+ C.atksynd = 0
+ C.aggressive = 1
+
+ del(src)
+ return
+
+/obj/item/weapon/grenade/spawnergrenade/manhacks
+ name = "manhack delivery grenade"
+ spawner_type = /obj/effect/critter/manhack
+ deliveryamt = 5
+ origin_tech = "materials=3;magnets=4;syndicate=4"
+
+/obj/item/weapon/grenade/spawnergrenade/spesscarp
+ name = "carp delivery grenade"
+ spawner_type = /obj/effect/critter/spesscarp
+ deliveryamt = 5
+ origin_tech = "materials=3;magnets=4;syndicate=4"
+
+/obj/item/weapon/grenade/spawnergrenade/elitespesscarp
+ name = "elite carp delivery grenade"
+ spawner_type = /obj/effect/critter/spesscarp/elite
+ deliveryamt = 2
+ origin_tech = "materials=3;magnets=4;syndicate=4"
diff --git a/code/game/objects/items/robot_upgrades.dm b/code/game/objects/items/robot_upgrades.dm
index e82f705a32a..f41fdc46d0c 100644
--- a/code/game/objects/items/robot_upgrades.dm
+++ b/code/game/objects/items/robot_upgrades.dm
@@ -12,8 +12,11 @@
var/require_module = 0
var/installed = 0
-/obj/item/borg/upgrade/proc/action()
- return
+/obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R)
+ if(R.Stat() == 2)
+ usr << "/red The [src] will not function on a deseased cyborg."
+ return 1
+ return 0
/obj/item/borg/upgrade/reset/
@@ -23,6 +26,7 @@
require_module = 1
/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
R.uneq_all()
R.hands.icon_state = "nomod"
R.icon_state = "robot"
@@ -66,6 +70,8 @@
require_module = 1
/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
if(R.speed == -1)
return 0
@@ -82,6 +88,8 @@
/obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
if(!istype(R.module, /obj/item/weapon/robot_module/security))
R << "Upgrade mounting error! No suitable hardpoint detected!"
usr << "There's no mounting point for the module!"
@@ -114,6 +122,8 @@
require_module = 1
/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R)
+ if(..()) return 0
+
if(!istype(R.module, /obj/item/weapon/robot_module/miner))
R << "Upgrade mounting error! No suitable hardpoint detected!"
usr << "There's no mounting point for the module!"
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 70ba63593fb..f0dfcf80c31 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -402,7 +402,7 @@ ZIPPO
New()
..()
flags |= NOREACT
- create_reagents(15)//so people can inject cigarettes without opening a packet
+ create_reagents(15*cigcount)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one
Del()
..()
@@ -420,10 +420,11 @@ ZIPPO
user << "\red You're out of cigs, shit! How you gonna get through the rest of the day..."
return
else
- cigcount--
var/obj/item/clothing/mask/cigarette/W = new /obj/item/clothing/mask/cigarette(user)
- reagents.trans_to(W, reagents.total_volume)
+ reagents.trans_to(W, (reagents.total_volume/cigcount))
user.put_in_active_hand(W)
+ src.reagents.maximum_volume = 15*cigcount
+ cigcount--
else
return ..()
update_icon()
diff --git a/code/game/objects/secstorage/ssafe.dm b/code/game/objects/secstorage/ssafe.dm
index b2882454908..081ea875a9e 100644
--- a/code/game/objects/secstorage/ssafe.dm
+++ b/code/game/objects/secstorage/ssafe.dm
@@ -19,7 +19,7 @@
/obj/item/weapon/secstorage/ssafe/HoS/New()
..()
- new /obj/item/weapon/storage/lockbox/clusterbang(src)
+ //new /obj/item/weapon/storage/lockbox/clusterbang(src) This item is currently broken... and probably shouldnt exist to begin with (even though it's cool)
/obj/item/weapon/secstorage/ssafe/attack_hand(mob/user as mob)
return attack_self(user)
\ No newline at end of file
diff --git a/code/game/objects/stacks/metal.dm b/code/game/objects/stacks/metal.dm
index c226d636e90..36a2b09b673 100644
--- a/code/game/objects/stacks/metal.dm
+++ b/code/game/objects/stacks/metal.dm
@@ -87,7 +87,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
- new/datum/stack_recipe("grenade casing", /obj/item/weapon/chem_grenade), \
+ new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \
new/datum/stack_recipe("small light fixture frame", /obj/item/light_fixture_frame/small, 1), \
null, \
diff --git a/code/game/objects/storage/kit.dm b/code/game/objects/storage/kit.dm
index 15bb571f42d..6aa4b0bd250 100644
--- a/code/game/objects/storage/kit.dm
+++ b/code/game/objects/storage/kit.dm
@@ -24,23 +24,23 @@
/obj/item/weapon/storage/flashbang_kit/New()
- new /obj/item/weapon/flashbang(src)
- new /obj/item/weapon/flashbang(src)
- new /obj/item/weapon/flashbang(src)
- new /obj/item/weapon/flashbang(src)
- new /obj/item/weapon/flashbang(src)
- new /obj/item/weapon/flashbang(src)
- new /obj/item/weapon/flashbang(src)
+ new /obj/item/weapon/grenade/flashbang(src)
+ new /obj/item/weapon/grenade/flashbang(src)
+ new /obj/item/weapon/grenade/flashbang(src)
+ new /obj/item/weapon/grenade/flashbang(src)
+ new /obj/item/weapon/grenade/flashbang(src)
+ new /obj/item/weapon/grenade/flashbang(src)
+ new /obj/item/weapon/grenade/flashbang(src)
..()
return
/obj/item/weapon/storage/emp_kit/New()
- new /obj/item/weapon/empgrenade(src)
- new /obj/item/weapon/empgrenade(src)
- new /obj/item/weapon/empgrenade(src)
- new /obj/item/weapon/empgrenade(src)
- new /obj/item/weapon/empgrenade(src)
+ new /obj/item/weapon/grenade/empgrenade(src)
+ new /obj/item/weapon/grenade/empgrenade(src)
+ new /obj/item/weapon/grenade/empgrenade(src)
+ new /obj/item/weapon/grenade/empgrenade(src)
+ new /obj/item/weapon/grenade/empgrenade(src)
..()
return
diff --git a/code/game/objects/storage/lockbox.dm b/code/game/objects/storage/lockbox.dm
index 5d0bb639098..3b83ab90acd 100644
--- a/code/game/objects/storage/lockbox.dm
+++ b/code/game/objects/storage/lockbox.dm
@@ -85,4 +85,4 @@
New()
..()
- new /obj/item/weapon/flashbang/clusterbang(src)
+ new /obj/item/weapon/grenade/flashbang/clusterbang(src)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index c968b08209c..cde750815ed 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -485,7 +485,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), M.slot_r_hand)
M.equip_if_possible(new /obj/item/weapon/kitchenknife(M), M.slot_l_hand)
- M.equip_if_possible(new /obj/item/weapon/smokebomb(M), M.slot_r_store)
+ M.equip_if_possible(new /obj/item/weapon/grenade/smokebomb(M), M.slot_r_store)
if ("tournament gangster") //gangster are supposed to fight each other. --rastaf0
@@ -525,8 +525,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
bucket.reagents.add_reagent("water", 70)
M.equip_if_possible(bucket, M.slot_l_hand)
- M.equip_if_possible(new /obj/item/weapon/chem_grenade/cleaner(M), M.slot_r_store)
- M.equip_if_possible(new /obj/item/weapon/chem_grenade/cleaner(M), M.slot_l_store)
+ M.equip_if_possible(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), M.slot_r_store)
+ M.equip_if_possible(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), M.slot_l_store)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
M.equip_if_possible(new /obj/item/stack/tile/plasteel(M), M.slot_in_backpack)
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index 1945d3d05a0..5647cd1c55d 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -171,7 +171,7 @@ var/global/sent_strike_team = 0
equip_if_possible(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/melee/energy/sword(src), slot_l_store)
- equip_if_possible(new /obj/item/weapon/flashbang(src), slot_r_store)
+ equip_if_possible(new /obj/item/weapon/grenade/flashbang(src), slot_r_store)
equip_if_possible(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
equip_if_possible(new /obj/item/weapon/gun/projectile/mateba(src), slot_belt)
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index 524288de066..ed60770de6b 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -174,7 +174,7 @@ var/global/sent_syndicate_strike_team = 0
equip_if_possible(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack)
equip_if_possible(new /obj/item/weapon/melee/energy/sword(src), slot_l_store)
- equip_if_possible(new /obj/item/weapon/empgrenade(src), slot_r_store)
+ equip_if_possible(new /obj/item/weapon/grenade/empgrenade(src), slot_r_store)
equip_if_possible(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
equip_if_possible(new /obj/item/weapon/gun/projectile/silenced(src), slot_belt)
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 3d1469516f5..c16132329f9 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -4,7 +4,7 @@
///////////////////////////////Grenades
//Includes changes by Mord_Sith to allow for buildable cameras
-/obj/item/weapon/chem_grenade
+/*/obj/item/weapon/chem_grenade //Commenting this out in case someone wants to revert the change or just doesn't like the move.
name = "Grenade Casing"
icon_state = "chemg"
icon = 'chemical.dmi'
@@ -176,7 +176,7 @@
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
if (istype(target, /obj/item/weapon/storage)) return ..()
if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..()
- if (!src.state && stage == 2 && !crit_fail)
+ if (!src.state && stage == 2 && !crit_fail && src.loc != target.loc)
user << "\red You prime the grenade! 3 seconds!"
message_admins("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
log_game("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
@@ -212,7 +212,7 @@
proc
explode()
- if(reliability)
+ if(prob(reliability))
var/has_reagents = 0
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
if(G.reagents.total_volume) has_reagents = 1
@@ -310,7 +310,7 @@
beakers += B1
beakers += B2
- icon_state = "chemg_locked"
+ icon_state = "chemg_locked"*/
/obj/effect/syringe_gun_dummy
name = ""
@@ -347,7 +347,7 @@
attackby(obj/item/I as obj, mob/user as mob)
- if((istype(I, /obj/item/weapon/chem_grenade)) || (istype(I, /obj/item/weapon/flashbang)) || (istype(I, /obj/item/weapon/smokebomb)) || (istype(I, /obj/item/weapon/mustardbomb)) || (istype(I, /obj/item/weapon/empgrenade)))
+ if((istype(I, /obj/item/weapon/grenade)))
if(grenades.len < max_grenades)
user.drop_item()
I.loc = src
@@ -378,112 +378,17 @@
for(var/mob/O in viewers(world.view, user))
O.show_message(text("\red [] fired a grenade!", user), 1)
user << "\red You fire the grenade launcher!"
- if (istype(grenades[1], /obj/item/weapon/chem_grenade))
- var/obj/item/weapon/chem_grenade/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- message_admins("[key_name_admin(user)] fired a chemistry grenade from a grenade launcher ([src.name]).")
- log_game("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
- F.state = 1
- F.icon_state = initial(icon_state)+"_armed"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.explode()
- else if (istype(grenades[1], /obj/item/weapon/flashbang))
- var/obj/item/weapon/flashbang/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- F.active = 1
- F.icon_state = "flashbang1"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.prime()
- else if (istype(grenades[1], /obj/item/weapon/smokebomb))
- var/obj/item/weapon/smokebomb/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- F.icon_state = "flashbang1"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.prime()
- else if (istype(grenades[1], /obj/item/weapon/mustardbomb))
- var/obj/item/weapon/mustardbomb/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- F.icon_state = "flashbang1"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.prime()
- else if (istype(grenades[1], /obj/item/weapon/empgrenade))
- var/obj/item/weapon/empgrenade/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- F.active = 1
- F.icon_state = "empar"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.prime()
- if (locate (/obj/structure/table, src.loc) || locate (/obj/item/weapon/storage, src.loc))
- return
- else
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] fired a grenade!", user), 1)
- user << "\red You fire the grenade launcher!"
- if (istype(grenades[1], /obj/item/weapon/chem_grenade))
- var/obj/item/weapon/chem_grenade/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- message_admins("[key_name_admin(user)] fired a chemistry grenade from a grenade launcher ([src.name]).")
- log_game("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
- F.state = 1
- F.icon_state = initial(icon_state)+"_armed"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.explode()
- else if (istype(grenades[1], /obj/item/weapon/flashbang))
- var/obj/item/weapon/flashbang/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- F.active = 1
- F.icon_state = "flashbang1"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.prime()
- else if (istype(grenades[1], /obj/item/weapon/smokebomb))
- var/obj/item/weapon/smokebomb/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- F.icon_state = "flashbang1"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.prime()
- else if (istype(grenades[1], /obj/item/weapon/mustardbomb))
- var/obj/item/weapon/mustardbomb/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- F.icon_state = "flashbang1"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.prime()
- else if (istype(grenades[1], /obj/item/weapon/empgrenade))
- var/obj/item/weapon/empgrenade/F = grenades[1]
- grenades -= F
- F.loc = user.loc
- F.throw_at(target, 30, 2)
- F.active = 1
- F.icon_state = "empar"
- playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
- spawn(15)
- F.prime()
+ var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta!
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
+ log_game("[key_name_admin(user)] used a grenade ([src.name]).")
+ F.active = 1
+ F.icon_state = initial(icon_state) + "_active"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
/obj/item/weapon/gun/syringe
@@ -724,7 +629,7 @@
/obj/structure/sink,
/obj/item/weapon/storage,
/obj/machinery/atmospherics/unary/cryo_cell,
- /obj/item/weapon/chem_grenade,
+ /obj/item/weapon/grenade/chem_grenade,
/obj/machinery/bot/medbot,
/obj/machinery/computer/pandemic,
/obj/item/weapon/secstorage/ssafe,
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index ccf6540413f..2f148b8aa23 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -36,6 +36,7 @@ Works together with spawning an observer, noted above.
if(client)
client.screen.len = null//Clear the hud, just to be sure.
var/mob/dead/observer/ghost = new(src,transfer_mind)//Transfer safety to observer spawning proc.
+ ghost.attack_log |= attack_log
if(transfer_mind)//When a body is destroyed.
if(mind)
mind.transfer_to(ghost)
@@ -44,7 +45,7 @@ Works together with spawning an observer, noted above.
else//Else just modify their key and connect them.
ghost.key = key
- verbs -= /mob/proc/ghost
+ verbs -= /client/proc/ghost
if (ghost.client)
ghost.client.eye = ghost
@@ -59,7 +60,7 @@ Works together with spawning an observer, noted above.
/*
This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues.
*/
-/mob/proc/ghost()
+/client/proc/ghost()
set category = "Ghost"
set name = "Ghost"
set desc = "You cannot be revived as a ghost."
@@ -68,9 +69,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
src << "Only dead people and admins get to ghost, and admins don't use this verb to ghost while alive."
return*/
if(key)
- var/mob/dead/observer/ghost = new(src)
+ var/mob/dead/observer/ghost = new(mob) //Duh.
+ ghost.loc = get_turf(mob) //This is to prevent ghosts from appearing at the arrival shuttle.
+ ghost.attack_log |= mob.attack_log //THE LEGACY MUST LIVE ON
ghost.key = key
- verbs -= /mob/proc/ghost
+ verbs -= /client/proc/ghost
if (ghost.client)
ghost.client.eye = ghost
return
@@ -145,9 +148,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
if(corpse.ajourn)
corpse.ajourn=0
+ corpse.attack_log |= attack_log //copy the ghost's attack log to the corpse. THE LEGACY MUST LIVE ON
client.mob = corpse
if (corpse.stat==2)
- verbs += /mob/proc/ghost
+ verbs += /client/proc/ghost
del(src)
/mob/dead/observer/proc/dead_tele()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm
index 3a48378c4c1..8683becafb6 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/death.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/death.dm
@@ -25,7 +25,7 @@
if (src.key)
spawn(10)
if(src.key && src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.client.verbs += /client/proc/ghost
tod = worldtime2text() //weasellos time of death patch
if (mind) mind.store_memory("Time of death: [tod]", 0)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/login.dm b/code/modules/mob/living/carbon/alien/humanoid/login.dm
index 686f36c08dc..827778a4c25 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/login.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/login.dm
@@ -7,7 +7,7 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == DEAD)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return
/*
@@ -99,7 +99,7 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
index 8e2fe185497..c90f074b0ea 100644
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ b/code/modules/mob/living/carbon/alien/larva/death.dm
@@ -23,7 +23,7 @@
if (src.client)
spawn(10)
if(src.client && src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.client.verbs += /client/proc/ghost
if(mind) // Skie - Added check that there's someone controlling the alien
tod = worldtime2text() //weasellos time of death patch
diff --git a/code/modules/mob/living/carbon/alien/larva/login.dm b/code/modules/mob/living/carbon/alien/larva/login.dm
index eeff902cce7..1278daa2bb3 100644
--- a/code/modules/mob/living/carbon/alien/larva/login.dm
+++ b/code/modules/mob/living/carbon/alien/larva/login.dm
@@ -5,6 +5,6 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 9b30ff5d76d..bea5b7b1e45 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -40,7 +40,7 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (!container || !istype(container, /obj/item/device/mmi))
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index 7564ad46272..131c0f61838 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -20,5 +20,5 @@
if (key)
spawn(50)
if(key && stat == 2)
- ghost()
+ src.client.verbs += /client/proc/ghost
return ..(gibbed)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index 81c9e00e8ea..ab29ec93bdc 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -75,8 +75,9 @@
if(!environment)
return
var/environment_heat_capacity = environment.heat_capacity()
- if(istype(loc, /turf/space))
- environment_heat_capacity = loc:heat_capacity
+ if(istype(get_turf(src), /turf/space))
+ var/turf/heat_turf = get_turf(src)
+ environment_heat_capacity = heat_turf.heat_capacity
if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10)))
var/transfer_coefficient
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 945266c4c38..9148ef5ff74 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -79,9 +79,11 @@
//This is where the suicide assemblies checks would go
if (client)
+ //world <<"Woo, there's a client!"
spawn(10)
if(client && src.stat == 2)
- verbs += /mob/proc/ghost
+ //world <<"You're sooooooo dead, let's ghost!"
+ client.verbs += /client/proc/ghost
tod = worldtime2text() //weasellos time of death patch
if(mind)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 476a08d9375..9406ca60afa 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -420,9 +420,10 @@
return
var/environment_heat_capacity = environment.heat_capacity()
var/loc_temp = T0C
- if(istype(loc, /turf/space))
- environment_heat_capacity = loc:heat_capacity
- loc_temp = 2.7
+ if(istype(get_turf(src), /turf/space))
+ var/turf/heat_turf = get_turf(src)
+ environment_heat_capacity = heat_turf.heat_capacity
+ loc_temp = heat_turf.temperature
else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
loc_temp = loc:air_contents.temperature
else
@@ -430,7 +431,7 @@
var/thermal_protection = get_thermal_protection()
- //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)]"
+ //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]"
if(stat != 2 && abs(bodytemperature - 310.15) < 50)
bodytemperature += adjust_body_temperature(bodytemperature, 310.15, thermal_protection)
@@ -591,7 +592,7 @@
proc/handle_temperature_damage(body_part, exposed_temperature, exposed_intensity)
if(nodamage)
return
-
+ //world <<"body_part = [body_part], exposed_temperature = [exposed_temperature], exposed_intensity = [exposed_intensity]"
var/discomfort = min(abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0)
if(exposed_temperature > bodytemperature)
@@ -601,6 +602,7 @@
discomfort *= 3 //I don't like magic numbers. I'll make mutantraces a datum with vars sometime later. -- Urist
else
discomfort *= 1.5 //Dangercon 2011 - Upping damage by use of magic numbers - Errorage
+ //world <<"[discomfort]"
switch(body_part)
if(HEAD)
diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm
index 07c78011584..a32d445f838 100644
--- a/code/modules/mob/living/carbon/human/login.dm
+++ b/code/modules/mob/living/carbon/human/login.dm
@@ -7,6 +7,6 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == DEAD)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return
diff --git a/code/modules/mob/living/carbon/metroid/death.dm b/code/modules/mob/living/carbon/metroid/death.dm
index 2356f425505..3241bbb94b9 100644
--- a/code/modules/mob/living/carbon/metroid/death.dm
+++ b/code/modules/mob/living/carbon/metroid/death.dm
@@ -37,6 +37,6 @@
if (src.key)
spawn(50)
if(src.key && src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.client.verbs += /client/proc/ghost
return ..(gibbed)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index 1817a5a0297..f06272a73b9 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -318,9 +318,10 @@
//var/environment_heat_capacity = environment.heat_capacity()
var/loc_temp = T0C
- if(istype(loc, /turf/space))
+ if(istype(get_turf(src), /turf/space))
//environment_heat_capacity = loc:heat_capacity
- loc_temp = 2.7
+ var/turf/heat_turf = get_turf(src)
+ loc_temp = heat_turf.temperature
else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
loc_temp = loc:air_contents.temperature
else
diff --git a/code/modules/mob/living/carbon/metroid/login.dm b/code/modules/mob/living/carbon/metroid/login.dm
index 831c6e10044..eac13bbfae6 100644
--- a/code/modules/mob/living/carbon/metroid/login.dm
+++ b/code/modules/mob/living/carbon/metroid/login.dm
@@ -7,6 +7,6 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == DEAD)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return
diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm
index a150d7c2bf5..99e99b9a5b8 100644
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ b/code/modules/mob/living/carbon/monkey/death.dm
@@ -67,6 +67,6 @@
if (src.key)
spawn(50)
if(src.key && src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.client.verbs += /client/proc/ghost
return ..(gibbed)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index ac08a337a6d..af6d64f90fa 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -330,8 +330,9 @@
if(!environment)
return
var/environment_heat_capacity = environment.heat_capacity()
- if(istype(loc, /turf/space))
- environment_heat_capacity = loc:heat_capacity
+ if(istype(get_turf(src), /turf/space))
+ var/turf/heat_turf = get_turf(src)
+ environment_heat_capacity = heat_turf.heat_capacity
if((environment.temperature > (T0C + 50)) || (environment.temperature < (T0C + 10)))
var/transfer_coefficient
diff --git a/code/modules/mob/living/carbon/monkey/login.dm b/code/modules/mob/living/carbon/monkey/login.dm
index 0a0c216129c..a1cc1b1b844 100644
--- a/code/modules/mob/living/carbon/monkey/login.dm
+++ b/code/modules/mob/living/carbon/monkey/login.dm
@@ -7,5 +7,5 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == DEAD)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 385ebfe1b6d..9bdc49ee17a 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -53,5 +53,5 @@
if (key)
spawn(50)
if(key && stat == 2)
- verbs += /mob/proc/ghost
+ client.verbs += /client/proc/ghost
return ..(gibbed)
diff --git a/code/modules/mob/living/silicon/ai/login.dm b/code/modules/mob/living/silicon/ai/login.dm
index 8e1c1c1f081..2e32d8d2a88 100644
--- a/code/modules/mob/living/silicon/ai/login.dm
+++ b/code/modules/mob/living/silicon/ai/login.dm
@@ -22,7 +22,7 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
else
for(var/obj/machinery/ai_status_display/O in world) //change status
spawn(0)
diff --git a/code/modules/mob/living/silicon/ai/logout.dm b/code/modules/mob/living/silicon/ai/logout.dm
index cf32ea51dae..13daf5d31bd 100644
--- a/code/modules/mob/living/silicon/ai/logout.dm
+++ b/code/modules/mob/living/silicon/ai/logout.dm
@@ -8,5 +8,5 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 397a403a2b8..da0b5dce4e9 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -72,5 +72,5 @@
if (src.key)
spawn(50)
if(src.key && src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return ..(gibbed)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm
index 898c15e4b14..f9439a0b14e 100644
--- a/code/modules/mob/living/silicon/robot/login.dm
+++ b/code/modules/mob/living/silicon/robot/login.dm
@@ -7,7 +7,7 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
if(src.real_name == "Cyborg")
src.ident = rand(1, 999)
src.real_name += " "
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index bf7e6cb242c..81707d7bef8 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -63,8 +63,12 @@
return //cannot shoot yourself
if(bumped) return
+ var/chance
var/forcedodge = 0 // force the projectile to pass
+ if (loc == original) chance = 95
+ else chance = 85
+ def_zone = ran_zone(def_zone, chance-(sqrt(abs(starting.x**2-loc.x**2)+abs(starting.y**2-loc.y**2)))) //Lower accurancy/longer range tradeoff.
bumped = 1
if(firer && istype(A, /mob))
diff --git a/code/unused/hivebot/death.dm b/code/unused/hivebot/death.dm
index 13bfff7264d..fda74c6c0fd 100644
--- a/code/unused/hivebot/death.dm
+++ b/code/unused/hivebot/death.dm
@@ -20,5 +20,5 @@
if (src.key)
spawn(50)
if(src.key && src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return ..(gibbed)
\ No newline at end of file
diff --git a/code/unused/hivebot/login.dm b/code/unused/hivebot/login.dm
index f03288dc95f..3a811b4c8a9 100644
--- a/code/unused/hivebot/login.dm
+++ b/code/unused/hivebot/login.dm
@@ -7,7 +7,7 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
if(src.real_name == "Hiveborg")
src.real_name += " "
src.real_name += "-[rand(1, 999)]"
diff --git a/code/unused/hivebot/mainframe.dm b/code/unused/hivebot/mainframe.dm
index 3c3b188f5b4..b8c3a993276 100644
--- a/code/unused/hivebot/mainframe.dm
+++ b/code/unused/hivebot/mainframe.dm
@@ -58,7 +58,7 @@
if (src.key)
spawn(50)
if(src.key && src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return ..(gibbed)
@@ -158,7 +158,7 @@
src.client.eye = src.loc
src.client.perspective = EYE_PERSPECTIVE
if (src.stat == 2)
- src.verbs += /mob/proc/ghost
+ src.verbs += /client/proc/ghost
return
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index 54b13331312..1fc6daeb9d5 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 07d4984b3ce..9566223bb1d 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/maps/tgstation.2.0.9.dmm b/maps/tgstation.2.0.9.dmm
index 68348b9bb2a..96a4481e0d3 100644
--- a/maps/tgstation.2.0.9.dmm
+++ b/maps/tgstation.2.0.9.dmm
@@ -3465,7 +3465,7 @@
"boG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"boH" = (/obj/structure/table,/obj/item/weapon/storage/syringes,/obj/item/clothing/glasses/science{pixel_x = 2; pixel_y = 4},/obj/item/clothing/glasses/science,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"boI" = (/obj/structure/table,/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/igniter{pixel_x = 3; pixel_y = -7},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/item/device/assembly/timer{pixel_x = -3; pixel_y = 3},/obj/machinery/camera{c_tag = "Chemistry South"; dir = 1; network = "SS13"; pixel_x = 22},/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
-"boJ" = (/obj/structure/table,/obj/item/weapon/chem_grenade,/obj/item/weapon/chem_grenade,/obj/item/weapon/chem_grenade,/obj/item/weapon/chem_grenade,/obj/item/weapon/screwdriver{pixel_y = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
+"boJ" = (/obj/structure/table,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/screwdriver{pixel_y = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"boK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"boL" = (/obj/machinery/light,/obj/structure/table,/obj/machinery/cell_charger,/obj/item/weapon/cell,/obj/item/weapon/cell,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"boM" = (/obj/structure/table,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
@@ -4070,7 +4070,7 @@
"bAn" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/janitor)
"bAo" = (/obj/structure/closet/jcloset,/turf/simulated/floor,/area/janitor)
"bAp" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/janitor)
-"bAq" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/cleaner,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/camera{c_tag = "Janitors Closet"; dir = 1},/turf/simulated/floor,/area/janitor)
+"bAq" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/cleaner,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/camera{c_tag = "Janitors Closet"; dir = 1},/turf/simulated/floor,/area/janitor)
"bAr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/janitor)
"bAs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = "90Curve"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bAt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple{color = "blue"; dir = 4; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -6979,7 +6979,7 @@
"cEk" = (/obj/effect/overlay{anchored = 1; icon = 'icons/misc/beach2.dmi'; icon_state = "palm2"; layer = 10; name = "palm tree"},/turf/unsimulated/floor{icon = 'beach.dmi'; icon_state = "sand"; name = "sand"},/area/beach)
"cEl" = (/obj/effect/overlay{anchored = 1; icon = 'icons/misc/beach2.dmi'; icon_state = "palm1"; layer = 10; name = "palm tree"},/turf/unsimulated/floor{icon = 'beach.dmi'; icon_state = "sand"; name = "sand"},/area/beach)
"cEm" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin)
-"cEn" = (/obj/structure/table{dir = 5; icon_state = "tabledir"},/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/obj/item/weapon/chem_grenade/cleaner,/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin)
+"cEn" = (/obj/structure/table{dir = 5; icon_state = "tabledir"},/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin)
"cEo" = (/obj/machinery/computer/pod{id = "thunderdomeaxe"; name = "Thunderdome Axe Supply"},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin)
"cEp" = (/obj/machinery/computer/pod{id = "thunderdomegen"; name = "Thunderdome General Supply"},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin)
"cEq" = (/obj/machinery/computer/pod{id = "thunderdomehea"; name = "Thunderdome Heavy Supply"},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin)
@@ -7636,7 +7636,7 @@
"cQR" = (/obj/structure/table,/obj/item/weapon/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor,/area/derelict/bridge)
"cQS" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/derelict/bridge)
"cQT" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/turf/simulated/floor,/area/derelict/bridge)
-"cQU" = (/obj/item/weapon/empgrenade,/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/bridge)
+"cQU" = (/obj/item/weapon/grenade/empgrenade,/obj/structure/table,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor,/area/derelict/bridge)
"cQV" = (/turf/simulated/floor/airless{icon_state = "damaged3"},/area/derelict/singularity_engine)
"cQW" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area/derelict/singularity_engine)
"cQX" = (/turf/simulated/floor/airless{icon_state = "damaged5"},/area/derelict/singularity_engine)