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)