diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
deleted file mode 100644
index fc617dacdc9..00000000000
--- a/code/defines/obj/weapon.dm
+++ /dev/null
@@ -1,1035 +0,0 @@
-/obj/item/weapon/phone
- name = "red phone"
- desc = "Should anything ever go wrong..."
- icon = 'icons/obj/items.dmi'
- icon_state = "red_phone"
- flags = CONDUCT
- force = 3.0
- throwforce = 2.0
- throw_speed = 1
- throw_range = 4
- w_class = 2
- attack_verb = list("called", "rang")
- hitsound = 'sound/weapons/ring.ogg'
-
-/obj/item/weapon/rsp
- name = "\improper Rapid-Seed-Producer (RSP)"
- desc = "A device used to rapidly deploy seeds."
- icon = 'icons/obj/items.dmi'
- icon_state = "rcd"
- opacity = 0
- density = 0
- anchored = 0.0
- var/matter = 0
- var/mode = 1
- w_class = 3.0
-
-/obj/item/weapon/bananapeel
- name = "banana peel"
- desc = "A peel from a banana."
- icon = 'icons/obj/items.dmi'
- icon_state = "banana_peel"
- item_state = "banana_peel"
- w_class = 1.0
- throwforce = 0
- throw_speed = 4
- throw_range = 20
-
-/obj/item/weapon/corncob
- name = "corn cob"
- desc = "A reminder of meals gone by."
- icon = 'icons/obj/harvest.dmi'
- icon_state = "corncob"
- item_state = "corncob"
- w_class = 1.0
- throwforce = 0
- throw_speed = 4
- throw_range = 20
-
-/obj/item/weapon/soap
- name = "soap"
- desc = "A cheap bar of soap. Doesn't smell."
- gender = PLURAL
- icon = 'icons/obj/items.dmi'
- icon_state = "soap"
- w_class = 1.0
- throwforce = 0
- throw_speed = 4
- throw_range = 20
- discrete = 1
- var/cleanspeed = 50 //slower than mop
-
-/obj/item/weapon/soap/nanotrasen
- desc = "A Nanotrasen brand bar of soap. Smells of plasma."
- icon_state = "soapnt"
-
-/obj/item/weapon/soap/deluxe
- icon_state = "soapdeluxe"
-
-/obj/item/weapon/soap/deluxe/New()
- desc = "A deluxe Waffle Co. brand bar of soap. Smells of comdoms."
- cleanspeed = 40 //same speed as mop because deluxe -- captain gets one of these
-
-/obj/item/weapon/soap/syndie
- desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster."
- icon_state = "soapsyndie"
- cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes
-
-/obj/item/weapon/bikehorn
- name = "bike horn"
- desc = "A horn off of a bicycle."
- icon = 'icons/obj/items.dmi'
- icon_state = "bike_horn"
- item_state = "bike_horn"
- hitsound = 'sound/items/bikehorn.ogg'
- throwforce = 3
- w_class = 1.0
- throw_speed = 3
- throw_range = 15
- attack_verb = list("HONKED")
- var/spam_flag = 0
-
-
-/obj/item/weapon/c_tube
- name = "cardboard tube"
- desc = "A tube... of cardboard."
- icon = 'icons/obj/items.dmi'
- icon_state = "c_tube"
- throwforce = 1
- w_class = 1.0
- throw_speed = 4
- throw_range = 5
-
-
-/obj/item/weapon/cane
- name = "cane"
- desc = "A cane used by a true gentlemen. Or a clown."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "cane"
- item_state = "stick"
- flags = CONDUCT
- force = 5.0
- throwforce = 7.0
- w_class = 2.0
- m_amt = 50
- attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed")
-
-/obj/item/weapon/disk
- name = "disk"
- icon = 'icons/obj/items.dmi'
-
-/obj/item/weapon/disk/nuclear
- name = "nuclear authentication disk"
- desc = "Better keep this safe."
- icon_state = "nucleardisk"
- item_state = "card-id"
- w_class = 1.0
-
-/*
-/obj/item/weapon/disk/nuclear/pickup(mob/living/user as mob)
- if(issyndicate(user))
- set_security_level(3)*/ //Nuke Ops rework makes stealth approach significantly harder; this makes it damn near impossible; besides, it's horrendously meta.
-
-/*
-/obj/item/weapon/game_kit
- name = "Gaming Kit"
- icon = 'icons/obj/items.dmi'
- icon_state = "game_kit"
- var/selected = null
- var/board_stat = null
- var/data = ""
- var/base_url = "http://svn.slurm.us/public/spacestation13/misc/game_kit"
- item_state = "sheet-metal"
- w_class = 5.0
-*/
-
-/obj/item/weapon/gift
- name = "gift"
- desc = "A wrapped item."
- icon = 'icons/obj/items.dmi'
- icon_state = "gift3"
- var/size = 3.0
- var/obj/item/gift = null
- item_state = "gift"
- w_class = 4.0
-
-/obj/item/weapon/legcuffs
- name = "legcuffs"
- desc = "Use this to keep prisoners in line."
- gender = PLURAL
- icon = 'icons/obj/items.dmi'
- icon_state = "handcuff"
- flags = CONDUCT
- throwforce = 0
- w_class = 3.0
- origin_tech = "materials=1"
- var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute
-
-/obj/item/weapon/legcuffs/beartrap
- name = "bear trap"
- throw_speed = 1
- throw_range = 1
- icon_state = "beartrap0"
- desc = "A trap used to catch bears and other legged creatures."
- var/armed = 0
- var/obj/item/weapon/grenade/iedcasing/IED = null
-
- suicide_act(mob/user)
- viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide."
- return (BRUTELOSS)
-
-/obj/item/weapon/legcuffs/beartrap/attack_self(mob/user as mob)
- ..()
- if(ishuman(user) && !user.stat && !user.restrained())
- armed = !armed
- icon_state = "beartrap[armed]"
- user << "[src] is now [armed ? "armed" : "disarmed"]"
-
-/obj/item/weapon/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive.
- if(istype(I, /obj/item/weapon/grenade/iedcasing))
- if(IED)
- user << "This beartrap already has an IED hooked up to it!"
- return
- IED = I
- switch(IED.assembled)
- if(0,1) //if it's not fueled/hooked up
- user << "You haven't prepared this IED yet!"
- IED = null
- return
- if(2,3)
- user.drop_item(src)
- I.loc = src
- var/turf/bombturf = get_turf(src)
- var/area/A = get_area(bombturf)
- var/log_str = "[key_name(usr)]? has rigged a beartrap with an IED at [A.name] (JMP)."
- message_admins(log_str)
- log_game(log_str)
- user << "You sneak the [IED] underneath the pressure plate and connect the trigger wire."
- desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it."
- else
- user << "You shouldn't be reading this message! Contact a coder or someone, something broke!"
- IED = null
- return
- if(istype(I, /obj/item/weapon/screwdriver))
- if(IED)
- IED.loc = get_turf(src.loc)
- IED = null
- user << "You remove the IED from the [src]."
- return
- ..()
-
-/obj/item/weapon/legcuffs/beartrap/Crossed(AM as mob|obj)
- if(armed)
- if(IED && isturf(src.loc))
- IED.active = 1
- IED.overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled")
- IED.icon_state = initial(icon_state) + "_active"
- IED.assembled = 3
- var/turf/bombturf = get_turf(src)
- var/area/A = get_area(bombturf)
- var/log_str = "[key_name(usr)]? has triggered an IED-rigged [name] at [A.name] (JMP)."
- message_admins(log_str)
- log_game(log_str)
- spawn(IED.det_time)
- IED.prime()
- if(ishuman(AM))
- if(isturf(src.loc))
- var/mob/living/carbon/H = AM
- if(H.m_intent == "run")
- if(H.lying)
- H.apply_damage(20,BRUTE,"chest")
- else
- H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg")))
- armed = 0
- icon_state = "beartrap0"
- playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
- H.visible_message("[H] triggers \the [src].", \
- "You trigger \the [src]!")
- H.legcuffed = src
- src.loc = H
- H.update_inv_legcuffed()
- H << "You step on \the [src]!"
- if(IED && IED.active)
- H << "The [src]'s IED has been activated!"
- feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
- for(var/mob/O in viewers(H, null))
- if(O == H)
- continue
- O.show_message("\red [H] steps on \the [src].", 1)
- if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
- armed = 0
- icon_state = "beartrap0"
- var/mob/living/simple_animal/SA = AM
- playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
- SA.visible_message("[SA] triggers \the [src].", \
- "You trigger \the [src]!")
- SA.health -= 20
- ..()
-
-/obj/item/weapon/legcuffs/bolas
- name = "bolas"
- desc = "An entangling bolas. Throw at your foes to trip them and prevent them from running."
- gender = NEUTER
- icon = 'icons/obj/weapons.dmi'
- icon_override = 'icons/mob/in-hand/swords.dmi'
- icon_state = "bolas"
- siemens_coefficient = 1
- slot_flags = SLOT_BELT
- throwforce = 2
- w_class = 2
- origin_tech = "materials=1"
- attack_verb = list("lashed", "bludgeoned", "whipped")
- force = 4
- breakouttime = 50 //10 seconds
- throw_speed = 1
- throw_range = 10
- var/dispenser = 0
- var/throw_sound = 'sound/weapons/whip.ogg'
- var/trip_prob = 60
- var/thrown_from
-
-/obj/item/weapon/legcuffs/bolas/suicide_act(mob/living/user)
- viewers(user) << "[user] is wrapping the [src.name] around \his neck! It looks like \he's trying to commit suicide."
- return(OXYLOSS)
-
-/obj/item/weapon/legcuffs/bolas/throw_at(var/atom/A, throw_range, throw_speed)
- if(usr && !istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas)) //if there is a user, but not a mech
- if(istype(usr, /mob/living/carbon/human)) //if the user is human
- var/mob/living/carbon/human/H = usr
- if((CLUMSY in H.mutations) && prob(50))
- H <<"You smack yourself in the face while swinging the [src]!"
- H.Stun(2)
- H.drop_item(src)
- return
- if (!thrown_from && usr) //if something hasn't set it already (like a mech does when it launches)
- thrown_from = usr //then the user must have thrown it
- if (!istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas))
- playsound(src, throw_sound, 20, 1) //because mechs play the sound anyways
- var/turf/target = get_turf(A)
- var/atom/movable/adjtarget = new /atom/movable
- var/xadjust = 0
- var/yadjust = 0
- var/scaler = 0 //used to changed the normalised vector to the proper size
- scaler = throw_range / max(abs(target.x - src.x), abs(target.y - src.y)) //whichever is larger magnitude is what we normalise to
- if (target.x - src.x != 0) //just to avoid fucking with math for no reason
- xadjust = round((target.x - src.x) * scaler) //normalised vector is now scaled up to throw_range
- adjtarget.x = src.x + xadjust //the new target at max range
- else
- adjtarget.x = src.x
- if (target.y - src.y != 0)
- yadjust = round((target.y - src.y) * scaler)
- adjtarget.y = src.y + yadjust
- else
- adjtarget.y = src.y
- // log_admin("Adjusted target of [adjtarget.x] and [adjtarget.y], adjusted with [xadjust] and [yadjust] from [scaler]")
- ..(get_turf(adjtarget), throw_range, throw_speed)
- thrown_from = null
-
-/obj/item/weapon/legcuffs/bolas/throw_impact(atom/hit_atom) //Pomf was right, I was wrong - Comic
- if(isliving(hit_atom) && hit_atom != usr) //if the target is a live creature other than the thrower
- var/mob/living/M = hit_atom
- if(ishuman(M)) //if they're a human species
- var/mob/living/carbon/human/H = M
- if(H.m_intent == "run") //if they're set to run (though not necessarily running at that moment)
- if(prob(trip_prob)) //this probability is up for change and mostly a placeholder - Comic
- step(H, H.dir)
- H.visible_message("[H] was tripped by the bolas!","Your legs have been tangled!");
- H.Stun(2) //used instead of setting damage in vars to avoid non-human targets being affected
- H.Weaken(4)
- H.legcuffed = src //applies legcuff properties inherited through legcuffs
- src.loc = H
- H.update_inv_legcuffed()
- if(!H.legcuffed) //in case it didn't happen, we need a safety net
- throw_failed()
- else if(H.legcuffed) //if the target is already legcuffed (has to be walking)
- throw_failed()
- return
- else //walking, but uncuffed, or the running prob() failed
- H << "You stumble over the thrown bolas"
- step(H, H.dir)
- H.Stun(1)
- throw_failed()
- return
- else
- M.Stun(2) //minor stun damage to anything not human
- throw_failed()
- return
-
-/obj/item/weapon/legcuffs/bolas/proc/throw_failed() //called when the throw doesn't entangle
- //log_admin("Logged as [thrown_from]")
- if(!thrown_from || !istype(thrown_from, /mob/living)) //in essence, if we don't know whether a person threw it
- qdel(src) //destroy it, to stop infinite bolases
-
-/obj/item/weapon/legcuffs/bolas/Bump()
- ..()
- throw_failed() //allows a mech bolas to be destroyed
-
-/obj/item/weapon/holosign_creator
- name = "holographic sign projector"
- desc = "A handy-dandy hologaphic projector that displays a janitorial sign."
- icon = 'icons/obj/janitor.dmi'
- icon_state = "signmaker"
- item_state = "electronic"
- force = 5
- w_class = 2
- throwforce = 0
- throw_speed = 3
- throw_range = 7
- origin_tech = "programming=3"
- var/list/signs = list()
- var/max_signs = 10
-
-/obj/item/weapon/holosign_creator/afterattack(atom/target, mob/user, flag)
- if(flag)
- var/turf/T = get_turf(target)
- var/obj/effect/overlay/holograph/H = locate() in T
- if(H)
- user << "You use [src] to destroy [H]."
- signs -= H
- qdel(H)
- else
- if(signs.len < max_signs)
- H = new(get_turf(target))
- signs += H
- user << "You create \a [H] with [src]."
- else
- user << "[src] is projecting at max capacity!"
-
-/obj/item/weapon/holosign_creator/attack(mob/living/carbon/human/M, mob/user)
- return
-
-/obj/item/weapon/holosign_creator/attack_self(mob/user)
- if(signs.len)
- var/list/L = signs.Copy()
- for(var/sign in L)
- qdel(sign)
- signs -= sign
- user << "You clear all active holograms."
-
-/obj/effect/overlay/holograph
- name = "wet floor sign"
- desc = "The words flicker as if they mean nothing."
- icon = 'icons/obj/janitor.dmi'
- icon_state = "holosign"
- anchored = 1
-
-/obj/item/weapon/caution
- desc = "Caution! Wet Floor!"
- name = "wet floor sign"
- icon = 'icons/obj/janitor.dmi'
- icon_state = "caution"
- force = 1.0
- throwforce = 3.0
- throw_speed = 1
- throw_range = 5
- w_class = 2.0
- attack_verb = list("warned", "cautioned", "smashed")
-
- proximity_sign
- var/timing = 0
- var/armed = 0
- var/timepassed = 0
-
- attack_self(mob/user as mob)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.mind.assigned_role != "Janitor")
- return
- if(armed)
- armed = 0
- user << "\blue You disarm \the [src]."
- return
- timing = !timing
- if(timing)
- processing_objects.Add(src)
- else
- armed = 0
- timepassed = 0
- H << "\blue You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]"
-
- process()
- if(!timing)
- processing_objects.Remove(src)
- timepassed++
- if(timepassed >= 15 && !armed)
- armed = 1
- timing = 0
-
- HasProximity(atom/movable/AM as mob|obj)
- if(armed)
- if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain))
- var/mob/living/carbon/C = AM
- if(C.m_intent != "walk")
- src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"")
- explosion(src.loc,-1,0,2)
- if(ishuman(C))
- dead_legs(C)
- if(src)
- qdel(src)
-
- proc/dead_legs(mob/living/carbon/human/H as mob)
- var/obj/item/organ/external/l = H.get_organ("l_leg")
- var/obj/item/organ/external/r = H.get_organ("r_leg")
- if(l && !(l.status & ORGAN_DESTROYED))
- l.status |= ORGAN_DESTROYED
- if(r && !(r.status & ORGAN_DESTROYED))
- r.status |= ORGAN_DESTROYED
-
-/obj/item/weapon/caution/cone
- desc = "This cone is trying to warn you of something!"
- name = "warning cone"
- icon_state = "cone"
-
-/obj/item/weapon/rack_parts
- name = "rack parts"
- desc = "Parts of a rack."
- icon = 'icons/obj/items.dmi'
- icon_state = "rack_parts"
- flags = CONDUCT
- m_amt = 3750
-
-/*/obj/item/weapon/syndicate_uplink
- name = "station bounced radio"
- desc = "Remain silent about this..."
- icon = 'icons/obj/radio.dmi'
- icon_state = "radio"
- var/temp = null
- var/uses = 10.0
- var/selfdestruct = 0.0
- var/traitor_frequency = 0.0
- var/mob/currentUser = null
- var/obj/item/device/radio/origradio = null
- flags = CONDUCT | ONBELT
- w_class = 2.0
- item_state = "radio"
- throw_speed = 4
- throw_range = 20
- m_amt = 100
- origin_tech = "magnets=2;syndicate=3"*/
-
-/obj/item/weapon/SWF_uplink
- name = "station-bounced radio"
- desc = "used to comunicate it appears."
- icon = 'icons/obj/radio.dmi'
- icon_state = "radio"
- var/temp = null
- var/uses = 4.0
- var/selfdestruct = 0.0
- var/traitor_frequency = 0.0
- var/obj/item/device/radio/origradio = null
- flags = CONDUCT
- slot_flags = SLOT_BELT
- item_state = "radio"
- throwforce = 5
- w_class = 2.0
- throw_speed = 4
- throw_range = 20
- m_amt = 100
- origin_tech = "magnets=1"
-
-/obj/item/weapon/staff
- name = "wizards staff"
- desc = "Apparently a staff used by the wizard."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "staff"
- force = 3.0
- throwforce = 5.0
- throw_speed = 1
- throw_range = 5
- w_class = 2.0
- flags = NOSHIELD
- attack_verb = list("bludgeoned", "whacked", "disciplined")
-
-/obj/item/weapon/staff/broom
- name = "broom"
- desc = "Used for sweeping, and flying into the night while cackling. Black cat not included."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "broom"
-
-/obj/item/weapon/staff/stick
- name = "stick"
- desc = "A great tool to drag someone else's drinks across the bar."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "stick"
- item_state = "stick"
- force = 3.0
- throwforce = 5.0
- throw_speed = 1
- throw_range = 5
- w_class = 2.0
- flags = NOSHIELD
-
-/obj/item/weapon/table_parts
- name = "table parts"
- desc = "Parts of a table. Poor table."
- gender = PLURAL
- icon = 'icons/obj/items.dmi'
- icon_state = "table_parts"
- m_amt = 3750
- flags = CONDUCT
- attack_verb = list("slammed", "bashed", "battered", "bludgeoned", "thrashed", "whacked")
-
-/obj/item/weapon/table_parts/reinforced
- name = "reinforced table parts"
- desc = "Hard table parts. Well...harder..."
- icon = 'icons/obj/items.dmi'
- icon_state = "reinf_tableparts"
- m_amt = 7500
- flags = CONDUCT
-
-/obj/item/weapon/table_parts/wood
- name = "wooden table parts"
- desc = "Keep away from fire."
- icon_state = "wood_tableparts"
- flags = null
-
-/obj/item/weapon/table_parts/glass
- name = "glass table parts"
- desc = "fragile!"
- icon_state = "glass_tableparts"
- flags = null
-
-/obj/item/weapon/wire
- desc = "This is just a simple piece of regular insulated wire."
- name = "wire"
- icon = 'icons/obj/power.dmi'
- icon_state = "item_wire"
- var/amount = 1.0
- var/laying = 0.0
- var/old_lay = null
- m_amt = 40
- attack_verb = list("whipped", "lashed", "disciplined", "tickled")
-
- suicide_act(mob/user)
- viewers(user) << "\red [user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide."
- return (OXYLOSS)
-
-/obj/item/weapon/module
- icon = 'icons/obj/module.dmi'
- icon_state = "std_module"
- w_class = 2.0
- item_state = "electronic"
- flags = CONDUCT
- var/mtype = 1 // 1=electronic 2=hardware
-
-/obj/item/weapon/module/card_reader
- name = "card reader module"
- icon_state = "card_mod"
- desc = "An electronic module for reading data and ID cards."
-
-/obj/item/weapon/module/power_control
- name = "power control module"
- icon_state = "power_mod"
- desc = "Heavy-duty switching circuits for power control."
-
-/obj/item/weapon/module/id_auth
- name = "\improper ID authentication module"
- icon_state = "id_mod"
- desc = "A module allowing secure authorization of ID cards."
-
-/obj/item/weapon/module/cell_power
- name = "power cell regulator module"
- icon_state = "power_mod"
- desc = "A converter and regulator allowing the use of power cells."
-
-/obj/item/weapon/module/cell_power
- name = "power cell charger module"
- icon_state = "power_mod"
- desc = "Charging circuits for power cells."
-
-/obj/item/weapon/hatchet
- name = "hatchet"
- desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "hatchet"
- flags = CONDUCT
- force = 12.0
- sharp = 1
- edge = 1
- w_class = 2.0
- throwforce = 15.0
- throw_speed = 4
- throw_range = 4
- m_amt = 15000
- origin_tech = "materials=2;combat=1"
- attack_verb = list("chopped", "torn", "cut")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/weapon/hatchet/unathiknife
- name = "duelling knife"
- desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "unathiknife"
- attack_verb = list("ripped", "torn", "cut")
-
-/obj/item/weapon/scythe
- icon_state = "scythe0"
- name = "scythe"
- desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
- force = 13.0
- throwforce = 5.0
- sharp = 1
- edge = 1
- throw_speed = 2
- throw_range = 3
- w_class = 4.0
- flags = NOSHIELD
- slot_flags = SLOT_BACK
- origin_tech = "materials=2;combat=2"
- attack_verb = list("chopped", "sliced", "cut", "reaped")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity)
- if(!proximity) return
- if(istype(A, /obj/effect/plant))
- for(var/obj/effect/plant/B in orange(A,1))
- if(prob(80))
- qdel(B)
- qdel(A)
-
-/*
-/obj/item/weapon/cigarpacket
- name = "Pete's Cuban Cigars"
- desc = "The most robust cigars on the planet."
- icon = 'icons/obj/cigarettes.dmi'
- icon_state = "cigarpacket"
- item_state = "cigarpacket"
- w_class = 1
- throwforce = 2
- var/cigarcount = 6
- flags = ONBELT */
-
-/obj/item/weapon/pai_cable
- desc = "A flexible coated cable with a universal jack on one end."
- name = "data cable"
- icon = 'icons/obj/power.dmi'
- icon_state = "wire1"
-
- var/obj/machinery/machine
-
-///////////////////////////////////////Stock Parts /////////////////////////////////
-
-/obj/item/weapon/storage/part_replacer
- name = "Rapid Part Exchange Device"
- desc = "Special mechanical module made to store, sort, and apply standard machine parts."
- icon_state = "RPED"
- item_state = "RPED"
- icon_override = 'icons/mob/in-hand/tools.dmi'
- w_class = 5
- can_hold = list("/obj/item/weapon/stock_parts")
- storage_slots = 50
- use_to_pickup = 1
- allow_quick_gather = 1
- allow_quick_empty = 1
- collection_mode = 1
- display_contents_with_number = 1
- max_w_class = 3
- max_combined_w_class = 100
-
-/obj/item/weapon/storage/part_replacer/proc/play_rped_sound()
- //Plays the sound for RPED exchanging or installing parts.
- playsound(src, 'sound/items/rped.ogg', 40, 1)
-
-//Sorts stock parts inside an RPED by their rating.
-//Only use /obj/item/weapon/stock_parts/ with this sort proc!
-/proc/cmp_rped_sort(var/obj/item/weapon/stock_parts/A, var/obj/item/weapon/stock_parts/B)
- return B.rating - A.rating
-
-/obj/item/weapon/stock_parts
- name = "stock part"
- desc = "What?"
- gender = PLURAL
- icon = 'icons/obj/stock_parts.dmi'
- w_class = 2.0
- var/rating = 1
- New()
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
-
-//Rank 1
-
-/obj/item/weapon/stock_parts/console_screen
- name = "console screen"
- desc = "Used in the construction of computers and other devices with a interactive console."
- icon_state = "screen"
- origin_tech = "materials=1"
- g_amt = 200
-
-/obj/item/weapon/stock_parts/capacitor
- name = "capacitor"
- desc = "A basic capacitor used in the construction of a variety of devices."
- icon_state = "capacitor"
- origin_tech = "powerstorage=1"
- m_amt = 50
- g_amt = 50
-
-/obj/item/weapon/stock_parts/scanning_module
- name = "scanning module"
- desc = "A compact, high resolution scanning module used in the construction of certain devices."
- icon_state = "scan_module"
- origin_tech = "magnets=1"
- m_amt = 50
- g_amt = 20
-
-/obj/item/weapon/stock_parts/manipulator
- name = "micro-manipulator"
- desc = "A tiny little manipulator used in the construction of certain devices."
- icon_state = "micro_mani"
- origin_tech = "materials=1;programming=1"
- m_amt = 30
-
-/obj/item/weapon/stock_parts/micro_laser
- name = "micro-laser"
- desc = "A tiny laser used in certain devices."
- icon_state = "micro_laser"
- origin_tech = "magnets=1"
- m_amt = 10
- g_amt = 20
-
-/obj/item/weapon/stock_parts/matter_bin
- name = "matter bin"
- desc = "A container for hold compressed matter awaiting re-construction."
- icon_state = "matter_bin"
- origin_tech = "materials=1"
- m_amt = 80
-
-//Rank 2
-
-/obj/item/weapon/stock_parts/capacitor/adv
- name = "advanced capacitor"
- desc = "An advanced capacitor used in the construction of a variety of devices."
- icon_state = "adv_capacitor"
- origin_tech = "powerstorage=3"
- rating = 2
- m_amt = 50
- g_amt = 50
-
-/obj/item/weapon/stock_parts/scanning_module/adv
- name = "advanced scanning module"
- desc = "A compact, high resolution scanning module used in the construction of certain devices."
- icon_state = "adv_scan_module"
- origin_tech = "magnets=3"
- rating = 2
- m_amt = 50
- g_amt = 20
-
-/obj/item/weapon/stock_parts/manipulator/nano
- name = "nano-manipulator"
- desc = "A tiny little manipulator used in the construction of certain devices."
- icon_state = "nano_mani"
- origin_tech = "materials=3,programming=2"
- rating = 2
- m_amt = 30
-
-/obj/item/weapon/stock_parts/micro_laser/high
- name = "high-power micro-laser"
- desc = "A tiny laser used in certain devices."
- icon_state = "high_micro_laser"
- origin_tech = "magnets=3"
- rating = 2
- m_amt = 10
- g_amt = 20
-
-/obj/item/weapon/stock_parts/matter_bin/adv
- name = "advanced matter bin"
- desc = "A container for hold compressed matter awaiting re-construction."
- icon_state = "advanced_matter_bin"
- origin_tech = "materials=3"
- rating = 2
- m_amt = 80
-
-//Rating 3
-
-/obj/item/weapon/stock_parts/capacitor/super
- name = "super capacitor"
- desc = "A super-high capacity capacitor used in the construction of a variety of devices."
- icon_state = "super_capacitor"
- origin_tech = "powerstorage=5;materials=4"
- rating = 3
- m_amt = 50
- g_amt = 50
-
-/obj/item/weapon/stock_parts/scanning_module/phasic
- name = "phasic scanning module"
- desc = "A compact, high resolution phasic scanning module used in the construction of certain devices."
- icon_state = "super_scan_module"
- origin_tech = "magnets=5"
- rating = 3
- m_amt = 50
- g_amt = 20
-
-/obj/item/weapon/stock_parts/manipulator/pico
- name = "pico-manipulator"
- desc = "A tiny little manipulator used in the construction of certain devices."
- icon_state = "pico_mani"
- origin_tech = "materials=5,programming=2"
- rating = 3
- m_amt = 30
-
-/obj/item/weapon/stock_parts/micro_laser/ultra
- name = "ultra-high-power micro-laser"
- icon_state = "ultra_high_micro_laser"
- desc = "A tiny laser used in certain devices."
- origin_tech = "magnets=5"
- rating = 3
- m_amt = 10
- g_amt = 20
-
-/obj/item/weapon/stock_parts/matter_bin/super
- name = "super matter bin"
- desc = "A container for hold compressed matter awaiting re-construction."
- icon_state = "super_matter_bin"
- origin_tech = "materials=5"
- rating = 3
- m_amt = 80
-
-// Subspace stock parts
-
-/obj/item/weapon/stock_parts/subspace/ansible
- name = "subspace ansible"
- icon_state = "subspace_ansible"
- desc = "A compact module capable of sensing extradimensional activity."
- origin_tech = "programming=2;magnets=3;materials=2;bluespace=1"
- m_amt = 30
- g_amt = 10
-
-/obj/item/weapon/stock_parts/subspace/filter
- name = "hyperwave filter"
- icon_state = "hyperwave_filter"
- desc = "A tiny device capable of filtering and converting super-intense radiowaves."
- origin_tech = "programming=2;magnets=1"
- m_amt = 30
- g_amt = 10
-
-/obj/item/weapon/stock_parts/subspace/amplifier
- name = "subspace amplifier"
- icon_state = "subspace_amplifier"
- desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
- origin_tech = "programming=2;magnets=2;materials=1;bluespace=1"
- m_amt = 30
- g_amt = 10
-
-/obj/item/weapon/stock_parts/subspace/treatment
- name = "subspace treatment disk"
- icon_state = "treatment_disk"
- desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
- origin_tech = "programming=2;magnets=1;materials=3;bluespace=1"
- m_amt = 30
- g_amt = 10
-
-/obj/item/weapon/stock_parts/subspace/analyzer
- name = "subspace wavelength analyzer"
- icon_state = "wavelength_analyzer"
- desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
- origin_tech = "programming=2;magnets=2;materials=2;bluespace=1"
- m_amt = 30
- g_amt = 10
-
-/obj/item/weapon/stock_parts/subspace/crystal
- name = "ansible crystal"
- icon_state = "ansible_crystal"
- desc = "A crystal made from pure glass used to transmit laser databursts to subspace."
- origin_tech = "magnets=2;materials=2;bluespace=1"
- g_amt = 50
-
-/obj/item/weapon/stock_parts/subspace/transmitter
- name = "subspace transmitter"
- icon_state = "subspace_transmitter"
- desc = "A large piece of equipment used to open a window into the subspace dimension."
- origin_tech = "magnets=3;materials=3;bluespace=2"
- m_amt = 50
-
-/obj/item/weapon/research//Makes testing much less of a pain -Sieve
- name = "research"
- icon = 'icons/obj/stock_parts.dmi'
- icon_state = "capacitor"
- desc = "A debug item for research."
- origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8"
-
-
-/////////Random shit////////
-
-/obj/item/weapon/lightning
- name = "lightning"
- icon = 'icons/obj/lightning.dmi'
- icon_state = "lightning"
- desc = "test lightning"
-
- New()
- icon = midicon
- icon_state = "1"
-
- afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
- var/angle = get_angle(A, user)
- //world << angle
- angle = round(angle) + 45
- if(angle > 180)
- angle -= 180
- else
- angle += 180
-
- if(!angle)
- angle = 1
- //world << "adjusted [angle]"
- icon_state = "[angle]"
- //world << "[angle] [(get_dist(user, A) - 1)]"
- user.Beam(A, "lightning", 'icons/obj/zap.dmi', 50, 15)
-/*Testing
-proc/get_angle(atom/a, atom/b)
- return atan2(b.y - a.y, b.x - a.x)
-proc/atan2(x, y)
- if(!x && !y) return 0
- return y >= 0 ? arccos(x / sqrt(x * x + y * y)) : -arccos(x / sqrt(x * x + y * y))
-proc
- // creates an /icon object with 360 states of rotation
- rotate_icon(file, state, step = 1, aa = FALSE)
- var icon/base = icon(file, state)
-
- var w, h, w2, h2
- if(aa)
- aa ++
- w = base.Width()
- w2 = w * aa
- h = base.Height()
- h2 = h * aa
-
- var icon{result = icon(base); temp}
-
- for(var/angle in 0 to 360 step step)
- if(angle == 0 ) continue
- if(angle == 360) continue
-
- temp = icon(base)
-
- if(aa) temp.Scale(w2, h2)
- temp.Turn(angle)
- if(aa) temp.Scale(w, h)
-
- result.Insert(temp, "[angle]")
-
- return result*/
-
-
-/obj/item/weapon/fan
- name = "desk fan"
- icon = 'icons/obj/decorations.dmi'
- icon_state = "fan"
- desc = "A smal desktop fan. Button seems to be stuck in the 'on' position."
-
-/obj/item/weapon/newton
- name = "newton cradle"
- icon = 'icons/obj/decorations.dmi'
- icon_state = "newton"
- desc = "A device bored paper pushers use to remind themselves that the time did not stop yet. Contains gravity."
-
-/obj/item/weapon/balltoy
- name = "ball toy"
- icon = 'icons/obj/decorations.dmi'
- icon_state = "rollball"
- desc = "A device bored paper pushers use to remind themselves that the time did not stop yet."
-
-/obj/item/weapon/kidanglobe
- name = "Kidan homeworld globe"
- icon = 'icons/obj/decorations.dmi'
- icon_state = "kidanglobe"
- desc = "A globe of the Kidan homeworld."
diff --git a/code/defines/obj.dm b/code/game/objects/effects/datacore-effect.dm
similarity index 59%
rename from code/defines/obj.dm
rename to code/game/objects/effects/datacore-effect.dm
index b0e8290ffee..ac2ec220987 100644
--- a/code/defines/obj.dm
+++ b/code/game/objects/effects/datacore-effect.dm
@@ -1,394 +1,210 @@
-/obj/structure/signpost
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "signpost"
- anchored = 1
- density = 1
-
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- return attack_hand(user)
-
- attack_hand(mob/user as mob)
- user << "Civilians: NT is recruiting! Please head SOUTH to the NT Recruitment office to join the station's crew!"
-
-/obj/structure/ninjatele
-
- name = "Long-Distance Teleportation Console"
- desc = "A console used to send a Spider Clan operative long distances rapidly."
- icon = 'icons/obj/ninjaobjects.dmi'
- icon_state = "teleconsole"
- anchored = 1
- density = 0
-
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
-
- return attack_hand(user)
-
-
- attack_hand(mob/user as mob)
-
-
- if (user.mind.special_role=="Ninja")
- switch(alert("Phase Jaunt relay primed, target locked as [station_name()], initiate VOID-shift translocation? (Warning! Internals required!)",,"Yes","No"))
-
- if("Yes")
- if(user.z != src.z) return
-
- user.loc.loc.Exited(user)
- user.loc = pick(carplist) // In the future, possibly make specific NinjaTele landmarks, and give him an option to teleport to North/South/East/West of SS13 instead of just hijacking a carpspawn.
-
-
- playsound(user.loc, 'sound/effects/phasein.ogg', 25, 1)
- playsound(user.loc, 'sound/effects/sparks2.ogg', 50, 1)
- anim(user.loc,user,'icons/mob/mob.dmi',,"phasein",,user.dir)
-
- user <<"\blue VOID-Shift translocation successful"
-
- if("No")
-
- user <<"\red Process aborted!"
-
- return
- else
- user<< "\red FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked."
-
-/obj/effect/mark
- var/mark = ""
- icon = 'icons/misc/mark.dmi'
- icon_state = "blank"
- anchored = 1
- layer = 99
- mouse_opacity = 0
- unacidable = 1//Just to be sure.
-
-/obj/effect/beam
- name = "beam"
- unacidable = 1//Just to be sure.
- var/def_zone
- pass_flags = PASSTABLE
-
-
-/obj/effect/begin
- name = "begin"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "begin"
- anchored = 1.0
- unacidable = 1
-
-/*
- * This item is completely unused, but removing it will break something in R&D and Radio code causing PDA and Ninja code to fail on compile
- */
-
-/obj/effect/datacore
- name = "datacore"
- var/medical[] = list()
- var/general[] = list()
- var/security[] = list()
- //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
- var/locked[] = list()
-
-
-/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
- var/list/heads = new()
- var/list/sec = new()
- var/list/eng = new()
- var/list/med = new()
- var/list/sci = new()
- var/list/supp = new()
- var/list/bot = new()
- var/list/misc = new()
- var/list/isactive = new()
- var/dat = {"
-
-
- | Name | Rank | Activity |
- "}
- var/even = 0
- // sort mobs
- for(var/datum/data/record/t in data_core.general)
- var/name = t.fields["name"]
- var/rank = t.fields["rank"]
- var/real_rank = t.fields["real_rank"]
- if(OOC)
- var/active = 0
- for(var/mob/M in player_list)
- if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
- active = 1
- break
- isactive[name] = active ? "Active" : "Inactive"
- else
- isactive[name] = t.fields["p_stat"]
- //world << "[name]: [rank]"
- //cael - to prevent multiple appearances of a player/job combination, add a continue after each line
- var/department = 0
- if(real_rank in command_positions)
- heads[name] = rank
- department = 1
- if(real_rank in security_positions)
- sec[name] = rank
- department = 1
- if(real_rank in engineering_positions)
- eng[name] = rank
- department = 1
- if(real_rank in medical_positions)
- med[name] = rank
- department = 1
- if(real_rank in science_positions)
- sci[name] = rank
- department = 1
- if(real_rank in support_positions)
- supp[name] = rank
- department = 1
- if(real_rank in nonhuman_positions)
- bot[name] = rank
- department = 1
- if(!department && !(name in heads))
- misc[name] = rank
- if(heads.len > 0)
- dat += "| Heads |
"
- for(name in heads)
- dat += "| [name] | [heads[name]] | [isactive[name]] |
"
- even = !even
- if(sec.len > 0)
- dat += "| Security |
"
- for(name in sec)
- dat += "| [name] | [sec[name]] | [isactive[name]] |
"
- even = !even
- if(eng.len > 0)
- dat += "| Engineering |
"
- for(name in eng)
- dat += "| [name] | [eng[name]] | [isactive[name]] |
"
- even = !even
- if(med.len > 0)
- dat += "| Medical |
"
- for(name in med)
- dat += "| [name] | [med[name]] | [isactive[name]] |
"
- even = !even
- if(sci.len > 0)
- dat += "| Science |
"
- for(name in sci)
- dat += "| [name] | [sci[name]] | [isactive[name]] |
"
- even = !even
- if(supp.len > 0)
- dat += "| Support |
"
- for(name in supp)
- dat += "| [name] | [supp[name]] | [isactive[name]] |
"
- even = !even
- // in case somebody is insane and added them to the manifest, why not
- if(bot.len > 0)
- dat += "| Silicon |
"
- for(name in bot)
- dat += "| [name] | [bot[name]] | [isactive[name]] |
"
- even = !even
- // misc guys
- if(misc.len > 0)
- dat += "| Miscellaneous |
"
- for(name in misc)
- dat += "| [name] | [misc[name]] | [isactive[name]] |
"
- even = !even
-
- dat += "
"
- dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
- dat = replacetext(dat, "\t", "")
- return dat
-
-
-/*
-We can't just insert in HTML into the nanoUI so we need the raw data to play with.
-Instead of creating this list over and over when someone leaves their PDA open to the page
-we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change
-using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( )
-*/
-
-var/global/list/PDA_Manifest = list()
-
-/obj/effect/datacore/proc/get_manifest_json()
- if(PDA_Manifest.len)
- return PDA_Manifest
- var/heads[0]
- var/sec[0]
- var/eng[0]
- var/med[0]
- var/sci[0]
- var/supp[0]
- var/bot[0]
- var/misc[0]
- for(var/datum/data/record/t in data_core.general)
- var/name = sanitize(t.fields["name"])
- var/rank = sanitize(t.fields["rank"])
- var/real_rank = t.fields["real_rank"]
- var/isactive = t.fields["p_stat"]
- var/department = 0
- var/depthead = 0 // Department Heads will be placed at the top of their lists.
- if(real_rank in command_positions)
- heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- depthead = 1
- if(rank=="Captain" && heads.len != 1)
- heads.Swap(1,heads.len)
-
- if(real_rank in security_positions)
- sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sec.len != 1)
- sec.Swap(1,sec.len)
-
- if(real_rank in engineering_positions)
- eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && eng.len != 1)
- eng.Swap(1,eng.len)
-
- if(real_rank in medical_positions)
- med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && med.len != 1)
- med.Swap(1,med.len)
-
- if(real_rank in science_positions)
- sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sci.len != 1)
- sci.Swap(1,sci.len)
-
- if(real_rank in support_positions)
- supp[++supp.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && supp.len != 1)
- supp.Swap(1,supp.len)
-
- if(real_rank in nonhuman_positions)
- bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
-
- if(!department && !(name in heads))
- misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
-
-
- PDA_Manifest = list(\
- "heads" = heads,\
- "sec" = sec,\
- "eng" = eng,\
- "med" = med,\
- "sci" = sci,\
- "supp" = supp,\
- "bot" = bot,\
- "misc" = misc\
- )
- return PDA_Manifest
-
-
-/obj/effect/laser
- name = "laser"
- desc = "IT BURNS!!!"
- icon = 'icons/obj/projectiles.dmi'
- var/damage = 0.0
- var/range = 10.0
-
-
-/obj/effect/list_container
- name = "list container"
-
-/obj/effect/list_container/mobl
- name = "mobl"
- var/master = null
-
- var/list/container = list( )
-
-/*
-/obj/structure/cable
- level = 1
- anchored =1
- var/datum/powernet/powernet
- name = "power cable"
- desc = "A flexible superconducting cable for heavy-duty power transfer"
- icon = 'icons/obj/power_cond_red.dmi'
- icon_state = "0-1"
- var/d1 = 0
- var/d2 = 1
- layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
- var/_color = "red"
- var/obj/structure/powerswitch/power_switch
- var/obj/item/device/powersink/attached // holding this here for qdel
-
-/obj/structure/cable/yellow
- _color = "yellow"
- icon = 'icons/obj/power_cond_yellow.dmi'
-
-/obj/structure/cable/green
- _color = "green"
- icon = 'icons/obj/power_cond_green.dmi'
-
-/obj/structure/cable/blue
- _color = "blue"
- icon = 'icons/obj/power_cond_blue.dmi'
-
-/obj/structure/cable/pink
- _color = "pink"
- icon = 'icons/obj/power_cond_pink.dmi'
-
-/obj/structure/cable/orange
- _color = "orange"
- icon = 'icons/obj/power_cond_orange.dmi'
-
-/obj/structure/cable/cyan
- _color = "cyan"
- icon = 'icons/obj/power_cond_cyan.dmi'
-
-/obj/structure/cable/white
- _color = "white"
- icon = 'icons/obj/power_cond_white.dmi'
-*/
-
-/obj/effect/projection
- name = "Projection"
- desc = "This looks like a projection of something."
- anchored = 1.0
-
-
-/obj/effect/shut_controller
- name = "shut controller"
- var/moving = null
- var/list/parts = list( )
-
-/obj/structure/showcase
- name = "Showcase"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "showcase_1"
- desc = "A stand with the empty body of a cyborg bolted to it."
- density = 1
- anchored = 1
- unacidable = 1//temporary until I decide whether the borg can be removed. -veyveyr
-
-/obj/item/mouse_drag_pointer = MOUSE_ACTIVE_POINTER
-
-/obj/item/weapon/beach_ball
- icon = 'icons/misc/beach.dmi'
- icon_state = "ball"
- name = "beach ball"
- item_state = "beachball"
- density = 0
- anchored = 0
- w_class = 1.0
- force = 0.0
- throwforce = 0.0
- throw_speed = 1
- throw_range = 20
- flags = CONDUCT
-
-
-/obj/effect/stop
- var/victim = null
- icon_state = "empty"
- name = "Geas"
- desc = "You can't resist."
- // name = ""
-
-/obj/effect/spawner
- name = "object spawner"
+//This item is not completely unused- the central datacore datum uses it.
+/*
+ * This item is completely unused, but removing it will break something in R&D and Radio code causing PDA and Ninja code to fail on compile
+ */
+
+/obj/effect/datacore
+ name = "datacore"
+ var/medical[] = list()
+ var/general[] = list()
+ var/security[] = list()
+ //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
+ var/locked[] = list()
+
+
+/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
+ var/list/heads = new()
+ var/list/sec = new()
+ var/list/eng = new()
+ var/list/med = new()
+ var/list/sci = new()
+ var/list/supp = new()
+ var/list/bot = new()
+ var/list/misc = new()
+ var/list/isactive = new()
+ var/dat = {"
+
+
+ | Name | Rank | Activity |
+ "}
+ var/even = 0
+ // sort mobs
+ for(var/datum/data/record/t in data_core.general)
+ var/name = t.fields["name"]
+ var/rank = t.fields["rank"]
+ var/real_rank = t.fields["real_rank"]
+ if(OOC)
+ var/active = 0
+ for(var/mob/M in player_list)
+ if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
+ active = 1
+ break
+ isactive[name] = active ? "Active" : "Inactive"
+ else
+ isactive[name] = t.fields["p_stat"]
+ //world << "[name]: [rank]"
+ //cael - to prevent multiple appearances of a player/job combination, add a continue after each line
+ var/department = 0
+ if(real_rank in command_positions)
+ heads[name] = rank
+ department = 1
+ if(real_rank in security_positions)
+ sec[name] = rank
+ department = 1
+ if(real_rank in engineering_positions)
+ eng[name] = rank
+ department = 1
+ if(real_rank in medical_positions)
+ med[name] = rank
+ department = 1
+ if(real_rank in science_positions)
+ sci[name] = rank
+ department = 1
+ if(real_rank in support_positions)
+ supp[name] = rank
+ department = 1
+ if(real_rank in nonhuman_positions)
+ bot[name] = rank
+ department = 1
+ if(!department && !(name in heads))
+ misc[name] = rank
+ if(heads.len > 0)
+ dat += "| Heads |
"
+ for(name in heads)
+ dat += "| [name] | [heads[name]] | [isactive[name]] |
"
+ even = !even
+ if(sec.len > 0)
+ dat += "| Security |
"
+ for(name in sec)
+ dat += "| [name] | [sec[name]] | [isactive[name]] |
"
+ even = !even
+ if(eng.len > 0)
+ dat += "| Engineering |
"
+ for(name in eng)
+ dat += "| [name] | [eng[name]] | [isactive[name]] |
"
+ even = !even
+ if(med.len > 0)
+ dat += "| Medical |
"
+ for(name in med)
+ dat += "| [name] | [med[name]] | [isactive[name]] |
"
+ even = !even
+ if(sci.len > 0)
+ dat += "| Science |
"
+ for(name in sci)
+ dat += "| [name] | [sci[name]] | [isactive[name]] |
"
+ even = !even
+ if(supp.len > 0)
+ dat += "| Support |
"
+ for(name in supp)
+ dat += "| [name] | [supp[name]] | [isactive[name]] |
"
+ even = !even
+ // in case somebody is insane and added them to the manifest, why not
+ if(bot.len > 0)
+ dat += "| Silicon |
"
+ for(name in bot)
+ dat += "| [name] | [bot[name]] | [isactive[name]] |
"
+ even = !even
+ // misc guys
+ if(misc.len > 0)
+ dat += "| Miscellaneous |
"
+ for(name in misc)
+ dat += "| [name] | [misc[name]] | [isactive[name]] |
"
+ even = !even
+
+ dat += "
"
+ dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
+ dat = replacetext(dat, "\t", "")
+ return dat
+
+
+/*
+We can't just insert in HTML into the nanoUI so we need the raw data to play with.
+Instead of creating this list over and over when someone leaves their PDA open to the page
+we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change
+using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( )
+*/
+
+var/global/list/PDA_Manifest = list()
+
+/obj/effect/datacore/proc/get_manifest_json()
+ if(PDA_Manifest.len)
+ return PDA_Manifest
+ var/heads[0]
+ var/sec[0]
+ var/eng[0]
+ var/med[0]
+ var/sci[0]
+ var/supp[0]
+ var/bot[0]
+ var/misc[0]
+ for(var/datum/data/record/t in data_core.general)
+ var/name = sanitize(t.fields["name"])
+ var/rank = sanitize(t.fields["rank"])
+ var/real_rank = t.fields["real_rank"]
+ var/isactive = t.fields["p_stat"]
+ var/department = 0
+ var/depthead = 0 // Department Heads will be placed at the top of their lists.
+ if(real_rank in command_positions)
+ heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ depthead = 1
+ if(rank=="Captain" && heads.len != 1)
+ heads.Swap(1,heads.len)
+
+ if(real_rank in security_positions)
+ sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sec.len != 1)
+ sec.Swap(1,sec.len)
+
+ if(real_rank in engineering_positions)
+ eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && eng.len != 1)
+ eng.Swap(1,eng.len)
+
+ if(real_rank in medical_positions)
+ med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && med.len != 1)
+ med.Swap(1,med.len)
+
+ if(real_rank in science_positions)
+ sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sci.len != 1)
+ sci.Swap(1,sci.len)
+
+ if(real_rank in support_positions)
+ supp[++supp.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && supp.len != 1)
+ supp.Swap(1,supp.len)
+
+ if(real_rank in nonhuman_positions)
+ bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+
+ if(!department && !(name in heads))
+ misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
+
+
+ PDA_Manifest = list(\
+ "heads" = heads,\
+ "sec" = sec,\
+ "eng" = eng,\
+ "med" = med,\
+ "sci" = sci,\
+ "supp" = supp,\
+ "bot" = bot,\
+ "misc" = misc\
+ )
+ return PDA_Manifest
+
diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm
index c2f590c5613..bc697657b98 100644
--- a/code/game/objects/effects/misc.dm
+++ b/code/game/objects/effects/misc.dm
@@ -1,3 +1,21 @@
+//MISC EFFECTS
+
+//This file is for effects that are less than 20 lines and don't fit very well in any other category.
+
+/*CURRENT CONTENTS
+ Strange Present
+ Mark
+ Beam
+ Laser
+ Begin
+ Stop
+ Projection
+ Shut_controller
+ Showcase
+ Spawner
+ List_container
+*/
+
//The effect when you wrap a dead body in gift wrap
/obj/effect/spresent
name = "strange present"
@@ -5,4 +23,72 @@
icon = 'icons/obj/items.dmi'
icon_state = "strangepresent"
density = 1
- anchored = 0
\ No newline at end of file
+ anchored = 0
+
+/obj/effect/mark
+ var/mark = ""
+ icon = 'icons/misc/mark.dmi'
+ icon_state = "blank"
+ anchored = 1
+ layer = 99
+ mouse_opacity = 0
+ unacidable = 1//Just to be sure.
+
+/obj/effect/beam
+ name = "beam"
+ unacidable = 1//Just to be sure.
+ var/def_zone
+ pass_flags = PASSTABLE
+
+/obj/effect/laser
+ name = "laser"
+ desc = "IT BURNS!!!"
+ icon = 'icons/obj/projectiles.dmi'
+ var/damage = 0.0
+ var/range = 10.0
+
+/obj/effect/begin
+ name = "begin"
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "begin"
+ anchored = 1.0
+ unacidable = 1
+
+/obj/effect/stop
+ var/victim = null
+ icon_state = "empty"
+ name = "Geas"
+ desc = "You can't resist."
+ // name = ""
+
+/obj/effect/projection
+ name = "Projection"
+ desc = "This looks like a projection of something."
+ anchored = 1.0
+
+
+/obj/effect/shut_controller
+ name = "shut controller"
+ var/moving = null
+ var/list/parts = list( )
+
+/obj/structure/showcase
+ name = "Showcase"
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "showcase_1"
+ desc = "A stand with the empty body of a cyborg bolted to it."
+ density = 1
+ anchored = 1
+ unacidable = 1//temporary until I decide whether the borg can be removed. -veyveyr
+
+/obj/effect/spawner
+ name = "object spawner"
+
+/obj/effect/list_container
+ name = "list container"
+
+/obj/effect/list_container/mobl
+ name = "mobl"
+ var/master = null
+
+ var/list/container = list( )
\ No newline at end of file
diff --git a/code/game/objects/items/misc.dm b/code/game/objects/items/misc.dm
new file mode 100644
index 00000000000..cdce6774518
--- /dev/null
+++ b/code/game/objects/items/misc.dm
@@ -0,0 +1,24 @@
+//MISC items
+//These items don't belong anywhere else, so they have this file.
+
+//Current contents:
+/*
+ mouse_drag_pointer
+ Beach Ball
+*/
+
+/obj/item/mouse_drag_pointer = MOUSE_ACTIVE_POINTER
+
+/obj/item/weapon/beach_ball
+ icon = 'icons/misc/beach.dmi'
+ icon_state = "ball"
+ name = "beach ball"
+ item_state = "beachball"
+ density = 0
+ anchored = 0
+ w_class = 1.0
+ force = 0.0
+ throwforce = 0.0
+ throw_speed = 1
+ throw_range = 20
+ flags = CONDUCT
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/caution.dm b/code/game/objects/items/weapons/caution.dm
new file mode 100644
index 00000000000..e3eaaf4751c
--- /dev/null
+++ b/code/game/objects/items/weapons/caution.dm
@@ -0,0 +1,66 @@
+/obj/item/weapon/caution
+ desc = "Caution! Wet Floor!"
+ name = "wet floor sign"
+ icon = 'icons/obj/janitor.dmi'
+ icon_state = "caution"
+ force = 1.0
+ throwforce = 3.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = 2.0
+ attack_verb = list("warned", "cautioned", "smashed")
+
+ proximity_sign
+ var/timing = 0
+ var/armed = 0
+ var/timepassed = 0
+
+ attack_self(mob/user as mob)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.mind.assigned_role != "Janitor")
+ return
+ if(armed)
+ armed = 0
+ user << "\blue You disarm \the [src]."
+ return
+ timing = !timing
+ if(timing)
+ processing_objects.Add(src)
+ else
+ armed = 0
+ timepassed = 0
+ H << "\blue You [timing ? "activate \the [src]'s timer, you have 15 seconds." : "de-activate \the [src]'s timer."]"
+
+ process()
+ if(!timing)
+ processing_objects.Remove(src)
+ timepassed++
+ if(timepassed >= 15 && !armed)
+ armed = 1
+ timing = 0
+
+ HasProximity(atom/movable/AM as mob|obj)
+ if(armed)
+ if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain))
+ var/mob/living/carbon/C = AM
+ if(C.m_intent != "walk")
+ src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"")
+ explosion(src.loc,-1,0,2)
+ if(ishuman(C))
+ dead_legs(C)
+ if(src)
+ qdel(src)
+
+ proc/dead_legs(mob/living/carbon/human/H as mob)
+ var/obj/item/organ/external/l = H.get_organ("l_leg")
+ var/obj/item/organ/external/r = H.get_organ("r_leg")
+ if(l && !(l.status & ORGAN_DESTROYED))
+ l.status |= ORGAN_DESTROYED
+ if(r && !(r.status & ORGAN_DESTROYED))
+ r.status |= ORGAN_DESTROYED
+
+/obj/item/weapon/caution/cone
+ desc = "This cone is trying to warn you of something!"
+ name = "warning cone"
+ icon_state = "cone"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
index 637dc49437a..84dc2d0c8b7 100644
--- a/code/game/objects/items/weapons/clown_items.dm
+++ b/code/game/objects/items/weapons/clown_items.dm
@@ -8,6 +8,18 @@
/*
* Banana Peals
*/
+
+/obj/item/weapon/bananapeel
+ name = "banana peel"
+ desc = "A peel from a banana."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "banana_peel"
+ item_state = "banana_peel"
+ w_class = 1.0
+ throwforce = 0
+ throw_speed = 4
+ throw_range = 20
+
/obj/item/weapon/bananapeel/Crossed(AM as mob|obj)
if (istype(AM, /mob/living/carbon))
var/mob/M = AM
@@ -66,6 +78,21 @@
/*
* Bike Horns
*/
+
+/obj/item/weapon/bikehorn
+ name = "bike horn"
+ desc = "A horn off of a bicycle."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "bike_horn"
+ item_state = "bike_horn"
+ hitsound = 'sound/items/bikehorn.ogg'
+ throwforce = 3
+ w_class = 1.0
+ throw_speed = 3
+ throw_range = 15
+ attack_verb = list("HONKED")
+ var/spam_flag = 0
+
/obj/item/weapon/bikehorn/attack_self(mob/user as mob)
if (spam_flag == 0)
spam_flag = 1
diff --git a/code/game/objects/items/weapons/disks.dm b/code/game/objects/items/weapons/disks.dm
new file mode 100644
index 00000000000..af88cf0bb78
--- /dev/null
+++ b/code/game/objects/items/weapons/disks.dm
@@ -0,0 +1,15 @@
+/obj/item/weapon/disk
+ name = "disk"
+ icon = 'icons/obj/items.dmi'
+
+/obj/item/weapon/disk/nuclear
+ name = "nuclear authentication disk"
+ desc = "Better keep this safe."
+ icon_state = "nucleardisk"
+ item_state = "card-id"
+ w_class = 1.0
+
+/*
+/obj/item/weapon/disk/nuclear/pickup(mob/living/user as mob)
+ if(issyndicate(user))
+ set_security_level(3)*/ //Nuke Ops rework makes stealth approach significantly harder; this makes it damn near impossible; besides, it's horrendously meta.
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/holosign.dm b/code/game/objects/items/weapons/holosign.dm
new file mode 100644
index 00000000000..49b6a7ad645
--- /dev/null
+++ b/code/game/objects/items/weapons/holosign.dm
@@ -0,0 +1,48 @@
+/obj/item/weapon/holosign_creator
+ name = "holographic sign projector"
+ desc = "A handy-dandy hologaphic projector that displays a janitorial sign."
+ icon = 'icons/obj/janitor.dmi'
+ icon_state = "signmaker"
+ item_state = "electronic"
+ force = 5
+ w_class = 2
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 7
+ origin_tech = "programming=3"
+ var/list/signs = list()
+ var/max_signs = 10
+
+/obj/item/weapon/holosign_creator/afterattack(atom/target, mob/user, flag)
+ if(flag)
+ var/turf/T = get_turf(target)
+ var/obj/effect/overlay/holograph/H = locate() in T
+ if(H)
+ user << "You use [src] to destroy [H]."
+ signs -= H
+ qdel(H)
+ else
+ if(signs.len < max_signs)
+ H = new(get_turf(target))
+ signs += H
+ user << "You create \a [H] with [src]."
+ else
+ user << "[src] is projecting at max capacity!"
+
+/obj/item/weapon/holosign_creator/attack(mob/living/carbon/human/M, mob/user)
+ return
+
+/obj/item/weapon/holosign_creator/attack_self(mob/user)
+ if(signs.len)
+ var/list/L = signs.Copy()
+ for(var/sign in L)
+ qdel(sign)
+ signs -= sign
+ user << "You clear all active holograms."
+
+/obj/effect/overlay/holograph
+ name = "wet floor sign"
+ desc = "The words flicker as if they mean nothing."
+ icon = 'icons/obj/janitor.dmi'
+ icon_state = "holosign"
+ anchored = 1
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm
new file mode 100644
index 00000000000..207deb0bfc7
--- /dev/null
+++ b/code/game/objects/items/weapons/legcuffs.dm
@@ -0,0 +1,210 @@
+/obj/item/weapon/legcuffs
+ name = "legcuffs"
+ desc = "Use this to keep prisoners in line."
+ gender = PLURAL
+ icon = 'icons/obj/items.dmi'
+ icon_state = "handcuff"
+ flags = CONDUCT
+ throwforce = 0
+ w_class = 3.0
+ origin_tech = "materials=1"
+ var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute
+
+/obj/item/weapon/legcuffs/beartrap
+ name = "bear trap"
+ throw_speed = 1
+ throw_range = 1
+ icon_state = "beartrap0"
+ desc = "A trap used to catch bears and other legged creatures."
+ var/armed = 0
+ var/obj/item/weapon/grenade/iedcasing/IED = null
+
+ suicide_act(mob/user)
+ viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide."
+ return (BRUTELOSS)
+
+/obj/item/weapon/legcuffs/beartrap/attack_self(mob/user as mob)
+ ..()
+ if(ishuman(user) && !user.stat && !user.restrained())
+ armed = !armed
+ icon_state = "beartrap[armed]"
+ user << "[src] is now [armed ? "armed" : "disarmed"]"
+
+/obj/item/weapon/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive.
+ if(istype(I, /obj/item/weapon/grenade/iedcasing))
+ if(IED)
+ user << "This beartrap already has an IED hooked up to it!"
+ return
+ IED = I
+ switch(IED.assembled)
+ if(0,1) //if it's not fueled/hooked up
+ user << "You haven't prepared this IED yet!"
+ IED = null
+ return
+ if(2,3)
+ user.drop_item(src)
+ I.loc = src
+ var/turf/bombturf = get_turf(src)
+ var/area/A = get_area(bombturf)
+ var/log_str = "[key_name(usr)]? has rigged a beartrap with an IED at [A.name] (JMP)."
+ message_admins(log_str)
+ log_game(log_str)
+ user << "You sneak the [IED] underneath the pressure plate and connect the trigger wire."
+ desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it."
+ else
+ user << "You shouldn't be reading this message! Contact a coder or someone, something broke!"
+ IED = null
+ return
+ if(istype(I, /obj/item/weapon/screwdriver))
+ if(IED)
+ IED.loc = get_turf(src.loc)
+ IED = null
+ user << "You remove the IED from the [src]."
+ return
+ ..()
+
+/obj/item/weapon/legcuffs/beartrap/Crossed(AM as mob|obj)
+ if(armed)
+ if(IED && isturf(src.loc))
+ IED.active = 1
+ IED.overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled")
+ IED.icon_state = initial(icon_state) + "_active"
+ IED.assembled = 3
+ var/turf/bombturf = get_turf(src)
+ var/area/A = get_area(bombturf)
+ var/log_str = "[key_name(usr)]? has triggered an IED-rigged [name] at [A.name] (JMP)."
+ message_admins(log_str)
+ log_game(log_str)
+ spawn(IED.det_time)
+ IED.prime()
+ if(ishuman(AM))
+ if(isturf(src.loc))
+ var/mob/living/carbon/H = AM
+ if(H.m_intent == "run")
+ if(H.lying)
+ H.apply_damage(20,BRUTE,"chest")
+ else
+ H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg")))
+ armed = 0
+ icon_state = "beartrap0"
+ playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
+ H.visible_message("[H] triggers \the [src].", \
+ "You trigger \the [src]!")
+ H.legcuffed = src
+ src.loc = H
+ H.update_inv_legcuffed()
+ H << "You step on \the [src]!"
+ if(IED && IED.active)
+ H << "The [src]'s IED has been activated!"
+ feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
+ for(var/mob/O in viewers(H, null))
+ if(O == H)
+ continue
+ O.show_message("\red [H] steps on \the [src].", 1)
+ if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
+ armed = 0
+ icon_state = "beartrap0"
+ var/mob/living/simple_animal/SA = AM
+ playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
+ SA.visible_message("[SA] triggers \the [src].", \
+ "You trigger \the [src]!")
+ SA.health -= 20
+ ..()
+
+/obj/item/weapon/legcuffs/bolas
+ name = "bolas"
+ desc = "An entangling bolas. Throw at your foes to trip them and prevent them from running."
+ gender = NEUTER
+ icon = 'icons/obj/weapons.dmi'
+ icon_override = 'icons/mob/in-hand/swords.dmi'
+ icon_state = "bolas"
+ siemens_coefficient = 1
+ slot_flags = SLOT_BELT
+ throwforce = 2
+ w_class = 2
+ origin_tech = "materials=1"
+ attack_verb = list("lashed", "bludgeoned", "whipped")
+ force = 4
+ breakouttime = 50 //10 seconds
+ throw_speed = 1
+ throw_range = 10
+ var/dispenser = 0
+ var/throw_sound = 'sound/weapons/whip.ogg'
+ var/trip_prob = 60
+ var/thrown_from
+
+/obj/item/weapon/legcuffs/bolas/suicide_act(mob/living/user)
+ viewers(user) << "[user] is wrapping the [src.name] around \his neck! It looks like \he's trying to commit suicide."
+ return(OXYLOSS)
+
+/obj/item/weapon/legcuffs/bolas/throw_at(var/atom/A, throw_range, throw_speed)
+ if(usr && !istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas)) //if there is a user, but not a mech
+ if(istype(usr, /mob/living/carbon/human)) //if the user is human
+ var/mob/living/carbon/human/H = usr
+ if((CLUMSY in H.mutations) && prob(50))
+ H <<"You smack yourself in the face while swinging the [src]!"
+ H.Stun(2)
+ H.drop_item(src)
+ return
+ if (!thrown_from && usr) //if something hasn't set it already (like a mech does when it launches)
+ thrown_from = usr //then the user must have thrown it
+ if (!istype(thrown_from, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bolas))
+ playsound(src, throw_sound, 20, 1) //because mechs play the sound anyways
+ var/turf/target = get_turf(A)
+ var/atom/movable/adjtarget = new /atom/movable
+ var/xadjust = 0
+ var/yadjust = 0
+ var/scaler = 0 //used to changed the normalised vector to the proper size
+ scaler = throw_range / max(abs(target.x - src.x), abs(target.y - src.y)) //whichever is larger magnitude is what we normalise to
+ if (target.x - src.x != 0) //just to avoid fucking with math for no reason
+ xadjust = round((target.x - src.x) * scaler) //normalised vector is now scaled up to throw_range
+ adjtarget.x = src.x + xadjust //the new target at max range
+ else
+ adjtarget.x = src.x
+ if (target.y - src.y != 0)
+ yadjust = round((target.y - src.y) * scaler)
+ adjtarget.y = src.y + yadjust
+ else
+ adjtarget.y = src.y
+ // log_admin("Adjusted target of [adjtarget.x] and [adjtarget.y], adjusted with [xadjust] and [yadjust] from [scaler]")
+ ..(get_turf(adjtarget), throw_range, throw_speed)
+ thrown_from = null
+
+/obj/item/weapon/legcuffs/bolas/throw_impact(atom/hit_atom) //Pomf was right, I was wrong - Comic
+ if(isliving(hit_atom) && hit_atom != usr) //if the target is a live creature other than the thrower
+ var/mob/living/M = hit_atom
+ if(ishuman(M)) //if they're a human species
+ var/mob/living/carbon/human/H = M
+ if(H.m_intent == "run") //if they're set to run (though not necessarily running at that moment)
+ if(prob(trip_prob)) //this probability is up for change and mostly a placeholder - Comic
+ step(H, H.dir)
+ H.visible_message("[H] was tripped by the bolas!","Your legs have been tangled!");
+ H.Stun(2) //used instead of setting damage in vars to avoid non-human targets being affected
+ H.Weaken(4)
+ H.legcuffed = src //applies legcuff properties inherited through legcuffs
+ src.loc = H
+ H.update_inv_legcuffed()
+ if(!H.legcuffed) //in case it didn't happen, we need a safety net
+ throw_failed()
+ else if(H.legcuffed) //if the target is already legcuffed (has to be walking)
+ throw_failed()
+ return
+ else //walking, but uncuffed, or the running prob() failed
+ H << "You stumble over the thrown bolas"
+ step(H, H.dir)
+ H.Stun(1)
+ throw_failed()
+ return
+ else
+ M.Stun(2) //minor stun damage to anything not human
+ throw_failed()
+ return
+
+/obj/item/weapon/legcuffs/bolas/proc/throw_failed() //called when the throw doesn't entangle
+ //log_admin("Logged as [thrown_from]")
+ if(!thrown_from || !istype(thrown_from, /mob/living)) //in essence, if we don't know whether a person threw it
+ qdel(src) //destroy it, to stop infinite bolases
+
+/obj/item/weapon/legcuffs/bolas/Bump()
+ ..()
+ throw_failed() //allows a mech bolas to be destroyed
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm
new file mode 100644
index 00000000000..01bac424342
--- /dev/null
+++ b/code/game/objects/items/weapons/misc.dm
@@ -0,0 +1,136 @@
+//MISC WEAPONS
+
+//This file contains /obj/item/weapon's that do not fit in any other category and are not big enough to warrant individual files.
+/*CURRENT CONTENTS
+ Ball Toy
+ Cane
+ Cardboard Tube
+ Fan
+ Gaming Kit
+ Gift
+ Kidan Globe
+ Lightning
+ Newton Cradle
+ PAI cable
+ Red Phone
+*/
+
+/obj/item/weapon/balltoy
+ name = "ball toy"
+ icon = 'icons/obj/decorations.dmi'
+ icon_state = "rollball"
+ desc = "A device bored paper pushers use to remind themselves that the time did not stop yet."
+
+/obj/item/weapon/cane
+ name = "cane"
+ desc = "A cane used by a true gentlemen. Or a clown."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "cane"
+ item_state = "stick"
+ flags = CONDUCT
+ force = 5.0
+ throwforce = 7.0
+ w_class = 2.0
+ m_amt = 50
+ attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed")
+
+/obj/item/weapon/c_tube
+ name = "cardboard tube"
+ desc = "A tube... of cardboard."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "c_tube"
+ throwforce = 1
+ w_class = 1.0
+ throw_speed = 4
+ throw_range = 5
+
+
+
+/obj/item/weapon/fan
+ name = "desk fan"
+ icon = 'icons/obj/decorations.dmi'
+ icon_state = "fan"
+ desc = "A smal desktop fan. Button seems to be stuck in the 'on' position."
+
+/*
+/obj/item/weapon/game_kit
+ name = "Gaming Kit"
+ icon = 'icons/obj/items.dmi'
+ icon_state = "game_kit"
+ var/selected = null
+ var/board_stat = null
+ var/data = ""
+ var/base_url = "http://svn.slurm.us/public/spacestation13/misc/game_kit"
+ item_state = "sheet-metal"
+ w_class = 5.0
+*/
+
+/obj/item/weapon/gift
+ name = "gift"
+ desc = "A wrapped item."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "gift3"
+ var/size = 3.0
+ var/obj/item/gift = null
+ item_state = "gift"
+ w_class = 4.0
+
+/obj/item/weapon/kidanglobe
+ name = "Kidan homeworld globe"
+ icon = 'icons/obj/decorations.dmi'
+ icon_state = "kidanglobe"
+ desc = "A globe of the Kidan homeworld."
+
+/obj/item/weapon/lightning
+ name = "lightning"
+ icon = 'icons/obj/lightning.dmi'
+ icon_state = "lightning"
+ desc = "test lightning"
+
+ New()
+ icon = midicon
+ icon_state = "1"
+
+ afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params)
+ var/angle = get_angle(A, user)
+ //world << angle
+ angle = round(angle) + 45
+ if(angle > 180)
+ angle -= 180
+ else
+ angle += 180
+
+ if(!angle)
+ angle = 1
+ //world << "adjusted [angle]"
+ icon_state = "[angle]"
+ //world << "[angle] [(get_dist(user, A) - 1)]"
+ user.Beam(A, "lightning", 'icons/obj/zap.dmi', 50, 15)
+
+/obj/item/weapon/newton
+ name = "newton cradle"
+ icon = 'icons/obj/decorations.dmi'
+ icon_state = "newton"
+ desc = "A device bored paper pushers use to remind themselves that the time did not stop yet. Contains gravity."
+
+/obj/item/weapon/pai_cable
+ desc = "A flexible coated cable with a universal jack on one end."
+ name = "data cable"
+ icon = 'icons/obj/power.dmi'
+ icon_state = "wire1"
+
+ var/obj/machinery/machine
+
+/obj/item/weapon/phone
+ name = "red phone"
+ desc = "Should anything ever go wrong..."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "red_phone"
+ flags = CONDUCT
+ force = 3.0
+ throwforce = 2.0
+ throw_speed = 1
+ throw_range = 4
+ w_class = 2
+ attack_verb = list("called", "rang")
+ hitsound = 'sound/weapons/ring.ogg'
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/module.dm b/code/game/objects/items/weapons/module.dm
new file mode 100644
index 00000000000..51a045cba13
--- /dev/null
+++ b/code/game/objects/items/weapons/module.dm
@@ -0,0 +1,32 @@
+/obj/item/weapon/module
+ icon = 'icons/obj/module.dmi'
+ icon_state = "std_module"
+ w_class = 2.0
+ item_state = "electronic"
+ flags = CONDUCT
+ var/mtype = 1 // 1=electronic 2=hardware
+
+/obj/item/weapon/module/card_reader
+ name = "card reader module"
+ icon_state = "card_mod"
+ desc = "An electronic module for reading data and ID cards."
+
+/obj/item/weapon/module/power_control
+ name = "power control module"
+ icon_state = "power_mod"
+ desc = "Heavy-duty switching circuits for power control."
+
+/obj/item/weapon/module/id_auth
+ name = "\improper ID authentication module"
+ icon_state = "id_mod"
+ desc = "A module allowing secure authorization of ID cards."
+
+/obj/item/weapon/module/cell_power
+ name = "power cell regulator module"
+ icon_state = "power_mod"
+ desc = "A converter and regulator allowing the use of power cells."
+
+/obj/item/weapon/module/cell_power
+ name = "power cell charger module"
+ icon_state = "power_mod"
+ desc = "Charging circuits for power cells."
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm
new file mode 100644
index 00000000000..7f5f6b7861e
--- /dev/null
+++ b/code/game/objects/items/weapons/soap.dm
@@ -0,0 +1,28 @@
+/obj/item/weapon/soap
+ name = "soap"
+ desc = "A cheap bar of soap. Doesn't smell."
+ gender = PLURAL
+ icon = 'icons/obj/items.dmi'
+ icon_state = "soap"
+ w_class = 1.0
+ throwforce = 0
+ throw_speed = 4
+ throw_range = 20
+ discrete = 1
+ var/cleanspeed = 50 //slower than mop
+
+/obj/item/weapon/soap/nanotrasen
+ desc = "A Nanotrasen brand bar of soap. Smells of plasma."
+ icon_state = "soapnt"
+
+/obj/item/weapon/soap/deluxe
+ icon_state = "soapdeluxe"
+
+/obj/item/weapon/soap/deluxe/New()
+ desc = "A deluxe Waffle Co. brand bar of soap. Smells of comdoms."
+ cleanspeed = 40 //same speed as mop because deluxe -- captain gets one of these
+
+/obj/item/weapon/soap/syndie
+ desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster."
+ icon_state = "soapsyndie"
+ cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm
new file mode 100644
index 00000000000..a97ae394244
--- /dev/null
+++ b/code/game/objects/items/weapons/staff.dm
@@ -0,0 +1,31 @@
+/obj/item/weapon/staff
+ name = "wizards staff"
+ desc = "Apparently a staff used by the wizard."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "staff"
+ force = 3.0
+ throwforce = 5.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = 2.0
+ flags = NOSHIELD
+ attack_verb = list("bludgeoned", "whacked", "disciplined")
+
+/obj/item/weapon/staff/broom
+ name = "broom"
+ desc = "Used for sweeping, and flying into the night while cackling. Black cat not included."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "broom"
+
+/obj/item/weapon/staff/stick
+ name = "stick"
+ desc = "A great tool to drag someone else's drinks across the bar."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "stick"
+ item_state = "stick"
+ force = 3.0
+ throwforce = 5.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = 2.0
+ flags = NOSHIELD
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm
new file mode 100644
index 00000000000..758486872a4
--- /dev/null
+++ b/code/game/objects/items/weapons/stock_parts.dm
@@ -0,0 +1,238 @@
+///////////////////////////////////////Stock Parts /////////////////////////////////
+
+/obj/item/weapon/storage/part_replacer
+ name = "Rapid Part Exchange Device"
+ desc = "Special mechanical module made to store, sort, and apply standard machine parts."
+ icon_state = "RPED"
+ item_state = "RPED"
+ icon_override = 'icons/mob/in-hand/tools.dmi'
+ w_class = 5
+ can_hold = list("/obj/item/weapon/stock_parts")
+ storage_slots = 50
+ use_to_pickup = 1
+ allow_quick_gather = 1
+ allow_quick_empty = 1
+ collection_mode = 1
+ display_contents_with_number = 1
+ max_w_class = 3
+ max_combined_w_class = 100
+
+/obj/item/weapon/storage/part_replacer/proc/play_rped_sound()
+ //Plays the sound for RPED exchanging or installing parts.
+ playsound(src, 'sound/items/rped.ogg', 40, 1)
+
+//Sorts stock parts inside an RPED by their rating.
+//Only use /obj/item/weapon/stock_parts/ with this sort proc!
+/proc/cmp_rped_sort(var/obj/item/weapon/stock_parts/A, var/obj/item/weapon/stock_parts/B)
+ return B.rating - A.rating
+
+/obj/item/weapon/stock_parts
+ name = "stock part"
+ desc = "What?"
+ gender = PLURAL
+ icon = 'icons/obj/stock_parts.dmi'
+ w_class = 2.0
+ var/rating = 1
+ New()
+ src.pixel_x = rand(-5.0, 5)
+ src.pixel_y = rand(-5.0, 5)
+
+//Rank 1
+
+/obj/item/weapon/stock_parts/console_screen
+ name = "console screen"
+ desc = "Used in the construction of computers and other devices with a interactive console."
+ icon_state = "screen"
+ origin_tech = "materials=1"
+ g_amt = 200
+
+/obj/item/weapon/stock_parts/capacitor
+ name = "capacitor"
+ desc = "A basic capacitor used in the construction of a variety of devices."
+ icon_state = "capacitor"
+ origin_tech = "powerstorage=1"
+ m_amt = 50
+ g_amt = 50
+
+/obj/item/weapon/stock_parts/scanning_module
+ name = "scanning module"
+ desc = "A compact, high resolution scanning module used in the construction of certain devices."
+ icon_state = "scan_module"
+ origin_tech = "magnets=1"
+ m_amt = 50
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/manipulator
+ name = "micro-manipulator"
+ desc = "A tiny little manipulator used in the construction of certain devices."
+ icon_state = "micro_mani"
+ origin_tech = "materials=1;programming=1"
+ m_amt = 30
+
+/obj/item/weapon/stock_parts/micro_laser
+ name = "micro-laser"
+ desc = "A tiny laser used in certain devices."
+ icon_state = "micro_laser"
+ origin_tech = "magnets=1"
+ m_amt = 10
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/matter_bin
+ name = "matter bin"
+ desc = "A container for hold compressed matter awaiting re-construction."
+ icon_state = "matter_bin"
+ origin_tech = "materials=1"
+ m_amt = 80
+
+//Rank 2
+
+/obj/item/weapon/stock_parts/capacitor/adv
+ name = "advanced capacitor"
+ desc = "An advanced capacitor used in the construction of a variety of devices."
+ icon_state = "adv_capacitor"
+ origin_tech = "powerstorage=3"
+ rating = 2
+ m_amt = 50
+ g_amt = 50
+
+/obj/item/weapon/stock_parts/scanning_module/adv
+ name = "advanced scanning module"
+ desc = "A compact, high resolution scanning module used in the construction of certain devices."
+ icon_state = "adv_scan_module"
+ origin_tech = "magnets=3"
+ rating = 2
+ m_amt = 50
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/manipulator/nano
+ name = "nano-manipulator"
+ desc = "A tiny little manipulator used in the construction of certain devices."
+ icon_state = "nano_mani"
+ origin_tech = "materials=3,programming=2"
+ rating = 2
+ m_amt = 30
+
+/obj/item/weapon/stock_parts/micro_laser/high
+ name = "high-power micro-laser"
+ desc = "A tiny laser used in certain devices."
+ icon_state = "high_micro_laser"
+ origin_tech = "magnets=3"
+ rating = 2
+ m_amt = 10
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/matter_bin/adv
+ name = "advanced matter bin"
+ desc = "A container for hold compressed matter awaiting re-construction."
+ icon_state = "advanced_matter_bin"
+ origin_tech = "materials=3"
+ rating = 2
+ m_amt = 80
+
+//Rating 3
+
+/obj/item/weapon/stock_parts/capacitor/super
+ name = "super capacitor"
+ desc = "A super-high capacity capacitor used in the construction of a variety of devices."
+ icon_state = "super_capacitor"
+ origin_tech = "powerstorage=5;materials=4"
+ rating = 3
+ m_amt = 50
+ g_amt = 50
+
+/obj/item/weapon/stock_parts/scanning_module/phasic
+ name = "phasic scanning module"
+ desc = "A compact, high resolution phasic scanning module used in the construction of certain devices."
+ icon_state = "super_scan_module"
+ origin_tech = "magnets=5"
+ rating = 3
+ m_amt = 50
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/manipulator/pico
+ name = "pico-manipulator"
+ desc = "A tiny little manipulator used in the construction of certain devices."
+ icon_state = "pico_mani"
+ origin_tech = "materials=5,programming=2"
+ rating = 3
+ m_amt = 30
+
+/obj/item/weapon/stock_parts/micro_laser/ultra
+ name = "ultra-high-power micro-laser"
+ icon_state = "ultra_high_micro_laser"
+ desc = "A tiny laser used in certain devices."
+ origin_tech = "magnets=5"
+ rating = 3
+ m_amt = 10
+ g_amt = 20
+
+/obj/item/weapon/stock_parts/matter_bin/super
+ name = "super matter bin"
+ desc = "A container for hold compressed matter awaiting re-construction."
+ icon_state = "super_matter_bin"
+ origin_tech = "materials=5"
+ rating = 3
+ m_amt = 80
+
+// Subspace stock parts
+
+/obj/item/weapon/stock_parts/subspace/ansible
+ name = "subspace ansible"
+ icon_state = "subspace_ansible"
+ desc = "A compact module capable of sensing extradimensional activity."
+ origin_tech = "programming=2;magnets=3;materials=2;bluespace=1"
+ m_amt = 30
+ g_amt = 10
+
+/obj/item/weapon/stock_parts/subspace/filter
+ name = "hyperwave filter"
+ icon_state = "hyperwave_filter"
+ desc = "A tiny device capable of filtering and converting super-intense radiowaves."
+ origin_tech = "programming=2;magnets=1"
+ m_amt = 30
+ g_amt = 10
+
+/obj/item/weapon/stock_parts/subspace/amplifier
+ name = "subspace amplifier"
+ icon_state = "subspace_amplifier"
+ desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
+ origin_tech = "programming=2;magnets=2;materials=1;bluespace=1"
+ m_amt = 30
+ g_amt = 10
+
+/obj/item/weapon/stock_parts/subspace/treatment
+ name = "subspace treatment disk"
+ icon_state = "treatment_disk"
+ desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
+ origin_tech = "programming=2;magnets=1;materials=3;bluespace=1"
+ m_amt = 30
+ g_amt = 10
+
+/obj/item/weapon/stock_parts/subspace/analyzer
+ name = "subspace wavelength analyzer"
+ icon_state = "wavelength_analyzer"
+ desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
+ origin_tech = "programming=2;magnets=2;materials=2;bluespace=1"
+ m_amt = 30
+ g_amt = 10
+
+/obj/item/weapon/stock_parts/subspace/crystal
+ name = "ansible crystal"
+ icon_state = "ansible_crystal"
+ desc = "A crystal made from pure glass used to transmit laser databursts to subspace."
+ origin_tech = "magnets=2;materials=2;bluespace=1"
+ g_amt = 50
+
+/obj/item/weapon/stock_parts/subspace/transmitter
+ name = "subspace transmitter"
+ icon_state = "subspace_transmitter"
+ desc = "A large piece of equipment used to open a window into the subspace dimension."
+ origin_tech = "magnets=3;materials=3;bluespace=2"
+ m_amt = 50
+
+/obj/item/weapon/research//Makes testing much less of a pain -Sieve
+ name = "research"
+ icon = 'icons/obj/stock_parts.dmi'
+ icon_state = "capacitor"
+ desc = "A debug item for research."
+ origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8"
diff --git a/code/game/objects/items/weapons/syndie_uplink.dm b/code/game/objects/items/weapons/syndie_uplink.dm
new file mode 100644
index 00000000000..825a55865be
--- /dev/null
+++ b/code/game/objects/items/weapons/syndie_uplink.dm
@@ -0,0 +1,38 @@
+/*/obj/item/weapon/syndicate_uplink
+ name = "station bounced radio"
+ desc = "Remain silent about this..."
+ icon = 'icons/obj/radio.dmi'
+ icon_state = "radio"
+ var/temp = null
+ var/uses = 10.0
+ var/selfdestruct = 0.0
+ var/traitor_frequency = 0.0
+ var/mob/currentUser = null
+ var/obj/item/device/radio/origradio = null
+ flags = CONDUCT | ONBELT
+ w_class = 2.0
+ item_state = "radio"
+ throw_speed = 4
+ throw_range = 20
+ m_amt = 100
+ origin_tech = "magnets=2;syndicate=3"*/
+
+/obj/item/weapon/SWF_uplink
+ name = "station-bounced radio"
+ desc = "used to comunicate it appears."
+ icon = 'icons/obj/radio.dmi'
+ icon_state = "radio"
+ var/temp = null
+ var/uses = 4.0
+ var/selfdestruct = 0.0
+ var/traitor_frequency = 0.0
+ var/obj/item/device/radio/origradio = null
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ item_state = "radio"
+ throwforce = 5
+ w_class = 2.0
+ throw_speed = 4
+ throw_range = 20
+ m_amt = 100
+ origin_tech = "magnets=1"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm
index 03a07d4a2d1..560d5c2e754 100644
--- a/code/game/objects/items/weapons/table_rack_parts.dm
+++ b/code/game/objects/items/weapons/table_rack_parts.dm
@@ -6,7 +6,43 @@
* Rack Parts
*/
+/obj/item/weapon/table_parts
+ name = "table parts"
+ desc = "Parts of a table. Poor table."
+ gender = PLURAL
+ icon = 'icons/obj/items.dmi'
+ icon_state = "table_parts"
+ m_amt = 3750
+ flags = CONDUCT
+ attack_verb = list("slammed", "bashed", "battered", "bludgeoned", "thrashed", "whacked")
+/obj/item/weapon/table_parts/reinforced
+ name = "reinforced table parts"
+ desc = "Hard table parts. Well...harder..."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "reinf_tableparts"
+ m_amt = 7500
+ flags = CONDUCT
+
+/obj/item/weapon/table_parts/wood
+ name = "wooden table parts"
+ desc = "Keep away from fire."
+ icon_state = "wood_tableparts"
+ flags = null
+
+/obj/item/weapon/table_parts/glass
+ name = "glass table parts"
+ desc = "fragile!"
+ icon_state = "glass_tableparts"
+ flags = null
+
+/obj/item/weapon/rack_parts
+ name = "rack parts"
+ desc = "Parts of a rack."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "rack_parts"
+ flags = CONDUCT
+ m_amt = 3750
/*
* Table Parts
diff --git a/code/game/objects/items/weapons/wires.dm b/code/game/objects/items/weapons/wires.dm
index 284be5284c3..6ab0138391e 100644
--- a/code/game/objects/items/weapons/wires.dm
+++ b/code/game/objects/items/weapons/wires.dm
@@ -1,5 +1,21 @@
// WIRES
+/obj/item/weapon/wire
+ desc = "This is just a simple piece of regular insulated wire."
+ name = "wire"
+ icon = 'icons/obj/power.dmi'
+ icon_state = "item_wire"
+ var/amount = 1.0
+ var/laying = 0.0
+ var/old_lay = null
+ m_amt = 40
+ attack_verb = list("whipped", "lashed", "disciplined", "tickled")
+
+ suicide_act(mob/user)
+ viewers(user) << "\red [user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide."
+ return (OXYLOSS)
+
+
/obj/item/weapon/wire/proc/update()
if (src.amount > 1)
src.icon_state = "spool_wire"
diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm
new file mode 100644
index 00000000000..fc9a0d4584c
--- /dev/null
+++ b/code/game/objects/structures/misc.dm
@@ -0,0 +1,59 @@
+//MISC structures- if it is less than 100 lines and doesn't fit in a category, toss it in here!
+
+/*CURRENT CONTENTS:
+ NT recruitment signpost
+ Ninja Teleportation Console
+*/
+
+/obj/structure/signpost
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "signpost"
+ anchored = 1
+ density = 1
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ return attack_hand(user)
+
+ attack_hand(mob/user as mob)
+ user << "Civilians: NT is recruiting! Please head SOUTH to the NT Recruitment office to join the station's crew!"
+
+/obj/structure/ninjatele
+
+ name = "Long-Distance Teleportation Console"
+ desc = "A console used to send a Spider Clan operative long distances rapidly."
+ icon = 'icons/obj/ninjaobjects.dmi'
+ icon_state = "teleconsole"
+ anchored = 1
+ density = 0
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+
+ return attack_hand(user)
+
+
+ attack_hand(mob/user as mob)
+
+
+ if (user.mind.special_role=="Ninja")
+ switch(alert("Phase Jaunt relay primed, target locked as [station_name()], initiate VOID-shift translocation? (Warning! Internals required!)",,"Yes","No"))
+
+ if("Yes")
+ if(user.z != src.z) return
+
+ user.loc.loc.Exited(user)
+ user.loc = pick(carplist) // In the future, possibly make specific NinjaTele landmarks, and give him an option to teleport to North/South/East/West of SS13 instead of just hijacking a carpspawn.
+
+
+ playsound(user.loc, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(user.loc, 'sound/effects/sparks2.ogg', 50, 1)
+ anim(user.loc,user,'icons/mob/mob.dmi',,"phasein",,user.dir)
+
+ user <<"\blue VOID-Shift translocation successful"
+
+ if("No")
+
+ user <<"\red Process aborted!"
+
+ return
+ else
+ user<< "\red FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked."
\ No newline at end of file
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index df21cfa90d6..d70035bdc84 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -1,4 +1,4 @@
-//Analyzer, pestkillers, weedkillers, nutrients, hatchets, cutters.
+//Analyzer, pestkillers, weedkillers, nutrients, hatchets, cutters, Rapid-Seed-Producer (RSP), corn cob.
/obj/item/weapon/wirecutters/clippers
name = "plant clippers"
@@ -263,21 +263,17 @@
icon_state = "hatchet"
flags = CONDUCT
force = 12.0
+ sharp = 1
+ edge = 1
w_class = 2.0
throwforce = 15.0
throw_speed = 4
throw_range = 4
- sharp = 1
- edge = 1
- m_amt = 10000
+ m_amt = 15000
origin_tech = "materials=2;combat=1"
attack_verb = list("chopped", "torn", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
-/obj/item/weapon/hatchet/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-//If it's a hatchet it goes here. I guess
/obj/item/weapon/hatchet/unathiknife
name = "duelling knife"
desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
@@ -300,13 +296,16 @@
desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
force = 13.0
throwforce = 5.0
- throw_speed = 1
+ sharp = 1
+ edge = 1
+ throw_speed = 2
throw_range = 3
w_class = 4.0
flags = NOSHIELD
slot_flags = SLOT_BACK
origin_tech = "materials=2;combat=2"
attack_verb = list("chopped", "sliced", "cut", "reaped")
+ hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity)
if(!proximity) return
@@ -314,4 +313,38 @@
for(var/obj/effect/plant/B in orange(A,1))
if(prob(80))
B.die_off(1)
- del A
\ No newline at end of file
+ qdel(A)
+
+/obj/item/weapon/rsp
+ name = "\improper Rapid-Seed-Producer (RSP)"
+ desc = "A device used to rapidly deploy seeds."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "rcd"
+ opacity = 0
+ density = 0
+ anchored = 0.0
+ var/matter = 0
+ var/mode = 1
+ w_class = 3.0
+
+/obj/item/weapon/bananapeel
+ name = "banana peel"
+ desc = "A peel from a banana."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "banana_peel"
+ item_state = "banana_peel"
+ w_class = 1.0
+ throwforce = 0
+ throw_speed = 4
+ throw_range = 20
+
+/obj/item/weapon/corncob
+ name = "corn cob"
+ desc = "A reminder of meals gone by."
+ icon = 'icons/obj/harvest.dmi'
+ icon_state = "corncob"
+ item_state = "corncob"
+ w_class = 1.0
+ throwforce = 0
+ throw_speed = 4
+ throw_range = 20
diff --git a/paradise.dme b/paradise.dme
index e98f8cf6e2f..1bf34f25e1d 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -189,9 +189,7 @@
#include "code\datums\wires\taperecorder.dm"
#include "code\datums\wires\vending.dm"
#include "code\datums\wires\wires.dm"
-#include "code\defines\obj.dm"
#include "code\defines\vox_sounds.dm"
-#include "code\defines\obj\weapon.dm"
#include "code\defines\procs\admin.dm"
#include "code\defines\procs\announce.dm"
#include "code\defines\procs\AStar.dm"
@@ -537,6 +535,7 @@
#include "code\game\objects\effects\aliens.dm"
#include "code\game\objects\effects\anomalies.dm"
#include "code\game\objects\effects\bump_teleporter.dm"
+#include "code\game\objects\effects\datacore-effect.dm"
#include "code\game\objects\effects\effect_system.dm"
#include "code\game\objects\effects\explosion_particles.dm"
#include "code\game\objects\effects\forcefields.dm"
@@ -576,6 +575,7 @@
#include "code\game\objects\items\documents.dm"
#include "code\game\objects\items\flag.dm"
#include "code\game\objects\items\latexballoon.dm"
+#include "code\game\objects\items\misc.dm"
#include "code\game\objects\items\policetape.dm"
#include "code\game\objects\items\random_items.dm"
#include "code\game\objects\items\shooting_range.dm"
@@ -644,6 +644,7 @@
#include "code\game\objects\items\weapons\alien_specific.dm"
#include "code\game\objects\items\weapons\cards_ids.dm"
#include "code\game\objects\items\weapons\cash.dm"
+#include "code\game\objects\items\weapons\caution.dm"
#include "code\game\objects\items\weapons\chrono_eraser.dm"
#include "code\game\objects\items\weapons\cigs_lighters.dm"
#include "code\game\objects\items\weapons\clown_items.dm"
@@ -651,6 +652,7 @@
#include "code\game\objects\items\weapons\courtroom.dm"
#include "code\game\objects\items\weapons\defib.dm"
#include "code\game\objects\items\weapons\dice.dm"
+#include "code\game\objects\items\weapons\disks.dm"
#include "code\game\objects\items\weapons\dna_injector.dm"
#include "code\game\objects\items\weapons\dnascrambler.dm"
#include "code\game\objects\items\weapons\explosives.dm"
@@ -660,9 +662,13 @@
#include "code\game\objects\items\weapons\gift_wrappaper.dm"
#include "code\game\objects\items\weapons\grenades.dm"
#include "code\game\objects\items\weapons\handcuffs.dm"
+#include "code\game\objects\items\weapons\holosign.dm"
#include "code\game\objects\items\weapons\hydroponics.dm"
#include "code\game\objects\items\weapons\kitchen.dm"
+#include "code\game\objects\items\weapons\legcuffs.dm"
#include "code\game\objects\items\weapons\manuals.dm"
+#include "code\game\objects\items\weapons\misc.dm"
+#include "code\game\objects\items\weapons\module.dm"
#include "code\game\objects\items\weapons\mop.dm"
#include "code\game\objects\items\weapons\paint.dm"
#include "code\game\objects\items\weapons\paiwire.dm"
@@ -673,9 +679,13 @@
#include "code\game\objects\items\weapons\shards.dm"
#include "code\game\objects\items\weapons\shields.dm"
#include "code\game\objects\items\weapons\signs.dm"
+#include "code\game\objects\items\weapons\soap.dm"
+#include "code\game\objects\items\weapons\staff.dm"
+#include "code\game\objects\items\weapons\stock_parts.dm"
#include "code\game\objects\items\weapons\stunbaton.dm"
#include "code\game\objects\items\weapons\surgery_tools.dm"
#include "code\game\objects\items\weapons\swords_axes_etc.dm"
+#include "code\game\objects\items\weapons\syndie_uplink.dm"
#include "code\game\objects\items\weapons\table_rack_parts.dm"
#include "code\game\objects\items\weapons\teleportation.dm"
#include "code\game\objects\items\weapons\tools.dm"
@@ -747,6 +757,7 @@
#include "code\game\objects\structures\lattice.dm"
#include "code\game\objects\structures\mineral_doors.dm"
#include "code\game\objects\structures\mirror.dm"
+#include "code\game\objects\structures\misc.dm"
#include "code\game\objects\structures\mop_bucket.dm"
#include "code\game\objects\structures\morgue.dm"
#include "code\game\objects\structures\musician.dm"