diff --git a/code/game/objects/washing_machine.dm b/code/game/machinery/washing_machine.dm
similarity index 100%
rename from code/game/objects/washing_machine.dm
rename to code/game/machinery/washing_machine.dm
diff --git a/code/game/objects/alien/acid.dm b/code/game/objects/alien/acid.dm
deleted file mode 100644
index a1af1180019..00000000000
--- a/code/game/objects/alien/acid.dm
+++ /dev/null
@@ -1,13 +0,0 @@
-/obj/effect/alien/acid/proc/tick()
- ticks += 1
- for(var/mob/O in hearers(src, null))
- O.show_message("\green [src.target] sizzles and begins to melt under the bubbling mess of acid!", 1)
- if(prob(ticks*10))
- for(var/mob/O in hearers(src, null))
- O.show_message("\green [src.target] collapses under its own weight into a puddle of goop and undigested debris!", 1)
-// if(target.occupant) //I tried to fix mechas-with-humans-getting-deleted. Made them unacidable for now.
-// target.ex_act(1)
- del(target)
- del(src)
- return
- spawn(rand(200, 600)) tick()
diff --git a/code/game/objects/alien/defines.dm b/code/game/objects/alien/defines.dm
deleted file mode 100644
index a91346449f3..00000000000
--- a/code/game/objects/alien/defines.dm
+++ /dev/null
@@ -1,54 +0,0 @@
-/obj/effect/alien
- name = "alien thing"
- desc = "theres something alien about this"
- icon = 'icons/mob/alien.dmi'
-// unacidable = 1 //Aliens won't ment their own.
-
-/obj/effect/alien/resin
- name = "resin"
- desc = "Looks like some kind of slimy growth."
- icon_state = "resin"
-
- density = 1
- opacity = 1
- anchored = 1
- var/health = 50
- //var/mob/living/affecting = null
-
- wall
- name = "resin wall"
- desc = "Purple slime solidified into a wall."
- icon_state = "resinwall" //same as resin, but consistency ho!
-
- membrane
- name = "resin membrane"
- desc = "Purple slime just thin enough to let light pass through."
- icon_state = "resinmembrane"
- opacity = 0
- health = 20
-
-/obj/effect/alien/weeds
- name = "weeds"
- desc = "Weird purple weeds."
- icon_state = "weeds"
-
- anchored = 1
- density = 0
- var/health = 50
-
- node
- icon_state = "weednode"
- name = "purple sac"
- desc = "Weird purple octopus-like thing."
-
-/obj/effect/alien/acid
- name = "acid"
- desc = "Burbling corrossive stuff. I wouldn't want to touch it."
- icon_state = "acid"
-
- density = 0
- opacity = 0
- anchored = 1
-
- var/obj/target
- var/ticks = 0
\ No newline at end of file
diff --git a/code/game/objects/alien/egg.dm b/code/game/objects/alien/egg.dm
deleted file mode 100644
index ed292d7381d..00000000000
--- a/code/game/objects/alien/egg.dm
+++ /dev/null
@@ -1,103 +0,0 @@
-/var/const //for the status var
- BURST = 0
- GROWING = 1
- GROWN = 2
-
- MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger
- MAX_GROWTH_TIME = 3000
-
-/obj/effect/alien/egg
- desc = "It looks like a weird egg"
- name = "egg"
- icon_state = "egg_growing"
- density = 0
- anchored = 1
-
- var/health = 100
- var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive
-
- New()
- if(aliens_allowed)
- ..()
- spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME))
- Grow()
- else
- del(src)
-
- attack_paw(user as mob)
- if(isalien(user))
- switch(status)
- if(BURST)
- user << "\red The child is already gone."
- return
- if(GROWING)
- user << "\red The child is not developed yet."
- return
- if(GROWN)
- user << "\red You retrieve the child."
- loc.contents += GetFacehugger()//need to write the code for giving it to the alien later
- Burst()
- return
- else
- return attack_hand(user)
-
- attack_hand(user as mob)
- user << "It feels slimy."
- return
-
- proc/GetFacehugger()
- return locate(/obj/item/clothing/mask/facehugger) in contents
-
- proc/Grow()
- icon_state = "egg"
- status = GROWN
- new /obj/item/clothing/mask/facehugger(src)
- return
-
- proc/Burst() //drops and kills the hugger if any is remaining
- var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
-
- if(child)
- loc.contents += child
- child.Die()
-
- icon_state = "egg_hatched"
- status = BURST
- return
-
-/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
- ..()
- healthcheck()
- return
-
-
-
-/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user)
- if(health <= 0)
- return
- if(W.attack_verb.len)
- src.visible_message("\red \The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]")
- else
- src.visible_message("\red \The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]")
- var/damage = W.force / 4.0
-
- if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
-
- if(WT.remove_fuel(0, user))
- damage = 15
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
-
- src.health -= damage
- src.healthcheck()
-
-
-/obj/effect/alien/egg/proc/healthcheck()
- if(health <= 0)
- Burst()
-
-/obj/effect/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 500)
- health -= 5
- healthcheck()
\ No newline at end of file
diff --git a/code/game/objects/alien/resin.dm b/code/game/objects/alien/resin.dm
deleted file mode 100644
index 6aee96423dd..00000000000
--- a/code/game/objects/alien/resin.dm
+++ /dev/null
@@ -1,166 +0,0 @@
-// Resin walls improved. /N
-
-/obj/effect/alien/resin/proc/healthcheck()
- if(health <=0)
- density = 0
- /* if(affecting)
- var/mob/living/carbon/M = affecting
- contents.Remove(affecting)
- if(ishuman(M))
- M.verbs += /mob/living/carbon/human/verb/suicide
- else
- M.verbs += /mob/living/carbon/monkey/verb/suicide
- M.loc = loc
- M.paralysis += 10
- for(var/mob/O in viewers(src, 3))
- O.show_message(text("A body appeared from the dead resin!"), 1, text("You hear faint moaning somewhere about you."), 2)*/
- del(src)
- return
-
-/obj/effect/alien/resin/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
- ..()
- healthcheck()
- return
-
-/obj/effect/alien/resin/ex_act(severity)
- switch(severity)
- if(1.0)
- health-=50
- if(2.0)
- health-=50
- if(3.0)
- if (prob(50))
- health-=50
- else
- health-=25
- healthcheck()
- return
-
-/obj/effect/alien/resin/blob_act()
- health-=50
- healthcheck()
- return
-
-/obj/effect/alien/resin/meteorhit()
- health-=50
- healthcheck()
- return
-
-/obj/effect/alien/resin/hitby(AM as mob|obj)
- ..()
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [src] was hit by [AM].", 1)
- var/tforce = 0
- if(ismob(AM))
- tforce = 10
- else
- tforce = AM:throwforce
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- health = max(0, health - tforce)
- healthcheck()
- ..()
- return
-
-/obj/effect/alien/resin/attack_hand()
- if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
- usr << "\blue You easily destroy the [name]."
- for(var/mob/O in oviewers(src))
- O.show_message("\red [usr] destroys the [name]!", 1)
- health = 0
- healthcheck()
- return
-
-/obj/effect/alien/resin/attack_paw()
- return attack_hand()
-
-/obj/effect/alien/resin/attack_alien()
- if (islarva(usr))//Safety check for larva. /N
- return
- usr << "\green You claw at the [name]."
- for(var/mob/O in oviewers(src))
- O.show_message("\red [usr] claws at the resin!", 1)
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- health -= rand(10, 20)
- if(health <= 0)
- usr << "\green You slice the [name] to pieces."
- for(var/mob/O in oviewers(src))
- O.show_message("\red [usr] slices the [name] apart!", 1)
- healthcheck()
- return
-
-/obj/effect/alien/resin/attackby(obj/item/weapon/W as obj, mob/user as mob)
- /*if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
- var/obj/item/weapon/grab/G = W
- if(isalien(user)&&(ishuman(G.affecting)||ismonkey(G.affecting)))
- //Only aliens can stick humans and monkeys into resin walls. Also, the wall must not have a person inside already.
- if(!affecting)
- if(G.state<2)
- user << "\red You need a better grip to do that!"
- return
- G.affecting.loc = src
- G.affecting.paralysis = 10
- for(var/mob/O in viewers(world.view, src))
- if (O.client)
- O << text("\green [] places [] in the resin wall!", G.assailant, G.affecting)
- affecting=G.affecting
- del(W)
- spawn(0)
- process()
- else
- user << "\red This wall is already occupied."
- return */
-
- var/aforce = W.force
- health = max(0, health - aforce)
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- healthcheck()
- ..()
- return
-
-///obj/effect/alien/resin/process() //Buggy and irrelevant now that you're able to just make nice little infection chambers - Urist
- /*if(affecting)
- var/mob/living/carbon/M = affecting
- var/check = 0
- if(ishuman(affecting))//So they do not suicide and kill the babby.
- M.verbs -= /mob/living/carbon/human/verb/suicide
- else
- check = 1
- M.verbs -= /mob/living/carbon/monkey/verb/suicide
-
- contents.Add(affecting)
-
- while(!isnull(M)&&!isnull(src))//While M and wall exist
- if(prob(90)&& HULK in M.mutations)//If they're the Hulk, they're getting out.
- M << "You smash your way to freedom!"
- break
- if(prob(30))//Let's people know that someone is trapped in the resin wall.
- M << "\green You feel a strange sense of calm as a flesh-like substance seems to completely envelop you."
- for(var/mob/O in viewers(src, 3))
- O.show_message(text("There appears to be a person stuck inside a resin wall nearby."), 1, text("You hear faint moaning somewhere about you."), 2)
- if(prob(5))//MAYBE they are able to crawl out on their own. Not likely...
- M << "You are able to crawl your way through the sticky mass, and out to freedom. But for how long?"
- break
- M.paralysis = 10//Set theis paralysis to 10 so they cannot act.
- sleep(50)//To cut down on processing time
-
- if(!isnull(src))
- affecting = null
-
- if(!isnull(M))//As long as they still exist.
- if(!check)//And now they can suicide again, even if they are already dead in case they get revived.
- M.verbs += /mob/living/carbon/human/verb/suicide
- else
- M.verbs += /mob/living/carbon/monkey/verb/suicide
- for(var/mob/O in viewers(src, 3))
- O.show_message(text("A body appeared from the dead resin!"), 1, text("You hear faint moaning somewhere about you."), 2)
- else
- for(var/mob/O in viewers(src, 3))
- O.show_message(text("\red An alien larva bursts from the resin wall!"), 1, text("\red You hear a high, alien screech nearby!"), 2)*/
-// return
-
-/obj/effect/alien/resin/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group) return 0
- if(istype(mover) && mover.checkpass(PASSGLASS))
- return !opacity
- return !density
diff --git a/code/game/objects/alien/weeds.dm b/code/game/objects/alien/weeds.dm
deleted file mode 100644
index 60a72feec8c..00000000000
--- a/code/game/objects/alien/weeds.dm
+++ /dev/null
@@ -1,108 +0,0 @@
-#define NODERANGE 3
-
-/obj/effect/alien/weeds/New()
- ..()
- if(istype(loc, /turf/space))
- del(src)
- return
- if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
- spawn(rand(150,300))
- if(src)
- Life()
- return
-
-/obj/effect/alien/weeds/node/New()
- ..()
- sd_SetLuminosity(NODERANGE)
- return
-
-/obj/effect/alien/weeds/proc/Life()
- set background = 1
- var/turf/U = get_turf(src)
-/*
- if (locate(/obj/movable, U))
- U = locate(/obj/movable, U)
- if(U.density == 1)
- del(src)
- return
-
-Alien plants should do something if theres a lot of poison
- if(U.poison> 200000)
- health -= round(U.poison/200000)
- update()
- return
-*/
- if (istype(U, /turf/space))
- del(src)
- return
-
- direction_loop:
- for(var/dirn in cardinal)
- var/turf/T = get_step(src, dirn)
-
- if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space))
- continue
-
- if(!(locate(/obj/effect/alien/weeds/node) in view(NODERANGE,T)))
- continue
-
- // if (locate(/obj/movable, T)) // don't propogate into movables
- // continue
-
- for(var/obj/O in T)
- if(O.density)
- continue direction_loop
-
- new /obj/effect/alien/weeds(T)
-
-
-/obj/effect/alien/weeds/ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- if(2.0)
- if (prob(50))
- del(src)
- if(3.0)
- if (prob(5))
- del(src)
- return
-
-/obj/effect/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user)
- if(W.attack_verb.len)
- visible_message("\red \The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]")
- else
- visible_message("\red \The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]")
-
- var/damage = W.force / 4.0
-
- if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
-
- if(WT.remove_fuel(0, user))
- damage = 15
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
-
- health -= damage
- healthcheck()
-
-/obj/effect/alien/weeds/proc/healthcheck()
- if(health <= 0)
- del(src)
-
-
-/obj/effect/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 300)
- health -= 5
- healthcheck()
-
-/*/obj/effect/alien/weeds/burn(fi_amount)
- if (fi_amount > 18000)
- spawn( 0 )
- del(src)
- return
- return 0
- return 1
-*/
-
-#undef NODRANGE
\ No newline at end of file
diff --git a/code/game/objects/transfer_valve.dm b/code/game/objects/devices/transfer_valve.dm
similarity index 100%
rename from code/game/objects/transfer_valve.dm
rename to code/game/objects/devices/transfer_valve.dm
diff --git a/code/game/objects/uplinks.dm b/code/game/objects/devices/uplinks.dm
similarity index 89%
rename from code/game/objects/uplinks.dm
rename to code/game/objects/devices/uplinks.dm
index 40d2cd2e599..30705c12060 100644
--- a/code/game/objects/uplinks.dm
+++ b/code/game/objects/devices/uplinks.dm
@@ -371,32 +371,6 @@ A list of items and costs is stored under the datum of every game mode, alongsid
if(hidden_uplink)
hidden_uplink.trigger(user)
-/obj/item/weapon/implant/uplink
- name = "uplink"
- desc = "Summon things."
- var/activation_emote = "chuckle"
-
-/obj/item/weapon/implant/uplink/New()
- activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
- hidden_uplink = new(src)
- hidden_uplink.uses = 5
- ..()
- return
-
-// Moved the Uplink Implant here
-
-/obj/item/weapon/implant/uplink/implanted(mob/source)
- activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
- source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
- source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
- return 1
-
-
-/obj/item/weapon/implant/uplink/trigger(emote, mob/source as mob)
- if(hidden_uplink && usr == source) // Let's not have another people activate our uplink
- hidden_uplink.check_trigger(source, emote, activation_emote)
- return
-
/obj/item/device/radio/headset/uplink
traitor_frequency = 1445
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
new file mode 100644
index 00000000000..341b30c1699
--- /dev/null
+++ b/code/game/objects/effects/aliens.dm
@@ -0,0 +1,421 @@
+/* Alien Effects!
+ * Contains:
+ * effect/alien
+ * Resin
+ * Weeds
+ * Acid
+ * Egg
+ */
+
+/*
+ * effect/alien
+ */
+/obj/effect/alien
+ name = "alien thing"
+ desc = "theres something alien about this"
+ icon = 'icons/mob/alien.dmi'
+// unacidable = 1 //Aliens won't ment their own.
+
+
+/*
+ * Resin
+ */
+/obj/effect/alien/resin
+ name = "resin"
+ desc = "Looks like some kind of slimy growth."
+ icon_state = "resin"
+
+ density = 1
+ opacity = 1
+ anchored = 1
+ var/health = 50
+ //var/mob/living/affecting = null
+
+ wall
+ name = "resin wall"
+ desc = "Purple slime solidified into a wall."
+ icon_state = "resinwall" //same as resin, but consistency ho!
+
+ membrane
+ name = "resin membrane"
+ desc = "Purple slime just thin enough to let light pass through."
+ icon_state = "resinmembrane"
+ opacity = 0
+ health = 20
+
+/obj/effect/alien/resin/proc/healthcheck()
+ if(health <=0)
+ density = 0
+ del(src)
+ return
+
+/obj/effect/alien/resin/bullet_act(var/obj/item/projectile/Proj)
+ health -= Proj.damage
+ ..()
+ healthcheck()
+ return
+
+/obj/effect/alien/resin/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ health-=50
+ if(2.0)
+ health-=50
+ if(3.0)
+ if (prob(50))
+ health-=50
+ else
+ health-=25
+ healthcheck()
+ return
+
+/obj/effect/alien/resin/blob_act()
+ health-=50
+ healthcheck()
+ return
+
+/obj/effect/alien/resin/meteorhit()
+ health-=50
+ healthcheck()
+ return
+
+/obj/effect/alien/resin/hitby(AM as mob|obj)
+ ..()
+ for(var/mob/O in viewers(src, null))
+ O.show_message("\red [src] was hit by [AM].", 1)
+ var/tforce = 0
+ if(ismob(AM))
+ tforce = 10
+ else
+ tforce = AM:throwforce
+ playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
+ health = max(0, health - tforce)
+ healthcheck()
+ ..()
+ return
+
+/obj/effect/alien/resin/attack_hand()
+ if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
+ usr << "\blue You easily destroy the [name]."
+ for(var/mob/O in oviewers(src))
+ O.show_message("\red [usr] destroys the [name]!", 1)
+ health = 0
+ healthcheck()
+ return
+
+/obj/effect/alien/resin/attack_paw()
+ return attack_hand()
+
+/obj/effect/alien/resin/attack_alien()
+ if (islarva(usr))//Safety check for larva. /N
+ return
+ usr << "\green You claw at the [name]."
+ for(var/mob/O in oviewers(src))
+ O.show_message("\red [usr] claws at the resin!", 1)
+ playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
+ health -= rand(10, 20)
+ if(health <= 0)
+ usr << "\green You slice the [name] to pieces."
+ for(var/mob/O in oviewers(src))
+ O.show_message("\red [usr] slices the [name] apart!", 1)
+ healthcheck()
+ return
+
+/obj/effect/alien/resin/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ /*if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
+ var/obj/item/weapon/grab/G = W
+ if(isalien(user)&&(ishuman(G.affecting)||ismonkey(G.affecting)))
+ //Only aliens can stick humans and monkeys into resin walls. Also, the wall must not have a person inside already.
+ if(!affecting)
+ if(G.state<2)
+ user << "\red You need a better grip to do that!"
+ return
+ G.affecting.loc = src
+ G.affecting.paralysis = 10
+ for(var/mob/O in viewers(world.view, src))
+ if (O.client)
+ O << text("\green [] places [] in the resin wall!", G.assailant, G.affecting)
+ affecting=G.affecting
+ del(W)
+ spawn(0)
+ process()
+ else
+ user << "\red This wall is already occupied."
+ return */
+
+ var/aforce = W.force
+ health = max(0, health - aforce)
+ playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
+ healthcheck()
+ ..()
+ return
+
+/obj/effect/alien/resin/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group) return 0
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return !opacity
+ return !density
+
+
+/*
+ * Weeds
+ */
+#define NODERANGE 3
+
+/obj/effect/alien/weeds
+ name = "weeds"
+ desc = "Weird purple weeds."
+ icon_state = "weeds"
+
+ anchored = 1
+ density = 0
+ var/health = 50
+
+ node
+ icon_state = "weednode"
+ name = "purple sac"
+ desc = "Weird purple octopus-like thing."
+
+/obj/effect/alien/weeds/New()
+ ..()
+ if(istype(loc, /turf/space))
+ del(src)
+ return
+ if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
+ spawn(rand(150,300))
+ if(src)
+ Life()
+ return
+
+/obj/effect/alien/weeds/node/New()
+ ..()
+ sd_SetLuminosity(NODERANGE)
+ return
+
+/obj/effect/alien/weeds/proc/Life()
+ set background = 1
+ var/turf/U = get_turf(src)
+/*
+ if (locate(/obj/movable, U))
+ U = locate(/obj/movable, U)
+ if(U.density == 1)
+ del(src)
+ return
+
+Alien plants should do something if theres a lot of poison
+ if(U.poison> 200000)
+ health -= round(U.poison/200000)
+ update()
+ return
+*/
+ if (istype(U, /turf/space))
+ del(src)
+ return
+
+ direction_loop:
+ for(var/dirn in cardinal)
+ var/turf/T = get_step(src, dirn)
+
+ if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space))
+ continue
+
+ if(!(locate(/obj/effect/alien/weeds/node) in view(NODERANGE,T)))
+ continue
+
+ // if (locate(/obj/movable, T)) // don't propogate into movables
+ // continue
+
+ for(var/obj/O in T)
+ if(O.density)
+ continue direction_loop
+
+ new /obj/effect/alien/weeds(T)
+
+
+/obj/effect/alien/weeds/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ if(2.0)
+ if (prob(50))
+ del(src)
+ if(3.0)
+ if (prob(5))
+ del(src)
+ return
+
+/obj/effect/alien/weeds/attackby(var/obj/item/weapon/W, var/mob/user)
+ if(W.attack_verb.len)
+ visible_message("\red \The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]")
+ else
+ visible_message("\red \The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]")
+
+ var/damage = W.force / 4.0
+
+ if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+
+ if(WT.remove_fuel(0, user))
+ damage = 15
+ playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+
+ health -= damage
+ healthcheck()
+
+/obj/effect/alien/weeds/proc/healthcheck()
+ if(health <= 0)
+ del(src)
+
+
+/obj/effect/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > 300)
+ health -= 5
+ healthcheck()
+
+/*/obj/effect/alien/weeds/burn(fi_amount)
+ if (fi_amount > 18000)
+ spawn( 0 )
+ del(src)
+ return
+ return 0
+ return 1
+*/
+
+#undef NODERANGE
+
+
+/*
+ * Acid
+ */
+/obj/effect/alien/acid
+ name = "acid"
+ desc = "Burbling corrossive stuff. I wouldn't want to touch it."
+ icon_state = "acid"
+
+ density = 0
+ opacity = 0
+ anchored = 1
+
+ var/obj/target
+ var/ticks = 0
+
+/obj/effect/alien/acid/proc/tick()
+ ticks += 1
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\green [src.target] sizzles and begins to melt under the bubbling mess of acid!", 1)
+ if(prob(ticks*10))
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\green [src.target] collapses under its own weight into a puddle of goop and undigested debris!", 1)
+// if(target.occupant) //I tried to fix mechas-with-humans-getting-deleted. Made them unacidable for now.
+// target.ex_act(1)
+ del(target)
+ del(src)
+ return
+ spawn(rand(200, 600)) tick()
+
+/*
+ * Egg
+ */
+/var/const //for the status var
+ BURST = 0
+ GROWING = 1
+ GROWN = 2
+
+ MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger
+ MAX_GROWTH_TIME = 3000
+
+/obj/effect/alien/egg
+ desc = "It looks like a weird egg"
+ name = "egg"
+ icon_state = "egg_growing"
+ density = 0
+ anchored = 1
+
+ var/health = 100
+ var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive
+
+ New()
+ if(aliens_allowed)
+ ..()
+ spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME))
+ Grow()
+ else
+ del(src)
+
+ attack_paw(user as mob)
+ if(isalien(user))
+ switch(status)
+ if(BURST)
+ user << "\red The child is already gone."
+ return
+ if(GROWING)
+ user << "\red The child is not developed yet."
+ return
+ if(GROWN)
+ user << "\red You retrieve the child."
+ loc.contents += GetFacehugger()//need to write the code for giving it to the alien later
+ Burst()
+ return
+ else
+ return attack_hand(user)
+
+ attack_hand(user as mob)
+ user << "It feels slimy."
+ return
+
+ proc/GetFacehugger()
+ return locate(/obj/item/clothing/mask/facehugger) in contents
+
+ proc/Grow()
+ icon_state = "egg"
+ status = GROWN
+ new /obj/item/clothing/mask/facehugger(src)
+ return
+
+ proc/Burst() //drops and kills the hugger if any is remaining
+ var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
+
+ if(child)
+ loc.contents += child
+ child.Die()
+
+ icon_state = "egg_hatched"
+ status = BURST
+ return
+
+/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj)
+ health -= Proj.damage
+ ..()
+ healthcheck()
+ return
+
+
+
+/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user)
+ if(health <= 0)
+ return
+ if(W.attack_verb.len)
+ src.visible_message("\red \The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]")
+ else
+ src.visible_message("\red \The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]")
+ var/damage = W.force / 4.0
+
+ if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+
+ if(WT.remove_fuel(0, user))
+ damage = 15
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+
+ src.health -= damage
+ src.healthcheck()
+
+
+/obj/effect/alien/egg/proc/healthcheck()
+ if(health <= 0)
+ Burst()
+
+/obj/effect/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > 500)
+ health -= 5
+ healthcheck()
\ No newline at end of file
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
new file mode 100644
index 00000000000..8fbd21a4177
--- /dev/null
+++ b/code/game/objects/effects/mines.dm
@@ -0,0 +1,85 @@
+/obj/effect/mine/New()
+ icon_state = "uglyminearmed"
+
+/obj/effect/mine/HasEntered(AM as mob|obj)
+ Bumped(AM)
+
+/obj/effect/mine/Bumped(mob/M as mob|obj)
+
+ if(triggered) return
+
+ if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey))
+ for(var/mob/O in viewers(world.view, src.loc))
+ O << "[M] triggered the \icon[src] [src]"
+ triggered = 1
+ call(src,triggerproc)(M)
+
+/obj/effect/mine/proc/triggerrad(obj)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ obj:radiation += 50
+ randmutb(obj)
+ domutcheck(obj,null)
+ spawn(0)
+ del(src)
+
+/obj/effect/mine/proc/triggerstun(obj)
+ if(ismob(obj))
+ var/mob/M = obj
+ M.Stun(30)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ spawn(0)
+ del(src)
+
+/obj/effect/mine/proc/triggern2o(obj)
+ //example: n2o triggerproc
+ //note: im lazy
+
+ for (var/turf/simulated/floor/target in range(1,src))
+ if(!target.blocks_air)
+ if(target.parent)
+ target.parent.suspend_group_processing()
+
+ var/datum/gas_mixture/payload = new
+ var/datum/gas/sleeping_agent/trace_gas = new
+
+ trace_gas.moles = 30
+ payload += trace_gas
+
+ target.air.merge(payload)
+
+ spawn(0)
+ del(src)
+
+/obj/effect/mine/proc/triggerplasma(obj)
+ for (var/turf/simulated/floor/target in range(1,src))
+ if(!target.blocks_air)
+ if(target.parent)
+ target.parent.suspend_group_processing()
+
+ var/datum/gas_mixture/payload = new
+
+ payload.toxins = 30
+
+ target.air.merge(payload)
+
+ target.hotspot_expose(1000, CELL_VOLUME)
+
+ spawn(0)
+ del(src)
+
+/obj/effect/mine/proc/triggerkick(obj)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ del(obj:client)
+ spawn(0)
+ del(src)
+
+/obj/effect/mine/proc/explode(obj)
+ explosion(loc, 0, 1, 2, 3)
+ spawn(0)
+ del(src)
\ No newline at end of file
diff --git a/code/game/objects/portals.dm b/code/game/objects/effects/portals.dm
similarity index 100%
rename from code/game/objects/portals.dm
rename to code/game/objects/effects/portals.dm
diff --git a/code/game/objects/sign_decals.dm b/code/game/objects/effects/signs.dm
similarity index 100%
rename from code/game/objects/sign_decals.dm
rename to code/game/objects/effects/signs.dm
diff --git a/code/game/objects/alien/facehugger.dm b/code/game/objects/facehugger.dm
similarity index 94%
rename from code/game/objects/alien/facehugger.dm
rename to code/game/objects/facehugger.dm
index 9a5cc518a28..9093ecba401 100644
--- a/code/game/objects/alien/facehugger.dm
+++ b/code/game/objects/facehugger.dm
@@ -1,5 +1,7 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
+//Moving this here for now.. it might end up in modules/mob/ later
+
var/const/MIN_IMPREGNATION_TIME = 100 //time it takes to impregnate someone
var/const/MAX_IMPREGNATION_TIME = 150
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
new file mode 100644
index 00000000000..2cba026e320
--- /dev/null
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -0,0 +1,23 @@
+/obj/item/weapon/implant/uplink
+ name = "uplink"
+ desc = "Summon things."
+ var/activation_emote = "chuckle"
+
+/obj/item/weapon/implant/uplink/New()
+ activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ hidden_uplink = new(src)
+ hidden_uplink.uses = 5
+ ..()
+ return
+
+/obj/item/weapon/implant/uplink/implanted(mob/source)
+ activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
+ source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
+ return 1
+
+
+/obj/item/weapon/implant/uplink/trigger(emote, mob/source as mob)
+ if(hidden_uplink && usr == source) // Let's not have another people activate our uplink
+ hidden_uplink.check_trigger(source, emote, activation_emote)
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/mousetraps.dm b/code/game/objects/items/weapons/mousetraps.dm
new file mode 100644
index 00000000000..4906f886a28
--- /dev/null
+++ b/code/game/objects/items/weapons/mousetraps.dm
@@ -0,0 +1,94 @@
+/obj/item/weapon/mousetrap/examine()
+ set src in oview(12)
+ ..()
+ if(armed)
+ usr << "\red It looks like it's armed."
+
+/obj/item/weapon/mousetrap/proc/triggered(mob/target as mob, var/type = "feet")
+ if(!armed)
+ return
+ var/datum/organ/external/affecting = null
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ switch(type)
+ if("feet")
+ if(!H.shoes)
+ affecting = H.get_organ(pick("l_leg", "r_leg"))
+ H.Weaken(3)
+ if("l_hand", "r_hand")
+ if(!H.gloves)
+ affecting = H.get_organ(type)
+ H.Stun(3)
+ if(affecting)
+ if(affecting.take_damage(1, 0))
+ H.UpdateDamageIcon()
+ H.updatehealth()
+ else if(ismouse(target))
+ var/mob/living/simple_animal/mouse/M = target
+ src.visible_message("\red SPLAT!")
+ M.splat()
+ playsound(target.loc, 'sound/effects/snap.ogg', 50, 1)
+ icon_state = "mousetrap"
+ armed = 0
+/*
+ else if (ismouse(target))
+ target.adjustBruteLoss(100)
+*/
+
+/obj/item/weapon/mousetrap/attack_self(mob/living/user as mob)
+ if(!armed)
+ icon_state = "mousetraparmed"
+ user << "\blue You arm the mousetrap."
+ else
+ icon_state = "mousetrap"
+ if(( (user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
+ var/which_hand = "l_hand"
+ if(!user.hand)
+ which_hand = "r_hand"
+ src.triggered(user, which_hand)
+ user << "\red You accidentally trigger the mousetrap!"
+ for(var/mob/O in viewers(user, null))
+ if(O == user)
+ continue
+ O.show_message("\red [user] accidentally sets off the mousetrap, breaking their fingers.", 1)
+ return
+ user << "\blue You disarm the mousetrap."
+ armed = !armed
+ playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
+
+/obj/item/weapon/mousetrap/attack_hand(mob/living/user as mob)
+ if(armed)
+ if(( (user.getBrainLoss() >= 60 || CLUMSY in user.mutations)) && prob(50))
+ var/which_hand = "l_hand"
+ if(!user.hand)
+ which_hand = "r_hand"
+ src.triggered(user, which_hand)
+ user << "\red You accidentally trigger the mousetrap!"
+ for(var/mob/O in viewers(user, null))
+ if(O == user)
+ continue
+ O.show_message("\red [user] accidentally sets off the mousetrap, breaking their fingers.", 1)
+ return
+ ..()
+
+/obj/item/weapon/mousetrap/HasEntered(AM as mob|obj)
+ if(armed)
+ if(ishuman(AM))
+ var/mob/living/carbon/H = AM
+ if(H.m_intent == "run")
+ src.triggered(H)
+ H << "\red You accidentally step on the mousetrap!"
+ for(var/mob/O in viewers(H, null))
+ if(O == H)
+ continue
+ O.show_message("\red [H] accidentally steps on the mousetrap.", 1)
+ if(ismouse(AM))
+ triggered(AM)
+ ..()
+
+/obj/item/weapon/mousetrap/hitby(A as mob|obj)
+ if(!armed)
+ return ..()
+ for(var/mob/O in viewers(src, null))
+ O.show_message("\red The mousetrap is triggered by [A].", 1)
+ src.triggered(null)
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index b23050d0e0d..27663d4309a 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -1,5 +1,6 @@
/*
CONTAINS:
+BANHAMMER
SWORD
BLADE
AXE
@@ -7,8 +8,10 @@ CLASSIC BATON
ENERGY SHIELD (where else should i even put this)
*/
-
-
+//BANHAMMER
+/obj/item/weapon/banhammer/attack(mob/M as mob, mob/user as mob)
+ M << " You have been banned FOR NO REISIN by [user]"
+ user << " You have BANNED [M]"
// SWORD
/obj/item/weapon/melee/energy/sword/IsShield()
diff --git a/code/game/objects/shooting_range.dm b/code/game/objects/shooting_range.dm
index c3717141b8c..94310b70fb9 100644
--- a/code/game/objects/shooting_range.dm
+++ b/code/game/objects/shooting_range.dm
@@ -1,61 +1,3 @@
-
-// TARGET STAKE
-// TARGET
-// Basically they are for the firing range
-/obj/structure/target_stake
- name = "target stake"
- desc = "A thin platform with negatively-magnetized wheels."
- icon = 'icons/obj/objects.dmi'
- icon_state = "target_stake"
- density = 1
- flags = CONDUCT
- var/obj/item/target/pinned_target // the current pinned target
-
- Move()
- ..()
- // Move the pinned target along with the stake
- if(pinned_target in view(3, src))
- pinned_target.loc = loc
-
- else // Sanity check: if the pinned target can't be found in immediate view
- pinned_target = null
- density = 1
-
- attackby(obj/item/W as obj, mob/user as mob)
- // Putting objects on the stake. Most importantly, targets
- if(pinned_target)
- return // get rid of that pinned target first!
-
- if(istype(W, /obj/item/target))
- density = 0
- W.density = 1
- user.drop_item(src)
- W.loc = loc
- W.layer = 3.1
- pinned_target = W
- user << "You slide the target into the stake."
- return
-
- attack_hand(mob/user as mob)
- // taking pinned targets off!
- if(pinned_target)
- density = 1
- pinned_target.density = 0
- pinned_target.layer = OBJ_LAYER
-
- pinned_target.loc = user.loc
- if(ishuman(user))
- if(!user.get_active_hand())
- user.put_in_hands(pinned_target)
- user << "You take the target out of the stake."
- else
- pinned_target.loc = get_turf_loc(user)
- user << "You take the target out of the stake."
-
- pinned_target = null
-
-
-
// Targets, the things that actually get shot!
/obj/item/target
name = "shooting target"
@@ -236,14 +178,4 @@
b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4)
b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4)
- Target.bulletholes.Add(src)
-
-
-
-
-
-
-
-
-
-
+ Target.bulletholes.Add(src)
\ No newline at end of file
diff --git a/code/game/objects/alien/nest.dm b/code/game/objects/structures/aliennests.dm
similarity index 100%
rename from code/game/objects/alien/nest.dm
rename to code/game/objects/structures/aliennests.dm
diff --git a/code/game/objects/structures/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
similarity index 100%
rename from code/game/objects/structures/closets.dm
rename to code/game/objects/structures/crates_lockers/closets.dm
diff --git a/code/game/objects/closets/bombsuit.dm b/code/game/objects/structures/crates_lockers/closets/bombsuit.dm
similarity index 100%
rename from code/game/objects/closets/bombsuit.dm
rename to code/game/objects/structures/crates_lockers/closets/bombsuit.dm
diff --git a/code/game/objects/closets/emergency.dm b/code/game/objects/structures/crates_lockers/closets/emergency.dm
similarity index 100%
rename from code/game/objects/closets/emergency.dm
rename to code/game/objects/structures/crates_lockers/closets/emergency.dm
diff --git a/code/game/objects/closets/extinguisher.dm b/code/game/objects/structures/crates_lockers/closets/extinguisher.dm
similarity index 100%
rename from code/game/objects/closets/extinguisher.dm
rename to code/game/objects/structures/crates_lockers/closets/extinguisher.dm
diff --git a/code/game/objects/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
similarity index 100%
rename from code/game/objects/closets/fireaxe.dm
rename to code/game/objects/structures/crates_lockers/closets/fireaxe.dm
diff --git a/code/game/objects/closets/firecloset.dm b/code/game/objects/structures/crates_lockers/closets/firecloset.dm
similarity index 100%
rename from code/game/objects/closets/firecloset.dm
rename to code/game/objects/structures/crates_lockers/closets/firecloset.dm
diff --git a/code/game/objects/closets/fitnesscloset.dm b/code/game/objects/structures/crates_lockers/closets/fitnesscloset.dm
similarity index 100%
rename from code/game/objects/closets/fitnesscloset.dm
rename to code/game/objects/structures/crates_lockers/closets/fitnesscloset.dm
diff --git a/code/game/objects/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
similarity index 100%
rename from code/game/objects/closets/gimmick.dm
rename to code/game/objects/structures/crates_lockers/closets/gimmick.dm
diff --git a/code/game/objects/closets/gmcloset.dm b/code/game/objects/structures/crates_lockers/closets/gmcloset.dm
similarity index 100%
rename from code/game/objects/closets/gmcloset.dm
rename to code/game/objects/structures/crates_lockers/closets/gmcloset.dm
diff --git a/code/game/objects/closets/janitor.dm b/code/game/objects/structures/crates_lockers/closets/janitor.dm
similarity index 100%
rename from code/game/objects/closets/janitor.dm
rename to code/game/objects/structures/crates_lockers/closets/janitor.dm
diff --git a/code/game/objects/closets/kitchen.dm b/code/game/objects/structures/crates_lockers/closets/kitchen.dm
similarity index 100%
rename from code/game/objects/closets/kitchen.dm
rename to code/game/objects/structures/crates_lockers/closets/kitchen.dm
diff --git a/code/game/objects/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm
similarity index 100%
rename from code/game/objects/closets/l3closet.dm
rename to code/game/objects/structures/crates_lockers/closets/l3closet.dm
diff --git a/code/game/objects/closets/malfunction.dm b/code/game/objects/structures/crates_lockers/closets/malfunction.dm
similarity index 100%
rename from code/game/objects/closets/malfunction.dm
rename to code/game/objects/structures/crates_lockers/closets/malfunction.dm
diff --git a/code/game/objects/closets/nuclear.dm b/code/game/objects/structures/crates_lockers/closets/nuclear.dm
similarity index 100%
rename from code/game/objects/closets/nuclear.dm
rename to code/game/objects/structures/crates_lockers/closets/nuclear.dm
diff --git a/code/game/objects/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
similarity index 100%
rename from code/game/objects/closets/secure/bar.dm
rename to code/game/objects/structures/crates_lockers/closets/secure/bar.dm
diff --git a/code/game/objects/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
similarity index 100%
rename from code/game/objects/closets/secure/cargo.dm
rename to code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
diff --git a/code/game/objects/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
similarity index 100%
rename from code/game/objects/closets/secure/engineering.dm
rename to code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
diff --git a/code/game/objects/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
similarity index 100%
rename from code/game/objects/closets/secure/hydroponics.dm
rename to code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
diff --git a/code/game/objects/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
similarity index 100%
rename from code/game/objects/closets/secure/medical.dm
rename to code/game/objects/structures/crates_lockers/closets/secure/medical.dm
diff --git a/code/game/objects/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
similarity index 100%
rename from code/game/objects/closets/secure/personal.dm
rename to code/game/objects/structures/crates_lockers/closets/secure/personal.dm
diff --git a/code/game/objects/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
similarity index 100%
rename from code/game/objects/closets/secure/scientist.dm
rename to code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
diff --git a/code/game/objects/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
similarity index 100%
rename from code/game/objects/closets/secure/secure_closets.dm
rename to code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
similarity index 100%
rename from code/game/objects/closets/secure/security.dm
rename to code/game/objects/structures/crates_lockers/closets/secure/security.dm
diff --git a/code/game/objects/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
similarity index 100%
rename from code/game/objects/closets/syndicate.dm
rename to code/game/objects/structures/crates_lockers/closets/syndicate.dm
diff --git a/code/game/objects/closets/thunderdome.dm b/code/game/objects/structures/crates_lockers/closets/thunderdome.dm
similarity index 100%
rename from code/game/objects/closets/thunderdome.dm
rename to code/game/objects/structures/crates_lockers/closets/thunderdome.dm
diff --git a/code/game/objects/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
similarity index 100%
rename from code/game/objects/closets/wardrobe.dm
rename to code/game/objects/structures/crates_lockers/closets/wardrobe.dm
diff --git a/code/game/objects/structures/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
similarity index 100%
rename from code/game/objects/structures/crates.dm
rename to code/game/objects/structures/crates_lockers/crates.dm
diff --git a/code/game/objects/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
similarity index 100%
rename from code/game/objects/largecrate.dm
rename to code/game/objects/structures/crates_lockers/largecrate.dm
diff --git a/code/game/objects/grille.dm b/code/game/objects/structures/grille.dm
similarity index 100%
rename from code/game/objects/grille.dm
rename to code/game/objects/structures/grille.dm
diff --git a/code/game/objects/kitchen.dm b/code/game/objects/structures/kitchen_spike.dm
similarity index 100%
rename from code/game/objects/kitchen.dm
rename to code/game/objects/structures/kitchen_spike.dm
diff --git a/code/game/objects/ladders.dm b/code/game/objects/structures/ladders.dm
similarity index 100%
rename from code/game/objects/ladders.dm
rename to code/game/objects/structures/ladders.dm
diff --git a/code/game/objects/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
similarity index 100%
rename from code/game/objects/mineral_doors.dm
rename to code/game/objects/structures/mineral_doors.dm
diff --git a/code/game/objects/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
similarity index 100%
rename from code/game/objects/noticeboard.dm
rename to code/game/objects/structures/noticeboard.dm
diff --git a/code/game/objects/stool.dm b/code/game/objects/structures/stool_chair_bed.dm
similarity index 100%
rename from code/game/objects/stool.dm
rename to code/game/objects/structures/stool_chair_bed.dm
diff --git a/code/game/objects/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
similarity index 100%
rename from code/game/objects/tables_racks.dm
rename to code/game/objects/structures/tables_racks.dm
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
new file mode 100644
index 00000000000..1e9ac37a558
--- /dev/null
+++ b/code/game/objects/structures/target_stake.dm
@@ -0,0 +1,52 @@
+// Basically they are for the firing range
+/obj/structure/target_stake
+ name = "target stake"
+ desc = "A thin platform with negatively-magnetized wheels."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "target_stake"
+ density = 1
+ flags = CONDUCT
+ var/obj/item/target/pinned_target // the current pinned target
+
+ Move()
+ ..()
+ // Move the pinned target along with the stake
+ if(pinned_target in view(3, src))
+ pinned_target.loc = loc
+
+ else // Sanity check: if the pinned target can't be found in immediate view
+ pinned_target = null
+ density = 1
+
+ attackby(obj/item/W as obj, mob/user as mob)
+ // Putting objects on the stake. Most importantly, targets
+ if(pinned_target)
+ return // get rid of that pinned target first!
+
+ if(istype(W, /obj/item/target))
+ density = 0
+ W.density = 1
+ user.drop_item(src)
+ W.loc = loc
+ W.layer = 3.1
+ pinned_target = W
+ user << "You slide the target into the stake."
+ return
+
+ attack_hand(mob/user as mob)
+ // taking pinned targets off!
+ if(pinned_target)
+ density = 1
+ pinned_target.density = 0
+ pinned_target.layer = OBJ_LAYER
+
+ pinned_target.loc = user.loc
+ if(ishuman(user))
+ if(!user.get_active_hand())
+ user.put_in_hands(pinned_target)
+ user << "You take the target out of the stake."
+ else
+ pinned_target.loc = get_turf_loc(user)
+ user << "You take the target out of the stake."
+
+ pinned_target = null
\ No newline at end of file
diff --git a/code/game/objects/watercloset.dm b/code/game/objects/structures/watercloset.dm
similarity index 100%
rename from code/game/objects/watercloset.dm
rename to code/game/objects/structures/watercloset.dm
diff --git a/code/game/objects/tanks/oxygen.dm b/code/game/objects/tanks/oxygen.dm
deleted file mode 100644
index fdf86cd29a0..00000000000
--- a/code/game/objects/tanks/oxygen.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-
-/obj/item/weapon/tank/oxygen
- name = "Gas Tank (Oxygen)"
- desc = "A tank of oxygen"
- icon_state = "oxygen"
- distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
-
-
- New()
- ..()
- src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
- return
-
-
- examine()
- set src in usr
- ..()
- if(air_contents.oxygen < 10)
- usr << text("\red The meter on the [src.name] indicates you are almost out of air!")
- playsound(usr, 'sound/effects/alert.ogg', 50, 1)
-
-
-/obj/item/weapon/tank/oxygen/yellow
- name = "Gas Tank (Oxygen)"
- desc = "A tank of oxygen, this one is yellow."
- icon_state = "oxygen_f"
-
-
-/obj/item/weapon/tank/oxygen/red
- name = "Gas Tank (Oxygen)"
- desc = "A tank of oxygen, this one is red."
- icon_state = "oxygen_fr"
diff --git a/code/game/objects/tanks/tank_types.dm b/code/game/objects/tanks/tank_types.dm
new file mode 100644
index 00000000000..3cfb89a3069
--- /dev/null
+++ b/code/game/objects/tanks/tank_types.dm
@@ -0,0 +1,151 @@
+/* Types of tanks!
+ * Contains:
+ * Oxygen
+ * Anesthetic
+ * Air
+ * Plasma
+ */
+
+/*
+ * Oxygen
+ */
+/obj/item/weapon/tank/oxygen
+ name = "Gas Tank (Oxygen)"
+ desc = "A tank of oxygen"
+ icon_state = "oxygen"
+ distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
+
+
+ New()
+ ..()
+ src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
+ return
+
+
+ examine()
+ set src in usr
+ ..()
+ if(air_contents.oxygen < 10)
+ usr << text("\red The meter on the [src.name] indicates you are almost out of air!")
+ playsound(usr, 'sound/effects/alert.ogg', 50, 1)
+
+
+/obj/item/weapon/tank/oxygen/yellow
+ name = "Gas Tank (Oxygen)"
+ desc = "A tank of oxygen, this one is yellow."
+ icon_state = "oxygen_f"
+
+/obj/item/weapon/tank/oxygen/red
+ name = "Gas Tank (Oxygen)"
+ desc = "A tank of oxygen, this one is red."
+ icon_state = "oxygen_fr"
+
+
+/*
+ * Anesthetic
+ */
+/obj/item/weapon/tank/anesthetic
+ name = "Gas Tank (Sleeping Agent)"
+ desc = "A N2O/O2 gas mix"
+ icon_state = "anesthetic"
+ item_state = "an_tank"
+
+/obj/item/weapon/tank/anesthetic/New()
+ ..()
+
+ src.air_contents.oxygen = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
+
+ var/datum/gas/sleeping_agent/trace_gas = new()
+ trace_gas.moles = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
+
+ src.air_contents.trace_gases += trace_gas
+ return
+
+/*
+ * Air
+ */
+/obj/item/weapon/tank/air
+ name = "Gas Tank (Air Mix)"
+ desc = "Mixed anyone?"
+ icon_state = "oxygen"
+
+
+ examine()
+ set src in usr
+ ..()
+ if(air_contents.oxygen < 1 && loc==usr)
+ usr << "\red The meter on the [src.name] indicates you are almost out of air!"
+ usr << sound('sound/effects/alert.ogg')
+
+/obj/item/weapon/tank/air/New()
+ ..()
+
+ src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
+ src.air_contents.nitrogen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
+ return
+
+
+/*
+ * Plasma
+ */
+/obj/item/weapon/tank/plasma
+ name = "Gas Tank (BIOHAZARD)"
+ desc = "Contains dangerous plasma. Do not inhale."
+ icon_state = "plasma"
+ flags = FPRINT | TABLEPASS | CONDUCT
+ slot_flags = null //they have no straps!
+
+
+/obj/item/weapon/tank/plasma/New()
+ ..()
+
+ src.air_contents.toxins = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C)
+ return
+
+
+/obj/item/weapon/tank/plasma/proc/release()
+ var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles())
+
+ loc.assume_air(removed)
+
+/obj/item/weapon/tank/plasma/proc/ignite()
+ var/fuel_moles = air_contents.toxins + air_contents.oxygen/6
+ var/strength = 1
+
+ var/turf/ground_zero = get_turf(loc)
+ loc = null
+
+ if(air_contents.temperature > (T0C + 400))
+ strength = fuel_moles/15
+
+ explosion(ground_zero, strength, strength*2, strength*3, strength*4)
+
+ else if(air_contents.temperature > (T0C + 250))
+ strength = fuel_moles/20
+
+ explosion(ground_zero, 0, strength, strength*2, strength*3)
+
+ else if(air_contents.temperature > (T0C + 100))
+ strength = fuel_moles/25
+
+ explosion(ground_zero, 0, 0, strength, strength*3)
+
+ else
+ ground_zero.assume_air(air_contents)
+ ground_zero.hotspot_expose(1000, 125)
+
+ if(src.master)
+ del(src.master)
+ del(src)
+
+/obj/item/weapon/tank/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+
+ if (istype(W, /obj/item/weapon/flamethrower))
+ var/obj/item/weapon/flamethrower/F = W
+ if ((!F.status)||(F.ptank)) return
+ src.master = F
+ F.ptank = src
+ user.before_take_item(src)
+ src.loc = F
+ return
diff --git a/code/game/objects/tank.dm b/code/game/objects/tanks/tanks.dm
similarity index 50%
rename from code/game/objects/tank.dm
rename to code/game/objects/tanks/tanks.dm
index 2544bf75a81..aa785fc41f2 100644
--- a/code/game/objects/tank.dm
+++ b/code/game/objects/tanks/tanks.dm
@@ -1,10 +1,6 @@
-
/obj/item/weapon/tank
name = "tank"
icon = 'icons/obj/tank.dmi'
-
- var/datum/gas_mixture/air_contents = null
- var/distribute_pressure = ONE_ATMOSPHERE
flags = FPRINT | TABLEPASS | CONDUCT
slot_flags = SLOT_BACK
@@ -14,37 +10,58 @@
throwforce = 10.0
throw_speed = 1
throw_range = 4
+
+ var/datum/gas_mixture/air_contents = null
+ var/distribute_pressure = ONE_ATMOSPHERE
+ var/integrity = 3
var/volume = 70
+/obj/item/weapon/tank/New()
+ ..()
-/obj/item/weapon/tank/anesthetic
- name = "Gas Tank (Sleeping Agent)"
- desc = "A N2O/O2 gas mix"
- icon_state = "anesthetic"
- item_state = "an_tank"
+ src.air_contents = new /datum/gas_mixture()
+ src.air_contents.volume = volume //liters
+ src.air_contents.temperature = T20C
+ processing_objects.Add(src)
+ return
-/obj/item/weapon/tank/air
- name = "Gas Tank (Air Mix)"
- desc = "Mixed anyone?"
- icon_state = "oxygen"
+/obj/item/weapon/tank/Del()
+ if(air_contents)
+ del(air_contents)
+ processing_objects.Remove(src)
- examine()
- set src in usr
- ..()
- if(air_contents.oxygen < 1 && loc==usr)
- usr << "\red The meter on the [src.name] indicates you are almost out of air!"
- usr << sound('sound/effects/alert.ogg')
+ ..()
+/obj/item/weapon/tank/examine()
+ var/obj/icon = src
+ if (istype(src.loc, /obj/item/assembly))
+ icon = src.loc
+ if (!in_range(src, usr))
+ if (icon == src) usr << "\blue It's \a \icon[icon][src]! If you want any more information you'll need to get closer."
+ return
-/obj/item/weapon/tank/plasma
- name = "Gas Tank (BIOHAZARD)"
- desc = "Contains dangerous plasma. Do not inhale."
- icon_state = "plasma"
- flags = FPRINT | TABLEPASS | CONDUCT
- slot_flags = null //they have no straps!
+ var/celsius_temperature = src.air_contents.temperature-T0C
+ var/descriptive
+
+ if (celsius_temperature < 20)
+ descriptive = "cold"
+ else if (celsius_temperature < 40)
+ descriptive = "room temperature"
+ else if (celsius_temperature < 80)
+ descriptive = "lukewarm"
+ else if (celsius_temperature < 100)
+ descriptive = "warm"
+ else if (celsius_temperature < 300)
+ descriptive = "hot"
+ else
+ descriptive = "furiously hot"
+
+ usr << "\blue \The \icon[icon][src] feels [descriptive]"
+
+ return
/obj/item/weapon/tank/blob_act()
if(prob(50))
@@ -57,6 +74,47 @@
del(src)
+/obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ var/obj/icon = src
+ if (istype(src.loc, /obj/item/assembly))
+ icon = src.loc
+ if ((istype(W, /obj/item/device/analyzer) || (istype(W, /obj/item/device/pda))) && get_dist(user, src) <= 1)
+
+ for (var/mob/O in viewers(user, null))
+ O << "\red [user] has used [W] on \icon[icon] [src]"
+
+ var/pressure = air_contents.return_pressure()
+
+ var/total_moles = air_contents.total_moles()
+
+ user << "\blue Results of analysis of \icon[icon]"
+ if (total_moles>0)
+ var/o2_concentration = air_contents.oxygen/total_moles
+ var/n2_concentration = air_contents.nitrogen/total_moles
+ var/co2_concentration = air_contents.carbon_dioxide/total_moles
+ var/plasma_concentration = air_contents.toxins/total_moles
+
+ var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration)
+
+ user << "\blue Pressure: [round(pressure,0.1)] kPa"
+ user << "\blue Nitrogen: [round(n2_concentration*100)]%"
+ user << "\blue Oxygen: [round(o2_concentration*100)]%"
+ user << "\blue CO2: [round(co2_concentration*100)]%"
+ user << "\blue Plasma: [round(plasma_concentration*100)]%"
+ if(unknown_concentration>0.01)
+ user << "\red Unknown: [round(unknown_concentration*100)]%"
+ user << "\blue Temperature: [round(air_contents.temperature-T0C)]°C"
+ else
+ user << "\blue Tank is empty!"
+ src.add_fingerprint(user)
+ else if (istype(W,/obj/item/latexballon))
+ var/obj/item/latexballon/LB = W
+ LB.blow(src)
+ src.add_fingerprint(user)
+ return
+
+
/obj/item/weapon/tank/attack_self(mob/user as mob)
if (!(src.air_contents))
return
@@ -120,243 +178,79 @@
return
return
-/obj/item/weapon/tank
- remove_air(amount)
- return air_contents.remove(amount)
- return_air()
- return air_contents
+/obj/item/weapon/tank/remove_air(amount)
+ return air_contents.remove(amount)
- assume_air(datum/gas_mixture/giver)
- air_contents.merge(giver)
+/obj/item/weapon/tank/return_air()
+ return air_contents
- check_status()
- return 1
+/obj/item/weapon/tank/assume_air(datum/gas_mixture/giver)
+ air_contents.merge(giver)
- proc/remove_air_volume(volume_to_return)
- if(!air_contents)
- return null
+ check_status()
+ return 1
- var/tank_pressure = air_contents.return_pressure()
- if(tank_pressure < distribute_pressure)
- distribute_pressure = tank_pressure
+/obj/item/weapon/tank/proc/remove_air_volume(volume_to_return)
+ if(!air_contents)
+ return null
- var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
+ var/tank_pressure = air_contents.return_pressure()
+ if(tank_pressure < distribute_pressure)
+ distribute_pressure = tank_pressure
- return remove_air(moles_needed)
+ var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature)
- process()
- //Allow for reactions
+ return remove_air(moles_needed)
+
+/obj/item/weapon/tank/process()
+ //Allow for reactions
+ air_contents.react()
+ check_status()
+
+
+/obj/item/weapon/tank/proc/check_status()
+ //Handle exploding, leaking, and rupturing of the tank
+
+ if(!air_contents)
+ return 0
+
+ var/pressure = air_contents.return_pressure()
+ if(pressure > TANK_FRAGMENT_PRESSURE)
+ if(!istype(src.loc,/obj/item/device/transfer_valve))
+ message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].")
+ log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].")
+ //world << "\blue[x],[y] tank is exploding: [pressure] kPa"
+ //Give the gas a chance to build up more pressure through reacting
air_contents.react()
+ air_contents.react()
+ air_contents.react()
+ pressure = air_contents.return_pressure()
+ var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE
+ range = min(range, MAX_EXPLOSION_RANGE) // was 8 - - - Changed to a configurable define -- TLE
+ var/turf/epicenter = get_turf(loc)
- check_status()
+ //world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]"
- var/integrity = 3
- proc/check_status()
- //Handle exploding, leaking, and rupturing of the tank
+ explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5))
+ del(src)
- if(!air_contents)
- return 0
-
- var/pressure = air_contents.return_pressure()
- if(pressure > TANK_FRAGMENT_PRESSURE)
- if(!istype(src.loc,/obj/item/device/transfer_valve))
- message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].")
- log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].")
- //world << "\blue[x],[y] tank is exploding: [pressure] kPa"
- //Give the gas a chance to build up more pressure through reacting
- air_contents.react()
- air_contents.react()
- air_contents.react()
- pressure = air_contents.return_pressure()
-
- var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE
- range = min(range, MAX_EXPLOSION_RANGE) // was 8 - - - Changed to a configurable define -- TLE
- var/turf/epicenter = get_turf(loc)
-
- //world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]"
-
- explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5))
+ else if(pressure > TANK_RUPTURE_PRESSURE)
+ //world << "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]"
+ if(integrity <= 0)
+ loc.assume_air(air_contents)
+ playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
del(src)
-
- else if(pressure > TANK_RUPTURE_PRESSURE)
- //world << "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]"
- if(integrity <= 0)
- loc.assume_air(air_contents)
- playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
- del(src)
- else
- integrity--
-
- else if(pressure > TANK_LEAK_PRESSURE)
- //world << "\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]"
- if(integrity <= 0)
- var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25)
- loc.assume_air(leaked_gas)
- else
- integrity--
-
- else if(integrity < 3)
- integrity++
-
-
-/obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- var/obj/icon = src
- if (istype(src.loc, /obj/item/assembly))
- icon = src.loc
- if ((istype(W, /obj/item/device/analyzer) || (istype(W, /obj/item/device/pda))) && get_dist(user, src) <= 1)
-
- for (var/mob/O in viewers(user, null))
- O << "\red [user] has used [W] on \icon[icon] [src]"
-
- var/pressure = air_contents.return_pressure()
-
- var/total_moles = air_contents.total_moles()
-
- user << "\blue Results of analysis of \icon[icon]"
- if (total_moles>0)
- var/o2_concentration = air_contents.oxygen/total_moles
- var/n2_concentration = air_contents.nitrogen/total_moles
- var/co2_concentration = air_contents.carbon_dioxide/total_moles
- var/plasma_concentration = air_contents.toxins/total_moles
-
- var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration)
-
- user << "\blue Pressure: [round(pressure,0.1)] kPa"
- user << "\blue Nitrogen: [round(n2_concentration*100)]%"
- user << "\blue Oxygen: [round(o2_concentration*100)]%"
- user << "\blue CO2: [round(co2_concentration*100)]%"
- user << "\blue Plasma: [round(plasma_concentration*100)]%"
- if(unknown_concentration>0.01)
- user << "\red Unknown: [round(unknown_concentration*100)]%"
- user << "\blue Temperature: [round(air_contents.temperature-T0C)]°C"
else
- user << "\blue Tank is empty!"
- src.add_fingerprint(user)
- else if (istype(W,/obj/item/latexballon))
- var/obj/item/latexballon/LB = W
- LB.blow(src)
- src.add_fingerprint(user)
- return
+ integrity--
-/obj/item/weapon/tank/New()
- ..()
+ else if(pressure > TANK_LEAK_PRESSURE)
+ //world << "\blue[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]"
+ if(integrity <= 0)
+ var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25)
+ loc.assume_air(leaked_gas)
+ else
+ integrity--
- src.air_contents = new /datum/gas_mixture()
- src.air_contents.volume = volume //liters
- src.air_contents.temperature = T20C
-
- processing_objects.Add(src)
-
- return
-
-/obj/item/weapon/tank/Del()
- if(air_contents)
- del(air_contents)
-
- processing_objects.Remove(src)
-
- ..()
-
-/obj/item/weapon/tank/examine()
- var/obj/icon = src
- if (istype(src.loc, /obj/item/assembly))
- icon = src.loc
- if (!in_range(src, usr))
- if (icon == src) usr << "\blue It's \a \icon[icon][src]! If you want any more information you'll need to get closer."
- return
-
- var/celsius_temperature = src.air_contents.temperature-T0C
- var/descriptive
-
- if (celsius_temperature < 20)
- descriptive = "cold"
- else if (celsius_temperature < 40)
- descriptive = "room temperature"
- else if (celsius_temperature < 80)
- descriptive = "lukewarm"
- else if (celsius_temperature < 100)
- descriptive = "warm"
- else if (celsius_temperature < 300)
- descriptive = "hot"
- else
- descriptive = "furiously hot"
-
- usr << "\blue \The \icon[icon][src] feels [descriptive]"
-
- return
-
-/obj/item/weapon/tank/air/New()
- ..()
-
- src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
- src.air_contents.nitrogen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
- return
-
-
-/obj/item/weapon/tank/anesthetic/New()
- ..()
-
- src.air_contents.oxygen = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
-
- var/datum/gas/sleeping_agent/trace_gas = new()
- trace_gas.moles = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
-
- src.air_contents.trace_gases += trace_gas
- return
-
-/obj/item/weapon/tank/plasma/New()
- ..()
-
- src.air_contents.toxins = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C)
- return
-
-
-/obj/item/weapon/tank/plasma/proc/release()
- var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles())
-
- loc.assume_air(removed)
-
-/obj/item/weapon/tank/plasma/proc/ignite()
- var/fuel_moles = air_contents.toxins + air_contents.oxygen/6
- var/strength = 1
-
- var/turf/ground_zero = get_turf(loc)
- loc = null
-
- if(air_contents.temperature > (T0C + 400))
- strength = fuel_moles/15
-
- explosion(ground_zero, strength, strength*2, strength*3, strength*4)
-
- else if(air_contents.temperature > (T0C + 250))
- strength = fuel_moles/20
-
- explosion(ground_zero, 0, strength, strength*2, strength*3)
-
- else if(air_contents.temperature > (T0C + 100))
- strength = fuel_moles/25
-
- explosion(ground_zero, 0, 0, strength, strength*3)
-
- else
- ground_zero.assume_air(air_contents)
- ground_zero.hotspot_expose(1000, 125)
-
- if(src.master)
- del(src.master)
- del(src)
-
-/obj/item/weapon/tank/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob)
-
- ..()
-// PantsNote: More flamethrower assembly code. WOO!
- if (istype(W, /obj/item/weapon/flamethrower))
- var/obj/item/weapon/flamethrower/F = W
- if ((!F.status)||(F.ptank)) return
- src.master = F
- F.ptank = src
- user.before_take_item(src)
- src.loc = F
- return
+ else if(integrity < 3)
+ integrity++
\ No newline at end of file
diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm
index 8df8ecabfe2..c5c738c9c84 100644
--- a/code/game/objects/weapons.dm
+++ b/code/game/objects/weapons.dm
@@ -1,95 +1,4 @@
-//Banhammer deserves to be the first thing here
-
-/obj/item/weapon/banhammer/attack(mob/M as mob, mob/user as mob)
- M << " You have been banned FOR NO REISIN by [user]"
- user << " You have BANNED [M]"
-
-/obj/effect/mine/proc/triggerrad(obj)
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- obj:radiation += 50
- randmutb(obj)
- domutcheck(obj,null)
- spawn(0)
- del(src)
-
-/obj/effect/mine/proc/triggerstun(obj)
- if(ismob(obj))
- var/mob/M = obj
- M.Stun(30)
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- spawn(0)
- del(src)
-
-/obj/effect/mine/proc/triggern2o(obj)
- //example: n2o triggerproc
- //note: im lazy
-
- for (var/turf/simulated/floor/target in range(1,src))
- if(!target.blocks_air)
- if(target.parent)
- target.parent.suspend_group_processing()
-
- var/datum/gas_mixture/payload = new
- var/datum/gas/sleeping_agent/trace_gas = new
-
- trace_gas.moles = 30
- payload += trace_gas
-
- target.air.merge(payload)
-
- spawn(0)
- del(src)
-
-/obj/effect/mine/proc/triggerplasma(obj)
- for (var/turf/simulated/floor/target in range(1,src))
- if(!target.blocks_air)
- if(target.parent)
- target.parent.suspend_group_processing()
-
- var/datum/gas_mixture/payload = new
-
- payload.toxins = 30
-
- target.air.merge(payload)
-
- target.hotspot_expose(1000, CELL_VOLUME)
-
- spawn(0)
- del(src)
-
-/obj/effect/mine/proc/triggerkick(obj)
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- del(obj:client)
- spawn(0)
- del(src)
-
-/obj/effect/mine/proc/explode(obj)
- explosion(loc, 0, 1, 2, 3)
- spawn(0)
- del(src)
-
-
-/obj/effect/mine/HasEntered(AM as mob|obj)
- Bumped(AM)
-
-/obj/effect/mine/Bumped(mob/M as mob|obj)
-
- if(triggered) return
-
- if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey))
- for(var/mob/O in viewers(world.view, src.loc))
- O << "[M] triggered the \icon[src] [src]"
- triggered = 1
- call(src,triggerproc)(M)
-
-/obj/effect/mine/New()
- icon_state = "uglyminearmed"
+//TODO: Move these into atom_procs.dm after carn's finished with it, otherwise it'll conflict - Nodrak
/atom/proc/ex_act()
return
@@ -114,99 +23,4 @@
if (I)
I.hit()
return
- return
-
-/obj/item/weapon/mousetrap/examine()
- set src in oview(12)
- ..()
- if(armed)
- usr << "\red It looks like it's armed."
-
-/obj/item/weapon/mousetrap/proc/triggered(mob/target as mob, var/type = "feet")
- if(!armed)
- return
- var/datum/organ/external/affecting = null
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- switch(type)
- if("feet")
- if(!H.shoes)
- affecting = H.get_organ(pick("l_leg", "r_leg"))
- H.Weaken(3)
- if("l_hand", "r_hand")
- if(!H.gloves)
- affecting = H.get_organ(type)
- H.Stun(3)
- if(affecting)
- if(affecting.take_damage(1, 0))
- H.UpdateDamageIcon()
- H.updatehealth()
- else if(ismouse(target))
- var/mob/living/simple_animal/mouse/M = target
- src.visible_message("\red SPLAT!")
- M.splat()
- playsound(target.loc, 'sound/effects/snap.ogg', 50, 1)
- icon_state = "mousetrap"
- armed = 0
-/*
- else if (ismouse(target))
- target.adjustBruteLoss(100)
-*/
-
-/obj/item/weapon/mousetrap/attack_self(mob/living/user as mob)
- if(!armed)
- icon_state = "mousetraparmed"
- user << "\blue You arm the mousetrap."
- else
- icon_state = "mousetrap"
- if(( (user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
- var/which_hand = "l_hand"
- if(!user.hand)
- which_hand = "r_hand"
- src.triggered(user, which_hand)
- user << "\red You accidentally trigger the mousetrap!"
- for(var/mob/O in viewers(user, null))
- if(O == user)
- continue
- O.show_message("\red [user] accidentally sets off the mousetrap, breaking their fingers.", 1)
- return
- user << "\blue You disarm the mousetrap."
- armed = !armed
- playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3)
-
-/obj/item/weapon/mousetrap/attack_hand(mob/living/user as mob)
- if(armed)
- if(( (user.getBrainLoss() >= 60 || CLUMSY in user.mutations)) && prob(50))
- var/which_hand = "l_hand"
- if(!user.hand)
- which_hand = "r_hand"
- src.triggered(user, which_hand)
- user << "\red You accidentally trigger the mousetrap!"
- for(var/mob/O in viewers(user, null))
- if(O == user)
- continue
- O.show_message("\red [user] accidentally sets off the mousetrap, breaking their fingers.", 1)
- return
- ..()
-
-/obj/item/weapon/mousetrap/HasEntered(AM as mob|obj)
- if(armed)
- if(ishuman(AM))
- var/mob/living/carbon/H = AM
- if(H.m_intent == "run")
- src.triggered(H)
- H << "\red You accidentally step on the mousetrap!"
- for(var/mob/O in viewers(H, null))
- if(O == H)
- continue
- O.show_message("\red [H] accidentally steps on the mousetrap.", 1)
- if(ismouse(AM))
- triggered(AM)
- ..()
-
-/obj/item/weapon/mousetrap/hitby(A as mob|obj)
- if(!armed)
- return ..()
- for(var/mob/O in viewers(src, null))
- O.show_message("\red The mousetrap is triggered by [A].", 1)
- src.triggered(null)
+ return
\ No newline at end of file
diff --git a/tgstation.dme b/tgstation.dme
index 179a1e7a9a7..e69028317c5 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -58,9 +58,6 @@
#define FILE_DIR "code/game/mecha/medical"
#define FILE_DIR "code/game/mecha/working"
#define FILE_DIR "code/game/objects"
-#define FILE_DIR "code/game/objects/alien"
-#define FILE_DIR "code/game/objects/closets"
-#define FILE_DIR "code/game/objects/closets/secure"
#define FILE_DIR "code/game/objects/devices"
#define FILE_DIR "code/game/objects/devices/PDA"
#define FILE_DIR "code/game/objects/effects"
@@ -75,6 +72,9 @@
#define FILE_DIR "code/game/objects/stacks"
#define FILE_DIR "code/game/objects/storage"
#define FILE_DIR "code/game/objects/structures"
+#define FILE_DIR "code/game/objects/structures/crates_lockers"
+#define FILE_DIR "code/game/objects/structures/crates_lockers/closets"
+#define FILE_DIR "code/game/objects/structures/crates_lockers/closets/secure"
#define FILE_DIR "code/game/objects/tanks"
#define FILE_DIR "code/game/turfs"
#define FILE_DIR "code/game/vehicles"
@@ -484,6 +484,7 @@
#include "code\game\machinery\teleporter.dm"
#include "code\game\machinery\turrets.dm"
#include "code\game\machinery\vending.dm"
+#include "code\game\machinery\washing_machine.dm"
#include "code\game\machinery\atmoalter\area_atmos_computer.dm"
#include "code\game\machinery\atmoalter\canister.dm"
#include "code\game\machinery\atmoalter\meter.dm"
@@ -573,59 +574,13 @@
#include "code\game\objects\empulse.dm"
#include "code\game\objects\explosion.dm"
#include "code\game\objects\explosion_recursive.dm"
-#include "code\game\objects\grille.dm"
+#include "code\game\objects\facehugger.dm"
#include "code\game\objects\items.dm"
-#include "code\game\objects\kitchen.dm"
-#include "code\game\objects\ladders.dm"
-#include "code\game\objects\largecrate.dm"
-#include "code\game\objects\mineral_doors.dm"
-#include "code\game\objects\noticeboard.dm"
#include "code\game\objects\object_procs.dm"
-#include "code\game\objects\portals.dm"
#include "code\game\objects\shooting_range.dm"
-#include "code\game\objects\sign_decals.dm"
-#include "code\game\objects\stool.dm"
#include "code\game\objects\structures.dm"
-#include "code\game\objects\tables_racks.dm"
-#include "code\game\objects\tank.dm"
#include "code\game\objects\toys.dm"
-#include "code\game\objects\transfer_valve.dm"
-#include "code\game\objects\uplinks.dm"
-#include "code\game\objects\washing_machine.dm"
-#include "code\game\objects\watercloset.dm"
#include "code\game\objects\weapons.dm"
-#include "code\game\objects\alien\acid.dm"
-#include "code\game\objects\alien\defines.dm"
-#include "code\game\objects\alien\egg.dm"
-#include "code\game\objects\alien\facehugger.dm"
-#include "code\game\objects\alien\nest.dm"
-#include "code\game\objects\alien\resin.dm"
-#include "code\game\objects\alien\weeds.dm"
-#include "code\game\objects\closets\bombsuit.dm"
-#include "code\game\objects\closets\emergency.dm"
-#include "code\game\objects\closets\extinguisher.dm"
-#include "code\game\objects\closets\fireaxe.dm"
-#include "code\game\objects\closets\firecloset.dm"
-#include "code\game\objects\closets\fitnesscloset.dm"
-#include "code\game\objects\closets\gimmick.dm"
-#include "code\game\objects\closets\gmcloset.dm"
-#include "code\game\objects\closets\janitor.dm"
-#include "code\game\objects\closets\kitchen.dm"
-#include "code\game\objects\closets\l3closet.dm"
-#include "code\game\objects\closets\malfunction.dm"
-#include "code\game\objects\closets\nuclear.dm"
-#include "code\game\objects\closets\syndicate.dm"
-#include "code\game\objects\closets\thunderdome.dm"
-#include "code\game\objects\closets\wardrobe.dm"
-#include "code\game\objects\closets\secure\bar.dm"
-#include "code\game\objects\closets\secure\cargo.dm"
-#include "code\game\objects\closets\secure\engineering.dm"
-#include "code\game\objects\closets\secure\hydroponics.dm"
-#include "code\game\objects\closets\secure\medical.dm"
-#include "code\game\objects\closets\secure\personal.dm"
-#include "code\game\objects\closets\secure\scientist.dm"
-#include "code\game\objects\closets\secure\secure_closets.dm"
-#include "code\game\objects\closets\secure\security.dm"
#include "code\game\objects\devices\aicard.dm"
#include "code\game\objects\devices\chameleonproj.dm"
#include "code\game\objects\devices\flash.dm"
@@ -639,14 +594,20 @@
#include "code\game\objects\devices\shields.dm"
#include "code\game\objects\devices\taperecorder.dm"
#include "code\game\objects\devices\traitordevices.dm"
+#include "code\game\objects\devices\transfer_valve.dm"
+#include "code\game\objects\devices\uplinks.dm"
#include "code\game\objects\devices\PDA\cart.dm"
#include "code\game\objects\devices\PDA\chatroom.dm"
#include "code\game\objects\devices\PDA\PDA.dm"
#include "code\game\objects\devices\PDA\radio.dm"
+#include "code\game\objects\effects\aliens.dm"
#include "code\game\objects\effects\biomass.dm"
#include "code\game\objects\effects\effect_system.dm"
#include "code\game\objects\effects\gibs.dm"
#include "code\game\objects\effects\glowshroom.dm"
+#include "code\game\objects\effects\mines.dm"
+#include "code\game\objects\effects\portals.dm"
+#include "code\game\objects\effects\signs.dm"
#include "code\game\objects\effects\decals\blood.dm"
#include "code\game\objects\effects\decals\contraband.dm"
#include "code\game\objects\effects\spawners\bombspawner.dm"
@@ -680,6 +641,7 @@
#include "code\game\objects\items\weapons\manuals.dm"
#include "code\game\objects\items\weapons\medical.dm"
#include "code\game\objects\items\weapons\mop.dm"
+#include "code\game\objects\items\weapons\mousetraps.dm"
#include "code\game\objects\items\weapons\paint.dm"
#include "code\game\objects\items\weapons\paiwire.dm"
#include "code\game\objects\items\weapons\plant_bag.dm"
@@ -703,6 +665,7 @@
#include "code\game\objects\items\weapons\implants\implantfreedom.dm"
#include "code\game\objects\items\weapons\implants\implantnanoaug.dm"
#include "code\game\objects\items\weapons\implants\implantpad.dm"
+#include "code\game\objects\items\weapons\implants\implantuplink.dm"
#include "code\game\objects\radio\beacon.dm"
#include "code\game\objects\radio\electropack.dm"
#include "code\game\objects\radio\encryptionkey.dm"
@@ -729,20 +692,57 @@
#include "code\game\objects\storage\storage.dm"
#include "code\game\objects\storage\toolbox.dm"
#include "code\game\objects\storage\uplink_kits.dm"
-#include "code\game\objects\structures\closets.dm"
-#include "code\game\objects\structures\crates.dm"
+#include "code\game\objects\structures\aliennests.dm"
#include "code\game\objects\structures\displaycase.dm"
#include "code\game\objects\structures\door_assembly.dm"
#include "code\game\objects\structures\electricchair.dm"
+#include "code\game\objects\structures\grille.dm"
+#include "code\game\objects\structures\kitchen_spike.dm"
+#include "code\game\objects\structures\ladders.dm"
#include "code\game\objects\structures\lamarr_cage.dm"
+#include "code\game\objects\structures\mineral_doors.dm"
#include "code\game\objects\structures\mirror.dm"
#include "code\game\objects\structures\mop_bucket.dm"
#include "code\game\objects\structures\musician.dm"
+#include "code\game\objects\structures\noticeboard.dm"
+#include "code\game\objects\structures\stool_chair_bed.dm"
+#include "code\game\objects\structures\tables_racks.dm"
+#include "code\game\objects\structures\target_stake.dm"
+#include "code\game\objects\structures\watercloset.dm"
#include "code\game\objects\structures\windoor_assembly.dm"
#include "code\game\objects\structures\window.dm"
+#include "code\game\objects\structures\crates_lockers\closets.dm"
+#include "code\game\objects\structures\crates_lockers\crates.dm"
+#include "code\game\objects\structures\crates_lockers\largecrate.dm"
+#include "code\game\objects\structures\crates_lockers\closets\bombsuit.dm"
+#include "code\game\objects\structures\crates_lockers\closets\emergency.dm"
+#include "code\game\objects\structures\crates_lockers\closets\extinguisher.dm"
+#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm"
+#include "code\game\objects\structures\crates_lockers\closets\firecloset.dm"
+#include "code\game\objects\structures\crates_lockers\closets\fitnesscloset.dm"
+#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm"
+#include "code\game\objects\structures\crates_lockers\closets\gmcloset.dm"
+#include "code\game\objects\structures\crates_lockers\closets\janitor.dm"
+#include "code\game\objects\structures\crates_lockers\closets\kitchen.dm"
+#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm"
+#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm"
+#include "code\game\objects\structures\crates_lockers\closets\nuclear.dm"
+#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm"
+#include "code\game\objects\structures\crates_lockers\closets\thunderdome.dm"
+#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm"
#include "code\game\objects\tanks\emergency.dm"
#include "code\game\objects\tanks\jetpack.dm"
-#include "code\game\objects\tanks\oxygen.dm"
+#include "code\game\objects\tanks\tank_types.dm"
+#include "code\game\objects\tanks\tanks.dm"
#include "code\game\turfs\turf.dm"
#include "code\game\vehicles\vehicle.dm"
#include "code\game\vehicles\airtight\airtight.dm"