diff --git a/baystation12.dme b/baystation12.dme
index fad46ccc344..7b3e8565e88 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -605,7 +605,6 @@
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
#include "code\game\objects\items\weapons\AI_modules.dm"
#include "code\game\objects\items\weapons\autopsy.dm"
-#include "code\game\objects\items\weapons\bats.dm"
#include "code\game\objects\items\weapons\candle.dm"
#include "code\game\objects\items\weapons\cards_ids.dm"
#include "code\game\objects\items\weapons\cigs_lighters.dm"
@@ -618,6 +617,7 @@
#include "code\game\objects\items\weapons\flamethrower.dm"
#include "code\game\objects\items\weapons\gift_wrappaper.dm"
#include "code\game\objects\items\weapons\handcuffs.dm"
+#include "code\game\objects\items\weapons\improvised_components.dm"
#include "code\game\objects\items\weapons\kitchen.dm"
#include "code\game\objects\items\weapons\manuals.dm"
#include "code\game\objects\items\weapons\mop.dm"
@@ -628,7 +628,6 @@
#include "code\game\objects\items\weapons\RCD.dm"
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
-#include "code\game\objects\items\weapons\shards.dm"
#include "code\game\objects\items\weapons\shields.dm"
#include "code\game\objects\items\weapons\stunbaton.dm"
#include "code\game\objects\items\weapons\surgery_tools.dm"
@@ -636,7 +635,6 @@
#include "code\game\objects\items\weapons\tape.dm"
#include "code\game\objects\items\weapons\teleportation.dm"
#include "code\game\objects\items\weapons\tools.dm"
-#include "code\game\objects\items\weapons\twohanded.dm"
#include "code\game\objects\items\weapons\weaponry.dm"
#include "code\game\objects\items\weapons\weldbackpack.dm"
#include "code\game\objects\items\weapons\wires.dm"
@@ -674,6 +672,14 @@
#include "code\game\objects\items\weapons\implants\implantfreedom.dm"
#include "code\game\objects\items\weapons\implants\implantpad.dm"
#include "code\game\objects\items\weapons\implants\implantuplink.dm"
+#include "code\game\objects\items\weapons\material\bats.dm"
+#include "code\game\objects\items\weapons\material\kitchen.dm"
+#include "code\game\objects\items\weapons\material\knives.dm"
+#include "code\game\objects\items\weapons\material\misc.dm"
+#include "code\game\objects\items\weapons\material\shards.dm"
+#include "code\game\objects\items\weapons\material\swords.dm"
+#include "code\game\objects\items\weapons\material\thrown.dm"
+#include "code\game\objects\items\weapons\material\twohanded.dm"
#include "code\game\objects\items\weapons\melee\energy.dm"
#include "code\game\objects\items\weapons\melee\misc.dm"
#include "code\game\objects\items\weapons\storage\backpack.dm"
diff --git a/code/game/objects/items/weapons/improvised_components.dm b/code/game/objects/items/weapons/improvised_components.dm
new file mode 100644
index 00000000000..31a6e8d6a90
--- /dev/null
+++ b/code/game/objects/items/weapons/improvised_components.dm
@@ -0,0 +1,68 @@
+/obj/item/butterflyconstruction
+ name = "unfinished concealed knife"
+ desc = "An unfinished concealed knife, it looks like the screws need to be tightened."
+ icon = 'icons/obj/buildingobject.dmi'
+ icon_state = "butterflystep1"
+
+/obj/item/butterflyconstruction/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/weapon/screwdriver))
+ user << "You finish the concealed blade weapon."
+ new /obj/item/weapon/butterfly(user.loc)
+ qdel(src)
+ return
+
+/obj/item/butterflyblade
+ name = "knife blade"
+ desc = "A knife blade. Unusable as a weapon without a grip."
+ icon = 'icons/obj/buildingobject.dmi'
+ icon_state = "butterfly2"
+ matter = list(DEFAULT_WALL_MATERIAL = 5000)
+
+/obj/item/butterflyhandle
+ name = "concealed knife grip"
+ desc = "A plasteel grip with screw fittings for a blade."
+ icon = 'icons/obj/buildingobject.dmi'
+ icon_state = "butterfly1"
+ matter = list(DEFAULT_WALL_MATERIAL = 4000)
+
+/obj/item/butterflyhandle/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/butterflyblade))
+ user << "You attach the two concealed blade parts."
+ new /obj/item/butterflyconstruction(user.loc)
+ qdel(W)
+ qdel(src)
+ return
+ update_icon(user)
+
+/obj/item/weapon/wirerod
+ name = "wired rod"
+ desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit."
+ icon_state = "wiredrod"
+ item_state = "rods"
+ flags = CONDUCT
+ force = 8
+ throwforce = 10
+ w_class = 3
+ attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
+
+
+/obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob)
+ ..()
+ if(istype(I, /obj/item/weapon/shard))
+ var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear
+
+ user.put_in_hands(S)
+ user << "You fasten the glass shard to the top of the rod with the cable."
+ qdel(I)
+ qdel(src)
+ update_icon(user)
+
+ else if(istype(I, /obj/item/weapon/wirecutters))
+ var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod
+
+ user.put_in_hands(P)
+ user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward."
+ qdel(I)
+ qdel(src)
+ update_icon(user)
+ update_icon(user)
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 3a1496939ed..e69de29bb2d 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -1,468 +0,0 @@
-/* Kitchen tools
- * Contains:
- * Utensils
- * Spoons
- * Forks
- * Knives
- * Kitchen knives
- * Butcher's cleaver
- * Rolling Pins
- * Trays
- */
-
-/obj/item/weapon/kitchen
- icon = 'icons/obj/kitchen.dmi'
-
-/*
- * Utensils
- */
-/obj/item/weapon/kitchen/utensil
- force = 5.0
- w_class = 1.0
- throwforce = 5.0
- throw_speed = 3
- throw_range = 5
- flags = CONDUCT
- origin_tech = "materials=1"
- attack_verb = list("attacked", "stabbed", "poked")
- sharp = 0
-
- var/loaded //Descriptive string for currently loaded food object.
-
-/obj/item/weapon/kitchen/utensil/New()
- if (prob(60))
- src.pixel_y = rand(0, 4)
-
- create_reagents(5)
- return
-
-/obj/item/weapon/kitchen/utensil/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return ..()
-
- if(user.a_intent != I_HELP)
- if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes")
- if((CLUMSY in user.mutations) && prob(50))
- M = user
- return eyestab(M,user)
- else
- return ..()
-
- if (reagents.total_volume > 0)
- reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST)
- if(M == user)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\blue [] eats some [] from \the [].", user, loaded, src), 1)
- M.reagents.add_reagent("nutriment", 1)
- else
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\blue [] feeds [] some [] from \the []", user, M, loaded, src), 1)
- M.reagents.add_reagent("nutriment", 1)
- playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
- overlays.Cut()
- return
- else
- ..()
-
-/obj/item/weapon/kitchen/utensil/fork
- name = "fork"
- desc = "It's a fork. Sure is pointy."
- icon_state = "fork"
-
-/obj/item/weapon/kitchen/utensil/pfork
- name = "plastic fork"
- desc = "Yay, no washing up to do."
- icon_state = "pfork"
-
-/obj/item/weapon/kitchen/utensil/spoon
- name = "spoon"
- desc = "It's a spoon. You can see your own upside-down face in it."
- icon_state = "spoon"
- attack_verb = list("attacked", "poked")
-
-/obj/item/weapon/kitchen/utensil/pspoon
- name = "plastic spoon"
- desc = "It's a plastic spoon. How dull."
- icon_state = "pspoon"
- attack_verb = list("attacked", "poked")
-
-/*
- * Knives
- */
-/obj/item/weapon/kitchen/utensil/knife
- name = "knife"
- desc = "Can cut through any food."
- icon_state = "knife"
- force = 10.0
- throwforce = 10.0
- sharp = 1
- edge = 1
-
- suicide_act(mob/user)
- viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
-
-/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red You accidentally cut yourself with the [src]."
- user.take_organ_damage(20)
- return
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/obj/item/weapon/kitchen/utensil/pknife
- name = "plastic knife"
- desc = "The bluntest of blades."
- icon_state = "pknife"
- force = 1
- throwforce = 1
- sharp = 0
- edge = 1 //for cutting pizzas
-
-/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red You somehow managed to cut yourself with the [src]."
- user.take_organ_damage(20)
- return
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/*
- * Kitchen knives
- */
-/obj/item/weapon/kitchenknife
- name = "kitchen knife"
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "knife"
- desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
- flags = CONDUCT
- sharp = 1
- edge = 1
- force = 10.0
- w_class = 3.0
- throwforce = 6.0
- throw_speed = 3
- throw_range = 6
- matter = list(DEFAULT_WALL_MATERIAL = 12000)
- origin_tech = "materials=1"
- attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-
- suicide_act(mob/user)
- viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
-
-/obj/item/weapon/kitchenknife/hook
- name = "meat hook"
- desc = "A sharp, metal hook what sticks into things."
- icon_state = "hook_knife"
- item_state = "hook_knife"
-
-/obj/item/weapon/kitchenknife/ritual
- name = "ritual knife"
- desc = "The unearthly energies that once powered this blade are now dormant."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "render"
-
-/*
- * Bucher's cleaver
- */
-/obj/item/weapon/butch
- name = "butcher's cleaver"
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "butch"
- desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
- flags = CONDUCT
- force = 15.0
- w_class = 2.0
- throwforce = 8.0
- throw_speed = 3
- throw_range = 6
- matter = list(DEFAULT_WALL_MATERIAL = 12000)
- origin_tech = "materials=1"
- attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- sharp = 1
- edge = 1
-
-/obj/item/weapon/butch/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/*
- * Rolling Pins
- */
-
-/obj/item/weapon/kitchen/rollingpin
- name = "rolling pin"
- desc = "Used to knock out the Bartender."
- icon_state = "rolling_pin"
- force = 8.0
- throwforce = 10.0
- throw_speed = 2
- throw_range = 7
- w_class = 3.0
- attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway.
-
-/obj/item/weapon/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red The [src] slips out of your hand and hits your head."
- user.take_organ_damage(10)
- user.Paralyse(2)
- return
-
- M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
- msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)")
-
- var/t = user:zone_sel.selecting
- if (t == "head")
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if (H.stat < 2 && H.health < 50 && prob(90))
- // ******* Check
- if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80))
- H << "\red The helmet protects you from being hit hard in the head!"
- return
- var/time = rand(2, 6)
- if (prob(75))
- H.Paralyse(time)
- else
- H.Stun(time)
- if(H.stat != 2) H.stat = 1
- user.visible_message("\red [H] has been knocked unconscious!", "\red You knock [H] unconscious!")
- return
- else
- H.visible_message("\red [user] tried to knock [H] unconscious!", "\red [user] tried to knock you unconscious!")
- H.eye_blurry += 3
- return ..()
-
-/*
- * Trays - Agouri
- */
-/obj/item/weapon/tray
- name = "tray"
- icon = 'icons/obj/food.dmi'
- icon_state = "tray"
- desc = "A metal tray to lay food on."
- throwforce = 12.0
- throwforce = 10.0
- throw_speed = 1
- throw_range = 5
- w_class = 3.0
- flags = CONDUCT
- matter = list(DEFAULT_WALL_MATERIAL = 3000)
- /* // NOPE
- var/food_total= 0
- var/burger_amt = 0
- var/cheese_amt = 0
- var/fries_amt = 0
- var/classyalcdrink_amt = 0
- var/alcdrink_amt = 0
- var/bottle_amt = 0
- var/soda_amt = 0
- var/carton_amt = 0
- var/pie_amt = 0
- var/meatbreadslice_amt = 0
- var/salad_amt = 0
- var/miscfood_amt = 0
- */
- var/list/carrying = list() // List of things on the tray. - Doohl
- var/max_carry = 10 // w_class = 1 -- takes up 1
- // w_class = 2 -- takes up 3
- // w_class = 3 -- takes up 5
-
-/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
-
- // Drop all the things. All of them.
- overlays.Cut()
- for(var/obj/item/I in carrying)
- I.loc = M.loc
- carrying.Remove(I)
- if(isturf(I.loc))
- spawn()
- for(var/i = 1, i <= rand(1,2), i++)
- if(I)
- step(I, pick(NORTH,SOUTH,EAST,WEST))
- sleep(rand(2,4))
-
-
- if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown?
- M << "\red You accidentally slam yourself with the [src]!"
- M.Weaken(1)
- user.take_organ_damage(2)
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- return
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
- return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3
-
- var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later.
-
-
- if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes
- if(prob(33))
- src.add_blood(H)
- var/turf/location = H.loc
- if (istype(location, /turf/simulated))
- location.add_blood(H) ///Plik plik, the sound of blood
-
- M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
- msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)")
-
- if(prob(15))
- M.Weaken(3)
- M.take_organ_damage(3)
- else
- M.take_organ_damage(5)
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
- return
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
- return
-
-
-
-
- if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
- M << "\red You get slammed in the face with the tray, against your mask!"
- if(prob(33))
- src.add_blood(H)
- if (H.wear_mask)
- H.wear_mask.add_blood(H)
- if (H.head)
- H.head.add_blood(H)
- if (H.glasses && prob(33))
- H.glasses.add_blood(H)
- var/turf/location = H.loc
- if (istype(location, /turf/simulated)) //Addin' blood! At least on the floor and item :v
- location.add_blood(H)
-
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
- if(prob(10))
- M.Stun(rand(1,3))
- M.take_organ_damage(3)
- return
- else
- M.take_organ_damage(5)
- return
-
- else //No eye or head protection, tough luck!
- M << "\red You get slammed in the face with the tray!"
- if(prob(33))
- src.add_blood(M)
- var/turf/location = H.loc
- if (istype(location, /turf/simulated))
- location.add_blood(H)
-
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1)
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1)
- if(prob(30))
- M.Stun(rand(2,4))
- M.take_organ_damage(4)
- return
- else
- M.take_organ_damage(8)
- if(prob(30))
- M.Weaken(2)
- return
- return
-
-/obj/item/weapon/tray/var/cooldown = 0 //shield bash cooldown. based on world.time
-
-/obj/item/weapon/tray/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/kitchen/rollingpin))
- if(cooldown < world.time - 25)
- user.visible_message("[user] bashes [src] with [W]!")
- playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1)
- cooldown = world.time
- else
- ..()
-
-/*
-===============~~~~~================================~~~~~====================
-= =
-= Code for trays carrying things. By Doohl for Doohl erryday Doohl Doohl~ =
-= =
-===============~~~~~================================~~~~~====================
-*/
-/obj/item/weapon/tray/proc/calc_carry()
- // calculate the weight of the items on the tray
- var/val = 0 // value to return
-
- for(var/obj/item/I in carrying)
- if(I.w_class == 1.0)
- val ++
- else if(I.w_class == 2.0)
- val += 3
- else
- val += 5
-
- return val
-
-/obj/item/weapon/tray/pickup(mob/user)
-
- if(!isturf(loc))
- return
-
- for(var/obj/item/I in loc)
- if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) )
- var/add = 0
- if(I.w_class == 1.0)
- add = 1
- else if(I.w_class == 2.0)
- add = 3
- else
- add = 5
- if(calc_carry() + add >= max_carry)
- break
-
- I.loc = src
- carrying.Add(I)
- overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
-
-/obj/item/weapon/tray/dropped(mob/user)
-
- var/mob/living/M
- for(M in src.loc) //to handle hand switching
- return
-
- var/foundtable = 0
- for(var/obj/structure/table/T in loc)
- foundtable = 1
- break
-
- overlays.Cut()
-
- for(var/obj/item/I in carrying)
- I.loc = loc
- carrying.Remove(I)
- if(!foundtable && isturf(loc))
- // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere!
- spawn()
- for(var/i = 1, i <= rand(1,2), i++)
- if(I)
- step(I, pick(NORTH,SOUTH,EAST,WEST))
- sleep(rand(2,4))
diff --git a/code/game/objects/items/weapons/bats.dm b/code/game/objects/items/weapons/material/bats.dm
similarity index 100%
rename from code/game/objects/items/weapons/bats.dm
rename to code/game/objects/items/weapons/material/bats.dm
diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm
new file mode 100644
index 00000000000..f2f383bba98
--- /dev/null
+++ b/code/game/objects/items/weapons/material/kitchen.dm
@@ -0,0 +1,392 @@
+/obj/item/weapon/kitchen
+ icon = 'icons/obj/kitchen.dmi'
+
+/*
+ * Utensils
+ */
+/obj/item/weapon/kitchen/utensil
+ force = 5.0
+ w_class = 1.0
+ throwforce = 5.0
+ throw_speed = 3
+ throw_range = 5
+ flags = CONDUCT
+ origin_tech = "materials=1"
+ attack_verb = list("attacked", "stabbed", "poked")
+ sharp = 0
+
+ var/loaded //Descriptive string for currently loaded food object.
+
+/obj/item/weapon/kitchen/utensil/New()
+ if (prob(60))
+ src.pixel_y = rand(0, 4)
+
+ create_reagents(5)
+ return
+
+/obj/item/weapon/kitchen/utensil/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ if(!istype(M))
+ return ..()
+
+ if(user.a_intent != I_HELP)
+ if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes")
+ if((CLUMSY in user.mutations) && prob(50))
+ M = user
+ return eyestab(M,user)
+ else
+ return ..()
+
+ if (reagents.total_volume > 0)
+ reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST)
+ if(M == user)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\blue [] eats some [] from \the [].", user, loaded, src), 1)
+ M.reagents.add_reagent("nutriment", 1)
+ else
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\blue [] feeds [] some [] from \the []", user, M, loaded, src), 1)
+ M.reagents.add_reagent("nutriment", 1)
+ playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
+ overlays.Cut()
+ return
+ else
+ ..()
+
+/obj/item/weapon/kitchen/utensil/fork
+ name = "fork"
+ desc = "It's a fork. Sure is pointy."
+ icon_state = "fork"
+
+/obj/item/weapon/kitchen/utensil/pfork
+ name = "plastic fork"
+ desc = "Yay, no washing up to do."
+ icon_state = "pfork"
+
+/obj/item/weapon/kitchen/utensil/spoon
+ name = "spoon"
+ desc = "It's a spoon. You can see your own upside-down face in it."
+ icon_state = "spoon"
+ attack_verb = list("attacked", "poked")
+
+/obj/item/weapon/kitchen/utensil/pspoon
+ name = "plastic spoon"
+ desc = "It's a plastic spoon. How dull."
+ icon_state = "pspoon"
+ attack_verb = list("attacked", "poked")
+
+/*
+ * Knives
+ */
+/obj/item/weapon/kitchen/utensil/knife
+ name = "knife"
+ desc = "Can cut through any food."
+ icon_state = "knife"
+ force = 10.0
+ throwforce = 10.0
+ sharp = 1
+ edge = 1
+
+ suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
+ return (BRUTELOSS)
+
+/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
+ if ((CLUMSY in user.mutations) && prob(50))
+ user << "\red You accidentally cut yourself with the [src]."
+ user.take_organ_damage(20)
+ return
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return ..()
+
+/obj/item/weapon/kitchen/utensil/pknife
+ name = "plastic knife"
+ desc = "The bluntest of blades."
+ icon_state = "pknife"
+ force = 1
+ throwforce = 1
+ sharp = 0
+ edge = 1 //for cutting pizzas
+
+/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
+ if ((CLUMSY in user.mutations) && prob(50))
+ user << "\red You somehow managed to cut yourself with the [src]."
+ user.take_organ_damage(20)
+ return
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return ..()
+
+/*
+ * Rolling Pins
+ */
+
+/obj/item/weapon/kitchen/rollingpin
+ name = "rolling pin"
+ desc = "Used to knock out the Bartender."
+ icon_state = "rolling_pin"
+ force = 8.0
+ throwforce = 10.0
+ throw_speed = 2
+ throw_range = 7
+ w_class = 3.0
+ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway.
+
+/obj/item/weapon/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
+ if ((CLUMSY in user.mutations) && prob(50))
+ user << "\red The [src] slips out of your hand and hits your head."
+ user.take_organ_damage(10)
+ user.Paralyse(2)
+ return
+
+ M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)")
+
+ var/t = user:zone_sel.selecting
+ if (t == "head")
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if (H.stat < 2 && H.health < 50 && prob(90))
+ // ******* Check
+ if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80))
+ H << "\red The helmet protects you from being hit hard in the head!"
+ return
+ var/time = rand(2, 6)
+ if (prob(75))
+ H.Paralyse(time)
+ else
+ H.Stun(time)
+ if(H.stat != 2) H.stat = 1
+ user.visible_message("\red [H] has been knocked unconscious!", "\red You knock [H] unconscious!")
+ return
+ else
+ H.visible_message("\red [user] tried to knock [H] unconscious!", "\red [user] tried to knock you unconscious!")
+ H.eye_blurry += 3
+ return ..()
+
+/*
+ * Trays - Agouri
+ */
+/obj/item/weapon/tray
+ name = "tray"
+ icon = 'icons/obj/food.dmi'
+ icon_state = "tray"
+ desc = "A metal tray to lay food on."
+ throwforce = 12.0
+ throwforce = 10.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = 3.0
+ flags = CONDUCT
+ matter = list(DEFAULT_WALL_MATERIAL = 3000)
+ /* // NOPE
+ var/food_total= 0
+ var/burger_amt = 0
+ var/cheese_amt = 0
+ var/fries_amt = 0
+ var/classyalcdrink_amt = 0
+ var/alcdrink_amt = 0
+ var/bottle_amt = 0
+ var/soda_amt = 0
+ var/carton_amt = 0
+ var/pie_amt = 0
+ var/meatbreadslice_amt = 0
+ var/salad_amt = 0
+ var/miscfood_amt = 0
+ */
+ var/list/carrying = list() // List of things on the tray. - Doohl
+ var/max_carry = 10 // w_class = 1 -- takes up 1
+ // w_class = 2 -- takes up 3
+ // w_class = 3 -- takes up 5
+
+/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+
+ // Drop all the things. All of them.
+ overlays.Cut()
+ for(var/obj/item/I in carrying)
+ I.loc = M.loc
+ carrying.Remove(I)
+ if(isturf(I.loc))
+ spawn()
+ for(var/i = 1, i <= rand(1,2), i++)
+ if(I)
+ step(I, pick(NORTH,SOUTH,EAST,WEST))
+ sleep(rand(2,4))
+
+
+ if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown?
+ M << "\red You accidentally slam yourself with the [src]!"
+ M.Weaken(1)
+ user.take_organ_damage(2)
+ if(prob(50))
+ playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
+ return
+ else
+ playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
+ return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3
+
+ var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later.
+
+
+ if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes
+ if(prob(33))
+ src.add_blood(H)
+ var/turf/location = H.loc
+ if (istype(location, /turf/simulated))
+ location.add_blood(H) ///Plik plik, the sound of blood
+
+ M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)")
+
+ if(prob(15))
+ M.Weaken(3)
+ M.take_organ_damage(3)
+ else
+ M.take_organ_damage(5)
+ if(prob(50))
+ playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
+ return
+ else
+ playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
+ return
+
+
+ if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
+ M << "\red You get slammed in the face with the tray, against your mask!"
+ if(prob(33))
+ src.add_blood(H)
+ if (H.wear_mask)
+ H.wear_mask.add_blood(H)
+ if (H.head)
+ H.head.add_blood(H)
+ if (H.glasses && prob(33))
+ H.glasses.add_blood(H)
+ var/turf/location = H.loc
+ if (istype(location, /turf/simulated)) //Addin' blood! At least on the floor and item :v
+ location.add_blood(H)
+
+ if(prob(50))
+ playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
+ else
+ playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
+ if(prob(10))
+ M.Stun(rand(1,3))
+ M.take_organ_damage(3)
+ return
+ else
+ M.take_organ_damage(5)
+ return
+
+ else //No eye or head protection, tough luck!
+ M << "\red You get slammed in the face with the tray!"
+ if(prob(33))
+ src.add_blood(M)
+ var/turf/location = H.loc
+ if (istype(location, /turf/simulated))
+ location.add_blood(H)
+
+ if(prob(50))
+ playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1)
+ else
+ playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1)
+ if(prob(30))
+ M.Stun(rand(2,4))
+ M.take_organ_damage(4)
+ return
+ else
+ M.take_organ_damage(8)
+ if(prob(30))
+ M.Weaken(2)
+ return
+ return
+
+/obj/item/weapon/tray/var/cooldown = 0 //shield bash cooldown. based on world.time
+
+/obj/item/weapon/tray/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/kitchen/rollingpin))
+ if(cooldown < world.time - 25)
+ user.visible_message("[user] bashes [src] with [W]!")
+ playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1)
+ cooldown = world.time
+ else
+ ..()
+
+/*
+===============~~~~~================================~~~~~====================
+= =
+= Code for trays carrying things. By Doohl for Doohl erryday Doohl Doohl~ =
+= =
+===============~~~~~================================~~~~~====================
+*/
+/obj/item/weapon/tray/proc/calc_carry()
+ // calculate the weight of the items on the tray
+ var/val = 0 // value to return
+
+ for(var/obj/item/I in carrying)
+ if(I.w_class == 1.0)
+ val ++
+ else if(I.w_class == 2.0)
+ val += 3
+ else
+ val += 5
+
+ return val
+
+/obj/item/weapon/tray/pickup(mob/user)
+
+ if(!isturf(loc))
+ return
+
+ for(var/obj/item/I in loc)
+ if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) )
+ var/add = 0
+ if(I.w_class == 1.0)
+ add = 1
+ else if(I.w_class == 2.0)
+ add = 3
+ else
+ add = 5
+ if(calc_carry() + add >= max_carry)
+ break
+
+ I.loc = src
+ carrying.Add(I)
+ overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
+
+/obj/item/weapon/tray/dropped(mob/user)
+
+ var/mob/living/M
+ for(M in src.loc) //to handle hand switching
+ return
+
+ var/foundtable = 0
+ for(var/obj/structure/table/T in loc)
+ foundtable = 1
+ break
+
+ overlays.Cut()
+
+ for(var/obj/item/I in carrying)
+ I.loc = loc
+ carrying.Remove(I)
+ if(!foundtable && isturf(loc))
+ // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere!
+ spawn()
+ for(var/i = 1, i <= rand(1,2), i++)
+ if(I)
+ step(I, pick(NORTH,SOUTH,EAST,WEST))
+ sleep(rand(2,4))
diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm
new file mode 100644
index 00000000000..341ebb36cb1
--- /dev/null
+++ b/code/game/objects/items/weapons/material/knives.dm
@@ -0,0 +1,106 @@
+/obj/item/weapon/butterfly
+ name = "butterfly knife"
+ desc = "A basic metal blade concealed in a lightweight plasteel grip. Small enough when folded to fit in a pocket."
+ icon_state = "butterflyknife"
+ item_state = null
+ hitsound = null
+ var/active = 0
+ w_class = 2
+ force = 2
+ sharp = 0
+ edge = 0
+ throw_speed = 3
+ throw_range = 4
+ throwforce = 7
+ attack_verb = list("patted", "tapped")
+
+/obj/item/weapon/butterfly/switchblade
+ name = "switchblade"
+ desc = "A classic switchblade with gold engraving. Just holding it makes you feel like a gangster."
+ icon_state = "switchblade"
+
+/obj/item/weapon/butterfly/attack_self(mob/user)
+ active = !active
+ if(active)
+ user << "You flip out your [src]."
+ playsound(user, 'sound/weapons/flipblade.ogg', 15, 1)
+ force = 15 //bay adjustments
+ throwforce = 12
+ edge = 1
+ sharp = 1
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ icon_state += "_open"
+ w_class = 3
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ else
+ user << "The butterfly knife can now be concealed."
+ force = initial(force)
+ edge = 0
+ sharp = 0
+ hitsound = initial(hitsound)
+ icon_state = initial(icon_state)
+ w_class = initial(w_class)
+ attack_verb = initial(attack_verb)
+ add_fingerprint(user)
+
+/*
+ * Kitchen knives
+ */
+/obj/item/weapon/kitchenknife
+ name = "kitchen knife"
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "knife"
+ desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
+ flags = CONDUCT
+ sharp = 1
+ edge = 1
+ force = 10.0
+ w_class = 3.0
+ throwforce = 6.0
+ throw_speed = 3
+ throw_range = 6
+ matter = list(DEFAULT_WALL_MATERIAL = 12000)
+ origin_tech = "materials=1"
+ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+
+ suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
+ return (BRUTELOSS)
+
+/obj/item/weapon/kitchenknife/hook
+ name = "meat hook"
+ desc = "A sharp, metal hook what sticks into things."
+ icon_state = "hook_knife"
+ item_state = "hook_knife"
+
+/obj/item/weapon/kitchenknife/ritual
+ name = "ritual knife"
+ desc = "The unearthly energies that once powered this blade are now dormant."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "render"
+
+/*
+ * Bucher's cleaver
+ */
+/obj/item/weapon/butch
+ name = "butcher's cleaver"
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "butch"
+ desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
+ flags = CONDUCT
+ force = 15.0
+ w_class = 2.0
+ throwforce = 8.0
+ throw_speed = 3
+ throw_range = 6
+ matter = list(DEFAULT_WALL_MATERIAL = 12000)
+ origin_tech = "materials=1"
+ attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ sharp = 1
+ edge = 1
+
+/obj/item/weapon/butch/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm
new file mode 100644
index 00000000000..8099e626dba
--- /dev/null
+++ b/code/game/objects/items/weapons/material/misc.dm
@@ -0,0 +1,11 @@
+/obj/item/weapon/harpoon
+ name = "harpoon"
+ sharp = 1
+ edge = 0
+ desc = "Tharr she blows!"
+ icon_state = "harpoon"
+ item_state = "harpoon"
+ force = 20
+ throwforce = 15
+ w_class = 3
+ attack_verb = list("jabbed","stabbed","ripped")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/material/shards.dm
similarity index 96%
rename from code/game/objects/items/weapons/shards.dm
rename to code/game/objects/items/weapons/material/shards.dm
index 593b3d019d9..8fea29b4f26 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/material/shards.dm
@@ -1,120 +1,120 @@
-// Glass shards
-
-/obj/item/weapon/shard
- name = "shard"
- icon = 'icons/obj/shards.dmi'
- icon_state = "large"
- sharp = 1
- edge = 1
- desc = "Made of nothing. How does this even exist?" // set based on material, if this desc is visible it's a bug (shards default to being made of glass)
- w_class = 2.0
- force = 5.0
- throwforce = 8.0
- item_state = "shard-glass"
- //matter = list("glass" = 3750) // Weld it into sheets before you use it!
- attack_verb = list("stabbed", "slashed", "sliced", "cut")
-
- gender = "neuter"
- var/material/material = null
-
-/obj/item/weapon/shard/suicide_act(mob/user)
- viewers(user) << pick("\red [user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.")
- return (BRUTELOSS)
-
-/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/obj/item/weapon/shard/Bump()
-
- spawn( 0 )
- if (prob(20))
- src.force = 15
- else
- src.force = 4
- ..()
- return
- return
-
-/obj/item/weapon/shard/New(loc, material/material)
- ..(loc)
-
- if(!material || !istype(material)) // We either don't have a material or we've been passed an invalid material. Use glass instead.
- material = get_material_by_name("glass")
-
- set_material(material)
-
-/obj/item/weapon/shard/proc/set_material(material/material)
- if(istype(material))
- src.material = material
- icon_state = "[material.shard_icon][pick("large", "medium", "small")]"
- pixel_x = rand(-8, 8)
- pixel_y = rand(-8, 8)
- update_material()
- update_icon()
-
-/obj/item/weapon/shard/proc/update_material()
- if(material)
- if(material.shard_type)
- name = "[material.display_name] [material.shard_type]"
- desc = "A small piece of [material.display_name]. It looks sharp, you wouldn't want to step on it barefoot. Could probably be used as ... a throwing weapon?"
- switch(material.shard_type)
- if(SHARD_SPLINTER, SHARD_SHRAPNEL)
- gender = "plural"
- else
- gender = "neuter"
- else
- qdel(src)
- return
- else
- name = initial(name)
- desc = initial(desc)
-
-/obj/item/weapon/shard/update_icon()
- if(material)
- color = material.icon_colour
- // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity
- alpha = 255 * (1 - (1 - material.opacity)*(1 - material.opacity))
- else
- color = "#ffffff"
- alpha = 255
-
-/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/weldingtool) && material.shard_can_repair)
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- material.place_sheet(loc)
- qdel(src)
- return
- return ..()
-
-/obj/item/weapon/shard/Crossed(AM as mob|obj)
- if(ismob(AM))
- var/mob/M = AM
- M << "\red You step on \the [src]!"
- playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
-
- if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5)) //Thick skin.
- return
-
- if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
- var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
- if(affecting.status & ORGAN_ROBOT)
- return
- if(affecting.take_damage(5, 0))
- H.UpdateDamageIcon()
- H.updatehealth()
- if(!(H.species && (H.species.flags & NO_PAIN)))
- H.Weaken(3)
- ..()
-
-// Preset types - left here for the code that uses them
-
-/obj/item/weapon/shard/shrapnel/New(loc)
- ..(loc, get_material_by_name("steel"))
-
-/obj/item/weapon/shard/phoron/New(loc)
- ..(loc, get_material_by_name("phoron glass"))
+// Glass shards
+
+/obj/item/weapon/shard
+ name = "shard"
+ icon = 'icons/obj/shards.dmi'
+ icon_state = "large"
+ sharp = 1
+ edge = 1
+ desc = "Made of nothing. How does this even exist?" // set based on material, if this desc is visible it's a bug (shards default to being made of glass)
+ w_class = 2.0
+ force = 5.0
+ throwforce = 8.0
+ item_state = "shard-glass"
+ //matter = list("glass" = 3750) // Weld it into sheets before you use it!
+ attack_verb = list("stabbed", "slashed", "sliced", "cut")
+
+ gender = "neuter"
+ var/material/material = null
+
+/obj/item/weapon/shard/suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS)
+
+/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return ..()
+
+/obj/item/weapon/shard/Bump()
+
+ spawn( 0 )
+ if (prob(20))
+ src.force = 15
+ else
+ src.force = 4
+ ..()
+ return
+ return
+
+/obj/item/weapon/shard/New(loc, material/material)
+ ..(loc)
+
+ if(!material || !istype(material)) // We either don't have a material or we've been passed an invalid material. Use glass instead.
+ material = get_material_by_name("glass")
+
+ set_material(material)
+
+/obj/item/weapon/shard/proc/set_material(material/material)
+ if(istype(material))
+ src.material = material
+ icon_state = "[material.shard_icon][pick("large", "medium", "small")]"
+ pixel_x = rand(-8, 8)
+ pixel_y = rand(-8, 8)
+ update_material()
+ update_icon()
+
+/obj/item/weapon/shard/proc/update_material()
+ if(material)
+ if(material.shard_type)
+ name = "[material.display_name] [material.shard_type]"
+ desc = "A small piece of [material.display_name]. It looks sharp, you wouldn't want to step on it barefoot. Could probably be used as ... a throwing weapon?"
+ switch(material.shard_type)
+ if(SHARD_SPLINTER, SHARD_SHRAPNEL)
+ gender = "plural"
+ else
+ gender = "neuter"
+ else
+ qdel(src)
+ return
+ else
+ name = initial(name)
+ desc = initial(desc)
+
+/obj/item/weapon/shard/update_icon()
+ if(material)
+ color = material.icon_colour
+ // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity
+ alpha = 255 * (1 - (1 - material.opacity)*(1 - material.opacity))
+ else
+ color = "#ffffff"
+ alpha = 255
+
+/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/weldingtool) && material.shard_can_repair)
+ var/obj/item/weapon/weldingtool/WT = W
+ if(WT.remove_fuel(0, user))
+ material.place_sheet(loc)
+ qdel(src)
+ return
+ return ..()
+
+/obj/item/weapon/shard/Crossed(AM as mob|obj)
+ if(ismob(AM))
+ var/mob/M = AM
+ M << "\red You step on \the [src]!"
+ playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5)) //Thick skin.
+ return
+
+ if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
+ var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
+ if(affecting.status & ORGAN_ROBOT)
+ return
+ if(affecting.take_damage(5, 0))
+ H.UpdateDamageIcon()
+ H.updatehealth()
+ if(!(H.species && (H.species.flags & NO_PAIN)))
+ H.Weaken(3)
+ ..()
+
+// Preset types - left here for the code that uses them
+
+/obj/item/weapon/shard/shrapnel/New(loc)
+ ..(loc, get_material_by_name("steel"))
+
+/obj/item/weapon/shard/phoron/New(loc)
+ ..(loc, get_material_by_name("phoron glass"))
diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm
new file mode 100644
index 00000000000..ea8c2590048
--- /dev/null
+++ b/code/game/objects/items/weapons/material/swords.dm
@@ -0,0 +1,49 @@
+/obj/item/weapon/claymore
+ name = "claymore"
+ desc = "What are you standing around staring at this for? Get to killing!"
+ icon_state = "claymore"
+ item_state = "claymore"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ force = 40
+ throwforce = 10
+ sharp = 1
+ edge = 1
+ w_class = 3
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+
+ IsShield()
+ return 1
+
+ suicide_act(mob/user)
+ viewers(user) << "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide."
+ return(BRUTELOSS)
+
+/obj/item/weapon/claymore/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return ..()
+
+/obj/item/weapon/katana
+ name = "katana"
+ desc = "Woefully underpowered in D20"
+ icon_state = "katana"
+ item_state = "katana"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT | SLOT_BACK
+ force = 40
+ throwforce = 10
+ sharp = 1
+ edge = 1
+ w_class = 3
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+
+ suicide_act(mob/user)
+ viewers(user) << "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."
+ return(BRUTELOSS)
+
+/obj/item/weapon/katana/IsShield()
+ return 1
+
+/obj/item/weapon/katana/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return ..()
diff --git a/code/game/objects/items/weapons/material/thrown.dm b/code/game/objects/items/weapons/material/thrown.dm
new file mode 100644
index 00000000000..ffba72c4cbb
--- /dev/null
+++ b/code/game/objects/items/weapons/material/thrown.dm
@@ -0,0 +1,31 @@
+/obj/item/weapon/star
+ name = "shuriken"
+ desc = "A sharp, perfectly weighted piece of metal."
+ icon_state = "star"
+ force = 5
+ throw_speed = 10
+ throwforce = 15
+ throw_range = 15
+ sharp = 1
+ edge = 1
+ matter = list(DEFAULT_WALL_MATERIAL = 500)
+
+ var/poisoned = 0
+
+/obj/item/weapon/star/New()
+ ..()
+ src.pixel_x = rand(-12, 12)
+ src.pixel_y = rand(-12, 12)
+
+//TODO: consider making this something done with reagents.
+/obj/item/weapon/star/throw_impact(atom/hit_atom)
+ ..()
+ if(poisoned && istype(hit_atom,/mob/living))
+ var/mob/living/M = hit_atom
+ M.adjustToxLoss(rand(20,40))
+ poisoned = 0
+ color = null
+
+/obj/item/weapon/star/ninja
+ color = "#007700"
+ poisoned = 1
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
similarity index 100%
rename from code/game/objects/items/weapons/twohanded.dm
rename to code/game/objects/items/weapons/material/twohanded.dm
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index fbbc731f2ae..867c5155e08 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -89,215 +89,6 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
-/obj/item/weapon/claymore
- name = "claymore"
- desc = "What are you standing around staring at this for? Get to killing!"
- icon_state = "claymore"
- item_state = "claymore"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 40
- throwforce = 10
- sharp = 1
- edge = 1
- w_class = 3
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-
- IsShield()
- return 1
-
- suicide_act(mob/user)
- viewers(user) << "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide."
- return(BRUTELOSS)
-
-/obj/item/weapon/claymore/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/obj/item/weapon/katana
- name = "katana"
- desc = "Woefully underpowered in D20"
- icon_state = "katana"
- item_state = "katana"
- flags = CONDUCT
- slot_flags = SLOT_BELT | SLOT_BACK
- force = 40
- throwforce = 10
- sharp = 1
- edge = 1
- w_class = 3
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-
- suicide_act(mob/user)
- viewers(user) << "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."
- return(BRUTELOSS)
-
-/obj/item/weapon/katana/IsShield()
- return 1
-
-/obj/item/weapon/katana/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/obj/item/weapon/harpoon
- name = "harpoon"
- sharp = 1
- edge = 0
- desc = "Tharr she blows!"
- icon_state = "harpoon"
- item_state = "harpoon"
- force = 20
- throwforce = 15
- w_class = 3
- attack_verb = list("jabbed","stabbed","ripped")
-
-/obj/item/weapon/butterfly
- name = "butterfly knife"
- desc = "A basic metal blade concealed in a lightweight plasteel grip. Small enough when folded to fit in a pocket."
- icon_state = "butterflyknife"
- item_state = null
- hitsound = null
- var/active = 0
- w_class = 2
- force = 2
- sharp = 0
- edge = 0
- throw_speed = 3
- throw_range = 4
- throwforce = 7
- attack_verb = list("patted", "tapped")
-
-/obj/item/butterflyconstruction
- name = "unfinished concealed knife"
- desc = "An unfinished concealed knife, it looks like the screws need to be tightened."
- icon = 'icons/obj/buildingobject.dmi'
- icon_state = "butterflystep1"
-
-/obj/item/butterflyconstruction/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/screwdriver))
- user << "You finish the concealed blade weapon."
- new /obj/item/weapon/butterfly(user.loc)
- qdel(src)
- return
-
-/obj/item/butterflyblade
- name = "knife blade"
- desc = "A knife blade. Unusable as a weapon without a grip."
- icon = 'icons/obj/buildingobject.dmi'
- icon_state = "butterfly2"
- matter = list(DEFAULT_WALL_MATERIAL = 5000)
-
-/obj/item/butterflyhandle
- name = "concealed knife grip"
- desc = "A plasteel grip with screw fittings for a blade."
- icon = 'icons/obj/buildingobject.dmi'
- icon_state = "butterfly1"
- matter = list(DEFAULT_WALL_MATERIAL = 4000)
-
-/obj/item/butterflyhandle/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W,/obj/item/butterflyblade))
- user << "You attach the two concealed blade parts."
- new /obj/item/butterflyconstruction(user.loc)
- qdel(W)
- qdel(src)
- return
- update_icon(user)
-
-/obj/item/weapon/butterfly/switchblade
- name = "switchblade"
- desc = "A classic switchblade with gold engraving. Just holding it makes you feel like a gangster."
- icon_state = "switchblade"
-
-/obj/item/weapon/butterfly/attack_self(mob/user)
- active = !active
- if(active)
- user << "You flip out your [src]."
- playsound(user, 'sound/weapons/flipblade.ogg', 15, 1)
- force = 15 //bay adjustments
- throwforce = 12
- edge = 1
- sharp = 1
- hitsound = 'sound/weapons/bladeslice.ogg'
- icon_state += "_open"
- w_class = 3
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- else
- user << "The butterfly knife can now be concealed."
- force = initial(force)
- edge = 0
- sharp = 0
- hitsound = initial(hitsound)
- icon_state = initial(icon_state)
- w_class = initial(w_class)
- attack_verb = initial(attack_verb)
- add_fingerprint(user)
-
-
-obj/item/weapon/wirerod
- name = "wired rod"
- desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit."
- icon_state = "wiredrod"
- item_state = "rods"
- flags = CONDUCT
- force = 8
- throwforce = 10
- w_class = 3
- attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
-
-
-obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob)
- ..()
- if(istype(I, /obj/item/weapon/shard))
- var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear
-
- user.put_in_hands(S)
- user << "You fasten the glass shard to the top of the rod with the cable."
- qdel(I)
- qdel(src)
- update_icon(user)
-
- else if(istype(I, /obj/item/weapon/wirecutters))
- var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod
-
- user.put_in_hands(P)
- user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward."
- qdel(I)
- qdel(src)
- update_icon(user)
- update_icon(user)
-
-/obj/item/weapon/star
- name = "shuriken"
- desc = "A sharp, perfectly weighted piece of metal."
- icon_state = "star"
- force = 5
- throw_speed = 10
- throwforce = 15
- throw_range = 15
- sharp = 1
- edge = 1
- matter = list(DEFAULT_WALL_MATERIAL = 500)
-
- var/poisoned = 0
-
-/obj/item/weapon/star/New()
- ..()
- src.pixel_x = rand(-12, 12)
- src.pixel_y = rand(-12, 12)
-
-//TODO: consider making this something done with reagents.
-/obj/item/weapon/star/throw_impact(atom/hit_atom)
- ..()
- if(poisoned && istype(hit_atom,/mob/living))
- var/mob/living/M = hit_atom
- M.adjustToxLoss(rand(20,40))
- poisoned = 0
- color = null
-
-/obj/item/weapon/star/ninja
- color = "#007700"
- poisoned = 1
-
/obj/item/weapon/energy_net
name = "energy net"
desc = "It's a net made of green energy."