diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_fishing.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_fishing.dmm
index 44229d8048a6..8ce33a885177 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_fishing.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_fishing.dmm
@@ -146,8 +146,8 @@
/area/ruin/powered/fishing/shop)
"dV" = (
/obj/structure/rack,
-/obj/item/twohanded/fishingrod,
-/obj/item/twohanded/fishingrod,
+/obj/item/fishingrod,
+/obj/item/fishingrod,
/obj/item/storage/toolbox/mechanical/insulateds{
pixel_x = 1;
pixel_y = -1
@@ -1537,7 +1537,7 @@
/obj/machinery/vending/fishing{
contraband = list(/obj/item/reagent_containers/food/snacks/bait/type = 6);
premium = list(/obj/item/reagent_containers/food/snacks/bait/master = 10);
- products = list(/obj/item/twohanded/fishingrod = 12, /obj/item/reagent_containers/food/snacks/bait/apprentice = 30, /obj/item/reagent_containers/food/snacks/bait/journeyman = 20, /obj/item/clothing/head/fishing = 6, /obj/item/clothing/suit/fishing = 6, /obj/item/clothing/gloves/fishing = 6, /obj/item/clothing/shoes/fishing = 6)
+ products = list(/obj/item/fishingrod = 12, /obj/item/reagent_containers/food/snacks/bait/apprentice = 30, /obj/item/reagent_containers/food/snacks/bait/journeyman = 20, /obj/item/clothing/head/fishing = 6, /obj/item/clothing/suit/fishing = 6, /obj/item/clothing/gloves/fishing = 6, /obj/item/clothing/shoes/fishing = 6)
},
/turf/open/floor/plasteel,
/area/ruin/powered/fishing/shop)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_I.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_I.dmm
index 887846c85691..2bcca7b11561 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_I.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_I.dmm
@@ -181,7 +181,7 @@
"BJ" = (
/obj/structure/closet/crate/coffin,
/obj/item/shield/riot/buckler,
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/plasteel/dark/lavaland,
/area/ruin/unpowered)
"Ch" = (
@@ -200,7 +200,7 @@
/turf/open/floor/plasteel/dark/lavaland,
/area/ruin/unpowered)
"He" = (
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/plating/lavaland_baseturf{
icon_state = "panelscorched"
},
@@ -221,14 +221,14 @@
"NG" = (
/obj/structure/closet/crate/coffin,
/obj/effect/mob_spawn/human/skeleton,
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/plasteel/dark/lavaland,
/area/ruin/unpowered)
"Pa" = (
/obj/structure/closet/crate/coffin,
/obj/effect/decal/cleanable/dirt,
/obj/item/shield/riot/buckler,
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/plasteel/dark/lavaland,
/area/ruin/unpowered)
"QE" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
index 614ad6f2687a..bc81302af13e 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm
@@ -529,7 +529,7 @@
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
"bt" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/floor/plasteel,
/area/ruin/powered/animal_hospital)
"bu" = (
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index fd768d45c5da..e6d24008769e 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -1276,7 +1276,7 @@
dir = 4
},
/obj/effect/mapping_helpers/no_lava,
-/obj/item/twohanded/bonespear,
+/obj/item/melee/spear/bonespear,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"AD" = (
@@ -1305,12 +1305,12 @@
dir = 8
},
/obj/structure/table/wood,
-/obj/item/twohanded/bonespear,
-/obj/item/twohanded/bonespear{
+/obj/item/melee/spear/bonespear,
+/obj/item/melee/spear/bonespear{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/twohanded/bonespear{
+/obj/item/melee/spear/bonespear{
pixel_x = -3;
pixel_y = 3
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
index f898880d6f3a..100ec2826a20 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
@@ -334,7 +334,7 @@
/turf/open/floor/plating,
/area/ruin/powered/snow_biodome)
"As" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/ruin/powered/snow_biodome)
"AM" = (
@@ -372,7 +372,7 @@
/turf/open/floor/pod/dark,
/area/ruin/powered/snow_biodome)
"KS" = (
-/obj/item/twohanded/required/chainsaw,
+/obj/item/melee/chainsaw,
/obj/structure/closet,
/obj/machinery/light/small{
dir = 4
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cursedtoyshop.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cursedtoyshop.dmm
index ef4d9f183223..292c36fd8200 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cursedtoyshop.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cursedtoyshop.dmm
@@ -479,7 +479,7 @@
/area/ruin/powered)
"bb" = (
/obj/structure/table/wood,
-/obj/item/twohanded/dualsaber/toy,
+/obj/item/melee/dualsaber/toy,
/obj/item/toy/katana{
pixel_x = 6
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_forgottenkitchen.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_forgottenkitchen.dmm
index 7e33fba0ea03..4577ddf91be7 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_forgottenkitchen.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_forgottenkitchen.dmm
@@ -198,7 +198,7 @@
/turf/open/floor/plating/lavaland_baseturf,
/area/ruin/powered)
"kb" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/dark/opposingcorners,
/obj/effect/turf_decal/tile/red/opposingcorners,
/turf/open/floor/plasteel/lavaland,
@@ -213,7 +213,7 @@
},
/area/ruin/powered)
"kD" = (
-/obj/item/twohanded/required/kirbyplants/dead,
+/obj/item/kirbyplants/dead,
/obj/effect/turf_decal/tile/dark/opposingcorners,
/obj/effect/turf_decal/tile/red/opposingcorners,
/obj/item/stack/sheet/metal,
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_kinggoatboss.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_kinggoatboss.dmm
index 93bdf350758f..f55718c31d77 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_kinggoatboss.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_kinggoatboss.dmm
@@ -139,7 +139,7 @@
/area/lavaland/surface/outdoors)
"G" = (
/obj/effect/decal/cleanable/blood/old,
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/mob/living/simple_animal/hostile/retaliate/goat,
/turf/open/floor/wood,
/area/ruin/powered/kinggoatlair)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm
index 51434ee9fa79..beab03230486 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_medical.dmm
@@ -612,7 +612,7 @@
/turf/open/floor/plasteel/white,
/area/ruin/powered)
"bI" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/machinery/light,
/turf/open/floor/plasteel/white,
/area/ruin/powered)
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_meteorite.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_meteorite.dmm
index 03eb0f3cdc21..4a57e983cee8 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_meteorite.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_meteorite.dmm
@@ -337,7 +337,7 @@
pixel_x = -3;
pixel_y = -6
},
-/obj/item/twohanded/fireaxe/boneaxe,
+/obj/item/fireaxe/boneaxe,
/mob/living/simple_animal/hostile/asteroid/gutlunch,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
@@ -1339,7 +1339,7 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"yJ" = (
-/obj/item/twohanded/bonespear{
+/obj/item/melee/spear/bonespear{
pixel_x = 3;
pixel_y = -3
},
@@ -1912,7 +1912,7 @@
/obj/structure/closet/crate/necropolis{
anchored = 1
},
-/obj/item/twohanded/required/gibtonite{
+/obj/item/melee/gibtonite{
quality = 3
},
/obj/item/survivalcapsule/luxuryelite{
@@ -2636,11 +2636,11 @@
/obj/structure/stone_tile/cracked{
dir = 1
},
-/obj/item/twohanded/bonespear{
+/obj/item/melee/spear/bonespear{
pixel_x = -11;
pixel_y = 1
},
-/obj/item/twohanded/bonespear{
+/obj/item/melee/spear/bonespear{
pixel_x = 3;
pixel_y = -1
},
@@ -2651,11 +2651,11 @@
/obj/structure/stone_tile/cracked{
dir = 1
},
-/obj/item/twohanded/bonespear{
+/obj/item/melee/spear/bonespear{
pixel_x = -11;
pixel_y = 1
},
-/obj/item/twohanded/bonespear{
+/obj/item/melee/spear/bonespear{
pixel_x = 3;
pixel_y = -1
},
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_weavernest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_weavernest.dmm
index ee1919c82e32..c74ec78dbcfa 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_weavernest.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_weavernest.dmm
@@ -30,7 +30,7 @@
"dV" = (
/obj/structure/table,
/obj/effect/turf_decal/sand,
-/obj/item/twohanded/bonespear,
+/obj/item/melee/spear/bonespear,
/turf/open/floor/plasteel/lavaland,
/area/ruin/unpowered)
"fQ" = (
@@ -150,7 +150,7 @@
/area/ruin/unpowered)
"za" = (
/obj/effect/mob_spawn/human/skeleton,
-/obj/item/twohanded/bonespear,
+/obj/item/melee/spear/bonespear,
/obj/item/reagent_containers/food/snacks/spidereggs,
/obj/effect/spawner/lootdrop/mob/marrow_weaver,
/obj/structure/spider/stickyweb,
@@ -222,7 +222,7 @@
"He" = (
/obj/effect/mob_spawn/human/skeleton,
/obj/item/clothing/suit/armor/bone,
-/obj/item/twohanded/fireaxe/boneaxe,
+/obj/item/fireaxe/boneaxe,
/obj/structure/spider/stickyweb,
/obj/structure/spider/cocoon,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
diff --git a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm
index 367372c00270..c4edff5424f0 100644
--- a/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm
+++ b/_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm
@@ -165,7 +165,7 @@
/turf/open/floor/plasteel/grimy,
/area/ruin/space/has_grav/hilbertresearchfacility)
"D" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/grimy,
/area/ruin/space/has_grav/hilbertresearchfacility)
"E" = (
diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
index 01bd87574de2..a799f3822b86 100644
--- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm
@@ -878,7 +878,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/floor/plasteel/grimy,
/area/ruin/space/has_grav/listeningstation/quarters)
"hv" = (
@@ -1193,7 +1193,7 @@
/obj/item/clothing/head/HoS/syndicate{
desc = "A black cap fit for a Syndicate recon officer."
},
-/obj/item/twohanded/binoculars,
+/obj/item/binoculars,
/obj/item/clothing/under/syndicate,
/obj/item/clothing/under/syndicate/combat,
/obj/item/clothing/under/syndicate/camo,
@@ -1215,7 +1215,7 @@
/obj/effect/turf_decal/tile/red/anticorner/contrasted{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/listeningstation/hallway)
@@ -2378,7 +2378,7 @@
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/listeningstation/hallway)
"JS" = (
@@ -2700,7 +2700,7 @@
/area/ruin/space/has_grav/listeningstation/warehouse)
"OJ" = (
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/listeningstation/hallway)
"OV" = (
@@ -3359,7 +3359,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/floor/plasteel/grimy,
/area/ruin/space/has_grav/listeningstation/quarters)
"YH" = (
diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm
index 1f99f423fb66..9af5ce7cbb6c 100644
--- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm
+++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm
@@ -198,7 +198,7 @@
/area/ruin/space/has_grav/powered/cat_man)
"aE" = (
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -211,7 +211,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/powered/cat_man)
"aF" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
@@ -520,7 +520,7 @@
/area/ruin/space/has_grav/powered/cat_man)
"bv" = (
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
diff --git a/_maps/RandomRuins/SpaceRuins/nicelittlenest.dmm b/_maps/RandomRuins/SpaceRuins/nicelittlenest.dmm
index 04bb769afc92..4aa7410bacbb 100644
--- a/_maps/RandomRuins/SpaceRuins/nicelittlenest.dmm
+++ b/_maps/RandomRuins/SpaceRuins/nicelittlenest.dmm
@@ -37,7 +37,7 @@
/turf/open/floor/grass,
/area/ruin/space/has_grav/powered)
"dc" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/turf/open/floor/wood,
/area/ruin/space/has_grav/powered)
"dm" = (
@@ -310,7 +310,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/powered)
"uf" = (
diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
index a2c9ada59526..11343eda8005 100644
--- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm
+++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm
@@ -215,7 +215,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-25"
},
/obj/effect/decal/cleanable/cobweb,
@@ -595,7 +595,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-25"
},
/turf/open/floor/plasteel,
@@ -1502,7 +1502,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/ancientstation/sec)
"ft" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-25"
},
/turf/open/floor/plasteel,
@@ -1751,7 +1751,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/ancientstation/hydroponics)
"gF" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-25"
},
/obj/effect/decal/cleanable/cobweb,
@@ -6126,7 +6126,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/ancientstation/deltacorridor)
"CV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-25"
},
/obj/effect/decal/cleanable/dirt,
@@ -6380,7 +6380,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/ancientstation/atmo)
"EW" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-25"
},
/obj/effect/decal/cleanable/dirt,
diff --git a/_maps/RandomRuins/SpaceRuins/pubby_monastery.dmm b/_maps/RandomRuins/SpaceRuins/pubby_monastery.dmm
index 5b1b52cecd7c..06211ef7b657 100644
--- a/_maps/RandomRuins/SpaceRuins/pubby_monastery.dmm
+++ b/_maps/RandomRuins/SpaceRuins/pubby_monastery.dmm
@@ -199,7 +199,7 @@
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/monastery/library)
"cH" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_y = 3
},
@@ -310,7 +310,7 @@
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/monastery/library)
"eg" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/firealarm{
@@ -557,7 +557,7 @@
/area/ruin/space/has_grav/monastery)
"hb" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22";
pixel_y = 8
},
@@ -1055,7 +1055,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/monastery)
"nI" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
@@ -1165,7 +1165,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/monastery)
"ph" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/structure/cable{
@@ -1459,7 +1459,7 @@
/turf/open/floor/plating,
/area/ruin/space/has_grav/monastery/maint)
"sM" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/item/radio/intercom{
@@ -1922,7 +1922,7 @@
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/monastery/library)
"yj" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/dark,
@@ -2153,7 +2153,7 @@
/obj/structure/cable{
icon_state = "2-4"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
@@ -2776,7 +2776,7 @@
/obj/structure/sign/plaques/deempisi{
pixel_y = 28
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_y = 3
},
@@ -2979,7 +2979,7 @@
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/monastery)
"LV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
@@ -3029,7 +3029,7 @@
/turf/open/space/basic,
/area/ruin/unpowered/no_grav)
"Mn" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-08"
},
/turf/open/floor/plasteel/dark,
@@ -4298,7 +4298,7 @@
/area/ruin/space/has_grav/monastery/library)
"Zn" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05";
pixel_y = 10
},
@@ -4368,7 +4368,7 @@
/obj/structure/cable{
icon_state = "1-4"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
diff --git a/_maps/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/RandomRuins/SpaceRuins/spacebar.dmm
index fbd93c217671..a2972a4b4ff4 100644
--- a/_maps/RandomRuins/SpaceRuins/spacebar.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacebar.dmm
@@ -527,7 +527,7 @@
icon_state = "tile_corner"
},
/obj/effect/turf_decal/tile/bar,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/powered/spacebar)
"tt" = (
@@ -542,7 +542,7 @@
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/powered/spacebar)
"tH" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/powered/spacebar)
@@ -1392,7 +1392,7 @@
/obj/effect/turf_decal/tile/darkgreen{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/powered/spacebar)
"YH" = (
diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
index 2dd6ed0b679f..cb07ee717dae 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
@@ -169,7 +169,7 @@
/turf/open/floor/wood,
/area/ruin/space/has_grav/hotel/guestroom/room_3)
"aD" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02"
},
/turf/open/floor/wood,
@@ -212,7 +212,7 @@
/turf/open/floor/wood,
/area/ruin/space/has_grav/hotel/guestroom/room_3)
"aL" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/turf/open/floor/wood,
@@ -258,7 +258,7 @@
/turf/open/floor/wood,
/area/ruin/space/has_grav/hotel/guestroom/room_4)
"aT" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/turf/open/floor/wood,
@@ -301,7 +301,7 @@
/turf/open/floor/wood,
/area/ruin/space/has_grav/hotel/guestroom/room_4)
"bb" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18"
},
/turf/open/floor/wood,
@@ -1159,7 +1159,7 @@
/turf/open/floor/wood,
/area/ruin/space/has_grav/hotel/dock)
"cY" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-02"
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
@@ -1311,7 +1311,7 @@
/turf/open/floor/wood,
/area/ruin/space/has_grav/hotel/guestroom/room_2)
"dq" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/wood,
@@ -1379,7 +1379,7 @@
/turf/open/floor/wood,
/area/ruin/space/has_grav/hotel/guestroom/room_1)
"dy" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-14"
},
/turf/open/floor/wood,
@@ -2416,7 +2416,7 @@
},
/area/ruin/space/has_grav/hotel/dock)
"gh" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/wood,
@@ -2859,7 +2859,7 @@
/turf/open/floor/carpet,
/area/ruin/space/has_grav/hotel)
"hq" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18"
},
/turf/open/floor/plasteel/dark,
@@ -3509,7 +3509,7 @@
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/hotel/power)
"iM" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/floor/wood,
/area/ruin/space/has_grav/hotel)
"iO" = (
@@ -4760,7 +4760,7 @@
/turf/open/floor/plasteel/dark,
/area/ruin/space/has_grav/hotel/pool)
"mD" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-25"
},
/obj/effect/turf_decal/tile/neutral{
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_arcade.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_arcade.dmm
index 8f08f7aad883..50167344080f 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_arcade.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_arcade.dmm
@@ -563,7 +563,7 @@
/turf/open/floor/wood,
/area/crew_quarters/bar)
"pw" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/radio/intercom{
pixel_y = 28
},
@@ -768,7 +768,7 @@
/turf/open/floor/wood,
/area/crew_quarters/bar)
"FY" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/eighties,
/area/crew_quarters/bar)
"Go" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_box.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_box.dmm
index 2117bf436e8d..0ae6910b7a8c 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_box.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_box.dmm
@@ -1135,7 +1135,7 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"cY" = (
@@ -1391,7 +1391,7 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"MY" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_casino.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_casino.dmm
index 5f2788da0dea..7e40e14c98d0 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_casino.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_casino.dmm
@@ -920,7 +920,7 @@
/turf/open/floor/carpet,
/area/crew_quarters/bar)
"JA" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/carpet,
/area/crew_quarters/bar)
"Kb" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_cheese.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_cheese.dmm
index 5333f4d5bdb6..62b732bf11b5 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_cheese.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_cheese.dmm
@@ -635,7 +635,7 @@
},
/area/crew_quarters/bar)
"cr" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/bar)
"cs" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_conveyor.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_conveyor.dmm
index bbc2d9ce3a17..786c1bbe7a3f 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_conveyor.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_conveyor.dmm
@@ -312,7 +312,7 @@
},
/area/crew_quarters/kitchen)
"bb" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/turf/open/floor/plasteel/vaporwave,
@@ -926,7 +926,7 @@
/turf/open/floor/plasteel/vaporwave,
/area/crew_quarters/bar)
"gz" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-26"
},
/turf/open/floor/plasteel/vaporwave,
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_grassy.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_grassy.dmm
index 06373c458dbf..f620996e42dc 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_grassy.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_grassy.dmm
@@ -681,7 +681,7 @@
/turf/open/floor/grass,
/area/crew_quarters/bar)
"vt" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/bar)
"vA" = (
@@ -959,7 +959,7 @@
/turf/open/floor/grass,
/area/crew_quarters/bar)
"JJ" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/grass,
/area/crew_quarters/bar)
"JV" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_irish.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_irish.dmm
index 2e46a7c7a720..1d713fde9c43 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_irish.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_irish.dmm
@@ -112,7 +112,7 @@
/turf/open/floor/wood,
/area/crew_quarters/theatre)
"ar" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/green{
dir = 8
},
@@ -1416,7 +1416,7 @@
/obj/machinery/newscaster{
pixel_y = -28
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/green{
dir = 8
},
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_purple.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_purple.dmm
index aff65547036f..1a10636d1d4e 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_purple.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_purple.dmm
@@ -1153,7 +1153,7 @@
/obj/machinery/newscaster{
pixel_y = -28
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
"dy" = (
@@ -1244,7 +1244,7 @@
/turf/open/floor/mineral/titanium/purple,
/area/crew_quarters/kitchen)
"vE" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
"xW" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_spacious.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_spacious.dmm
index 955edf73ab76..531092b0368f 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_spacious.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_spacious.dmm
@@ -699,7 +699,7 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"cl" = (
@@ -1126,7 +1126,7 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"Wu" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/bar_trek.dmm b/_maps/RandomRuins/StationRuins/BoxStation/bar_trek.dmm
index 94bdf170e787..73fecfed1623 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/bar_trek.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/bar_trek.dmm
@@ -109,7 +109,7 @@
/turf/open/floor/mineral/titanium/blue,
/area/crew_quarters/bar)
"at" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/obj/item/radio/intercom{
pixel_y = 25
},
@@ -1231,7 +1231,7 @@
/turf/closed/wall,
/area/crew_quarters/bar)
"Sd" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/turf/open/floor/mineral/titanium/white,
/area/crew_quarters/bar)
"Sl" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/chapel1.dmm b/_maps/RandomRuins/StationRuins/BoxStation/chapel1.dmm
index 8f29a200fc3b..f0e80d95eca0 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/chapel1.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/chapel1.dmm
@@ -856,7 +856,7 @@
/turf/open/floor/plasteel/dark,
/area/chapel/office)
"ZG" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/chapel/main)
"ZR" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/chapel2.dmm b/_maps/RandomRuins/StationRuins/BoxStation/chapel2.dmm
index eb5931579fef..855d718817a2 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/chapel2.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/chapel2.dmm
@@ -459,7 +459,7 @@
},
/area/chapel/main)
"Cq" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/chapel/main)
"Cv" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/hydro2.dmm b/_maps/RandomRuins/StationRuins/BoxStation/hydro2.dmm
index 47ff04036713..38cc3322b920 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/hydro2.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/hydro2.dmm
@@ -122,7 +122,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/template_noop)
"x" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/hydro4.dmm b/_maps/RandomRuins/StationRuins/BoxStation/hydro4.dmm
index f9450363d94d..09d510dbb5bf 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/hydro4.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/hydro4.dmm
@@ -279,7 +279,7 @@
/turf/open/floor/plasteel,
/area/template_noop)
"Y" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/template_noop)
"Z" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/hydro5.dmm b/_maps/RandomRuins/StationRuins/BoxStation/hydro5.dmm
index 57a095c295fc..12a2e59bfb53 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/hydro5.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/hydro5.dmm
@@ -101,7 +101,7 @@
/turf/open/floor/plasteel,
/area/template_noop)
"k" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/template_noop)
"m" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/hydro6.dmm b/_maps/RandomRuins/StationRuins/BoxStation/hydro6.dmm
index 2250ef8d4130..16c11a6628a3 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/hydro6.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/hydro6.dmm
@@ -4,7 +4,7 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/template_noop)
"d" = (
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/testingsite_range4.dmm b/_maps/RandomRuins/StationRuins/BoxStation/testingsite_range4.dmm
index 60a3bf83bd60..55dba3516761 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/testingsite_range4.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/testingsite_range4.dmm
@@ -268,7 +268,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/template_noop)
"S" = (
@@ -354,7 +354,7 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/template_noop)
diff --git a/_maps/RandomRuins/StationRuins/BoxStation/transfer10.dmm b/_maps/RandomRuins/StationRuins/BoxStation/transfer10.dmm
index 4bb474b79920..d5c0f7cef2b3 100644
--- a/_maps/RandomRuins/StationRuins/BoxStation/transfer10.dmm
+++ b/_maps/RandomRuins/StationRuins/BoxStation/transfer10.dmm
@@ -198,7 +198,7 @@
pixel_x = 2;
pixel_y = 8
},
-/obj/item/twohanded/required/pool/pool_noodle{
+/obj/item/pool/pool_noodle{
pixel_x = 8;
pixel_y = -7
},
diff --git a/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm b/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm
index ce59a7294f9b..c9855d2fd277 100644
--- a/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm
+++ b/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm
@@ -1354,7 +1354,7 @@
dir = 1;
pixel_y = -24
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/tcommsat/computer)
"Bs" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_deltalibrary.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_deltalibrary.dmm
index 796004b57842..890fb8b4cab7 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_deltalibrary.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_deltalibrary.dmm
@@ -23,7 +23,7 @@
/area/template_noop)
"ag" = (
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood{
icon_state = "wood-broken"
},
@@ -296,7 +296,7 @@
/turf/open/floor/plasteel/grimy,
/area/template_noop)
"yo" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/grimy,
/area/template_noop)
"GX" = (
@@ -307,7 +307,7 @@
/area/template_noop)
"Ob" = (
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plating,
/area/template_noop)
"QX" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm
index 277d2d79154d..419ab0526ebe 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fishinghole.dmm
@@ -109,7 +109,7 @@
/area/template_noop)
"tg" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/twohanded/fishingrod,
+/obj/item/fishingrod,
/obj/structure/rack,
/obj/item/poster/random_contraband,
/obj/item/picket_sign,
@@ -317,7 +317,7 @@
/obj/structure/rack,
/obj/item/radio,
/obj/item/relic,
-/obj/item/twohanded/fishingrod,
+/obj/item/fishingrod,
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 4
@@ -356,7 +356,7 @@
/area/template_noop)
"MI" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/twohanded/fishingrod,
+/obj/item/fishingrod,
/obj/structure/rack,
/obj/item/pet_carrier,
/turf/open/floor/plasteel/checker,
@@ -455,7 +455,7 @@
/obj/structure/rack,
/obj/item/soap/homemade,
/obj/item/soap/homemade,
-/obj/item/twohanded/fishingrod,
+/obj/item/fishingrod,
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/light{
dir = 4
diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fourshops.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fourshops.dmm
index 61986d9d3d51..96084e2bf188 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fourshops.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_fourshops.dmm
@@ -199,7 +199,7 @@
/obj/effect/turf_decal/tile/darkgreen{
dir = 4
},
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/plasteel,
/area/template_noop)
"sa" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_olddiner.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_olddiner.dmm
index e66413f1ea3b..b1acec8126ff 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_olddiner.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_olddiner.dmm
@@ -116,7 +116,7 @@
},
/area/template_noop)
"nJ" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/template_noop)
"pn" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_roosterdome.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_roosterdome.dmm
index c1a72b9d9faf..cdaed06b25a5 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_roosterdome.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_roosterdome.dmm
@@ -3,7 +3,7 @@
/turf/open/floor/plasteel/dark,
/area/template_noop)
"b" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/dark,
diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_smallmagician.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_smallmagician.dmm
index 054336469cb8..ad3f8af97c73 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_smallmagician.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_smallmagician.dmm
@@ -148,7 +148,7 @@
/turf/open/floor/plasteel/cafeteria,
/area/template_noop)
"D" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/template_noop)
"E" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_snakefighter.dmm b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_snakefighter.dmm
index 4fa5e0a7d3ec..9fa1693ba7c8 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x10/10x10_snakefighter.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x10/10x10_snakefighter.dmm
@@ -73,7 +73,7 @@
/turf/open/floor/plating,
/area/template_noop)
"q" = (
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/plating,
/area/template_noop)
"r" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_barbershop.dmm b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_barbershop.dmm
index 40845516729a..46315b65f4fb 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_barbershop.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_barbershop.dmm
@@ -116,7 +116,7 @@
"B" = (
/obj/structure/window/spawner/west,
/obj/structure/table/wood,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18";
pixel_y = 10
},
diff --git a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltaarcade.dmm b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltaarcade.dmm
index ae67dd7a25c2..e41daebad355 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltaarcade.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltaarcade.dmm
@@ -119,7 +119,7 @@
/turf/open/floor/plasteel,
/area/template_noop)
"k" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plating,
/area/template_noop)
"l" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltabotnis.dmm b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltabotnis.dmm
index 40e9b4bba597..0a6e4481d818 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltabotnis.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltabotnis.dmm
@@ -7,7 +7,7 @@
/turf/open/floor/plasteel,
/area/template_noop)
"b" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light/small{
dir = 1
},
@@ -76,7 +76,7 @@
/turf/open/floor/plasteel,
/area/template_noop)
"n" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
diff --git a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltacafeteria.dmm b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltacafeteria.dmm
index 40e93af23fe2..5941663f0954 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltacafeteria.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltacafeteria.dmm
@@ -31,7 +31,7 @@
/area/template_noop)
"c" = (
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/sign/poster/contraband/random{
pixel_y = 32
},
diff --git a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltaclutter1.dmm b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltaclutter1.dmm
index 6e25fc698aea..8f492fc4d493 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltaclutter1.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltaclutter1.dmm
@@ -15,7 +15,7 @@
/turf/open/floor/wood,
/area/template_noop)
"e" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/template_noop)
"f" = (
@@ -45,7 +45,7 @@
/obj/machinery/light/small{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/template_noop)
"j" = (
@@ -123,7 +123,7 @@
},
/area/template_noop)
"s" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/template_noop)
"t" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltarobotics.dmm b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltarobotics.dmm
index 97be06e1bb5f..529c71da467e 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltarobotics.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_deltarobotics.dmm
@@ -7,7 +7,7 @@
/turf/open/floor/plasteel,
/area/template_noop)
"b" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -21,7 +21,7 @@
/turf/open/floor/plating,
/area/template_noop)
"d" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/template_noop)
@@ -245,11 +245,11 @@
/turf/open/floor/plating,
/area/template_noop)
"Q" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plating,
/area/template_noop)
"T" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/template_noop)
diff --git a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_medicalmaint.dmm b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_medicalmaint.dmm
index 9838244fb2e9..b688ef4be84b 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_medicalmaint.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_medicalmaint.dmm
@@ -117,7 +117,7 @@
/turf/open/floor/plasteel/white,
/area/template_noop)
"r" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-27"
},
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
diff --git a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_transit.dmm b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_transit.dmm
index 7e00d512d6f3..ae2dfa323a26 100644
--- a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_transit.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_transit.dmm
@@ -25,7 +25,7 @@
/turf/closed/wall/r_wall,
/area/template_noop)
"n" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plating,
/area/template_noop)
"p" = (
@@ -54,7 +54,7 @@
/area/template_noop)
"z" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plating,
/area/template_noop)
"I" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/3x3/3x3_memorial.dmm b/_maps/RandomRuins/StationRuins/maint/3x3/3x3_memorial.dmm
index bda3d6d823d1..3135a1dc264f 100644
--- a/_maps/RandomRuins/StationRuins/maint/3x3/3x3_memorial.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/3x3/3x3_memorial.dmm
@@ -11,7 +11,7 @@
desc = "This plaque seems to memorialize those who fell while constructing the station. The names have been redacted, and they cover the entire plaque.";
pixel_y = 32
},
-/obj/item/twohanded/required/kirbyplants/dead{
+/obj/item/kirbyplants/dead{
desc = "Some flowers have been placed lovingly here in a pot. They have not been watered quite as lovingly...";
name = "Dead Flowers";
pixel_y = 19
diff --git a/_maps/RandomRuins/StationRuins/maint/5x3/5x3_smallfish.dmm b/_maps/RandomRuins/StationRuins/maint/5x3/5x3_smallfish.dmm
index 696f6233e14b..cf9cede6afd3 100644
--- a/_maps/RandomRuins/StationRuins/maint/5x3/5x3_smallfish.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/5x3/5x3_smallfish.dmm
@@ -67,7 +67,7 @@
dir = 8
},
/obj/structure/chair/stool/bamboo,
-/obj/item/twohanded/fishingrod{
+/obj/item/fishingrod{
pixel_x = -6;
pixel_y = 7
},
diff --git a/_maps/RandomRuins/StationRuins/maint/5x3/5x3_waitingroom.dmm b/_maps/RandomRuins/StationRuins/maint/5x3/5x3_waitingroom.dmm
index e68eac9b904b..cdf5e5e2deb8 100644
--- a/_maps/RandomRuins/StationRuins/maint/5x3/5x3_waitingroom.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/5x3/5x3_waitingroom.dmm
@@ -70,7 +70,7 @@
/turf/open/floor/plasteel,
/area/template_noop)
"Q" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
diff --git a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltadetective.dmm b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltadetective.dmm
index e58043ebb7d1..74e5105d79ad 100644
--- a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltadetective.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltadetective.dmm
@@ -22,7 +22,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/sign/poster/official/do_not_question{
pixel_x = 32
},
diff --git a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltagamble.dmm b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltagamble.dmm
index 4fd9fcaabd5c..e5b5855941db 100644
--- a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltagamble.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltagamble.dmm
@@ -1,6 +1,6 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/carpet/green,
/area/template_noop)
"c" = (
@@ -8,12 +8,12 @@
/turf/open/floor/wood,
/area/template_noop)
"d" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/template_noop)
"e" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/template_noop)
"f" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltalounge.dmm b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltalounge.dmm
index c8915974f370..60dae668d911 100644
--- a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltalounge.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltalounge.dmm
@@ -1,6 +1,6 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plating,
/area/template_noop)
"b" = (
diff --git a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltasurgery.dmm b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltasurgery.dmm
index 0d83f5d663d5..371091a916f9 100644
--- a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltasurgery.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_deltasurgery.dmm
@@ -44,7 +44,7 @@
/turf/open/floor/plasteel,
/area/template_noop)
"e" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/template_noop)
diff --git a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_kilohauntedlibrary.dmm b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_kilohauntedlibrary.dmm
index 86733cf23389..f01d8affdc7e 100644
--- a/_maps/RandomRuins/StationRuins/maint/5x4/5x4_kilohauntedlibrary.dmm
+++ b/_maps/RandomRuins/StationRuins/maint/5x4/5x4_kilohauntedlibrary.dmm
@@ -108,7 +108,7 @@
/turf/open/floor/plasteel/dark,
/area/template_noop)
"q" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/effect/turf_decal/tile/neutral,
diff --git a/_maps/RandomZLevels/Cabin.dmm b/_maps/RandomZLevels/Cabin.dmm
index a9527b6d5d3e..5174801ad407 100644
--- a/_maps/RandomZLevels/Cabin.dmm
+++ b/_maps/RandomZLevels/Cabin.dmm
@@ -54,7 +54,7 @@
/area/awaymission/snowforest/lumbermill)
"am" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/chainsaw,
+/obj/item/melee/chainsaw,
/turf/open/floor/wood/cold,
/area/awaymission/snowforest/lumbermill)
"an" = (
diff --git a/_maps/RandomZLevels/VR/syndicate_trainer.dmm b/_maps/RandomZLevels/VR/syndicate_trainer.dmm
index 2d97de497a31..1c1201056032 100644
--- a/_maps/RandomZLevels/VR/syndicate_trainer.dmm
+++ b/_maps/RandomZLevels/VR/syndicate_trainer.dmm
@@ -1368,7 +1368,7 @@
/turf/open/indestructible,
/area/awaymission/centcomAway/general)
"hW" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/indestructible,
/area/awaymission/centcomAway/general)
"hX" = (
@@ -1949,7 +1949,7 @@
"lv" = (
/obj/structure/rack,
/obj/item/restraints/legcuffs/beartrap,
-/obj/item/twohanded/fireaxe,
+/obj/item/fireaxe,
/turf/open/indestructible,
/area/awaymission/centcomAway/thunderdome)
"lw" = (
diff --git a/_maps/RandomZLevels/VR/vrhub.dmm b/_maps/RandomZLevels/VR/vrhub.dmm
index 2e2b54f95c2d..7fd7efb1e45c 100644
--- a/_maps/RandomZLevels/VR/vrhub.dmm
+++ b/_maps/RandomZLevels/VR/vrhub.dmm
@@ -1289,7 +1289,7 @@
/turf/open/indestructible,
/area/awaymission/vr/syndicate)
"pX" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/indestructible,
/area/awaymission/vr/syndicate)
"pY" = (
@@ -2750,7 +2750,7 @@
"Pm" = (
/obj/structure/rack,
/obj/item/restraints/legcuffs/beartrap,
-/obj/item/twohanded/fireaxe,
+/obj/item/fireaxe,
/turf/open/indestructible,
/area/awaymission/vr/syndicate)
"Pn" = (
diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm
index c8b16e9ce4e7..63c45280811d 100644
--- a/_maps/RandomZLevels/caves.dmm
+++ b/_maps/RandomZLevels/caves.dmm
@@ -516,7 +516,7 @@
},
/area/awaymission/caves/BMP_asteroid/level_three)
"by" = (
-/obj/item/twohanded/mjollnir,
+/obj/item/mjolnir,
/mob/living/simple_animal/hostile/poison/giant_spider/nurse,
/turf/open/floor/plating/asteroid/basalt{
initial_gas_mix = "n2=23;o2=14"
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index 5a725be75640..5bb51263e5fc 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -4829,7 +4829,7 @@
},
/area/awaymission/moonoutpost19/research)
"jq" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
desc = "A plastic potted plant.";
pixel_y = 3
},
@@ -7050,7 +7050,7 @@
},
/area/awaymission/moonoutpost19/arrivals)
"ob" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
desc = "A plastic potted plant.";
pixel_y = 3
},
diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm
index 08ced079adc5..0d92d8820e29 100644
--- a/_maps/RandomZLevels/research.dmm
+++ b/_maps/RandomZLevels/research.dmm
@@ -117,7 +117,7 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/engineering)
"ax" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-20";
pixel_y = 3
},
@@ -1762,7 +1762,7 @@
/turf/open/floor/plasteel/dark,
/area/awaymission/research/interior/secure)
"dN" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/obj/effect/turf_decal/tile/purple{
@@ -4065,7 +4065,7 @@
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"hV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/purple{
@@ -4191,7 +4191,7 @@
/turf/open/floor/plasteel,
/area/awaymission/research/interior/security)
"ii" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
desc = "A potted plant, it doesn't look very healthy...";
name = "dead potted plant"
},
@@ -4693,7 +4693,7 @@
/turf/open/floor/wood,
/area/awaymission/research/interior/dorm)
"jm" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-14"
},
/turf/open/floor/plasteel/yellowsiding{
@@ -5340,7 +5340,7 @@
/turf/open/floor/plating,
/area/awaymission/research/interior/medbay)
"kC" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/yellowsiding{
@@ -5714,7 +5714,7 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/medbay)
"ly" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/turf/open/floor/plasteel/yellowsiding{
@@ -6198,7 +6198,7 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/escapepods)
"mJ" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/effect/turf_decal/tile/green{
dir = 1
},
@@ -6235,7 +6235,7 @@
/turf/open/floor/grass,
/area/awaymission/research/interior/escapepods)
"mN" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/effect/turf_decal/tile/green,
diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm
index 6018b157064b..2b15f9a3ec6a 100644
--- a/_maps/RandomZLevels/undergroundoutpost45.dmm
+++ b/_maps/RandomZLevels/undergroundoutpost45.dmm
@@ -1427,7 +1427,7 @@
},
/area/awaymission/undergroundoutpost45/central)
"do" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
layer = 5
},
/obj/effect/decal/cleanable/dirt,
@@ -2931,7 +2931,7 @@
},
/area/awaymission/undergroundoutpost45/central)
"fT" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
layer = 5
},
/obj/effect/decal/cleanable/dirt,
@@ -5166,7 +5166,7 @@
},
/area/awaymission/undergroundoutpost45/gateway)
"kh" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
layer = 5
},
/obj/effect/decal/cleanable/dirt,
@@ -6820,7 +6820,7 @@
/area/awaymission/undergroundoutpost45/research)
"mQ" = (
/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
layer = 5
},
/turf/open/floor/plasteel/cafeteria{
@@ -8422,7 +8422,7 @@
},
/area/awaymission/undergroundoutpost45/research)
"pl" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
layer = 5
},
/obj/effect/decal/cleanable/dirt,
@@ -9495,7 +9495,7 @@
},
/area/awaymission/undergroundoutpost45/engineering)
"rk" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
layer = 5
},
/obj/effect/turf_decal/tile/yellow{
@@ -12431,7 +12431,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
layer = 5
},
/obj/effect/decal/cleanable/dirt,
diff --git a/_maps/RandomZLevels/wildwest.dmm b/_maps/RandomZLevels/wildwest.dmm
index e7c0455431b9..c05dc686a041 100644
--- a/_maps/RandomZLevels/wildwest.dmm
+++ b/_maps/RandomZLevels/wildwest.dmm
@@ -722,7 +722,7 @@
/area/awaymission/wildwest/mines)
"cL" = (
/obj/structure/table/wood,
-/obj/item/twohanded/dualsaber,
+/obj/item/melee/dualsaber,
/turf/open/floor/wood,
/area/awaymission/wildwest/gov)
"cM" = (
diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm
index 5726ce005980..66422f02793f 100644
--- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm
+++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm
@@ -91,7 +91,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aaV" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"abc" = (
@@ -809,7 +809,7 @@
/turf/closed/wall/r_wall,
/area/engine/foyer)
"ahm" = (
-/obj/item/twohanded/required/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
/turf/open/indestructible/sound/pool,
/area/crew_quarters/fitness)
"ahu" = (
@@ -1112,7 +1112,7 @@
/obj/machinery/newscaster{
pixel_y = 32
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/radio/intercom{
dir = 4;
name = "Station Intercom (General)";
@@ -1801,7 +1801,7 @@
/area/chapel/main)
"aqo" = (
/obj/structure/table/glass,
-/obj/item/twohanded/required/kirbyplants/dead{
+/obj/item/kirbyplants/dead{
pixel_y = 13
},
/turf/open/floor/plasteel/dark,
@@ -1948,7 +1948,7 @@
/turf/open/floor/carpet,
/area/medical/psych)
"arn" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
/obj/machinery/light/small{
dir = 1
@@ -3067,7 +3067,7 @@
/turf/open/floor/plating,
/area/maintenance/port/fore)
"aAu" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
@@ -3337,7 +3337,7 @@
/turf/open/space/basic,
/area/space)
"aCk" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark/corner{
dir = 8
},
@@ -3402,7 +3402,7 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"aCx" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark/corner,
/area/chapel/main)
"aCB" = (
@@ -5783,7 +5783,7 @@
/turf/open/floor/plasteel/white,
/area/medical/paramedic)
"aYJ" = (
-/obj/item/twohanded/required/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
/turf/open/indestructible/sound/pool,
/area/crew_quarters/fitness)
"aYK" = (
@@ -6108,7 +6108,7 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/fore)
"bcW" = (
@@ -7291,7 +7291,7 @@
/obj/effect/turf_decal/siding/wood{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light_switch{
pixel_x = -25
},
@@ -8828,7 +8828,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"bZR" = (
-/obj/item/twohanded/required/kirbyplants/dead,
+/obj/item/kirbyplants/dead,
/obj/machinery/firealarm{
dir = 4;
pixel_x = -24
@@ -8838,7 +8838,7 @@
/area/crew_quarters/heads/hor)
"bZS" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"bZW" = (
@@ -11237,7 +11237,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos/pumproom)
"cOs" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/camera{
c_tag = "Construction Area North";
dir = 0
@@ -11390,7 +11390,7 @@
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cQY" = (
@@ -11576,7 +11576,7 @@
/turf/open/floor/plating,
/area/teleporter)
"cUF" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white/side,
/area/science/xenobiology)
"cUI" = (
@@ -14305,7 +14305,7 @@
/area/ruin/space/has_grav/listeningstation)
"dSG" = (
/obj/item/reagent_containers/food/snacks/fish/tuna,
-/obj/item/twohanded/fishingrod,
+/obj/item/fishingrod,
/turf/open/floor/white{
icon = 'icons/turf/floors/ice_turf.dmi';
icon_state = "unsmooth";
@@ -15568,7 +15568,7 @@
/obj/machinery/light{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 10
},
@@ -16102,7 +16102,7 @@
/turf/open/floor/plating,
/area/maintenance/port)
"euL" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/firealarm{
pixel_y = 26
},
@@ -16739,7 +16739,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos/hfr)
"eFQ" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -19574,7 +19574,7 @@
/turf/open/indestructible/grass/sand,
/area/hydroponics/garden)
"fDb" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 10
},
@@ -20173,7 +20173,7 @@
/turf/open/floor/plating,
/area/maintenance/port)
"fOX" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
/obj/structure/sign/painting{
persistence_id = "public";
@@ -20311,7 +20311,7 @@
/turf/open/floor/plasteel,
/area/storage/tech)
"fQU" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/maintenance/starboard/fore)
"fQX" = (
@@ -22384,7 +22384,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"gAc" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 9
},
@@ -22963,11 +22963,11 @@
/area/engine/atmos/distro)
"gJL" = (
/obj/structure/closet/crate,
-/obj/item/twohanded/fishingrod,
-/obj/item/twohanded/fishingrod,
-/obj/item/twohanded/fishingrod,
-/obj/item/twohanded/fishingrod/collapsible,
-/obj/item/twohanded/fishingrod/collapsible,
+/obj/item/fishingrod,
+/obj/item/fishingrod,
+/obj/item/fishingrod,
+/obj/item/fishingrod/collapsible,
+/obj/item/fishingrod/collapsible,
/turf/open/floor/white{
icon = 'icons/turf/floors/ice_turf.dmi';
icon_state = "unsmooth";
@@ -23536,7 +23536,7 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"gSF" = (
-/obj/item/twohanded/fishingrod,
+/obj/item/fishingrod,
/obj/structure/table/wood,
/turf/open/floor/plating/beach/sand,
/area/crew_quarters/bar)
@@ -25678,7 +25678,7 @@
/turf/closed/wall/r_wall,
/area/engine/engineering)
"hAR" = (
-/obj/item/twohanded/fishingrod,
+/obj/item/fishingrod,
/turf/open/floor/white{
icon = 'icons/turf/floors/ice_turf.dmi';
icon_state = "unsmooth";
@@ -28210,7 +28210,7 @@
/obj/item/stack/sheet/metal/fifty,
/obj/item/stack/sheet/glass/fifty,
/obj/item/clothing/gloves/color/yellow,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/obj/item/stack/cable_coil,
/obj/machinery/airalarm{
dir = 8;
@@ -31437,7 +31437,7 @@
dir = 8
},
/obj/structure/table,
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 10
},
/turf/open/floor/black,
@@ -31615,7 +31615,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"jyK" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 6
},
@@ -32436,7 +32436,7 @@
/turf/open/floor/plasteel,
/area/maintenance/disposal/incinerator)
"jLj" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/eighties,
/area/maintenance/starboard/fore)
"jLp" = (
@@ -32444,7 +32444,7 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"jLz" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/carpet/royalblack,
/area/bridge/meeting_room)
"jLH" = (
@@ -32495,7 +32495,7 @@
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 8
},
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel/white/side{
dir = 4
},
@@ -33360,7 +33360,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
@@ -33694,7 +33694,7 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/main)
"khG" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/medical/patients_rooms/room_a)
"kiq" = (
@@ -34271,7 +34271,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"krT" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/airalarm{
dir = 4;
pixel_x = -24
@@ -35135,7 +35135,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"kGv" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light{
dir = 1
},
@@ -35227,7 +35227,7 @@
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"kIj" = (
@@ -38720,7 +38720,7 @@
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"lTX" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/green/filled/line,
/turf/open/floor/plasteel/white,
/area/medical/virology)
@@ -40191,7 +40191,7 @@
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
desc = "About as helpful as an actual cargo tech.";
icon_state = "plant-27";
name = "Planty the Cargo Technician "
@@ -41647,7 +41647,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"mTt" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 1
},
@@ -43556,7 +43556,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"nuU" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
},
@@ -44140,7 +44140,7 @@
/turf/open/floor/plating,
/area/engine/atmos/storage)
"nFe" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/lawoffice)
"nFm" = (
@@ -44387,7 +44387,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"nJQ" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/science/explab)
"nKG" = (
@@ -45806,7 +45806,7 @@
/turf/open/floor/wood,
/area/library)
"ogU" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/extinguisher_cabinet{
pixel_x = 27
},
@@ -45857,7 +45857,7 @@
/obj/structure/cable{
icon_state = "0-8"
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/carpet,
/area/crew_quarters/heads/hos)
"oic" = (
@@ -47887,7 +47887,7 @@
},
/area/ruin/powered)
"oRq" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 4
},
@@ -49885,7 +49885,7 @@
/turf/open/floor/plasteel,
/area/hydroponics)
"puW" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"pvd" = (
@@ -50583,7 +50583,7 @@
/turf/open/floor/plasteel/grimy,
/area/ai_monitored/turret_protected/aisat_interior)
"pGo" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/extinguisher_cabinet{
pixel_x = 27
},
@@ -50804,7 +50804,7 @@
/obj/effect/turf_decal/siding/wideplating{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/hallway/primary/starboard)
"pKa" = (
@@ -51878,7 +51878,7 @@
pixel_x = 27
},
/obj/effect/turf_decal/siding/wideplating,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"pYC" = (
@@ -52373,7 +52373,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"qhL" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/carpet/black,
/area/maintenance/department/tcoms)
"qhM" = (
@@ -53060,7 +53060,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos/pumproom)
"qtP" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/power/apc/highcap/five_k{
areastring = "/area/science/nanite";
dir = 1;
@@ -54615,7 +54615,7 @@
/area/bridge)
"qXQ" = (
/obj/structure/window/reinforced,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 10
},
@@ -56696,7 +56696,7 @@
/turf/open/floor/plasteel,
/area/engine/foyer)
"rEy" = (
-/obj/item/twohanded/fishingrod,
+/obj/item/fishingrod,
/turf/open/floor/plating/beach/coastline_t{
dir = 8
},
@@ -56752,7 +56752,7 @@
/area/hallway/primary/central)
"rEU" = (
/obj/structure/table/reinforced,
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 10
},
/obj/effect/turf_decal/trimline/blue/filled/line{
@@ -58560,7 +58560,7 @@
/obj/structure/sign/poster/official/random{
pixel_y = -32
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet/locker)
"sir" = (
@@ -58644,7 +58644,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -59079,7 +59079,7 @@
/obj/machinery/light{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"sti" = (
@@ -59674,7 +59674,7 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"sDn" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/sign/painting{
persistence_id = "public";
pixel_y = 32
@@ -61324,7 +61324,7 @@
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"tbS" = (
@@ -61965,7 +61965,7 @@
/turf/open/space/basic,
/area/space/nearstation)
"tob" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 10
},
@@ -62153,7 +62153,7 @@
pixel_y = 22;
req_access_txt = "39"
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 4
},
@@ -63482,7 +63482,7 @@
/turf/open/floor/plating,
/area/maintenance/central)
"tTf" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/medical/patients_rooms/room_b)
"tTG" = (
@@ -63599,7 +63599,7 @@
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"tVH" = (
-/obj/item/twohanded/required/kirbyplants/dead,
+/obj/item/kirbyplants/dead,
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
"tVJ" = (
@@ -64385,7 +64385,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"uiJ" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 9
},
@@ -67012,7 +67012,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/quartermaster/office)
"veL" = (
@@ -67077,7 +67077,7 @@
/area/security/main)
"vfv" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/kirbyplants/random{
+/obj/item/kirbyplants/random{
pixel_x = -1;
pixel_y = 12
},
@@ -69485,7 +69485,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
"vYn" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line,
/turf/open/floor/plasteel/white,
/area/medical/storage/backroom)
@@ -70132,7 +70132,7 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"wjG" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/radio/intercom{
pixel_y = -30
},
@@ -71496,7 +71496,7 @@
/obj/machinery/door/firedoor/border_only{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
@@ -74036,7 +74036,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/storage/satellite)
"xwy" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
"xwA" = (
@@ -75211,7 +75211,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light_switch{
pixel_x = -25
},
diff --git a/_maps/map_files/GaxStation/GaxStation.dmm b/_maps/map_files/GaxStation/GaxStation.dmm
index 3aed26e0562c..6020d5c40971 100644
--- a/_maps/map_files/GaxStation/GaxStation.dmm
+++ b/_maps/map_files/GaxStation/GaxStation.dmm
@@ -614,7 +614,7 @@
/obj/machinery/light{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"aoG" = (
@@ -1465,7 +1465,7 @@
dir = 1
},
/obj/effect/turf_decal/trimline/blue/filled/corner/lower,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"aMq" = (
@@ -3861,7 +3861,7 @@
/obj/machinery/camera{
c_tag = "Bridge North"
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
dir = 5
},
@@ -4470,7 +4470,7 @@
c_tag = "Engineering East";
dir = 8
},
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cmq" = (
@@ -8640,7 +8640,7 @@
/obj/effect/turf_decal/trimline/purple/filled/line/lower{
dir = 9
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"ekN" = (
@@ -10611,7 +10611,7 @@
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"fcw" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/airalarm{
dir = 4;
pixel_x = -24
@@ -10803,7 +10803,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"fhj" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/camera{
c_tag = "AI Ship Access";
dir = 8
@@ -11483,7 +11483,7 @@
/turf/open/space/basic,
/area/space/nearstation)
"fzn" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/camera{
c_tag = "EVA East";
dir = 6
@@ -12369,7 +12369,7 @@
dir = 1;
pixel_y = -24
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/bridge)
"fRO" = (
@@ -13507,7 +13507,7 @@
/obj/structure/sign/departments/minsky/research/robotics{
pixel_x = 32
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/filled/line/lower{
dir = 6
},
@@ -13766,7 +13766,7 @@
/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"gBL" = (
@@ -14522,7 +14522,7 @@
dir = 1;
pixel_y = -28
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/carpet/purple,
/area/chapel/main)
"gXE" = (
@@ -14837,7 +14837,7 @@
/area/maintenance/solars/starboard/fore)
"hfV" = (
/obj/structure/window/reinforced,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
dir = 6
},
@@ -16759,7 +16759,7 @@
/obj/effect/turf_decal/trimline/white/filled/line/lower{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/secred/warning/lower{
alpha = 220;
dir = 1
@@ -21912,7 +21912,7 @@
/obj/effect/turf_decal/trimline/brown/filled/line/lower{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"kLw" = (
@@ -24662,7 +24662,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -24947,7 +24947,7 @@
c_tag = "Escape Arm Airlocks";
dir = 6
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/secred/warning/lower{
alpha = 220;
dir = 1
@@ -26818,7 +26818,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 6
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/firealarm{
dir = 8;
pixel_x = 28
@@ -27038,7 +27038,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"npL" = (
@@ -27309,7 +27309,7 @@
/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{
dir = 9
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"nvs" = (
@@ -28129,7 +28129,7 @@
/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{
dir = 9
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom{
dir = 9
},
@@ -29589,7 +29589,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
dir = 5
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"oEB" = (
@@ -29675,7 +29675,7 @@
/turf/open/floor/plasteel/dark,
/area/medical/sleeper)
"oGQ" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
dir = 9
},
@@ -30509,7 +30509,7 @@
/area/maintenance/port/aft)
"peJ" = (
/obj/effect/turf_decal/trimline/blue/filled/line/lower,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"peO" = (
@@ -32710,7 +32710,7 @@
/turf/open/floor/plating,
/area/maintenance/department/science/xenobiology)
"qet" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/neutral/filled/line/lower{
dir = 6
},
@@ -33064,7 +33064,7 @@
/turf/open/floor/plasteel,
/area/science/storage)
"qlO" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/filled/line/lower,
/turf/open/floor/plasteel/white,
/area/science/lab)
@@ -33116,7 +33116,7 @@
"qmG" = (
/obj/structure/table,
/obj/item/restraints/handcuffs,
-/obj/item/twohanded/required/baseball_bat{
+/obj/item/melee/baseball_bat{
desc = "A staple of security force interrogations.";
icon_state = "baseball_bat_metal";
name = "kneecapper"
@@ -38985,7 +38985,7 @@
pixel_x = 32;
pixel_y = -2
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/lawoffice)
"teC" = (
@@ -39875,7 +39875,7 @@
/obj/effect/turf_decal/trimline/green/filled/line/lower{
dir = 9
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"tDz" = (
@@ -44369,7 +44369,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
dir = 10
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/door/firedoor/border_only{
dir = 1
},
@@ -44835,7 +44835,7 @@
/obj/effect/turf_decal/trimline/brown/filled/line/lower{
dir = 6
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
@@ -46711,7 +46711,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"wYh" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 10
},
@@ -47328,7 +47328,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"xlQ" = (
diff --git a/_maps/map_files/YogStation/YogStation.dmm b/_maps/map_files/YogStation/YogStation.dmm
index fe2c22cba276..26d5a9f20e7a 100644
--- a/_maps/map_files/YogStation/YogStation.dmm
+++ b/_maps/map_files/YogStation/YogStation.dmm
@@ -1727,7 +1727,7 @@
name = "Head of Security's Office APC";
pixel_x = -25
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/cable{
icon_state = "0-4"
},
@@ -2335,7 +2335,7 @@
/obj/machinery/light{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/brown/filled/line/lower{
dir = 1
},
@@ -5989,7 +5989,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"aPz" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aPA" = (
@@ -6057,7 +6057,7 @@
/turf/open/floor/plating,
/area/security/processing)
"aPM" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
@@ -6099,7 +6099,7 @@
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
"aQn" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aQr" = (
@@ -6197,7 +6197,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aQT" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/firealarm{
pixel_y = 26
},
@@ -6217,7 +6217,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/sign/poster/official/pda_ad{
pixel_x = 32
},
@@ -7651,7 +7651,7 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
"bdr" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/disposalpipe/segment{
dir = 10
},
@@ -10661,7 +10661,7 @@
dir = 8;
pixel_x = 24
},
-/obj/item/twohanded/required/kirbyplants/dead,
+/obj/item/kirbyplants/dead,
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/heads/hor)
"bCi" = (
@@ -13044,7 +13044,7 @@
/turf/open/floor/plasteel,
/area/storage/primary)
"caT" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 4
},
@@ -13515,7 +13515,7 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"cgo" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/door/firedoor/border_only,
/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{
dir = 1
@@ -14391,7 +14391,7 @@
/turf/closed/wall/r_wall,
/area/engine/engineering)
"cru" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/door/firedoor/border_only,
/obj/machinery/door/firedoor/border_only{
dir = 1
@@ -15780,7 +15780,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"cMh" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plating,
/area/storage/tech)
"cMj" = (
@@ -15969,7 +15969,7 @@
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/obj/item/toy/figure/cmo,
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/heads/cmo)
@@ -16293,7 +16293,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"cTB" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/purple/visible{
dir = 5
},
@@ -16812,7 +16812,7 @@
/turf/open/floor/plasteel/dark,
/area/hydroponics)
"ddC" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/brown/filled/line/lower,
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
@@ -17543,7 +17543,7 @@
dir = 1
},
/obj/effect/turf_decal/stripes/line,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"dtc" = (
@@ -18703,7 +18703,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"dOW" = (
@@ -19069,7 +19069,7 @@
/obj/machinery/light{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/camera/motion/armory,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
@@ -19487,7 +19487,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"edX" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/maintenance/disposal/incinerator)
"eec" = (
@@ -19540,7 +19540,7 @@
/turf/open/floor/plating,
/area/engine/engineering)
"efg" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/radio/intercom{
pixel_x = -25
},
@@ -20589,7 +20589,7 @@
/obj/structure/chair/office/dark{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
desc = "About as helpful as an actual cargo tech.";
icon_state = "plant-27";
name = "Planty the Cargo Technician "
@@ -20775,7 +20775,7 @@
/obj/machinery/camera{
c_tag = "Central Hallway North"
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/darkblue/filled/line/lower{
dir = 1
},
@@ -21427,7 +21427,7 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"eME" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light,
/obj/structure/noticeboard{
dir = 8;
@@ -23423,7 +23423,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"fyB" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
@@ -23648,7 +23648,7 @@
/obj/machinery/status_display/evac{
pixel_y = -32
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
@@ -23730,7 +23730,7 @@
/obj/effect/turf_decal/trimline/secred/filled/line/lower{
dir = 9
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/security/prison/hallway)
"fEW" = (
@@ -23775,7 +23775,7 @@
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"fFL" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{
dir = 1
},
@@ -25186,7 +25186,7 @@
/area/engine/engineering)
"gha" = (
/obj/machinery/light/small,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"ghg" = (
@@ -25980,7 +25980,7 @@
/turf/open/floor/plasteel/white,
/area/medical/storage)
"gzz" = (
-/obj/item/twohanded/required/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
/turf/open/indestructible/sound/pool,
/area/crew_quarters/fitness)
"gzP" = (
@@ -26082,7 +26082,7 @@
pixel_x = 7;
pixel_y = 23
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 9
},
@@ -27654,8 +27654,8 @@
dir = 1
},
/obj/item/clothing/shoes/jackboots,
-/obj/item/twohanded/required/pool/rubber_ring,
-/obj/item/twohanded/required/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"hfW" = (
@@ -27992,7 +27992,7 @@
name = "Security Office APC";
pixel_x = 24
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/cable,
/obj/effect/turf_decal/trimline/secred/filled/corner/lower{
dir = 4
@@ -28152,7 +28152,7 @@
/obj/machinery/light{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/darkblue/filled/line/lower{
dir = 5
},
@@ -28514,7 +28514,7 @@
name = "Escape Hallway APC";
pixel_x = -25
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/cable,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
@@ -28602,7 +28602,7 @@
/turf/open/floor/carpet/royalblue,
/area/crew_quarters/heads/cmo)
"hwu" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
@@ -28983,7 +28983,7 @@
/turf/open/floor/plating,
/area/maintenance/port)
"hDa" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/sign/warning/radiation/rad_area{
pixel_x = -32
},
@@ -30186,7 +30186,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/medical/medbay/aft)
"ibZ" = (
@@ -30212,7 +30212,7 @@
/turf/open/floor/plating,
/area/maintenance/fore/secondary)
"ics" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/vacant_room)
"icy" = (
@@ -30251,7 +30251,7 @@
/turf/open/floor/plasteel,
/area/security/prison)
"icP" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/darkblue/filled/line/lower,
/turf/open/floor/plasteel,
/area/crew_quarters/heads/hop)
@@ -30400,7 +30400,7 @@
name = "Station Intercom (General)";
pixel_y = -29
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/vacant_room)
"ies" = (
@@ -32022,7 +32022,7 @@
dir = 1;
pixel_y = -26
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/filled/line/lower,
/turf/open/floor/plasteel,
/area/science/misc_lab)
@@ -32270,14 +32270,14 @@
/turf/open/floor/grass,
/area/hallway/primary/fore)
"iNE" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/secred/filled/line/lower{
dir = 10
},
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"iNM" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{
dir = 8
},
@@ -32285,7 +32285,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"iNT" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
@@ -32495,7 +32495,7 @@
/turf/open/floor/plasteel/dark,
/area/science/xenobiology)
"iSt" = (
-/obj/item/twohanded/required/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
/turf/open/indestructible/sound/pool,
/area/crew_quarters/fitness)
"iSH" = (
@@ -32568,7 +32568,7 @@
/turf/open/floor/carpet,
/area/security/detectives_office)
"iUt" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/security/courtroom)
"iUu" = (
@@ -32969,7 +32969,7 @@
/turf/open/floor/plasteel,
/area/vacant_room/commissary)
"jbY" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/darkblue/filled/line/lower{
dir = 10
},
@@ -34351,7 +34351,7 @@
/turf/open/floor/plasteel,
/area/security/processing)
"jFt" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 4
},
@@ -35100,7 +35100,7 @@
/obj/structure/table/reinforced,
/obj/machinery/cell_charger,
/obj/item/stock_parts/cell/high/plus,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel,
/area/crew_quarters/heads/chief)
"jVQ" = (
@@ -36246,7 +36246,7 @@
/turf/open/floor/plasteel,
/area/engine/foyer)
"kua" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light,
/obj/effect/turf_decal/trimline/green/filled/corner/lower,
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
@@ -36277,7 +36277,7 @@
/area/security/prison)
"kuY" = (
/obj/machinery/holopad,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/brown/filled/line/lower{
dir = 1
},
@@ -37377,7 +37377,7 @@
/turf/open/floor/carpet/blue,
/area/bridge/meeting_room)
"kRG" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/obj/effect/turf_decal/trimline/blue/filled/corner/lower{
dir = 8
},
@@ -38431,7 +38431,7 @@
dir = 1;
pixel_y = -24
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet/locker)
"llW" = (
@@ -38441,7 +38441,7 @@
/obj/effect/turf_decal/stripes{
dir = 5
},
-/obj/item/twohanded/required/kirbyplants/random{
+/obj/item/kirbyplants/random{
pixel_x = -5
},
/obj/effect/turf_decal/ramp_middle{
@@ -38451,7 +38451,7 @@
/turf/open/floor/carpet,
/area/library)
"lmd" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/darkblue/filled/line/lower{
dir = 6
},
@@ -39381,7 +39381,7 @@
/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
"lHv" = (
@@ -39871,7 +39871,7 @@
c_tag = "EVA South";
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"lRt" = (
@@ -40033,7 +40033,7 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/main)
"lUn" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4,
/turf/open/floor/wood,
/area/medical/psych)
@@ -40706,7 +40706,7 @@
/turf/open/floor/plating,
/area/security/prison)
"mhE" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/corner/lower{
dir = 4
},
@@ -41418,7 +41418,7 @@
/turf/open/floor/plasteel,
/area/storage/primary)
"muS" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/door/firedoor/border_only,
/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{
dir = 5
@@ -41975,7 +41975,7 @@
/obj/machinery/firealarm{
pixel_y = 26
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/security/interrogation)
"mEh" = (
@@ -45177,7 +45177,7 @@
/obj/effect/turf_decal/trimline/blue/filled/corner/lower{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 10
},
/obj/structure/table,
@@ -45845,7 +45845,7 @@
pixel_x = 5;
pixel_y = -36
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"ohL" = (
@@ -46522,7 +46522,7 @@
dir = 8;
pixel_x = 24
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/stripes/line{
dir = 6
},
@@ -47566,7 +47566,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/qm)
"oNV" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/firealarm{
dir = 1;
pixel_y = -26
@@ -48600,7 +48600,7 @@
/turf/open/floor/plating,
/area/science/xenobiology)
"piy" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/window/reinforced,
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
dir = 10
@@ -50630,7 +50630,7 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"pVW" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/door/firedoor/border_only{
dir = 1
},
@@ -51618,7 +51618,7 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"qnM" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/grimy,
/area/security/detectives_office)
"qnN" = (
@@ -53201,7 +53201,7 @@
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"qRi" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{
dir = 10
},
@@ -53310,7 +53310,7 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"qTl" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/filled/line/lower{
dir = 4
},
@@ -56933,7 +56933,7 @@
/turf/closed/wall,
/area/engine/atmos/mix)
"soM" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/filled/line/lower{
dir = 5
},
@@ -57691,7 +57691,7 @@
layer = 4;
pixel_y = 32
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/green/filled/line/lower{
dir = 5
},
@@ -59339,7 +59339,7 @@
/turf/open/floor/plating,
/area/maintenance/port)
"tmp" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/requests_console{
department = "Medbay";
departmentType = 1;
@@ -59744,7 +59744,7 @@
/turf/open/floor/plating,
/area/storage/tech)
"twb" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line/lower{
dir = 9
},
@@ -62238,8 +62238,8 @@
/area/crew_quarters/heads/captain)
"utp" = (
/obj/structure/closet/athletic_mixed,
-/obj/item/twohanded/required/pool/pool_noodle,
-/obj/item/twohanded/required/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"utG" = (
@@ -62281,7 +62281,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 6
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 1
},
@@ -63952,7 +63952,7 @@
/turf/open/floor/plasteel/white,
/area/medical/storage)
"vbw" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/obj/effect/turf_decal/trimline/blue/filled/corner/lower{
dir = 1
},
@@ -64615,7 +64615,7 @@
/obj/machinery/airalarm{
pixel_y = 24
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
@@ -65864,14 +65864,14 @@
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
"vLb" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
dir = 9
},
/turf/open/floor/plasteel/white,
/area/medical/virology)
"vLD" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/secred/filled/line/lower{
dir = 6
},
@@ -65970,7 +65970,7 @@
pixel_x = 30;
receive_ore_updates = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/science/nanite)
"vNB" = (
@@ -66365,7 +66365,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai)
"vUT" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{
dir = 1
},
@@ -66760,7 +66760,7 @@
/turf/open/floor/plasteel,
/area/science/nanite)
"wcf" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/mapping_helpers/teleport_anchor,
/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{
dir = 4
@@ -66774,7 +66774,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos/mix)
"wcl" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 5
},
@@ -68689,7 +68689,7 @@
/turf/open/floor/plasteel/white,
/area/medical/virology)
"wRN" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light,
/turf/open/floor/plasteel,
/area/science/robotics/lab)
@@ -69531,7 +69531,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos/distro)
"xjZ" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/light,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
@@ -70803,7 +70803,7 @@
/turf/open/floor/plasteel,
/area/science/mixing)
"xKE" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/carpet,
/area/library)
"xLu" = (
@@ -71426,7 +71426,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/filled/line/lower{
dir = 5
},
@@ -71452,8 +71452,8 @@
pixel_y = 30
},
/obj/structure/table,
-/obj/item/twohanded/rcl/pre_loaded,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel,
/area/engine/engineering)
"xYw" = (
@@ -71567,7 +71567,7 @@
pixel_x = -21;
pixel_y = -11
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/structure/cable{
icon_state = "0-2"
},
@@ -71915,7 +71915,7 @@
dir = 1
},
/obj/effect/turf_decal/stripes/line,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"ygx" = (
diff --git a/_maps/map_files/Yogsmeta/Yogsmeta.dmm b/_maps/map_files/Yogsmeta/Yogsmeta.dmm
index a6b8043d363a..c4e98044a466 100644
--- a/_maps/map_files/Yogsmeta/Yogsmeta.dmm
+++ b/_maps/map_files/Yogsmeta/Yogsmeta.dmm
@@ -157,7 +157,7 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/effect/decal/cleanable/dirt,
@@ -177,7 +177,7 @@
/obj/structure/cable/yellow{
icon_state = "1-2"
},
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/security/prison)
@@ -629,7 +629,7 @@
/turf/open/floor/plasteel/airless/solarpanel,
/area/solar/starboard/fore)
"acm" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-13"
},
/obj/effect/decal/cleanable/dirt,
@@ -10355,7 +10355,7 @@
/area/lawoffice)
"aBD" = (
/obj/effect/decal/cleanable/cobweb,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-20";
pixel_y = 3
},
@@ -10748,7 +10748,7 @@
c_tag = "AI Upload Chamber - Fore";
network = list("aiupload")
},
-/obj/item/twohanded/required/kirbyplants/photosynthetic{
+/obj/item/kirbyplants/photosynthetic{
pixel_y = 10
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
@@ -12727,8 +12727,8 @@
/obj/effect/turf_decal/bot{
dir = 1
},
-/obj/item/twohanded/rcl/pre_loaded,
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/turf/open/floor/plasteel{
dir = 1
},
@@ -13720,7 +13720,7 @@
name = "Law Office APC";
pixel_y = 23
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/wood,
@@ -16407,7 +16407,7 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/clerk)
"aPc" = (
@@ -17181,7 +17181,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/effect/turf_decal/tile/neutral{
@@ -19100,7 +19100,7 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"aUY" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/engine/engineering)
"aUZ" = (
@@ -19288,7 +19288,7 @@
/turf/open/floor/plating,
/area/hallway/secondary/entry)
"aVt" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-13"
},
/obj/effect/turf_decal/stripes/line{
@@ -19644,7 +19644,7 @@
/obj/machinery/airalarm{
pixel_y = 24
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/effect/turf_decal/tile/neutral{
@@ -19753,7 +19753,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = 27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/obj/item/radio/intercom{
@@ -20554,7 +20554,7 @@
/turf/closed/wall,
/area/hallway/secondary/entry)
"aYF" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/effect/turf_decal/stripes/line{
@@ -21030,7 +21030,7 @@
charge = 100;
maxcharge = 15000
},
-/obj/item/twohanded/rcl/pre_loaded,
+/obj/item/rcl/pre_loaded,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
@@ -25058,7 +25058,7 @@
/obj/structure/window/reinforced{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/aisat)
"bjN" = (
@@ -28570,7 +28570,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"btR" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-18"
},
/obj/effect/turf_decal/stripes/line{
@@ -28588,7 +28588,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"btU" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-08"
},
/turf/open/floor/plasteel/grimy,
@@ -28600,7 +28600,7 @@
/turf/open/floor/plasteel/grimy,
/area/hallway/primary/port)
"btW" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/turf/open/floor/plasteel/grimy,
@@ -28858,7 +28858,7 @@
/turf/closed/wall,
/area/aisat)
"bvB" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-20"
},
/obj/effect/turf_decal/stripes/line{
@@ -30352,7 +30352,7 @@
/turf/open/floor/wood,
/area/library)
"bBx" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/wood,
@@ -33132,7 +33132,7 @@
/turf/open/floor/circuit/telecomms/mainframe,
/area/tcommsat/server)
"bKS" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-06"
},
/obj/effect/turf_decal/stripes/line{
@@ -35044,7 +35044,7 @@
/turf/open/floor/carpet,
/area/bridge/showroom/corporate)
"bRG" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/purple,
@@ -36528,7 +36528,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/effect/turf_decal/tile/blue{
@@ -37936,7 +37936,7 @@
/obj/item/radio/intercom{
pixel_y = -30
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-08"
},
/obj/effect/turf_decal/tile/purple,
@@ -39754,7 +39754,7 @@
/turf/open/floor/plasteel/white,
/area/science/research)
"coj" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/purple,
@@ -44729,7 +44729,7 @@
/turf/open/floor/plasteel,
/area/science/robotics/lab)
"cJQ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/purple{
@@ -50265,7 +50265,7 @@
/area/medical/virology)
"dZO" = (
/obj/machinery/holopad,
-/obj/item/twohanded/required/kirbyplants/dead,
+/obj/item/kirbyplants/dead,
/turf/open/floor/plasteel/cafeteria{
dir = 5
},
@@ -51484,7 +51484,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos/hfr)
"eHu" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -51530,7 +51530,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 6
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/aisat)
"eIa" = (
@@ -54504,7 +54504,7 @@
dir = 8
},
/obj/effect/turf_decal/trimline/yellow/filled/corner,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/engine/atmos/distro)
"gIT" = (
@@ -54590,7 +54590,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 4
@@ -55247,7 +55247,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/engine/atmos/mix)
"hlX" = (
@@ -56140,7 +56140,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"hTB" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
@@ -56486,7 +56486,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 5
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"ihp" = (
@@ -56794,7 +56794,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"isH" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
@@ -57417,7 +57417,7 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
"iQE" = (
-/obj/item/twohanded/required/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
/turf/open/indestructible/sound/pool/end,
/area/crew_quarters/fitness/recreation)
"iQM" = (
@@ -58020,7 +58020,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/aft)
"jhQ" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/engine/atmos/distro)
"jhU" = (
@@ -58887,7 +58887,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 9
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"jHe" = (
@@ -60888,8 +60888,8 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/pool/rubber_ring,
-/obj/item/twohanded/required/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/recreation)
"kRB" = (
@@ -63173,7 +63173,7 @@
/turf/open/floor/plasteel/freezer,
/area/security/prison)
"mgw" = (
-/obj/item/twohanded/required/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
/turf/open/indestructible/sound/pool,
/area/crew_quarters/fitness/recreation)
"mgP" = (
@@ -63509,7 +63509,7 @@
dir = 8
},
/obj/structure/window/reinforced,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/aisat)
"mtq" = (
@@ -64887,7 +64887,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 6
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"nkk" = (
@@ -68087,8 +68087,8 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/pool/pool_noodle,
-/obj/item/twohanded/required/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/recreation)
"plS" = (
@@ -68114,7 +68114,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 5
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/aisat)
"pnv" = (
@@ -70976,7 +70976,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/power/apc{
areastring = "/area/medical/storage/locker";
dir = 8;
@@ -71990,7 +71990,7 @@
/turf/open/floor/plasteel,
/area/engine/atmos/mix)
"rGz" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 6
},
@@ -72848,7 +72848,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"sqh" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/machinery/computer/security/telescreen/entertainment{
pixel_y = -32
},
@@ -72912,7 +72912,7 @@
/obj/item/radio/intercom{
pixel_x = 29
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-16"
},
/obj/effect/turf_decal/tile/yellow{
@@ -73793,7 +73793,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = 27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-14"
},
/turf/open/floor/plasteel,
@@ -74024,7 +74024,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"sYP" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/radio/intercom{
pixel_x = -26;
pixel_y = -1
@@ -74035,7 +74035,7 @@
/turf/open/floor/plasteel,
/area/engine/foyer)
"sYX" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-11"
},
/obj/effect/turf_decal/trimline/chemorange/filled/line,
@@ -75625,7 +75625,7 @@
/turf/open/floor/wood,
/area/crew_quarters/theatre)
"tXA" = (
-/obj/item/twohanded/required/kirbyplants/random{
+/obj/item/kirbyplants/random{
pixel_x = 6;
pixel_y = -2
},
@@ -78103,7 +78103,7 @@
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
"vtO" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 4
},
@@ -78875,7 +78875,7 @@
icon_state = "map-right-MS";
pixel_y = -32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-03"
},
/obj/effect/turf_decal/tile/blue{
@@ -79530,7 +79530,7 @@
dir = 4
},
/obj/structure/window/reinforced,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/aisat)
"wwz" = (
@@ -80318,7 +80318,7 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-04"
},
/obj/effect/turf_decal/tile/yellow{
@@ -81026,7 +81026,7 @@
/obj/structure/window/reinforced/tinted{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/crew_quarters/heads/cmo)
"xuR" = (
@@ -81381,7 +81381,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/dark,
/area/aisat)
"xEA" = (
@@ -81458,7 +81458,7 @@
/obj/effect/turf_decal/trimline/yellow/filled/corner{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/engine/atmos/distro)
"xHY" = (
diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm
index 022e0cc76fc2..45cb7e5b04ed 100644
--- a/_maps/map_files/debug/multiz.dmm
+++ b/_maps/map_files/debug/multiz.dmm
@@ -1209,7 +1209,7 @@
"dO" = (
/obj/structure/table,
/obj/machinery/light,
-/obj/item/twohanded/fireaxe,
+/obj/item/fireaxe,
/obj/item/extinguisher,
/turf/open/floor/plasteel,
/area/storage/primary)
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index a7695af74b5c..4fcca222067a 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -1571,7 +1571,7 @@
name = "chain whip"
},
/obj/item/scythe,
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"adO" = (
@@ -1832,19 +1832,19 @@
/obj/item/melee/chainofcommand{
name = "chain whip"
},
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"aez" = (
/obj/structure/table/wood,
/obj/item/scythe,
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"aeA" = (
/obj/structure/table/wood,
/obj/item/tailclub,
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"aeB" = (
@@ -2038,7 +2038,7 @@
/area/yogs/infiltrator_base)
"aeX" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/kirbyplants/random{
+/obj/item/kirbyplants/random{
pixel_y = 12
},
/turf/open/floor/holofloor/carpet,
@@ -2998,11 +2998,11 @@
/turf/open/floor/circuit/green/anim,
/area/ctf)
"ahE" = (
-/obj/item/twohanded/ctf/blue,
+/obj/item/ctf_flag/blue,
/turf/open/floor/circuit/green/anim,
/area/ctf)
"ahF" = (
-/obj/item/twohanded/ctf/red,
+/obj/item/ctf_flag/red,
/turf/open/floor/circuit/green/anim,
/area/ctf)
"ahG" = (
@@ -4030,7 +4030,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/control)
"ake" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -4134,7 +4134,7 @@
/turf/open/floor/plasteel,
/area/centcom/supply)
"akk" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/neutral{
@@ -4247,7 +4247,7 @@
/turf/open/floor/plasteel/grimy,
/area/centcom/control)
"akB" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/firealarm{
@@ -4270,7 +4270,7 @@
/obj/structure/window/reinforced{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/grimy,
@@ -4279,7 +4279,7 @@
/obj/structure/window/reinforced{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel/grimy,
@@ -4320,13 +4320,13 @@
/obj/structure/window/reinforced{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel/grimy,
/area/centcom/control)
"akJ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/airalarm{
@@ -4786,7 +4786,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"alQ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/firealarm{
@@ -5226,7 +5226,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"amL" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green{
@@ -5238,7 +5238,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"amM" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -6028,7 +6028,7 @@
/obj/machinery/status_display/ai{
pixel_y = 32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-15";
pixel_x = -6;
pixel_y = 12
@@ -6242,7 +6242,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"aoy" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -6605,7 +6605,7 @@
/turf/open/floor/plasteel/grimy,
/area/centcom/ferry)
"aph" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/light{
@@ -6839,7 +6839,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/control)
"apw" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/structure/extinguisher_cabinet{
@@ -7207,13 +7207,13 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"aqd" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/wood,
/area/centcom/ferry)
"aqe" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light_switch{
@@ -7527,7 +7527,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/reagent_containers/pill/adminordrazine,
/turf/open/floor/plasteel/bluespace,
/area/centcom/testchamber)
@@ -7869,7 +7869,7 @@
/turf/open/floor/plasteel,
/area/centcom/ferry)
"art" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/newscaster{
@@ -7891,7 +7891,7 @@
/obj/machinery/light_switch{
pixel_y = 24
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/wood,
@@ -8069,7 +8069,7 @@
/turf/open/floor/grass,
/area/centcom/control)
"arL" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/extinguisher_cabinet{
@@ -9126,7 +9126,7 @@
/turf/open/floor/plasteel,
/area/centcom/ferry)
"atJ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green{
@@ -9165,7 +9165,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"atO" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -9188,7 +9188,7 @@
/turf/closed/indestructible/riveted,
/area/centcom/evac)
"atS" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/stripes/line{
@@ -9300,7 +9300,7 @@
/area/centcom/testchamber)
"aug" = (
/obj/structure/table/wood,
-/obj/item/twohanded/pitchfork/demonic/ascended,
+/obj/item/pitchfork/demonic/ascended,
/obj/item/melee/powerfist,
/turf/open/floor/wood,
/area/centcom/testchamber)
@@ -9621,7 +9621,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/storage/pill_bottle/zoom,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
@@ -9731,7 +9731,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"auT" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/neutral{
@@ -9761,7 +9761,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"auV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -10849,7 +10849,7 @@
/turf/open/floor/plating,
/area/centcom/ferry)
"axi" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/delivery,
@@ -10919,7 +10919,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"axp" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -10931,7 +10931,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"axq" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green,
@@ -10950,7 +10950,7 @@
/turf/open/floor/plating,
/area/centcom/evac)
"axs" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/stripes/line{
@@ -11619,7 +11619,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/reagent_containers/pill/adminordrazine,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
@@ -11756,7 +11756,7 @@
},
/area/holodeck/rec_center/medical)
"azd" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light{
@@ -12341,7 +12341,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"aAm" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red{
@@ -12362,7 +12362,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"aAp" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/blue,
@@ -13423,7 +13423,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"aCw" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/power/apc{
@@ -13460,7 +13460,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"aCy" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/light,
@@ -13481,7 +13481,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/ferry)
"aCz" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/extinguisher_cabinet{
@@ -13777,7 +13777,7 @@
/area/centcom/holding)
"aCW" = (
/obj/structure/table/wood,
-/obj/item/twohanded/spear,
+/obj/item/melee/spear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"aCX" = (
@@ -13908,7 +13908,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/evac)
"aDf" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/structure/extinguisher_cabinet{
@@ -14416,7 +14416,7 @@
/turf/open/floor/plasteel/dark,
/area/centcom/control)
"aDV" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -14425,7 +14425,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"aDW" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green,
@@ -15060,7 +15060,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"aFs" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green{
@@ -15074,7 +15074,7 @@
},
/area/tdome/tdomeobserve)
"aFu" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green,
@@ -15176,7 +15176,7 @@
/turf/open/floor/plasteel/white,
/area/tdome/tdomeobserve)
"aFG" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red,
@@ -15256,7 +15256,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"aFQ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -15396,7 +15396,7 @@
},
/area/tdome/tdomeobserve)
"aGg" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/neutral{
@@ -15410,7 +15410,7 @@
},
/area/tdome/tdomeobserve)
"aGh" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red{
@@ -15419,7 +15419,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"aGi" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/red{
@@ -15432,7 +15432,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"aGj" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/red,
@@ -15461,7 +15461,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"aGn" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/effect/turf_decal/tile/green,
@@ -15471,7 +15471,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"aGo" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green,
@@ -15484,7 +15484,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"aGp" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/green{
@@ -16563,7 +16563,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"aHZ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral,
@@ -16636,7 +16636,7 @@
/turf/open/floor/plasteel,
/area/tdome/tdomeobserve)
"aIg" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -17526,7 +17526,7 @@
},
/area/bluespace_locker)
"aJZ" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/firealarm{
@@ -17558,7 +17558,7 @@
/turf/open/floor/plasteel/dark,
/area/tdome/tdomeadmin)
"aKc" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -18000,7 +18000,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/holofloor{
icon_state = "white"
},
@@ -18842,7 +18842,7 @@
},
/area/holodeck/rec_center/chapelcourt)
"aMs" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/wood,
@@ -18938,7 +18938,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/throwing_star/ninja,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
@@ -19252,10 +19252,10 @@
/area/centcom/supplypod)
"aNi" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/cult_bastard{
+/obj/item/melee/cult_bastard{
pixel_y = 3
},
-/obj/item/twohanded/cult_spear,
+/obj/item/cult_spear,
/obj/item/kitchen/knife/envy,
/turf/open/floor/wood,
/area/centcom/testchamber)
@@ -19666,7 +19666,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/reagent_containers/autoinjector/medipen/stimpack/large,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
@@ -19725,7 +19725,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/storage/pill_bottle/stimulant,
/obj/item/encryptionkey/syndicate,
/turf/open/floor/plasteel,
@@ -19757,7 +19757,7 @@
/turf/open/floor/plasteel,
/area/centcom/control)
"aOk" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/hot_potato/syndicate,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
@@ -19777,16 +19777,16 @@
"aOm" = (
/obj/structure/table/wood,
/obj/item/veilrender/honkrender/honkhulkrender,
-/obj/item/twohanded/required/baseball_bat/homerun,
+/obj/item/melee/baseball_bat/homerun,
/obj/item/melee/singularity_sword,
/turf/open/floor/wood,
/area/centcom/testchamber)
"aOn" = (
/obj/structure/table/wood,
-/obj/item/twohanded/mjollnir{
+/obj/item/mjolnir{
pixel_y = 3
},
-/obj/item/twohanded/singularityhammer,
+/obj/item/singularityhammer,
/obj/item/melee/transforming/cleaving_saw,
/turf/open/floor/wood,
/area/centcom/testchamber)
@@ -19917,7 +19917,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/throwing_star/ninja,
/obj/item/throwing_star/ninja,
/obj/item/encryptionkey/binary,
@@ -20000,7 +20000,7 @@
/area/centcom/holding)
"aOH" = (
/obj/effect/turf_decal/tile/neutral,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/storage/pill_bottle/aranesp,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
@@ -20253,14 +20253,14 @@
/area/yogs/infiltrator_base)
"aPg" = (
/obj/structure/table/wood,
-/obj/item/twohanded/dualsaber/purple{
+/obj/item/melee/dualsaber/purple{
pixel_y = 3
},
-/obj/item/twohanded/dualsaber/green{
+/obj/item/melee/dualsaber/green{
pixel_y = 6
},
-/obj/item/twohanded/dualsaber/blue,
-/obj/item/twohanded/dualsaber/red{
+/obj/item/melee/dualsaber/blue,
+/obj/item/melee/dualsaber/red{
pixel_y = 9
},
/obj/item/melee/transforming/energy/blade,
@@ -20448,7 +20448,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/switchblade,
/obj/item/reagent_containers/pill/adminordrazine,
/turf/open/floor/plasteel,
@@ -20545,7 +20545,7 @@
/turf/open/floor/plasteel/white,
/area/centcom/holding)
"aPP" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
"aPQ" = (
@@ -20816,7 +20816,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/holofloor{
icon_state = "white"
},
@@ -21216,7 +21216,7 @@
"aRf" = (
/obj/structure/glowshroom/glowcap,
/obj/structure/table/wood,
-/obj/item/twohanded/required/chainsaw/doomslayer,
+/obj/item/melee/chainsaw/doomslayer,
/obj/item/melee/fryingpan/bananium,
/obj/item/kitchen/knife/rainbowknife,
/turf/open/floor/wood,
@@ -21458,7 +21458,7 @@
/area/holodeck/rec_center/chapelcourt)
"aRE" = (
/obj/structure/table/wood,
-/obj/item/twohanded/bonespear/chitinspear,
+/obj/item/melee/spear/bonespear/chitinspear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"aRF" = (
@@ -22682,7 +22682,7 @@
},
/area/holodeck/rec_center/lounge)
"aUb" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/storage/pill_bottle/stimulant,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
@@ -23720,7 +23720,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/switchblade,
/obj/item/reagent_containers/pill/adminordrazine,
/turf/open/floor/plasteel,
@@ -23729,7 +23729,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/storage/pill_bottle/stimulant,
/obj/item/reagent_containers/pill/adminordrazine,
/turf/open/floor/plasteel,
@@ -23762,7 +23762,7 @@
/turf/open/floor/mineral/titanium/white,
/area/centcom/evac)
"aWo" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/reagent_containers/pill/adminordrazine,
/obj/item/malf_upgrade,
/turf/open/floor/plasteel,
@@ -23936,7 +23936,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/pneumatic_cannon/pie/selfcharge,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
@@ -24075,7 +24075,7 @@
"aWV" = (
/obj/structure/table/wood,
/obj/item/tailclub,
-/obj/item/twohanded/bonespear/chitinspear,
+/obj/item/melee/spear/bonespear/chitinspear,
/turf/open/floor/holofloor/asteroid,
/area/holodeck/rec_center/thunderdome1218)
"aWW" = (
@@ -24158,7 +24158,7 @@
/area/holodeck/rec_center/spacechess)
"aXc" = (
/obj/structure/table/wood,
-/obj/item/twohanded/required/adamantineshield,
+/obj/item/adamantineshield,
/obj/item/shield/mirror,
/obj/item/shield/energy/bananium,
/obj/item/shield/energy,
@@ -24388,7 +24388,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/item/switchblade,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
@@ -24803,7 +24803,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel,
/area/centcom/testchamber)
"aYs" = (
@@ -25274,7 +25274,7 @@
/turf/open/floor/plasteel,
/area/centcom/testchamber)
"aZs" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -25531,7 +25531,7 @@
"aZR" = (
/obj/structure/table/wood,
/obj/item/rune_scimmy,
-/obj/item/twohanded/vibro_weapon,
+/obj/item/vibro_weapon,
/obj/item/melee/ghost_sword,
/obj/item/katana,
/obj/item/energy_katana,
@@ -25882,7 +25882,7 @@
/turf/open/floor/plasteel/bluespace,
/area/centcom)
"gkW" = (
-/obj/item/twohanded/required/kirbyplants/photosynthetic,
+/obj/item/kirbyplants/photosynthetic,
/turf/open/floor/wood,
/area/centcom/holding)
"gxx" = (
diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm
index c4796f8babad..0f4ba1ebe833 100644
--- a/_maps/shuttles/arrival_delta.dmm
+++ b/_maps/shuttles/arrival_delta.dmm
@@ -210,7 +210,7 @@
/obj/machinery/status_display/evac{
pixel_x = -32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -233,7 +233,7 @@
/obj/machinery/status_display/ai{
pixel_x = 32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral,
@@ -284,7 +284,7 @@
/turf/closed/wall/mineral/titanium,
/area/shuttle/arrival)
"A" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -322,7 +322,7 @@
/turf/open/floor/plasteel,
/area/shuttle/arrival)
"E" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral,
diff --git a/_maps/shuttles/arrival_omega.dmm b/_maps/shuttles/arrival_omega.dmm
index f877f2a5fd52..b6826676a292 100644
--- a/_maps/shuttles/arrival_omega.dmm
+++ b/_maps/shuttles/arrival_omega.dmm
@@ -131,7 +131,7 @@
/turf/open/floor/plasteel,
/area/shuttle/arrival)
"o" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm
index 43f47cb4a814..115288d1d00b 100644
--- a/_maps/shuttles/emergency_bar.dmm
+++ b/_maps/shuttles/emergency_bar.dmm
@@ -175,7 +175,7 @@
pixel_x = 6;
pixel_y = 24
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -398,7 +398,7 @@
/turf/open/floor/plasteel/grimy,
/area/shuttle/escape)
"bc" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -565,7 +565,7 @@
/turf/open/floor/plating/airless,
/area/shuttle/escape)
"bG" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -665,7 +665,7 @@
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"bT" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/obj/effect/turf_decal/tile/bar,
diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm
index 0ccf53dbb40f..a9ad698be4be 100644
--- a/_maps/shuttles/emergency_birdboat.dmm
+++ b/_maps/shuttles/emergency_birdboat.dmm
@@ -14,7 +14,7 @@
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/shuttle/escape)
"ae" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/mineral/titanium,
@@ -26,7 +26,7 @@
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"ag" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/door/firedoor/border_only{
@@ -286,7 +286,7 @@
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"aN" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/mineral/titanium/blue,
@@ -435,7 +435,7 @@
/turf/open/floor/mineral/plastitanium,
/area/shuttle/escape)
"bi" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/door/firedoor/border_only{
diff --git a/_maps/shuttles/emergency_cargo.dmm b/_maps/shuttles/emergency_cargo.dmm
index bb7fcb4d47e1..2f377b118a5a 100644
--- a/_maps/shuttles/emergency_cargo.dmm
+++ b/_maps/shuttles/emergency_cargo.dmm
@@ -562,7 +562,7 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"Hv" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/plasteel/rockvault,
/area/shuttle/escape)
"HR" = (
diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm
index cda82dd4bfec..e302b09a663c 100644
--- a/_maps/shuttles/emergency_cere.dmm
+++ b/_maps/shuttles/emergency_cere.dmm
@@ -420,7 +420,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"aM" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/item/radio/intercom{
@@ -446,7 +446,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"aP" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/item/radio/intercom{
@@ -1012,7 +1012,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"ca" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel,
@@ -1038,7 +1038,7 @@
/obj/machinery/light{
dir = 4
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/plasteel,
diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm
index cf16f1abf94e..d35fd379e0c9 100644
--- a/_maps/shuttles/emergency_delta.dmm
+++ b/_maps/shuttles/emergency_delta.dmm
@@ -189,7 +189,7 @@
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"an" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -218,7 +218,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"ap" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -837,7 +837,7 @@
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"bz" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/machinery/button/flasher{
@@ -851,7 +851,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bA" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/obj/effect/turf_decal/tile/neutral{
@@ -1059,7 +1059,7 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/escape)
"cb" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -1379,7 +1379,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"cA" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm
index b08da6ba93d3..2dce8da131ac 100644
--- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm
+++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm
@@ -183,7 +183,7 @@
/turf/open/floor/carpet,
/area/shuttle/escape)
"y" = (
-/obj/item/twohanded/required/kirbyplants,
+/obj/item/kirbyplants,
/turf/open/floor/wood,
/area/shuttle/escape)
"z" = (
diff --git a/_maps/shuttles/emergency_kilo.dmm b/_maps/shuttles/emergency_kilo.dmm
index 994d7033e3cb..6fe1f99f8ddb 100644
--- a/_maps/shuttles/emergency_kilo.dmm
+++ b/_maps/shuttles/emergency_kilo.dmm
@@ -511,7 +511,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/turf/open/floor/mineral/plastitanium,
@@ -535,7 +535,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/mineral/plastitanium,
@@ -872,7 +872,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/mineral/titanium/white,
@@ -1237,7 +1237,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21"
},
/turf/open/floor/mineral/titanium/white,
@@ -1267,7 +1267,7 @@
dir = 1
},
/obj/effect/turf_decal/tile/blue,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "applebush"
},
/obj/effect/turf_decal/stripes/line,
@@ -1374,7 +1374,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 5
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-05"
},
/obj/machinery/portable_atmospherics/canister/air,
@@ -1445,7 +1445,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-10"
},
/turf/open/floor/mineral/titanium/white,
diff --git a/_maps/shuttles/emergency_mafia.dmm b/_maps/shuttles/emergency_mafia.dmm
index a7a7346efc54..da9a3979ea57 100644
--- a/_maps/shuttles/emergency_mafia.dmm
+++ b/_maps/shuttles/emergency_mafia.dmm
@@ -48,7 +48,7 @@
/turf/open/floor/carpet/exoticgreen,
/area/shuttle/escape)
"jA" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/shuttle/escape)
"jZ" = (
diff --git a/_maps/shuttles/emergency_octa.dmm b/_maps/shuttles/emergency_octa.dmm
index 55fe205a112c..fa46cb3fa758 100644
--- a/_maps/shuttles/emergency_octa.dmm
+++ b/_maps/shuttles/emergency_octa.dmm
@@ -382,7 +382,7 @@
/turf/closed/wall/mineral/titanium,
/area/shuttle/escape)
"Ie" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/mineral/titanium/yellow,
/area/shuttle/escape)
"Ki" = (
@@ -539,7 +539,7 @@
/area/shuttle/escape)
"RU" = (
/obj/machinery/door/firedoor/border_only,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"SM" = (
@@ -573,7 +573,7 @@
/turf/open/floor/mineral/titanium,
/area/shuttle/escape)
"UJ" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/darkblue/filled/line/lower{
dir = 6
},
diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm
index 9740fe91746b..6080c7f1374d 100644
--- a/_maps/shuttles/emergency_omega.dmm
+++ b/_maps/shuttles/emergency_omega.dmm
@@ -202,7 +202,7 @@
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"as" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -338,7 +338,7 @@
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aC" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -918,7 +918,7 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"by" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
diff --git a/_maps/shuttles/emergency_pool.dmm b/_maps/shuttles/emergency_pool.dmm
index 98968940f6ab..867ae0b50968 100644
--- a/_maps/shuttles/emergency_pool.dmm
+++ b/_maps/shuttles/emergency_pool.dmm
@@ -369,7 +369,7 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"rf" = (
-/obj/item/twohanded/required/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
/turf/open/indestructible/sound/pool,
/area/shuttle/escape)
"tt" = (
@@ -380,9 +380,9 @@
/area/shuttle/escape)
"wx" = (
/obj/machinery/door/firedoor/border_only,
-/obj/item/twohanded/required/pool/rubber_ring,
-/obj/item/twohanded/required/pool/rubber_ring,
-/obj/item/twohanded/required/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
+/obj/item/pool/rubber_ring,
/obj/structure/closet/athletic_mixed{
name = "pool floaties"
},
@@ -492,7 +492,7 @@
/turf/open/floor/plating,
/area/shuttle/escape)
"Ut" = (
-/obj/item/twohanded/required/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
/turf/open/indestructible/sound/pool,
/area/shuttle/escape)
"Wn" = (
@@ -536,9 +536,9 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"Yy" = (
-/obj/item/twohanded/required/pool/pool_noodle,
-/obj/item/twohanded/required/pool/pool_noodle,
-/obj/item/twohanded/required/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
+/obj/item/pool/pool_noodle,
/obj/structure/closet/athletic_mixed{
name = "pool noodles"
},
diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm
index b256a141599b..220dbaf4a64f 100644
--- a/_maps/shuttles/emergency_pubby.dmm
+++ b/_maps/shuttles/emergency_pubby.dmm
@@ -62,7 +62,7 @@
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"am" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/door/firedoor/border_only{
@@ -77,7 +77,7 @@
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"ao" = (
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-22"
},
/obj/machinery/door/firedoor/border_only{
@@ -114,7 +114,7 @@
/obj/machinery/computer/security/telescreen/entertainment{
pixel_y = 32
},
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-21";
pixel_x = -3;
pixel_y = 3
@@ -205,7 +205,7 @@
/area/shuttle/escape)
"aB" = (
/obj/structure/window/reinforced,
-/obj/item/twohanded/required/kirbyplants{
+/obj/item/kirbyplants{
icon_state = "plant-11"
},
/obj/effect/turf_decal/tile/green,
diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm
index 11ae04f65b78..ad60ced7dbbb 100644
--- a/_maps/shuttles/emergency_russiafightpit.dmm
+++ b/_maps/shuttles/emergency_russiafightpit.dmm
@@ -446,7 +446,7 @@
/area/shuttle/escape)
"bo" = (
/obj/structure/table,
-/obj/item/twohanded/required/baseball_bat{
+/obj/item/melee/baseball_bat{
pixel_x = -5
},
/obj/item/crowbar/large{
diff --git a/_maps/shuttles/emergency_scrapheap.dmm b/_maps/shuttles/emergency_scrapheap.dmm
index f686dcb2fb0d..3a1105fc48d1 100644
--- a/_maps/shuttles/emergency_scrapheap.dmm
+++ b/_maps/shuttles/emergency_scrapheap.dmm
@@ -228,7 +228,7 @@
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"aF" = (
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/mineral/titanium/blue,
/area/shuttle/escape)
"aG" = (
diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm
index f3003ccdb173..09dada7dbeb3 100644
--- a/_maps/shuttles/ferry_lighthouse.dmm
+++ b/_maps/shuttles/ferry_lighthouse.dmm
@@ -283,7 +283,7 @@
/turf/open/floor/wood,
/area/shuttle/transport)
"bd" = (
-/obj/item/twohanded/required/kirbyplants/dead{
+/obj/item/kirbyplants/dead{
desc = "It doesn't look very healthy...";
name = "potted plant"
},
diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm
index bd848012dabc..a5755f4ce697 100644
--- a/_maps/shuttles/infiltrator_basic.dmm
+++ b/_maps/shuttles/infiltrator_basic.dmm
@@ -1381,7 +1381,7 @@
/obj/item/pickaxe/drill/jackhammer,
/obj/item/pickaxe/drill/jackhammer,
/obj/item/pickaxe/drill/jackhammer,
-/obj/item/twohanded/vxtvulhammer,
+/obj/item/melee/vxtvulhammer,
/turf/open/floor/plasteel/dark,
/area/shuttle/syndicate/airlock)
diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm
index 47d0e5d7d4ba..871010061277 100644
--- a/_maps/shuttles/pirate_default.dmm
+++ b/_maps/shuttles/pirate_default.dmm
@@ -1257,7 +1257,7 @@
pixel_x = 13;
pixel_y = 6
},
-/obj/item/twohanded/vxtvulhammer/pirate,
+/obj/item/melee/vxtvulhammer/pirate,
/turf/open/floor/pod/light,
/area/shuttle/pirate)
"Yj" = (
diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm
index e50107f991d3..aabe42b6a117 100644
--- a/_maps/templates/shelter_2.dmm
+++ b/_maps/templates/shelter_2.dmm
@@ -94,7 +94,7 @@
/area/survivalpod)
"q" = (
/obj/structure/tubes,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/item/kirbyplants/random,
/turf/open/floor/pod,
/area/survivalpod)
"r" = (
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm
index 649204104c1f..6e536322a11e 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm
@@ -120,9 +120,12 @@
#define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0)
///from /mob/living/emote(): ()
#define COMSIG_MOB_EMOTE "mob_emote"
-///from base of mob/swap_hand(): (obj/item)
-#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands"
+///from base of mob/swap_hand(): (obj/item/currently_held_item)
+#define COMSIG_MOB_SWAPPING_HANDS "mob_swapping_hands"
#define COMPONENT_BLOCK_SWAP (1<<0)
+/// from base of mob/swap_hand(): ()
+/// Performed after the hands are swapped.
+#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands"
///from base of /mob/verb/pointed: (atom/A)
#define COMSIG_MOB_POINTED "mob_pointed"
///Mob is trying to open the wires of a target [/atom], from /datum/wires/interactable(): (atom/target)
diff --git a/code/__DEFINES/dcs/signals/signals_twohand.dm b/code/__DEFINES/dcs/signals/signals_twohand.dm
new file mode 100644
index 000000000000..ffe335954cb3
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_twohand.dm
@@ -0,0 +1,7 @@
+// /datum/component/two_handed signals
+
+///from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user)
+#define COMSIG_TWOHANDED_WIELD "twohanded_wield"
+ #define COMPONENT_TWOHANDED_BLOCK_WIELD (1<<0)
+///from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user)
+#define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield"
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index babf3483c608..a4b75b15b11f 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -284,6 +284,10 @@
// item traits
#define TRAIT_NODROP "nodrop"
#define TRAIT_T_RAY_VISIBLE "t-ray-visible" // Visible on t-ray scanners if the atom/var/level == 1
+/// Properly wielded two handed item
+#define TRAIT_WIELDED "wielded"
+/// The items needs two hands to be carried
+#define TRAIT_NEEDS_TWO_HANDS "needstwohands"
#define TRAIT_NO_TELEPORT "no-teleport" //you just can't
#define TRAIT_NO_STORAGE "no-storage" //you cannot put this in any container, backpack, box etc
diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm
index 33cab77cfe05..6b7221551dbd 100644
--- a/code/_onclick/drag_drop.dm
+++ b/code/_onclick/drag_drop.dm
@@ -177,10 +177,6 @@
/obj/item/proc/onMouseUp(object, location, params, mob)
return
-/obj/item
- var/canMouseDown = FALSE
- var/syndicate = FALSE // Does this item have syndicate only functionality via hud buttons? Needs to be in this scope to encompass all Chameleon items - Hopek
-
/obj/item/gun/CanItemAutoclick(object, location, params)
. = automatic
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index ac90d508acd8..a7179f51f679 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -70,7 +70,7 @@ SUBSYSTEM_DEF(traumas)
/obj/item/trash/cheesie)),
"greytide" = typecacheof(list(/obj/item/clothing/under/color/grey, /obj/item/melee/baton/cattleprod,
- /obj/item/twohanded/spear, /obj/item/clothing/mask/gas)),
+ /obj/item/melee/spear, /obj/item/clothing/mask/gas)),
"lizards" = typecacheof(list(/obj/item/toy/plush/lizardplushie, /obj/item/reagent_containers/food/snacks/kebab/tail,
/obj/item/organ/tail/lizard, /obj/item/reagent_containers/food/drinks/bottle/lizardwine)),
@@ -111,7 +111,7 @@ SUBSYSTEM_DEF(traumas)
/obj/item/card/id/captains_spare, /obj/item/card/id/centcom, /obj/machinery/door/airlock/command)),
"the supernatural" = typecacheof(list(/obj/structure/destructible/cult, /obj/item/tome,
- /obj/item/melee/cultblade, /obj/item/twohanded/required/cult_bastard, /obj/item/restraints/legcuffs/bola/cult,
+ /obj/item/melee/cultblade, /obj/item/melee/cult_bastard, /obj/item/restraints/legcuffs/bola/cult,
/obj/item/clothing/suit/cultrobes, /obj/item/clothing/suit/space/hardsuit/cult,
/obj/item/clothing/suit/hooded/cultrobes, /obj/item/clothing/head/hooded/cult_hoodie, /obj/effect/rune,
/obj/item/stack/sheet/runed_metal, /obj/machinery/door/airlock/cult, /obj/singularity/narsie,
@@ -142,7 +142,7 @@ SUBSYSTEM_DEF(traumas)
"anime" = typecacheof(list(/obj/item/clothing/under/schoolgirl, /obj/item/katana, /obj/item/reagent_containers/food/snacks/sashimi, /obj/item/reagent_containers/food/snacks/chawanmushi,
/obj/item/reagent_containers/food/drinks/bottle/sake, /obj/item/throwing_star, /obj/item/clothing/head/kitty/genuine, /obj/item/clothing/suit/space/space_ninja,
- /obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/twohanded/vibro_weapon, /obj/item/horrortentacle,
+ /obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/vibro_weapon, /obj/item/horrortentacle,
/obj/item/nullrod/vibro, /obj/item/energy_katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, /obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe))
)
diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm
index 528b4e74c963..5c9d30f144f1 100644
--- a/code/datums/components/chasm.dm
+++ b/code/datums/components/chasm.dm
@@ -207,14 +207,14 @@
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/datum/component/chasm/proc/fish(datum/source, obj/item/I, mob/user, params)
- if(!istype(I,/obj/item/twohanded/fishingrod))
+ if(!istype(I,/obj/item/fishingrod))
return
- var/obj/item/twohanded/fishingrod/rod = I
- if(!rod.wielded)
+ var/obj/item/fishingrod/rod = I
+ if(!HAS_TRAIT(rod, TRAIT_WIELDED))
to_chat(user, span_warning("You need to wield the rod in both hands before you can fish in the chasm!"))
return
if(do_after(user, 3 SECONDS, src.parent))
- if(!rod.wielded)
+ if(!HAS_TRAIT(rod, TRAIT_WIELDED))
return
var/list/fishing_contents = list()
diff --git a/code/datums/components/crafting/antag.dm b/code/datums/components/crafting/antag.dm
index 53be3491f07c..bee860e3a44a 100644
--- a/code/datums/components/crafting/antag.dm
+++ b/code/datums/components/crafting/antag.dm
@@ -6,7 +6,7 @@
// Weapons
/datum/crafting_recipe/metal_baseball_bat
name = "Titanium Baseball Bat"
- result = /obj/item/twohanded/required/baseball_bat/metal_bat
+ result = /obj/item/melee/baseball_bat/metal_bat
reqs = list(/obj/item/stack/sheet/mineral/titanium = 10
)
tools = list(TOOL_WELDER) //to weld the bat together
@@ -16,12 +16,12 @@
/datum/crafting_recipe/lance
name = "Explosive Lance (Grenade)"
- result = /obj/item/twohanded/spear
- reqs = list(/obj/item/twohanded/spear = 1,
+ result = /obj/item/melee/spear
+ reqs = list(/obj/item/melee/spear = 1,
/obj/item/grenade = 1)
- blacklist = list(/obj/item/twohanded/spear/explosive,
+ blacklist = list(/obj/item/melee/spear/explosive,
/obj/item/grenade/flashbang)
- parts = list(/obj/item/twohanded/spear = 1,
+ parts = list(/obj/item/melee/spear = 1,
/obj/item/grenade = 1)
time = 1.5 SECONDS
category = CAT_WEAPONRY
diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm
index e401b4d055bc..6e9c202fca3f 100644
--- a/code/datums/components/crafting/recipes.dm
+++ b/code/datums/components/crafting/recipes.dm
@@ -232,7 +232,7 @@
/datum/crafting_recipe/toysword
name = "Toy Sledgehammer"
reqs = list(/obj/item/light/bulb = 2, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
- result = /obj/item/twohanded/vxtvulhammer/toy/pirate // not authentic!!!!
+ result = /obj/item/melee/vxtvulhammer/toy/pirate // not authentic!!!!
category = CAT_MISC
/datum/crafting_recipe/toybat
@@ -361,31 +361,31 @@
/datum/crafting_recipe/headpike
name = "Spike Head (Glass Spear)"
time = 6.5 SECONDS
- reqs = list(/obj/item/twohanded/spear = 1,
+ reqs = list(/obj/item/melee/spear = 1,
/obj/item/bodypart/head = 1)
parts = list(/obj/item/bodypart/head = 1,
- /obj/item/twohanded/spear = 1)
- blacklist = list(/obj/item/twohanded/bonespear, /obj/item/twohanded/bamboospear)
+ /obj/item/melee/spear = 1)
+ blacklist = list(/obj/item/melee/spear/bonespear, /obj/item/melee/spear/bamboospear)
result = /obj/structure/headpike/glass
category = CAT_PRIMAL
/datum/crafting_recipe/headpikebone
name = "Spike Head (Bone Spear)"
time = 6.5 SECONDS
- reqs = list(/obj/item/twohanded/bonespear = 1,
+ reqs = list(/obj/item/melee/spear/bonespear = 1,
/obj/item/bodypart/head = 1)
parts = list(/obj/item/bodypart/head = 1,
- /obj/item/twohanded/bonespear = 1)
+ /obj/item/melee/spear/bonespear = 1)
result = /obj/structure/headpike/bone
category = CAT_PRIMAL
/datum/crafting_recipe/headpikebamboo
name = "Spike Head (Bamboo Spear)"
time = 6.5 SECONDS
- reqs = list(/obj/item/twohanded/bamboospear = 1,
+ reqs = list(/obj/item/melee/spear/bamboospear = 1,
/obj/item/bodypart/head = 1)
parts = list(/obj/item/bodypart/head = 1,
- /obj/item/twohanded/bamboospear = 1)
+ /obj/item/melee/spear/bamboospear = 1)
result = /obj/structure/headpike/bamboo
category = CAT_PRIMAL
@@ -409,7 +409,7 @@
/datum/crafting_recipe/rcl
name = "Makeshift Rapid Cable Layer"
- result = /obj/item/twohanded/rcl/ghetto
+ result = /obj/item/rcl/ghetto
time = 4 SECONDS
tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH)
reqs = list(/obj/item/stack/sheet/metal = 15)
diff --git a/code/datums/components/crafting/weapons.dm b/code/datums/components/crafting/weapons.dm
index ea03e590a527..ebe1f0da56a6 100644
--- a/code/datums/components/crafting/weapons.dm
+++ b/code/datums/components/crafting/weapons.dm
@@ -210,7 +210,7 @@
/datum/crafting_recipe/chainsaw
name = "Chainsaw"
- result = /obj/item/twohanded/required/chainsaw
+ result = /obj/item/melee/chainsaw
reqs = list(/obj/item/circular_saw = 1,
/obj/item/stack/cable_coil = 3,
/obj/item/stack/sheet/plasteel = 5)
@@ -221,7 +221,7 @@
/datum/crafting_recipe/spear
name = "Spear"
- result = /obj/item/twohanded/spear
+ result = /obj/item/melee/spear
reqs = list(/obj/item/restraints/handcuffs/cable = 1,
/obj/item/shard = 1,
/obj/item/stack/rods = 1)
@@ -255,7 +255,7 @@
result = /obj/item/bombcore/chemical
reqs = list(
/obj/item/stock_parts/matter_bin = 1,
- /obj/item/twohanded/required/gibtonite = 1,
+ /obj/item/melee/gibtonite = 1,
/obj/item/grenade/chem_grenade = 2
)
parts = list(/obj/item/stock_parts/matter_bin = 1, /obj/item/grenade/chem_grenade = 2)
@@ -310,7 +310,7 @@
/datum/crafting_recipe/bonespear
name = "Bone Spear"
- result = /obj/item/twohanded/bonespear
+ result = /obj/item/melee/spear/bonespear
time = 3 SECONDS
reqs = list(/obj/item/stack/sheet/bone = 4,
/obj/item/stack/sheet/sinew = 1)
@@ -319,7 +319,7 @@
/datum/crafting_recipe/boneaxe
name = "Bone Axe"
- result = /obj/item/twohanded/fireaxe/boneaxe
+ result = /obj/item/fireaxe/boneaxe
time = 5 SECONDS
reqs = list(/obj/item/stack/sheet/bone = 6,
/obj/item/stack/sheet/sinew = 3)
@@ -328,9 +328,9 @@
/datum/crafting_recipe/chitinspear
name = "Chitin Spear"
- result = /obj/item/twohanded/bonespear/chitinspear //take a bonespear, reinforce it with some chitin and resin, profit?
+ result = /obj/item/melee/spear/bonespear/chitinspear //take a bonespear, reinforce it with some chitin and resin, profit?
time = 7.5 SECONDS
- reqs = list(/obj/item/twohanded/bonespear = 1,
+ reqs = list(/obj/item/melee/spear/bonespear = 1,
/obj/item/stack/sheet/sinew = 3,
/obj/item/stack/sheet/ashresin = 1,
/obj/item/stack/sheet/animalhide/weaver_chitin = 6)
diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm
new file mode 100644
index 000000000000..4892e0208f1c
--- /dev/null
+++ b/code/datums/components/twohanded.dm
@@ -0,0 +1,412 @@
+/**
+ * Two Handed Component
+ *
+ * When applied to an item it will make it two handed
+ *
+ */
+/datum/component/two_handed
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS // Only one of the component can exist on an item
+
+ /// Reference to the offhand created for the item
+ var/obj/item/offhand/offhand_item
+
+ /// Are we holding the two handed item properly
+ var/wielded = FALSE
+ /// The multiplier applied to force when wielded, does not work with force_wielded, and force_unwielded
+ var/force_multiplier = 0
+ /// The force of the item when wielded
+ var/force_wielded = 0
+ /// The force of the item when unweilded
+ var/force_unwielded = 0
+ /// Play sound when wielded
+ var/wieldsound = FALSE
+ /// Play sound when unwielded
+ var/unwieldsound = FALSE
+ /// Play sound on attack when wielded
+ var/attacksound = FALSE
+ /// Does it have to be held in both hands
+ var/require_twohands = FALSE
+ /// The icon that will be used when wielded
+ var/icon_wielded = FALSE
+ /// The amount of increase recived from sharpening the item
+ var/sharpened_increase = 0
+
+ /// stat list for wielded/unwielded, switches with weapon_stats when wielding or unwielding
+ var/list/wielded_stats
+
+ /// A callback on the parent to be called when the item is wielded
+ var/datum/callback/wield_callback
+ /// A callback on the parent to be called when the item is unwielded
+ var/datum/callback/unwield_callback
+
+/**
+
+ * Two Handed component
+ *
+ * vars:
+ * * require_twohands (optional) Does the item need both hands to be carried
+ * * wieldsound (optional) The sound to play when wielded
+ * * unwieldsound (optional) The sound to play when unwielded
+ * * attacksound (optional) The sound to play when wielded and attacking
+ * * force_multiplier (optional) The force multiplier when wielded, do not use with force_wielded, and force_unwielded
+ * * force_wielded (optional) The force setting when the item is wielded, do not use with force_multiplier
+ * * force_unwielded (optional) The force setting when the item is unwielded, do not use with force_multiplier
+ * * icon_wielded (optional) The icon to be used when wielded
+ */
+/datum/component/two_handed/Initialize(
+ require_twohands = FALSE,
+ wieldsound = FALSE,
+ unwieldsound = FALSE,
+ attacksound = FALSE,
+ force_multiplier = 0,
+ force_wielded = 0,
+ force_unwielded = 0,
+ icon_wielded = FALSE,
+ datum/callback/wield_callback,
+ datum/callback/unwield_callback,
+ list/wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 1, DAMAGE_LOW = 0, DAMAGE_HIGH = 0),
+)
+ if(!isitem(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ src.require_twohands = require_twohands
+ src.wieldsound = wieldsound
+ src.unwieldsound = unwieldsound
+ src.attacksound = attacksound
+ src.force_multiplier = force_multiplier
+ src.force_wielded = force_wielded
+ src.force_unwielded = force_unwielded
+ src.icon_wielded = icon_wielded
+ src.wield_callback = wield_callback
+ src.unwield_callback = unwield_callback
+ src.wielded_stats = wielded_stats
+
+ if(require_twohands)
+ ADD_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT)
+
+// Inherit the new values passed to the component
+/datum/component/two_handed/InheritComponent(
+ datum/component/two_handed/new_comp,
+ original,
+ require_twohands,
+ wieldsound,
+ unwieldsound,
+ force_multiplier,
+ force_wielded,
+ force_unwielded,
+ icon_wielded,
+ datum/callback/wield_callback,
+ datum/callback/unwield_callback,
+ list/wielded_stats,
+)
+ if(!original)
+ return
+ if(require_twohands)
+ src.require_twohands = require_twohands
+ if(wieldsound)
+ src.wieldsound = wieldsound
+ if(unwieldsound)
+ src.unwieldsound = unwieldsound
+ if(attacksound)
+ src.attacksound = attacksound
+ if(force_multiplier)
+ src.force_multiplier = force_multiplier
+ if(force_wielded)
+ src.force_wielded = force_wielded
+ if(force_unwielded)
+ src.force_unwielded = force_unwielded
+ if(icon_wielded)
+ src.icon_wielded = icon_wielded
+ if(wield_callback)
+ src.wield_callback = wield_callback
+ if(unwield_callback)
+ src.unwield_callback = unwield_callback
+ if(wielded_stats)
+ src.wielded_stats = wielded_stats
+
+// register signals withthe parent item
+/datum/component/two_handed/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip))
+ RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self))
+ RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(on_attack))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_update_icon))
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
+ RegisterSignal(parent, COMSIG_ITEM_SHARPEN_ACT, PROC_REF(on_sharpen))
+
+// Remove all siginals registered to the parent item
+/datum/component/two_handed/UnregisterFromParent()
+ UnregisterSignal(parent, list(
+ COMSIG_ITEM_EQUIPPED,
+ COMSIG_ITEM_DROPPED,
+ COMSIG_ITEM_ATTACK_SELF,
+ COMSIG_ITEM_ATTACK,
+ COMSIG_ATOM_UPDATE_ICON,
+ COMSIG_MOVABLE_MOVED,
+ COMSIG_ITEM_SHARPEN_ACT,
+ ))
+
+/// Triggered on equip of the item containing the component
+/datum/component/two_handed/proc/on_equip(datum/source, mob/user, slot)
+ SIGNAL_HANDLER
+
+ if(require_twohands && (slot & ITEM_SLOT_HANDS)) // force equip the item
+ wield(user)
+ if(!user.is_holding(parent) && wielded && !require_twohands)
+ unwield(user)
+
+/// Triggered on drop of item containing the component
+/datum/component/two_handed/proc/on_drop(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ if(require_twohands) //Don't let the item fall to the ground and cause bugs if it's actually being equipped on another slot.
+ unwield(user, FALSE, FALSE)
+ if(wielded)
+ unwield(user)
+ if(source == offhand_item && !QDELETED(source))
+ offhand_item = null
+ qdel(source)
+
+/// Triggered on destroy of the component's offhand
+/datum/component/two_handed/proc/on_destroy(datum/source)
+ SIGNAL_HANDLER
+ offhand_item = null
+
+/// Triggered on attack self of the item containing the component
+/datum/component/two_handed/proc/on_attack_self(datum/source, mob/user)
+ SIGNAL_HANDLER
+
+ if(!require_twohands)
+ if(wielded)
+ unwield(user)
+ else if(user.is_holding(parent))
+ wield(user)
+
+/**
+ * Wield the two handed item in both hands
+ *
+ * vars:
+ * * user The mob/living/carbon that is wielding the item
+ */
+/datum/component/two_handed/proc/wield(mob/living/carbon/user)
+ if(wielded)
+ return
+ if(ismonkey(user))
+ if(require_twohands)
+ to_chat(user, span_notice("[parent] is too heavy and cumbersome for you to carry!"))
+ user.dropItemToGround(parent, force=TRUE)
+ else
+ to_chat(user, span_notice("It's too heavy for you to wield fully."))
+ return
+ if(user.get_inactive_held_item())
+ if(require_twohands)
+ to_chat(user, span_notice("[parent] is too cumbersome to carry in one hand!"))
+ user.dropItemToGround(parent, force=TRUE)
+ else
+ to_chat(user, span_warning("You need your other hand to be empty!"))
+ return
+ if(user.get_num_arms() < 2)
+ if(require_twohands)
+ user.dropItemToGround(parent, force=TRUE)
+ to_chat(user, span_warning("You don't have enough intact hands."))
+ return
+
+ // wield update status
+ if(SEND_SIGNAL(parent, COMSIG_TWOHANDED_WIELD, user) & COMPONENT_TWOHANDED_BLOCK_WIELD)
+ return // blocked wield from item
+ wielded = TRUE
+ ADD_TRAIT(parent, TRAIT_WIELDED, REF(src))
+ RegisterSignal(user, COMSIG_MOB_SWAPPING_HANDS, PROC_REF(on_swapping_hands))
+ if(wield_callback)
+ wield_callback.Invoke(parent, user)
+
+ // update item stats and name
+ var/obj/item/parent_item = parent
+ if(force_multiplier)
+ parent_item.force *= force_multiplier
+ else if(force_wielded)
+ parent_item.force = force_wielded
+ if(sharpened_increase)
+ parent_item.force += sharpened_increase
+ parent_item.weapon_stats = wielded_stats
+ parent_item.name = "[parent_item.name] (Wielded)"
+ parent_item.update_appearance()
+
+ if(iscyborg(user))
+ to_chat(user, span_notice("You dedicate your module to [parent]."))
+ else
+ to_chat(user, span_notice("You grab [parent] with both hands."))
+
+ // Play sound if one is set
+ if(wieldsound)
+ playsound(parent_item.loc, wieldsound, 50, TRUE)
+
+ // Let's reserve the other hand
+ offhand_item = new(user)
+ offhand_item.name = "[parent_item.name] - offhand"
+ offhand_item.desc = "Your second grip on [parent_item]."
+ offhand_item.wielded = TRUE
+ RegisterSignal(offhand_item, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
+ RegisterSignal(offhand_item, COMSIG_PARENT_QDELETING, PROC_REF(on_destroy))
+ user.put_in_inactive_hand(offhand_item)
+
+/**
+ * Unwield the two handed item
+ *
+ * vars:
+ * * user The mob/living/carbon that is unwielding the item
+ * * show_message (option) show a message to chat on unwield
+ * * can_drop (option) whether 'dropItemToGround' can be called or not.
+ */
+/datum/component/two_handed/proc/unwield(mob/living/carbon/user, show_message=TRUE, can_drop=TRUE)
+ if(!wielded)
+ return
+
+ // wield update status
+ wielded = FALSE
+ UnregisterSignal(user, COMSIG_MOB_SWAPPING_HANDS)
+ SEND_SIGNAL(parent, COMSIG_TWOHANDED_UNWIELD, user)
+ REMOVE_TRAIT(parent, TRAIT_WIELDED, REF(src))
+ unwield_callback?.Invoke(parent, user)
+
+ // update item stats
+ var/obj/item/parent_item = parent
+ if(sharpened_increase)
+ parent_item.force -= sharpened_increase
+ if(force_multiplier)
+ parent_item.force /= force_multiplier
+ else if(force_unwielded)
+ parent_item.force = force_unwielded
+
+ parent_item.weapon_stats = initial(parent_item.weapon_stats)
+
+ // update the items name to remove the wielded status
+ var/sf = findtext(parent_item.name, " (Wielded)", -10) // 10 == length(" (Wielded)")
+ if(sf)
+ parent_item.name = copytext(parent_item.name, 1, sf)
+ else
+ parent_item.name = "[initial(parent_item.name)]"
+
+ // Update icons
+ parent_item.update_appearance(UPDATE_ICON)
+
+ if(istype(user)) // tk showed that we might not have a mob here
+ if(user.get_item_by_slot(ITEM_SLOT_BACK) == parent)
+ user.update_inv_back()
+ else
+ user.update_inv_hands()
+
+ // if the item requires two handed drop the item on unwield
+ if(require_twohands && can_drop)
+ user.dropItemToGround(parent, force=TRUE)
+
+ // Show message if requested
+ if(show_message)
+ if(iscyborg(user))
+ to_chat(user, span_notice("You free up your module."))
+ else if(require_twohands)
+ to_chat(user, span_notice("You drop [parent]."))
+ else
+ to_chat(user, span_notice("You are now carrying [parent] with one hand."))
+
+ // Play sound if set
+ if(unwieldsound)
+ playsound(parent_item.loc, unwieldsound, 50, TRUE)
+
+ // Remove the object in the offhand
+ if(offhand_item)
+ UnregisterSignal(offhand_item, list(COMSIG_ITEM_DROPPED, COMSIG_PARENT_QDELETING))
+ qdel(offhand_item)
+ // Clear any old refrence to an item that should be gone now
+ offhand_item = null
+
+/**
+ * on_attack triggers on attack with the parent item
+ */
+/datum/component/two_handed/proc/on_attack(obj/item/source, mob/living/target, mob/living/user)
+ SIGNAL_HANDLER
+ if(wielded && attacksound)
+ var/obj/item/parent_item = parent
+ playsound(parent_item.loc, attacksound, 50, TRUE)
+
+/**
+ * on_update_icon triggers on call to update parent items icon
+ *
+ * Updates the icon using icon_wielded if set
+ */
+/datum/component/two_handed/proc/on_update_icon(obj/item/source)
+ SIGNAL_HANDLER
+ if(!wielded)
+ return NONE
+ if(!icon_wielded)
+ return NONE
+ source.icon_state = icon_wielded
+ return COMSIG_ATOM_NO_UPDATE_ICON_STATE
+
+/**
+ * on_moved Triggers on item moved
+ */
+/datum/component/two_handed/proc/on_moved(datum/source, mob/user, dir)
+ SIGNAL_HANDLER
+
+ unwield(user, can_drop=FALSE)
+
+/**
+ * on_swap_hands Triggers on swapping hands, blocks swap if the other hand is busy
+ */
+/datum/component/two_handed/proc/on_swapping_hands(mob/user, obj/item/held_item)
+ SIGNAL_HANDLER
+
+ if(!held_item)
+ return
+ if(held_item == parent)
+ return COMPONENT_BLOCK_SWAP
+
+/**
+ * on_sharpen Triggers on usage of a sharpening stone on the item
+ */
+/datum/component/two_handed/proc/on_sharpen(obj/item/item, amount, max_amount)
+ SIGNAL_HANDLER
+
+ if(!item)
+ return COMPONENT_BLOCK_SHARPEN_BLOCKED
+ if(sharpened_increase)
+ return COMPONENT_BLOCK_SHARPEN_ALREADY
+ var/wielded_val = 0
+ if(force_multiplier)
+ var/obj/item/parent_item = parent
+ if(wielded)
+ wielded_val = parent_item.force
+ else
+ wielded_val = parent_item.force * force_multiplier
+ else
+ wielded_val = force_wielded
+ if(wielded_val > max_amount)
+ return COMPONENT_BLOCK_SHARPEN_MAXED
+ sharpened_increase = min(amount, (max_amount - wielded_val))
+ return COMPONENT_BLOCK_SHARPEN_APPLIED
+
+/**
+ * The offhand dummy item for two handed items
+ *
+ */
+/obj/item/offhand
+ name = "offhand"
+ icon_state = "offhand"
+ w_class = WEIGHT_CLASS_HUGE
+ item_flags = ABSTRACT
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ var/wielded = FALSE // Off Hand tracking of wielded status
+
+/obj/item/offhand/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
+
+/obj/item/offhand/Destroy()
+ wielded = FALSE
+ return ..()
+
+/obj/item/offhand/equipped(mob/user, slot)
+ . = ..()
+ if(wielded && !user.is_holding(src) && !QDELETED(src))
+ qdel(src)
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 1fc3da8df6de..4ab025c0ab63 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -165,27 +165,34 @@
to_chat(usr, "You will only deflect projectiles while throwmode is enabled.")
-/obj/item/twohanded/bostaff
+/obj/item/melee/bostaff
name = "bo staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
force = 10
w_class = WEIGHT_CLASS_NORMAL
- slot_flags = ITEM_SLOT_BACK
- force_wielded = 14
+ slot_flags = ITEM_SLOT_BACK
throwforce = 20
throw_speed = 2
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
icon = 'icons/obj/weapons/misc.dmi'
icon_state = "bostaff0"
+ base_icon_state = "bostaff"
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
block_chance = 50
-/obj/item/twohanded/bostaff/update_icon_state()
+/obj/item/melee/bostaff/Initialize(mapload)
. = ..()
- icon_state = "bostaff[wielded]"
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 10, \
+ force_wielded = 14, \
+ )
-/obj/item/twohanded/bostaff/attack(mob/target, mob/living/user)
+/obj/item/melee/bostaff/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]0"
+
+/obj/item/melee/bostaff/attack(mob/target, mob/living/user)
add_fingerprint(user)
if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, "You club yourself over the head with [src].")
@@ -205,7 +212,7 @@
to_chat(user, span_warning("It would be dishonorable to attack a foe while they cannot retaliate."))
return
if(user.a_intent == INTENT_DISARM)
- if(!wielded)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
return ..()
if(!ishuman(target))
return ..()
@@ -240,7 +247,7 @@
else
return ..()
-/obj/item/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(wielded)
+/obj/item/melee/bostaff/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
return ..()
return FALSE
diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm
index de8d1d06bfd2..2a5735cebe52 100644
--- a/code/datums/status_effects/debuffs/debuffs.dm
+++ b/code/datums/status_effects/debuffs/debuffs.dm
@@ -540,9 +540,9 @@
status_type = STATUS_EFFECT_REPLACE
alert_type = null
var/mutable_appearance/marked_underlay
- var/obj/item/twohanded/kinetic_crusher/hammer_synced
+ var/obj/item/kinetic_crusher/hammer_synced
-/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/kinetic_crusher/new_hammer_synced)
+/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/kinetic_crusher/new_hammer_synced)
. = ..()
if(.)
hammer_synced = new_hammer_synced
diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm
index 744df7059312..b7691aefcbc7 100644
--- a/code/datums/wires/explosive.dm
+++ b/code/datums/wires/explosive.dm
@@ -117,8 +117,8 @@
/datum/wires/explosive/gibtonite
- holder_type = /obj/item/twohanded/required/gibtonite
+ holder_type = /obj/item/melee/gibtonite
/datum/wires/explosive/gibtonite/explode()
- var/obj/item/twohanded/required/gibtonite/P = holder
+ var/obj/item/melee/gibtonite/P = holder
P.GibtoniteReaction(null, 2)
diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm
index 24520151f986..57056d469677 100644
--- a/code/datums/wounds/bones.dm
+++ b/code/datums/wounds/bones.dm
@@ -47,7 +47,7 @@
RegisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(attack_with_hurt_hand))
if(limb.held_index && victim.get_item_for_held_index(limb.held_index) && (disabling || prob(30 * severity)))
var/obj/item/I = victim.get_item_for_held_index(limb.held_index)
- if(istype(I, /obj/item/twohanded/offhand))
+ if(istype(I, /obj/item/offhand))
I = victim.get_inactive_held_item()
if(I && victim.dropItemToGround(I))
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 7ab71e2f9895..5f05af8d9927 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -91,6 +91,9 @@
var/base_pixel_x = 0
///Default pixel y shifting for the atom's icon.
var/base_pixel_y = 0
+ ///the base icon state used for anything that changes their icon state.
+ var/base_icon_state
+
///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
var/list/targeted_by
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index f9a8f2331d7a..8de6a30640d6 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
/obj/item/toy/talking/codex_gigas = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
/obj/item/toy/sword = 2,
- /obj/item/twohanded/vxtvulhammer/toy = 2,
+ /obj/item/melee/vxtvulhammer/toy = 2,
/obj/item/toy/gun = 2,
/obj/item/gun/ballistic/shotgun/toy/crossbow = 2,
/obj/item/storage/box/fakesyndiesuit = 2,
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index b7069f638451..25bc6605349d 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1272,10 +1272,10 @@
to_chat(user, span_warning("The airlock's bolts prevent it from being forced!"))
else if(brace)
to_chat(user, span_warning("The airlock won't budge!"))
- else if( !welded && !operating)
- if(istype(I, /obj/item/twohanded/fireaxe)) //being fireaxe'd
- var/obj/item/twohanded/fireaxe/F = I
- if(!F.wielded)
+ else if(!welded && !operating)
+ if(istype(I, /obj/item/fireaxe)) //being fireaxe'd
+ var/obj/item/fireaxe/F = I
+ if(!HAS_TRAIT(F, TRAIT_WIELDED))
to_chat(user, span_warning("You need to be wielding the fire axe to do that!"))
return
INVOKE_ASYNC(src, (density ? PROC_REF(open) : PROC_REF(close)), 2)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 64f9755c36b7..22cfd5e6c768 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -247,7 +247,7 @@
/obj/machinery/door/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
- if(user.a_intent != INTENT_HARM && (I.tool_behaviour == TOOL_CROWBAR || istype(I, /obj/item/twohanded/fireaxe)))
+ if(user.a_intent != INTENT_HARM && (I.tool_behaviour == TOOL_CROWBAR || istype(I, /obj/item/fireaxe)))
try_to_crowbar(I, user)
return 1
else if(istype(I, /obj/item/zombie_hand/gamemode))
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 82f1c88d10f6..4b8e6f00a424 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -8,6 +8,7 @@
name = "turret"
icon = 'icons/obj/turrets.dmi'
icon_state = "turretCover"
+ base_icon_state = "standard"
layer = OBJ_LAYER
invisibility = INVISIBILITY_OBSERVER //the turret is invisible if it's inside its cover
density = TRUE
@@ -18,7 +19,6 @@
req_access = list(ACCESS_SEC_DOORS)
power_channel = AREA_USAGE_EQUIP //drains power from the EQUIPMENT channel
- var/base_icon_state = "standard"
var/scan_range = 7
var/atom/base = null //for turrets inside other objects
diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm
index c1e5fbb34288..ddcb00969b36 100644
--- a/code/game/objects/effects/glowshroom.dm
+++ b/code/game/objects/effects/glowshroom.dm
@@ -13,6 +13,7 @@ GLOBAL_VAR_INIT(glowshrooms, 0)
density = FALSE
icon = 'icons/obj/lighting.dmi'
icon_state = "glowshroom" //replaced in New
+ base_icon_state = "glowshroom"
layer = ABOVE_NORMAL_TURF_LAYER
max_integrity = GLOWSHROOM_BASE_INTEGRITY
///Cooldown for when next to try to spread.
@@ -87,7 +88,6 @@ GLOBAL_VAR_INIT(glowshrooms, 0)
myseed.genes += G
set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color)
setDir(calc_dir())
- var/base_icon_state = initial(icon_state)
if(!floor)
switch(dir) //offset to make it be on the wall rather than on the floor
if(NORTH)
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 9c4618da8052..4a902a8740ae 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -283,6 +283,8 @@
duration = 2 MINUTES //2min
color = "#FF0000"
+ var/obj/item/melee/chainsaw/doomslayer/chainsaw
+
/obj/effect/mine/pickup/bloodbath/mineEffect(mob/living/carbon/victim)
if(!victim.client || !istype(victim))
return
@@ -295,16 +297,16 @@
spawn(0)
new /datum/hallucination/delusion(victim, TRUE, "demon",duration,0)
- var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
victim.log_message("entered a blood frenzy", LOG_ATTACK)
- ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT)
- victim.drop_all_held_items()
- victim.put_in_hands(chainsaw, forced = TRUE)
- chainsaw.attack_self(victim)
- chainsaw.wield(victim)
- victim.reagents.add_reagent(/datum/reagent/medicine/adminordrazine,25)
- to_chat(victim, span_warning("KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, KILL THEM ALL!"))
+ if(iscarbon(victim))
+ chainsaw = new(victim.loc)
+ ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT)
+ victim.drop_all_held_items()
+ victim.put_in_hands(chainsaw, forced = TRUE)
+ chainsaw.attack_self(victim)
+ victim.reagents.add_reagent(/datum/reagent/medicine/adminordrazine,25)
+ to_chat(victim, span_warning("KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, KILL THEM ALL!"))
victim.client.color = pure_red
animate(victim.client,color = red_splash, time = 1 SECONDS, easing = SINE_EASING|EASE_OUT)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 763bdd38e925..efcc06bf8714 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -142,6 +142,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/printed = FALSE
+ var/canMouseDown = FALSE
+ /// Does this item have syndicate only functionality via hud buttons? Needs to be in this scope to encompass all Chameleon items - Hopek
+ var/syndicate = FALSE
/// item hover FX
var/outline_filter
diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm
index c0a5aef6eaa9..32e18c255aa1 100644
--- a/code/game/objects/items/RCL.dm
+++ b/code/game/objects/items/RCL.dm
@@ -1,29 +1,44 @@
-/obj/item/twohanded/rcl
+/obj/item/rcl
name = "rapid cable layer"
desc = "A device used to rapidly deploy cables. It has screws on the side which can be removed to slide off the cables. Do not use without insulation!"
icon = 'icons/obj/tools.dmi'
icon_state = "rcl-0"
item_state = "rcl-0"
- var/obj/structure/cable/last
- var/obj/item/stack/cable_coil/loaded
opacity = FALSE
force = 5 //Plastic is soft
throwforce = 5
throw_speed = 1
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL
+ actions_types = list(/datum/action/item_action/rcl_col,/datum/action/item_action/rcl_gui)
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
+ var/obj/structure/cable/last
+ var/obj/item/stack/cable_coil/loaded
var/max_amount = 90
var/active = FALSE
- actions_types = list(/datum/action/item_action/rcl_col,/datum/action/item_action/rcl_gui,)
var/list/colors = list("red", "yellow", "green", "blue", "pink", "orange", "cyan", "white")
var/current_color_index = 1
var/ghetto = FALSE
- lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
var/datum/radial_menu/persistent/wiring_gui_menu
var/mob/listeningTo
-/obj/item/twohanded/rcl/attackby(obj/item/W, mob/user)
+/obj/item/rcl/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \
+ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \
+ )
+
+/// triggered on wield of two handed item
+/obj/item/rcl/proc/on_wield(obj/item/source, mob/user)
+ active = TRUE
+
+/// triggered on unwield of two handed item
+/obj/item/rcl/proc/on_unwield(obj/item/source, mob/user)
+ active = FALSE
+
+/obj/item/rcl/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
@@ -78,19 +93,19 @@
else
..()
-/obj/item/twohanded/rcl/examine(mob/user)
+/obj/item/rcl/examine(mob/user)
. = ..()
if(loaded)
. += span_info("It contains [loaded.amount]/[max_amount] cables.")
-/obj/item/twohanded/rcl/Destroy()
+/obj/item/rcl/Destroy()
QDEL_NULL(loaded)
last = null
listeningTo = null
QDEL_NULL(wiring_gui_menu)
return ..()
-/obj/item/twohanded/rcl/update_icon_state()
+/obj/item/rcl/update_icon_state()
. = ..()
if(!loaded)
icon_state = "rcl-0"
@@ -110,7 +125,7 @@
icon_state = "rcl-0"
item_state = "rcl-0"
-/obj/item/twohanded/rcl/proc/is_empty(mob/user, loud = 1)
+/obj/item/rcl/proc/is_empty(mob/user, loud = 1)
update_appearance(UPDATE_ICON)
if(!loaded || !loaded.amount)
if(loud)
@@ -119,26 +134,23 @@
QDEL_NULL(loaded)
loaded = null
QDEL_NULL(wiring_gui_menu)
- unwield(user)
- active = wielded
return TRUE
return FALSE
-/obj/item/twohanded/rcl/pickup(mob/user)
+/obj/item/rcl/pickup(mob/user)
..()
getMobhook(user)
-/obj/item/twohanded/rcl/dropped(mob/wearer)
+/obj/item/rcl/dropped(mob/wearer)
..()
UnregisterSignal(wearer, COMSIG_MOVABLE_MOVED)
listeningTo = null
last = null
QDEL_NULL(wiring_gui_menu)
-/obj/item/twohanded/rcl/attack_self(mob/user)
+/obj/item/rcl/attack_self(mob/user)
..()
- active = wielded
if(!active)
last = null
else if(!last)
@@ -147,7 +159,7 @@
last = C
break
-/obj/item/twohanded/rcl/proc/getMobhook(mob/to_hook)
+/obj/item/rcl/proc/getMobhook(mob/to_hook)
if(listeningTo == to_hook)
return
if(listeningTo)
@@ -156,7 +168,7 @@
RegisterSignal(listeningTo, COMSIG_MOVABLE_MOVED, PROC_REF(trigger))
-/obj/item/twohanded/rcl/proc/trigger(mob/user)
+/obj/item/rcl/proc/trigger(mob/user)
if(active)
layCable(user)
if(wiring_gui_menu) //update the wire options as you move
@@ -164,7 +176,7 @@
//previous contents of trigger(), lays cable each time the player moves
-/obj/item/twohanded/rcl/proc/layCable(mob/user)
+/obj/item/rcl/proc/layCable(mob/user)
if(!isturf(user.loc))
return
if(is_empty(user, 0))
@@ -173,7 +185,6 @@
if(prob(2) && ghetto) //Give ghetto RCLs a 2% chance to jam, requiring it to be reactviated manually.
to_chat(user, span_warning("[src]'s wires jam!"))
- active = FALSE
return
else
if(last)
@@ -198,7 +209,7 @@
//searches the current tile for a stub cable of the same colour
-/obj/item/twohanded/rcl/proc/findLinkingCable(mob/user)
+/obj/item/rcl/proc/findLinkingCable(mob/user)
var/turf/T
if(!isturf(user.loc))
return
@@ -217,7 +228,7 @@
return
-/obj/item/twohanded/rcl/proc/wiringGuiGenerateChoices(mob/user)
+/obj/item/rcl/proc/wiringGuiGenerateChoices(mob/user)
var/fromdir = 0
var/obj/structure/cable/linkingCable = findLinkingCable(user)
if(linkingCable)
@@ -234,12 +245,12 @@
wiredirs[icondir] = img
return wiredirs
-/obj/item/twohanded/rcl/proc/showWiringGui(mob/user)
+/obj/item/rcl/proc/showWiringGui(mob/user)
var/list/choices = wiringGuiGenerateChoices(user)
wiring_gui_menu = show_radial_menu_persistent(user, src , choices, select_proc = CALLBACK(src, PROC_REF(wiringGuiReact), user), radius = 42)
-/obj/item/twohanded/rcl/proc/wiringGuiUpdate(mob/user)
+/obj/item/rcl/proc/wiringGuiUpdate(mob/user)
if(!wiring_gui_menu)
return
@@ -250,7 +261,7 @@
//Callback used to respond to interactions with the wiring menu
-/obj/item/twohanded/rcl/proc/wiringGuiReact(mob/living/user,choice)
+/obj/item/rcl/proc/wiringGuiReact(mob/living/user,choice)
if(!choice) //close on a null choice (the center button)
QDEL_NULL(wiring_gui_menu)
return
@@ -282,18 +293,18 @@
wiringGuiUpdate(user)
-/obj/item/twohanded/rcl/pre_loaded/Initialize(mapload) //Comes preloaded with cable, for testing stuff
+/obj/item/rcl/pre_loaded/Initialize(mapload) //Comes preloaded with cable, for testing stuff
. = ..()
loaded = new()
loaded.max_amount = max_amount
loaded.amount = max_amount
update_appearance(UPDATE_ICON)
-/obj/item/twohanded/rcl/Initialize(mapload)
+/obj/item/rcl/Initialize(mapload)
. = ..()
update_appearance(UPDATE_ICON)
-/obj/item/twohanded/rcl/ui_action_click(mob/user, action)
+/obj/item/rcl/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/rcl_col))
current_color_index++;
if (current_color_index > colors.len)
@@ -310,13 +321,13 @@
else //open the menu
showWiringGui(user)
-/obj/item/twohanded/rcl/ghetto
+/obj/item/rcl/ghetto
actions_types = list()
max_amount = 30
name = "makeshift rapid cable layer"
ghetto = TRUE
-/obj/item/twohanded/rcl/ghetto/update_icon_state()
+/obj/item/rcl/ghetto/update_icon_state()
. = ..()
if(!loaded)
icon_state = "rclg-0"
diff --git a/code/game/objects/items/binoculars.dm b/code/game/objects/items/binoculars.dm
new file mode 100644
index 000000000000..a75bf3250077
--- /dev/null
+++ b/code/game/objects/items/binoculars.dm
@@ -0,0 +1,54 @@
+/obj/item/binoculars
+ name = "binoculars"
+ desc = "Used for long-distance surveillance."
+ icon = 'icons/obj/tools.dmi'
+ item_state = "binoculars"
+ icon_state = "binoculars"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+ slot_flags = ITEM_SLOT_BELT
+ w_class = WEIGHT_CLASS_SMALL
+
+ var/mob/listeningTo
+ var/zoom_out_amt = 6
+ var/zoom_amt = 10
+
+/obj/item/binoculars/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \
+ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \
+ )
+
+/obj/item/binoculars/Destroy()
+ listeningTo = null
+ return ..()
+
+/obj/item/binoculars/proc/on_wield(atom/source, mob/user)
+ RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_walk))
+ RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate))
+ listeningTo = user
+ user.visible_message("[user] holds [src] up to [user.p_their()] eyes.","You hold [src] up to your eyes.")
+ item_state = "binoculars_wielded"
+ user.regenerate_icons()
+ user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, user.dir)
+
+/obj/item/binoculars/proc/on_unwield(atom/source, mob/user)
+ if(listeningTo)
+ UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
+ UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE)
+ listeningTo = null
+ item_state = "binoculars"
+ user.regenerate_icons()
+ user.client.view_size.zoomIn()
+
+/obj/item/binoculars/proc/rotate(atom/thing, old_dir, new_dir)
+ if(ismob(thing))
+ var/mob/lad = thing
+ lad.regenerate_icons()
+ lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir)
+
+/obj/item/binoculars/proc/on_walk()
+ SIGNAL_HANDLER
+
+ attack_self(listeningTo) //Yes I have sinned, why do you ask?
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index bb8c8bdbbf60..b666ae3b887a 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -19,7 +19,7 @@
var/on = FALSE //if the paddles are equipped (1) or on the defib (0)
var/safety = TRUE //if you can zap people with the defibs on harm mode
var/powered = FALSE //if there's a cell in the defib with enough power for a revive, blocks paddles from reviving otherwise
- var/obj/item/twohanded/shockpaddles/paddles
+ var/obj/item/shockpaddles/paddles
var/obj/item/stock_parts/cell/high/cell
var/combat = FALSE //can we revive through space suits?
var/grab_ghost = TRUE // Do we pull the ghost back into their body?
@@ -58,6 +58,8 @@
powered = TRUE
else
powered = FALSE
+ if(istype(loc, /obj/machinery/defibrillator_mount))
+ loc.update_appearance(UPDATE_ICON)
return ..()
/obj/item/defibrillator/update_overlays()
@@ -113,7 +115,6 @@
/obj/item/defibrillator/attackby(obj/item/W, mob/user, params)
if(W == paddles)
- paddles.unwield()
toggle_paddles()
else if(istype(W, /obj/item/stock_parts/cell))
var/obj/item/stock_parts/cell/C = W
@@ -180,7 +181,6 @@
return
else
//Remove from their hands and back onto the defib unit
- paddles.unwield()
remove_paddles(user)
update_appearance(UPDATE_ICON)
@@ -189,7 +189,7 @@
A.build_all_button_icons()
/obj/item/defibrillator/proc/make_paddles()
- return new /obj/item/twohanded/shockpaddles(src)
+ return new /obj/item/shockpaddles(src)
/obj/item/defibrillator/equipped(mob/user, slot)
..()
@@ -273,19 +273,18 @@
/obj/item/defibrillator/compact/combat/loaded/attackby(obj/item/W, mob/user, params)
if(W == paddles)
- paddles.unwield()
toggle_paddles()
update_appearance(UPDATE_ICON)
return
//paddles
-/obj/item/twohanded/shockpaddles
+/obj/item/shockpaddles
name = "defibrillator paddles"
desc = "A pair of plastic-gripped paddles with flat metal surfaces that are used to deliver powerful electric shocks."
icon = 'icons/obj/defib.dmi'
icon_state = "defibpaddles0"
- item_state = "defibpaddles0"
+ base_icon_state = "defibpaddles"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
@@ -305,7 +304,21 @@
var/mob/listeningTo
-/obj/item/twohanded/shockpaddles/equipped(mob/user, slot)
+/obj/item/shockpaddles/Initialize(mapload, obj/item/defibrillator/spawned_in)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 8, \
+ force_wielded = 12, \
+ icon_wielded = "[base_icon_state]1", \
+ )
+ if(!req_defib)
+ return
+ if (!loc || !istype(loc, /obj/item/defibrillator)) //To avoid weird issues from admin spawns
+ return INITIALIZE_HINT_QDEL
+ defib = loc
+ busy = FALSE
+
+/obj/item/shockpaddles/equipped(mob/user, slot)
. = ..()
if(!req_defib || listeningTo == user)
return
@@ -314,17 +327,16 @@
RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(check_range))
listeningTo = user
-/obj/item/twohanded/shockpaddles/Moved()
+/obj/item/shockpaddles/Moved()
. = ..()
check_range()
-
-/obj/item/twohanded/shockpaddles/fire_act(exposed_temperature, exposed_volume)
+/obj/item/shockpaddles/fire_act(exposed_temperature, exposed_volume)
. = ..()
if((req_defib && defib) && loc != defib)
defib.fire_act(exposed_temperature, exposed_volume)
-/obj/item/twohanded/shockpaddles/proc/check_range()
+/obj/item/shockpaddles/proc/check_range()
if(!req_defib)
return
if(!in_range(src,defib))
@@ -336,7 +348,7 @@
visible_message(span_notice("[src] snap back into [defib]."))
snap_back()
-/obj/item/twohanded/shockpaddles/proc/recharge(time)
+/obj/item/shockpaddles/proc/recharge(time)
if(req_defib || !time)
return
cooldown = TRUE
@@ -348,25 +360,13 @@
cooldown = FALSE
update_appearance(UPDATE_ICON)
-/obj/item/twohanded/shockpaddles/New(mainunit)
- ..()
- if(check_defib_exists(mainunit, src) && req_defib)
- defib = mainunit
- forceMove(defib)
- busy = FALSE
- update_appearance(UPDATE_ICON)
-
-/obj/item/twohanded/shockpaddles/update_icon_state()
+/obj/item/shockpaddles/update_icon_state()
. = ..()
- icon_state = "defibpaddles[wielded]"
- item_state = "defibpaddles[wielded]"
+ icon_state = "[base_icon_state]0"
if(cooldown)
- icon_state = "defibpaddles[wielded]_cooldown"
- if(iscarbon(loc))
- var/mob/living/carbon/C = loc
- C.update_inv_hands()
+ icon_state = "[base_icon_state][!!HAS_TRAIT(src, TRAIT_WIELDED)]_cooldown"
-/obj/item/twohanded/shockpaddles/suicide_act(mob/user)
+/obj/item/shockpaddles/suicide_act(mob/user)
if(req_defib && !defib.deductcharge(revivecost))
user.visible_message(span_danger("[user] is putting the paddles on [user.p_their()] chest but it has no charge!"))
return SHAME
@@ -374,36 +374,24 @@
playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1)
return OXYLOSS
-/obj/item/twohanded/shockpaddles/dropped(mob/user)
+/obj/item/shockpaddles/dropped(mob/user)
if(!req_defib)
return ..()
if(listeningTo)
UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
if(user)
- var/obj/item/twohanded/offhand/O = user.get_inactive_held_item()
- if(istype(O))
- O.unwield()
to_chat(user, span_notice("The paddles snap back into the main unit."))
snap_back()
- return unwield(user)
+ return
-/obj/item/twohanded/shockpaddles/proc/snap_back()
+/obj/item/shockpaddles/proc/snap_back()
if(!defib)
return
defib.on = FALSE
forceMove(defib)
defib.update_appearance(UPDATE_ICON)
-/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, mob/living/carbon/M, obj/O)
- if(!req_defib)
- return TRUE //If it doesn't need a defib, just say it exists
- if (!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns
- qdel(O)
- return FALSE
- else
- return TRUE
-
-/obj/item/twohanded/shockpaddles/attack(mob/M, mob/user)
+/obj/item/shockpaddles/attack(mob/M, mob/user)
if(busy)
return
@@ -418,7 +406,7 @@
has_rod = TRUE
break
- if(!(wielded || has_rod))
+ if(!(HAS_TRAIT(src, TRAIT_WIELDED) || has_rod))
if(iscyborg(user))
to_chat(user, span_warning("You must activate the paddles in your active module before you can use them on someone!"))
else
@@ -457,18 +445,18 @@
H.grab_ghost() // Shove them back in their body.
else if(H.can_defib(FALSE))
H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src)
- if(has_rod && !wielded)
+ if(has_rod && !HAS_TRAIT(src, TRAIT_WIELDED))
to_chat(user, span_notice("Your snake holds the other paddle in its mouth and places it on [H]'s chest."))
do_help(H, user)
-/obj/item/twohanded/shockpaddles/proc/shock_touching(dmg, mob/H)
+/obj/item/shockpaddles/proc/shock_touching(dmg, mob/H)
if(isliving(H.pulledby)) //CLEAR!
var/mob/living/M = H.pulledby
if(M.electrocute_act(30, src))
M.visible_message(span_danger("[M] is electrocuted by [M.p_their()] contact with [H]!"))
M.emote("scream")
-/obj/item/twohanded/shockpaddles/proc/do_disarm(mob/living/M, mob/living/user)
+/obj/item/shockpaddles/proc/do_disarm(mob/living/M, mob/living/user)
if(req_defib && defib.safety)
return
if(!req_defib && !combat)
@@ -492,7 +480,7 @@
else
recharge(6 SECONDS)
-/obj/item/twohanded/shockpaddles/proc/do_harm(mob/living/carbon/H, mob/living/user)
+/obj/item/shockpaddles/proc/do_harm(mob/living/carbon/H, mob/living/user)
if(req_defib && defib.safety)
return
if(!req_defib && !combat)
@@ -547,7 +535,7 @@
busy = FALSE
update_appearance(UPDATE_ICON)
-/obj/item/twohanded/shockpaddles/proc/do_help(mob/living/carbon/H, mob/living/user)
+/obj/item/shockpaddles/proc/do_help(mob/living/carbon/H, mob/living/user)
user.visible_message(span_warning("[user] begins to place [src] on [H]'s chest."), span_warning("You begin to place [src] on [H]'s chest..."))
busy = TRUE
update_appearance(UPDATE_ICON)
@@ -657,13 +645,12 @@
busy = FALSE
update_appearance(UPDATE_ICON)
-/obj/item/twohanded/shockpaddles/cyborg
+/obj/item/shockpaddles/cyborg
name = "cyborg defibrillator paddles"
icon_state = "defibpaddles0"
- item_state = "defibpaddles0"
req_defib = FALSE
-/obj/item/twohanded/shockpaddles/cyborg/attack(mob/M, mob/user)
+/obj/item/shockpaddles/cyborg/attack(mob/M, mob/user)
if(iscyborg(user))
var/mob/living/silicon/robot/R = user
if(R.emagged)
@@ -675,12 +662,11 @@
. = ..()
-/obj/item/twohanded/shockpaddles/syndicate
+/obj/item/shockpaddles/syndicate
name = "syndicate defibrillator paddles"
desc = "A pair of paddles used to revive deceased operatives. It possesses both the ability to penetrate armor and to deliver powerful shocks offensively."
combat = TRUE
icon_state = "defibpaddles0"
- item_state = "defibpaddles0"
req_defib = FALSE
#undef HALFWAYCRITDEATH
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 553178a463ac..240a7d6ec817 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -389,49 +389,34 @@
/obj/item/nullrod/tribal_knife/process()
slowdown = rand(-2, 2)
-/obj/item/nullrod/hammer //this doesn't actually get used, it's more of a visual to select the actual nullrod
+/obj/item/nullrod/hammer
name = "relic war hammer"
desc = "This war hammer cost the chaplain forty thousand space dollars."
icon = 'icons/obj/weapons/misc.dmi'
icon_state = "hammer"
item_state = "hammer"
+ base_icon_state = "hammer"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
slot_flags = ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_HUGE
attack_verb = list("smashed", "bashed", "hammered", "crunched")
+ sharpness = SHARP_NONE
menutab = MENU_WEAPON
additional_desc = "Bonk the sinners."
-/obj/item/nullrod/hammer/equipped(mob/user, slot, initial) //can't do it on initialize because it initializes before getting put in hands
+/obj/item/nullrod/hammer/Initialize(mapload)
. = ..()
- var/obj/item/twohanded/required/nullrod/hammah = new /obj/item/twohanded/required/nullrod(src)
- user.drop_all_held_items()
- user.put_in_active_hand(hammah)
- qdel(src)//lemme just delete the nullrod you just selected
+ AddComponent(/datum/component/two_handed, \
+ require_twohands = TRUE, \
+ )
-/obj/item/twohanded/required/nullrod
- name = "relic war hammer"
- desc = "This war hammer cost the chaplain forty thousand space dollars."
- icon = 'icons/obj/weapons/misc.dmi'
- icon_state = "hammer"
- item_state = "hammer"
- lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
- slot_flags = ITEM_SLOT_BACK
- w_class = WEIGHT_CLASS_HUGE
- force = 18 //it's not quite a baseball bat
- attack_verb = list("smashed", "bashed", "hammered", "crunched", "clobbered")
- sharpness = SHARP_NONE
-
-/obj/item/twohanded/required/nullrod/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE) //trust me, this is better than re-coding two-handed weapons
-
-/obj/item/twohanded/required/nullrod/attack(mob/living/M, mob/living/user)//functions like a throw, but without the wallsplat
+/obj/item/nullrod/hammer/attack(mob/living/M, mob/living/user)//functions like a throw, but without the wallsplat
. = ..()
if(M == user)
return
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
+ return
var/atom/throw_target = get_edge_target_turf(M, user.dir)
ADD_TRAIT(M, TRAIT_IMPACTIMMUNE, "Nullrod Hammer")
var/distance = rand(1,5)
@@ -439,7 +424,7 @@
distance = 50 //hehe funny hallway launch
M.throw_at(throw_target, distance, 3, user, TRUE, TRUE, callback = CALLBACK(src, PROC_REF(afterimpact), M))
-/obj/item/twohanded/required/nullrod/proc/afterimpact(mob/living/M)
+/obj/item/nullrod/hammer/proc/afterimpact(mob/living/M)
REMOVE_TRAIT(M, TRAIT_IMPACTIMMUNE, "Nullrod Hammer")
/obj/item/nullrod/dualsword
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index e7f75f6af293..bf0e97233bb1 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -111,7 +111,7 @@
to_chat(user, span_warning("\the [HAS_TRAIT(src, TRAIT_NODROP) ? src : I] is stuck to your hand, you can't attach it to \the [HAS_TRAIT(src, TRAIT_NODROP) ? I : src]!"))
return
else
- var/obj/item/twohanded/dualsaber/makeshift/newSaber = new /obj/item/twohanded/dualsaber/makeshift(user.loc)
+ var/obj/item/melee/dualsaber/makeshift/newSaber = new /obj/item/melee/dualsaber/makeshift(user.loc)
to_chat(user, span_notice("You crudely attach both [src]s together in order to make a [newSaber]."))
qdel(I)
qdel(src)
diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm
index 21f4a00ad65d..ef9160a77d02 100644
--- a/code/game/objects/items/melee/transforming.dm
+++ b/code/game/objects/items/melee/transforming.dm
@@ -90,7 +90,6 @@
user.take_bodypart_damage(5,5)
/// Security lethal melee weapon, stats inspired by combat knife and energy sword
-/// Legally distinct from /obj/item/twohanded/vibro_weapon
/obj/item/melee/transforming/vib_blade
name = "vibration blade"
desc = "A blade with an edge that vibrates rapidly, enabling it to easily cut through armor and flesh alike."
diff --git a/code/game/objects/items/raised_hand.dm b/code/game/objects/items/raised_hand.dm
new file mode 100644
index 000000000000..091624ccdb8f
--- /dev/null
+++ b/code/game/objects/items/raised_hand.dm
@@ -0,0 +1,18 @@
+/obj/item/raisedhands
+ name = "raised hands"
+ desc = "What are you, French?"
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "latexballon"
+ item_state = "nothing"
+ force = 0
+ throwforce = 0
+ w_class = WEIGHT_CLASS_HUGE
+ item_flags = DROPDEL | ABSTRACT
+
+/obj/item/raisedhands/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, require_twohands = TRUE)
+
+/obj/item/raisedhands/dropped(mob/user)
+ user.visible_message(span_userdanger(("[user] lowers their hands!")))
+ return ..()
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 9ce8a8d008d6..fa7aa2886fd7 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -582,7 +582,7 @@
/obj/item/borg/upgrade/defib/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
- var/obj/item/twohanded/shockpaddles/cyborg/S = locate() in R.module.modules //yogs start
+ var/obj/item/shockpaddles/cyborg/S = locate() in R.module.modules //yogs start
if(S)
to_chat(user, span_warning("This unit is already equipped with a defibrillator module."))
return FALSE
@@ -594,7 +594,7 @@
/obj/item/borg/upgrade/defib/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
- for(var/obj/item/twohanded/shockpaddles/cyborg/S in R.module.modules)
+ for(var/obj/item/shockpaddles/cyborg/S in R.module.modules)
R.module.remove_module(S, TRUE)
/obj/item/borg/upgrade/adv_analyzer
@@ -897,7 +897,7 @@
/obj/item/borg/upgrade/broomer/action(mob/living/silicon/robot/R, user = usr)
if (!..())
return
- var/obj/item/twohanded/broom/cyborg/BR = locate() in R.module.modules
+ var/obj/item/broom/cyborg/BR = locate() in R.module.modules
if (BR)
to_chat(user, span_warning("This janiborg is already equipped with an experimental broom!"))
return FALSE
@@ -908,6 +908,6 @@
/obj/item/borg/upgrade/broomer/deactivate(mob/living/silicon/robot/R, user = usr)
if (!..())
return
- var/obj/item/twohanded/broom/cyborg/BR = locate() in R.module.modules
+ var/obj/item/broom/cyborg/BR = locate() in R.module.modules
if (BR)
R.module.remove_module(BR, TRUE)
diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm
index cbea82512bec..1733f23b01b0 100644
--- a/code/game/objects/items/sharpener.dm
+++ b/code/game/objects/items/sharpener.dm
@@ -24,21 +24,20 @@
if(istype(I, /obj/item/melee/transforming/energy))
to_chat(user, span_warning("You don't think \the [I] will be the thing getting modified if you use it on \the [src]!"))
return
- if(istype(I, /obj/item/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff
- var/obj/item/twohanded/TH = I
- if(TH.force_wielded >= max)
- to_chat(user, span_warning("[TH] is much too powerful to sharpen further!"))
- return
- if(TH.wielded)
- to_chat(user, span_warning("[TH] must be unwielded before it can be sharpened!"))
- return
- if(TH.force_wielded > initial(TH.force_wielded))
- to_chat(user, span_warning("[TH] has already been refined before. It cannot be sharpened further!"))
- return
- TH.force_wielded = clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay
- if(I.force > initial(I.force))
+ //This block is used to check more things if the item has a relevant component.
+ var/signal_out = SEND_SIGNAL(I, COMSIG_ITEM_SHARPEN_ACT, increment, max) //Stores the bitflags returned by SEND_SIGNAL
+ if(signal_out & COMPONENT_BLOCK_SHARPEN_MAXED) //If the item's components enforce more limits on maximum power from sharpening, we fail
+ to_chat(user, span_warning("[I] is much too powerful to sharpen further!"))
+ return
+ if(signal_out & COMPONENT_BLOCK_SHARPEN_BLOCKED)
+ to_chat(user, span_warning("[I] is not able to be sharpened right now!"))
+ return
+ if((signal_out & COMPONENT_BLOCK_SHARPEN_ALREADY) || (I.force > initial(I.force) && !signal_out)) //No sharpening stuff twice
to_chat(user, span_warning("[I] has already been refined before. It cannot be sharpened further!"))
return
+ if(!(signal_out & COMPONENT_BLOCK_SHARPEN_APPLIED)) //If the item has a relevant component and COMPONENT_BLOCK_SHARPEN_APPLIED is returned, the item only gets the throw force increase
+ I.force = clamp(I.force + increment, 0, max)
+ I.wound_bonus = I.wound_bonus + increment //wound_bonus has no cap
user.visible_message(span_notice("[user] sharpens [I] with [src]!"), span_notice("You sharpen [I], making it much more deadly than before."))
playsound(src, 'sound/items/unsheath.ogg', 25, 1)
I.sharpness = SHARP_EDGED
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index 1cc2cec7b237..5b303f0d853e 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -212,13 +212,13 @@
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
icon_state = "eshield1" // So it can display without initializing
+ base_icon_state = "eshield"
w_class = WEIGHT_CLASS_TINY
attack_verb = list("shoved", "bashed")
throw_range = 5
force = 3
throwforce = 3
throw_speed = 3
- var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted
var/on_force = 10
var/on_throwforce = 8
var/on_throw_speed = 2
diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm
index d4569690ecdf..63c629ed64ef 100644
--- a/code/game/objects/items/singularityhammer.dm
+++ b/code/game/objects/items/singularityhammer.dm
@@ -1,40 +1,49 @@
-/obj/item/twohanded/singularityhammer
+/obj/item/singularityhammer
name = "singularity hammer"
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
icon_state = "singhammer0"
+ base_icon_state = "singhammer"
icon = 'icons/obj/wizard.dmi'
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BACK
force = 5
- force_wielded = 15
throwforce = 15
throw_range = 1
w_class = WEIGHT_CLASS_HUGE
- var/charged = 5
armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
resistance_flags = FIRE_PROOF | ACID_PROOF
force_string = "LORD SINGULOTH HIMSELF"
+ var/charged = 5
-/obj/item/twohanded/singularityhammer/New()
- ..()
+/obj/item/singularityhammer/Initialize(mapload)
+ . = ..()
START_PROCESSING(SSobj, src)
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 5, \
+ force_wielded = 15, \
+ icon_wielded = "[base_icon_state]1", \
+ )
+
+/obj/item/singularityhammer/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]0"
-/obj/item/twohanded/singularityhammer/Destroy()
+/obj/item/singularityhammer/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
-/obj/item/twohanded/singularityhammer/process()
+/obj/item/singularityhammer/process()
if(charged < 5)
charged++
return
-/obj/item/twohanded/singularityhammer/update_icon_state() //Currently only here to fuck with the on-mob icons.
+/obj/item/singularityhammer/update_icon_state() //Currently only here to fuck with the on-mob icons.
. = ..()
- icon_state = "singhammer[wielded]"
+ icon_state = "[base_icon_state]0"
-/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
+/obj/item/singularityhammer/proc/vortex(turf/pull, mob/wielder)
for(var/atom/X in orange(5,pull))
if(ismovable(X))
var/atom/movable/A = X
@@ -56,24 +65,25 @@
step_towards(H,pull)
return
-/obj/item/twohanded/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
+/obj/item/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
. = ..()
if(!proximity)
return
- if(wielded)
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
if(charged == 5)
charged = 0
- if(istype(A, /mob/living/))
+ if(istype(A, /mob/living))
var/mob/living/Z = A
Z.take_bodypart_damage(20,0)
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
var/turf/target = get_turf(A)
vortex(target,user)
-/obj/item/twohanded/mjollnir
+/obj/item/mjolnir
name = "Mjolnir"
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
icon_state = "mjollnir0"
+ base_icon_state = "mjollnir"
icon = 'icons/obj/wizard.dmi'
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
@@ -81,12 +91,23 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
slot_flags = ITEM_SLOT_BACK
force = 5
- force_wielded = 20
throwforce = 30
throw_range = 7
w_class = WEIGHT_CLASS_HUGE
-/obj/item/twohanded/mjollnir/proc/shock(mob/living/target)
+/obj/item/mjolnir/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 5, \
+ force_wielded = 20, \
+ icon_wielded = "[base_icon_state]1", \
+ )
+
+/obj/item/mjolnir/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]0"
+
+/obj/item/mjolnir/proc/shock(mob/living/target)
target.Stun(60)
var/datum/effect_system/lightning_spread/s = new /datum/effect_system/lightning_spread
s.set_up(5, 1, target.loc)
@@ -98,13 +119,13 @@
target.throw_at(throw_target, 200, 4)
return
-/obj/item/twohanded/mjollnir/attack(mob/living/M, mob/user)
+/obj/item/mjolnir/attack(mob/living/M, mob/user)
..()
- if(wielded)
- playsound(src.loc, "sparks", 50, 1)
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ playsound(loc, "sparks", 50, 1)
shock(M)
-/obj/item/twohanded/mjollnir/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+/obj/item/mjolnir/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(isliving(hit_atom))
var/mob/M = hit_atom
@@ -114,11 +135,7 @@
M.visible_message(span_warning("[M]'s [A] glows brightly as it disrupts the Mjolnir's power!"))
visible_message(span_boldwarning("With a mighty thud, Mjolnir slams into the [src.loc], and its glow fades!
"))
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1, extrarange = 30)
- new /obj/structure/mjollnir(src.loc)
+ new /obj/structure/mjollnir(loc)
qdel(src)
else
shock(hit_atom)
-
-/obj/item/twohanded/mjollnir/update_icon_state() //Currently only here to fuck with the on-mob icons.
- . = ..()
- icon_state = "mjollnir[wielded]"
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 60f34da00965..3b81adcb57f1 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -473,7 +473,7 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
GLOBAL_LIST_INIT(metalhydrogen_recipes, list(
new /datum/stack_recipe("ancient armor", /obj/item/clothing/suit/armor/elder_atmosian, req_amount = 10, res_amount = 1),
new /datum/stack_recipe("ancient helmet", /obj/item/clothing/head/helmet/elder_atmosian, req_amount = 5, res_amount = 1),
- new /datum/stack_recipe("metallic hydrogen axe", /obj/item/twohanded/fireaxe/metal_h2_axe, req_amount = 15, res_amount = 1),
+ new /datum/stack_recipe("metallic hydrogen axe", /obj/item/fireaxe/metal_h2_axe, req_amount = 15, res_amount = 1),
))
/obj/item/stack/sheet/mineral/metal_hydrogen
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 51c111dd47dc..b5f27483c194 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -200,7 +200,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \
*/
GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
- new/datum/stack_recipe("baseball bat", /obj/item/twohanded/required/baseball_bat, 10, time = 15),\
+ new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 10, time = 15),\
new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \
@@ -312,7 +312,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
*/
GLOBAL_LIST_INIT(bamboo_recipes, list ( \
- new/datum/stack_recipe("bamboo spear", /obj/item/twohanded/bamboospear, 25, time = 90), \
+ new/datum/stack_recipe("bamboo spear", /obj/item/melee/spear/bamboospear, 25, time = 90), \
new/datum/stack_recipe("blow gun", /obj/item/gun/syringe/blowgun, 10, time = 70), \
new/datum/stack_recipe("crude syringe", /obj/item/reagent_containers/syringe/crude, 5, time = 10), \
new/datum/stack_recipe("punji sticks trap", /obj/structure/punji_sticks, 5, time = 30, one_per_turf = TRUE, on_floor = TRUE), \
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index f3a557001a7d..93c3afa29916 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -192,8 +192,8 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
B.name = name
B.icon_state = icon_state
B.item_state = item_state
- if(istype(A, /obj/item/twohanded/required/cult_bastard) && !iscultist(user))
- var/obj/item/twohanded/required/cult_bastard/sword = A
+ if(istype(A, /obj/item/melee/cult_bastard) && !iscultist(user))
+ var/obj/item/melee/cult_bastard/sword = A
to_chat(user, span_notice("You begin to exorcise [sword]."))
playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1)
if(do_after(user, 4 SECONDS, sword))
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 29e265aed96e..0f28e14632de 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -29,7 +29,7 @@
if("recon") //28ish TC
new /obj/item/clothing/glasses/thermal/xray(src) //Would argue 6 TC. Thermals are 4 TC but work on organic targets in darkness
new /obj/item/storage/briefcase/launchpad(src) //6 TC
- new /obj/item/twohanded/binoculars(src) //1 TC, maybe. Very good but mining medic/detective get them for free
+ new /obj/item/binoculars(src) //1 TC, maybe. Very good but mining medic/detective get them for free
new /obj/item/encryptionkey/syndicate(src) //2 TC
new /obj/item/storage/box/syndie_kit/space(src) //4 TC
new /obj/item/grenade/syndieminibomb/concussion/frag(src) //Minibomb with one less range on each part except for fire. 3-4 TC.
@@ -190,7 +190,7 @@
new /obj/item/storage/magspear_quiver(src)
new /obj/item/clothing/suit/space/hardsuit/carp(src) //1 carp
new /obj/item/clothing/mask/gas/carp(src) //1 carp?
- new /obj/item/twohanded/pitchfork/trident(src)
+ new /obj/item/pitchfork/trident(src)
new /obj/item/grenade/clusterbuster/syndie/spawner_spesscarp(src) //when you need A LOT of carps, you'll get at least (but most likely more) 30 carps with that
new /obj/item/grenade/spawnergrenade/spesscarp(src) //for precise and quick delivery of carps, 5 carps per grenade for a total of 20 carps
new /obj/item/grenade/spawnergrenade/spesscarp(src)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 0bb57cb68396..0bf579c41817 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -289,7 +289,7 @@
return
else
to_chat(user, span_notice("You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool."))
- var/obj/item/twohanded/dualsaber/toy/newSaber = new /obj/item/twohanded/dualsaber/toy(user.loc)
+ var/obj/item/melee/dualsaber/toy/newSaber = new /obj/item/melee/dualsaber/toy(user.loc)
if(hacked) // That's right, we'll only check the "original" "sword".
newSaber.hacked = TRUE
newSaber.saber_color = "rainbow"
@@ -369,7 +369,7 @@
/*
* Subtype of Double-Bladed Energy Swords
*/
-/obj/item/twohanded/dualsaber/toy
+/obj/item/melee/dualsaber/toy
name = "double-bladed toy sword"
desc = "A cheap, plastic replica of TWO energy swords. Double the fun!"
force = 0
@@ -379,45 +379,43 @@
throw_range = 5
attack_verb = list("attacked", "struck", "hit")
-/obj/item/twohanded/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+/obj/item/melee/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
return 0
-/obj/item/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles
+/obj/item/melee/dualsaber/toy/IsReflect() //Stops Toy Dualsabers from reflecting energy projectiles
return 0
/*
* Subtype of Vxtvul Hammer
*/
-/obj/item/twohanded/vxtvulhammer/toy
+/obj/item/melee/vxtvulhammer/toy
name = "toy sledgehammer"
desc = "A Donksoft motorized hammer with realistic flashing lights and speakers."
- force = 0
- force_wielded = 0 // after recreating the dozen procs this thing has I decided it should be a subtype
+ base_icon_state = "vxtvul_hammer"
throwforce = 0
resistance_flags = NONE
armour_penetration = 0
block_chance = 0
w_class = WEIGHT_CLASS_NORMAL
toy = TRUE
+
+ force = 0
+ force_wielded = 0
+
var/pirated = FALSE // knockoff brand!
-/obj/item/twohanded/vxtvulhammer/toy/Initialize(mapload)
+/obj/item/melee/vxtvulhammer/toy/Initialize(mapload)
. = ..()
if(pirated || prob(10)) // man i got scammed!
pirated = TRUE
name = "toy pirate sledgehammer"
desc += " This one looks different from the ones you see on commercials..."
- icon_state = "vxtvul_hammer_pirate0-0"
+ base_icon_state = "vxtvul_hammer_pirate"
+ icon_state = "[base_icon_state]0-0"
update_appearance(UPDATE_ICON)
-/obj/item/twohanded/vxtvulhammer/toy/update_icon_state()
- . = ..()
- if(!pirated)
- icon_state = "vxtvul_hammer_pirate[wielded]-[supercharged]"
- else
- icon_state = "vxtvul_hammer[wielded]-[supercharged]"
-
-/obj/item/twohanded/vxtvulhammer/toy/pirate
+/obj/item/melee/vxtvulhammer/toy/pirate
+ base_icon_state = "vxtvul_hammer_pirate"
pirated = TRUE
/obj/item/toy/katana
diff --git a/code/game/objects/items/two_handed/baseball_bat.dm b/code/game/objects/items/two_handed/baseball_bat.dm
new file mode 100644
index 000000000000..2f6dbb3153c1
--- /dev/null
+++ b/code/game/objects/items/two_handed/baseball_bat.dm
@@ -0,0 +1,80 @@
+/obj/item/melee/baseball_bat
+ name = "baseball bat"
+ desc = "A traditional tool for a game of Baseball. Modern wood isn't very strong, try not to crack the bat!"
+ icon = 'icons/obj/weapons/misc.dmi'
+ icon_state = "baseball_bat"
+ item_state = "baseball_bat"
+ lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
+ force = 16
+ wound_bonus = 5
+ armour_penetration = -30
+ bare_wound_bonus = 40
+ throwforce = 0
+ attack_verb = list("beat", "smacked")
+ sharpness = SHARP_NONE
+ w_class = WEIGHT_CLASS_HUGE
+ var/homerun_ready = FALSE
+ var/homerun_able = FALSE
+ var/flimsy = TRUE //spesswood? only used for knockback check now
+
+/obj/item/melee/baseball_bat/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, require_twohands = TRUE)
+
+/obj/item/melee/baseball_bat/homerun
+ name = "home run bat"
+ desc = "This thing looks dangerous... Dangerously good at baseball, that is."
+ homerun_able = TRUE
+
+/obj/item/melee/baseball_bat/attack_self(mob/user)
+ if(!homerun_able)
+ ..()
+ return
+ if(homerun_ready)
+ to_chat(user, span_notice("You're already ready to do a home run!"))
+ return
+ to_chat(user, span_warning("You begin gathering strength..."))
+ playsound(get_turf(src), 'sound/magic/lightning_chargeup.ogg', 65, 1)
+ if(do_after(user, 9 SECONDS, src))
+ to_chat(user, span_userdanger("You gather power! Time for a home run!"))
+ homerun_ready = 1
+ return ..()
+
+/obj/item/melee/baseball_bat/attack(mob/living/target, mob/living/user)
+ . = ..()
+ var/atom/throw_target = get_edge_target_turf(target, user.dir)
+ if(target == user)
+ return
+ if(homerun_ready)
+ user.visible_message(span_userdanger("It's a home run!"))
+ target.throw_at(throw_target, rand(8,10), 14, user)
+ SSexplosions.medturf += throw_target
+ playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, 1)
+ homerun_ready = 0
+ return
+ else if(!flimsy && !target.anchored)
+ var/whack_speed = (prob(50) ? 1 : 6)
+ target.throw_at(throw_target, rand(1, 2), whack_speed, user) // sorry friends, 7 speed batting caused wounds to absolutely delete whoever you knocked your target into (and said target)
+
+/obj/item/melee/baseball_bat/metal_bat
+ name = "titanium baseball bat"
+ desc = "This bat is made of titanium, it feels light yet strong."
+ icon_state = "baseball_bat_metal"
+ item_state = "baseball_bat_metal"
+ hitsound = 'yogstation/sound/weapons/bat_hit.ogg'
+ force = 18
+ throwforce = 0
+ wound_bonus = 15
+ armour_penetration = -25
+ bare_wound_bonus = 50
+ w_class = WEIGHT_CLASS_HUGE
+ flimsy = FALSE
+
+/obj/item/melee/baseball_bat/metal_bat/attack(mob/living/target, mob/living/user)
+ . = ..()
+ if(user.zone_selected == BODY_ZONE_HEAD && get_location_accessible(target, BODY_ZONE_HEAD))
+ if(prob(30))
+ target.Paralyze(40)
+ else
+ return TRUE
diff --git a/code/game/objects/items/two_handed/broom.dm b/code/game/objects/items/two_handed/broom.dm
new file mode 100644
index 000000000000..929c0759e5a9
--- /dev/null
+++ b/code/game/objects/items/two_handed/broom.dm
@@ -0,0 +1,79 @@
+#define BROOM_PUSH_LIMIT 20
+
+/obj/item/broom
+ name = "broom"
+ desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move."
+ icon = 'icons/obj/janitor.dmi'
+ icon_state = "broom0"
+ base_icon_state = "broom"
+ lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+ force = 8
+ throwforce = 10
+ throw_speed = 3
+ throw_range = 7
+ w_class = WEIGHT_CLASS_BULKY
+ attack_verb = list("swept", "brushed off", "bludgeoned", "whacked")
+ resistance_flags = FLAMMABLE
+
+/obj/item/broom/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 8, \
+ force_wielded = 4, \
+ icon_wielded = "[base_icon_state]1", \
+ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \
+ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \
+ )
+
+/obj/item/broom/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]0"
+
+/obj/item/broom/proc/on_wield(atom/source, mob/user)
+ to_chat(user, span_notice("You brace the [src] against the ground in a firm sweeping stance."))
+ RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(sweep))
+
+/obj/item/broom/proc/on_unwield(atom/source, mob/user)
+ UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE)
+
+/obj/item/broom/afterattack(atom/A, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ sweep(user, A)
+
+/obj/item/broom/proc/sweep(mob/user, atom/A)
+
+ var/turf/current_item_loc = isturf(A) ? A : get_turf(A)
+ if (!isturf(current_item_loc))
+ return
+ var/turf/new_item_loc = get_step(current_item_loc, user.dir)
+ var/obj/machinery/disposal/bin/target_bin = locate(/obj/machinery/disposal/bin) in new_item_loc.contents
+ var/i = 1
+ for (var/obj/item/garbage in current_item_loc.contents)
+ if (!garbage.anchored)
+ if (target_bin)
+ garbage.forceMove(target_bin)
+ else
+ garbage.Move(new_item_loc, user.dir)
+ i++
+ if (i > BROOM_PUSH_LIMIT)
+ break
+ if (i > 1)
+ if (target_bin)
+ target_bin.update_appearance(UPDATE_ICON)
+ to_chat(user, span_notice("You sweep the pile of garbage into [target_bin]."))
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1)
+
+/obj/item/broom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta
+ J.put_in_cart(src, user)
+ J.mybroom=src
+ J.update_appearance(UPDATE_ICON)
+
+/obj/item/broom/cyborg
+ name = "robotic push broom"
+
+/obj/item/broom/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
+ to_chat(user, span_notice("You cannot place your [src] into the [J]"))
+ return FALSE
diff --git a/code/game/objects/items/two_handed/chainsaw.dm b/code/game/objects/items/two_handed/chainsaw.dm
new file mode 100644
index 000000000000..38e447b0d432
--- /dev/null
+++ b/code/game/objects/items/two_handed/chainsaw.dm
@@ -0,0 +1,85 @@
+/datum/action/item_action/startchainsaw
+ name = "Pull The Starting Cord"
+
+/obj/item/melee/chainsaw
+ name = "chainsaw"
+ desc = "A versatile power tool. Useful for limbing trees and delimbing humans."
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "chainsaw_off"
+ lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
+ flags_1 = CONDUCT_1
+ force = 13
+ w_class = WEIGHT_CLASS_HUGE
+ throwforce = 13
+ throw_speed = 2
+ throw_range = 4
+ materials = list(/datum/material/iron=13000)
+ attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
+ hitsound = "swing_hit"
+ sharpness = SHARP_EDGED
+ actions_types = list(/datum/action/item_action/startchainsaw)
+ var/on = FALSE
+ var/force_on = 24
+ var/icon_name = "chainsaw"
+
+/obj/item/melee/chainsaw/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, require_twohands = TRUE)
+ AddComponent(/datum/component/butchering, 30, 100, 0, 'sound/weapons/chainsawhit.ogg', TRUE)
+
+/obj/item/melee/chainsaw/suicide_act(mob/living/carbon/user)
+ if(on)
+ user.visible_message(span_suicide("[user] begins to tear [user.p_their()] head off with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
+ playsound(src, 'sound/weapons/chainsawhit.ogg', 100, 1)
+ var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)
+ if(myhead)
+ myhead.dismember()
+ else
+ user.visible_message(span_suicide("[user] smashes [src] into [user.p_their()] neck, destroying [user.p_their()] esophagus! It looks like [user.p_theyre()] trying to commit suicide!"))
+ playsound(src, 'sound/weapons/genhit1.ogg', 100, 1)
+ return(BRUTELOSS)
+
+/obj/item/melee/chainsaw/attack_self(mob/user)
+ on = !on
+ to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]")
+ force = on ? force_on : initial(force)
+ throwforce = on ? force_on : initial(force)
+ icon_state = "[icon_name]_[on ? "on" : "off"]"
+ var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
+ butchering.butchering_enabled = on
+
+ if(on)
+ hitsound = 'sound/weapons/chainsawhit.ogg'
+ else
+ hitsound = "swing_hit"
+
+ if(src == user.get_active_held_item()) //update inhands
+ user.update_inv_hands()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.build_all_button_icons()
+
+/obj/item/melee/chainsaw/doomslayer
+ name = "THE GREAT COMMUNICATOR"
+ desc = span_warning("VRRRRRRR!!!")
+ armour_penetration = 100
+ force_on = 30
+
+/obj/item/melee/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(attack_type == PROJECTILE_ATTACK)
+ owner.visible_message(span_danger("Ranged attacks just make [owner] angrier!"))
+ playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
+ return 1
+ return 0
+
+/obj/item/melee/chainsaw/demon
+ name = "demon chainsaw"
+ desc = "Show me your dreams."
+ icon_state = "demon_off"
+ force_on = 30
+ icon_name = "demon"
+
+/obj/item/melee/chainsaw/demon/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/lifesteal, 30)
diff --git a/code/game/objects/items/two_handed/dualsaber.dm b/code/game/objects/items/two_handed/dualsaber.dm
new file mode 100644
index 000000000000..d4e0f6960e1f
--- /dev/null
+++ b/code/game/objects/items/two_handed/dualsaber.dm
@@ -0,0 +1,211 @@
+/*
+ * Double-Bladed Energy Swords - Cheridan
+ */
+/obj/item/melee/dualsaber
+ icon = 'icons/obj/weapons/energy.dmi'
+ icon_state = "dualsaber0"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ name = "double-bladed energy sword"
+ desc = "A more powerful version on the energy sword, it is more capable of blocking energy projectiles than its single bladed counterpart. 'At last we will have revenge' is carved on the side of the handle."
+ force = 3
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 5
+ w_class = WEIGHT_CLASS_SMALL
+ hitsound = "swing_hit"
+ armour_penetration = 35
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ block_chance = 75
+ max_integrity = 200
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70)
+ resistance_flags = FIRE_PROOF
+ light_system = MOVABLE_LIGHT
+ light_range = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
+ light_color = "#00ff00" //green
+ light_on = FALSE
+ wound_bonus = -10
+ bare_wound_bonus = 20
+ var/force_wielded = 31
+ var/w_class_on = WEIGHT_CLASS_BULKY
+ var/saber_color = "green"
+ var/hacked = FALSE
+ var/list/possible_colors = list("red", "blue", "green", "purple")
+
+/obj/item/melee/dualsaber/Initialize(mapload)
+ . = ..()
+ if(LAZYLEN(possible_colors))
+ saber_color = pick(possible_colors)
+ var/new_color
+ switch(saber_color)
+ if("red")
+ new_color = LIGHT_COLOR_RED
+ if("green")
+ new_color = LIGHT_COLOR_GREEN
+ if("blue")
+ new_color = LIGHT_COLOR_LIGHT_CYAN
+ if("purple")
+ new_color = LIGHT_COLOR_LAVENDER
+ set_light_color(new_color)
+
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 3, \
+ force_wielded = force_wielded, \
+ icon_wielded = "[base_icon_state][saber_color]1", \
+ wieldsound = 'sound/weapons/saberon.ogg', \
+ unwieldsound = 'sound/weapons/saberoff.ogg', \
+ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \
+ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \
+ )
+
+/obj/item/melee/dualsaber/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/melee/dualsaber/suicide_act(mob/living/carbon/user)
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ user.visible_message(span_suicide("[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!"))
+
+ var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code
+ var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
+ B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea
+ var/randdir
+ for(var/i in 1 to 24)//like a headless chicken!
+ if(user.is_holding(src))
+ randdir = pick(GLOB.alldirs)
+ user.Move(get_step(user, randdir),randdir)
+ user.emote("spin")
+ if (i == 3 && myhead)
+ myhead.drop_limb()
+ sleep(0.3 SECONDS)
+ else
+ user.visible_message(span_suicide("[user] panics and starts choking to death!"))
+ return OXYLOSS
+
+ else
+ user.visible_message(span_suicide("[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!"))
+ return BRUTELOSS
+
+/obj/item/melee/dualsaber/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]0"
+ SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_TYPE_BLOOD)
+
+/obj/item/melee/dualsaber/attack(mob/target, mob/living/carbon/human/user)
+ if(user.has_dna())
+ if(user.dna.check_mutation(HULK) || user.dna.check_mutation(ACTIVE_HULK))
+ to_chat(user, span_warning("You grip the blade too hard and accidentally close it!"))
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ user.dropItemToGround(src, force=TRUE)
+ return
+ ..()
+ if(HAS_TRAIT(user, TRAIT_CLUMSY) && (HAS_TRAIT(src, TRAIT_WIELDED)) && prob(40))
+ impale(user)
+ return
+ if(HAS_TRAIT(src, TRAIT_WIELDED) && prob(50))
+ INVOKE_ASYNC(src, PROC_REF(jedi_spin), user)
+
+/obj/item/melee/dualsaber/proc/jedi_spin(mob/living/user)
+ for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
+ user.setDir(i)
+ if(i == WEST)
+ user.emote("flip")
+ sleep(0.1 SECONDS)
+
+/obj/item/melee/dualsaber/proc/impale(mob/living/user)
+ to_chat(user, span_warning("You twirl around a bit before losing your balance and impaling yourself on [src]."))
+ if (force_wielded)
+ user.take_bodypart_damage(20,25,check_armor = TRUE)
+ else
+ user.adjustStaminaLoss(25)
+
+/obj/item/melee/dualsaber/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ return ..()
+ return 0
+
+/obj/item/melee/dualsaber/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ to_chat(user, span_warning("You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!"))
+ return 1
+
+/obj/item/melee/dualsaber/process()
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ if(hacked)
+ light_color = pick(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)
+ open_flame()
+ else
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/melee/dualsaber/IsReflect()
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ return TRUE
+
+/obj/item/melee/dualsaber/ignition_effect(atom/A, mob/user)
+ // same as /obj/item/melee/transforming/energy, mostly
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
+ return ""
+ var/in_mouth = ""
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(C.wear_mask)
+ in_mouth = ", barely missing [user.p_their()] nose"
+ . = span_warning("[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process.")
+ playsound(loc, hitsound, get_clamped_volume(), 1, -1)
+ add_fingerprint(user)
+ // Light your candles while spinning around the room
+ INVOKE_ASYNC(src, PROC_REF(jedi_spin), user)
+
+/obj/item/melee/dualsaber/green
+ possible_colors = list("green")
+
+/obj/item/melee/dualsaber/red
+ possible_colors = list("red")
+
+/obj/item/melee/dualsaber/blue
+ possible_colors = list("blue")
+
+/obj/item/melee/dualsaber/purple
+ possible_colors = list("purple")
+
+/obj/item/melee/dualsaber/attackby(obj/item/W, mob/user, params)
+ if(W.tool_behaviour == TOOL_MULTITOOL)
+ if(!hacked)
+ hacked = TRUE
+ to_chat(user, span_warning("2XRNBW_ENGAGE"))
+ saber_color = "rainbow"
+ update_appearance(UPDATE_ICON)
+ else
+ to_chat(user, span_warning("It's starting to look like a triple rainbow - no, nevermind."))
+ return
+ return ..()
+
+/obj/item/melee/dualsaber/proc/on_wield(atom/source, mob/living/carbon/M)
+ if(!M.has_dna())
+ return
+ if(M.dna.check_mutation(HULK) || M.dna.check_mutation(ACTIVE_HULK))
+ to_chat(M, span_warning("You lack the grace to wield this!"))
+ return
+ sharpness = SHARP_EDGED
+ w_class = w_class_on
+ hitsound = 'sound/weapons/blade1.ogg'
+ START_PROCESSING(SSobj, src)
+ set_light_on(TRUE)
+
+/obj/item/melee/dualsaber/proc/on_unwield(atom/source, mob/living/user)
+ sharpness = initial(sharpness)
+ w_class = initial(w_class)
+ hitsound = initial(hitsound)
+ STOP_PROCESSING(SSobj, src)
+ set_light_on(FALSE)
+
+/obj/item/melee/dualsaber/makeshift
+ name = "makeshift double-bladed energy sword"
+ desc = "Two energy swords taped crudely together. 'at last we finally get some revenge' is scribbled on the side with crayon."
+
+ force_wielded = 27 //total of 30 to be equal to an esword, it's literally just two duct taped together
+
+/obj/item/melee/dualsaber/makeshift/IsReflect()//only 50% chance to reflect, so it still has the cool effect, but not 100% chance
+ if(prob(50))
+ return ..()
+ return FALSE
diff --git a/code/game/objects/items/two_handed/fireaxe.dm b/code/game/objects/items/two_handed/fireaxe.dm
new file mode 100644
index 000000000000..d61023b7b344
--- /dev/null
+++ b/code/game/objects/items/two_handed/fireaxe.dm
@@ -0,0 +1,164 @@
+/obj/item/fireaxe
+ icon = 'icons/obj/tools.dmi'
+ icon_state = "fireaxe0"
+ base_icon_state = "fireaxe"
+ lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi'
+ name = "fire axe"
+ desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
+ force = 5
+ throwforce = 15
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut", "axed")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = SHARP_EDGED
+ max_integrity = 200
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
+ resistance_flags = FIRE_PROOF
+ wound_bonus = -15
+ bare_wound_bonus = 20
+
+ /// How much damage to do wielded
+ var/force_wielded = 24
+
+/obj/item/fireaxe/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force, \
+ force_wielded = force_wielded, \
+ icon_wielded = "[base_icon_state]1", \
+ )
+ AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools
+
+/obj/item/fireaxe/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]0"
+
+/obj/item/fireaxe/suicide_act(mob/user)
+ user.visible_message(span_suicide("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!"))
+ return (BRUTELOSS)
+
+/obj/item/fireaxe/afterattack(atom/A, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ if(HAS_TRAIT(src, TRAIT_WIELDED)) //destroys shit faster, generally in 1-2 hits.
+ if(istype(A, /obj/structure/window))
+ var/obj/structure/window/W = A
+ W.take_damage(W.max_integrity*2, BRUTE, MELEE, FALSE, null, armour_penetration)
+ else if(istype(A, /obj/structure/grille))
+ var/obj/structure/grille/G = A
+ G.take_damage(G.max_integrity*2, BRUTE, MELEE, FALSE, null, armour_penetration)
+ else if(istype(A, /obj/machinery/door)) //Nines hits for reinforced airlock, seven for normal
+ var/obj/machinery/door/D = A
+ D.take_damage((force+25), BRUTE, MELEE, FALSE, null, armour_penetration)
+ else if(istype(A, /obj/structure/door_assembly)) //Two hits for frames left behind
+ var/obj/machinery/door/D = A
+ D.take_damage((force+25), BRUTE, MELEE, FALSE, null, armour_penetration)
+
+/*
+ * Metal Hydrogen Axe
+ */
+/obj/item/fireaxe/metal_h2_axe // Blatant imitation of the fireaxe, but made out of metallic hydrogen
+ icon_state = "metalh2_axe0"
+ base_icon_state = "metalh2_axe"
+ name = "metallic hydrogen axe"
+ desc = "A large, menacing axe made of an unknown substance that the most elder atmosians call Metallic Hydrogen. Truly an otherworldly weapon."
+ force_wielded = 18
+
+/*
+ * Bone Axe
+ */
+/obj/item/fireaxe/boneaxe
+ icon_state = "bone_axe0"
+ base_icon_state = "bone_axe"
+ name = "bone axe"
+ desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters."
+ force_wielded = 18
+
+/*
+ * Energy Fire Axe
+ */
+/obj/item/fireaxe/energy
+ name = "energy fire axe"
+ desc = "A massive, two handed, energy-based hardlight axe capable of cutting through solid metal. 'Glory to atmosia' is carved on the side of the handle."
+ icon = 'icons/obj/weapons/energy.dmi'
+ icon_state = "energy-fireaxe0"
+ base_icon_state = "energy-fireaxe"
+ armour_penetration = 50 // Probably doesn't care much for armor given how it can destroy solid metal structures
+ block_chance = 50 // Big handle and large flat energy blade, good for blocking things
+ heat = 1800 // It's a FIRE axe
+ w_class = WEIGHT_CLASS_NORMAL
+ hitsound = "swing_hit"
+ light_system = MOVABLE_LIGHT
+ light_range = 6 //This is NOT a stealthy weapon
+ light_color = "#ff4800" //red-orange
+ light_on = FALSE
+ sharpness = SHARP_NONE
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+ force_wielded = 25
+
+ var/w_class_on = WEIGHT_CLASS_BULKY
+
+/obj/item/fireaxe/energy/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force, \
+ force_wielded = force_wielded, \
+ icon_wielded = "[base_icon_state]1", \
+ wieldsound = 'sound/weapons/saberon.ogg', \
+ unwieldsound = 'sound/weapons/saberoff.ogg', \
+ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \
+ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \
+ )
+
+/obj/item/fireaxe/energy/proc/on_wield(obj/item/source, mob/living/carbon/user)
+ w_class = w_class_on
+ sharpness = SHARP_EDGED
+ hitsound = 'sound/weapons/blade1.ogg'
+ START_PROCESSING(SSobj, src)
+ set_light_on(TRUE)
+
+/obj/item/fireaxe/energy/proc/on_unwield(obj/item/source, mob/living/carbon/user)
+ w_class = initial(w_class)
+ sharpness = initial(sharpness)
+ hitsound = "swing_hit"
+ STOP_PROCESSING(SSobj, src)
+ set_light_on(FALSE)
+
+/obj/item/fireaxe/energy/attack(mob/living/M, mob/living/user)
+ ..()
+ M.ignite_mob() // Ignites you if you're flammable
+
+/obj/item/fireaxe/energy/afterattack(atom/A, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ if(HAS_TRAIT(src, TRAIT_WIELDED)) // Does x2 damage against inanimate objects like machines, structures, mechs, etc
+ if(isobj(A) && !isitem(A))
+ var/obj/O = A
+ O.take_damage(force, BRUTE, MELEE, FALSE, null, armour_penetration)
+
+/obj/item/fireaxe/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
+ return 0 // large energy blade can only block stuff if it's actually on
+ return ..()
+
+/obj/item/fireaxe/energy/ignition_effect(atom/A, mob/user)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
+ return "[user] tries to light [A] with [src] while it's off. Nothing happens."
+ playsound(loc, hitsound, get_clamped_volume(), 1, -1)
+ return "[user] casually raises [src] up to [user.p_their()] face and lights [A]. Hot damn."
+
+/obj/item/fireaxe/energy/is_hot()
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
+ return FALSE // Shouldn't be able to ignite stuff if it's off
+ return ..()
+
+/obj/item/fireaxe/energy/process()
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
+ STOP_PROCESSING(SSobj, src)
+ return PROCESS_KILL
+ open_flame(heat)
diff --git a/code/game/objects/items/two_handed/highfrequencyblade.dm b/code/game/objects/items/two_handed/highfrequencyblade.dm
new file mode 100644
index 000000000000..5684a084ba55
--- /dev/null
+++ b/code/game/objects/items/two_handed/highfrequencyblade.dm
@@ -0,0 +1,58 @@
+/obj/item/vibro_weapon
+ icon = 'icons/obj/weapons/swords.dmi'
+ icon_state = "hfrequency0"
+ base_icon_state = "hfrequency"
+ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
+ name = "vibro sword"
+ desc = "A potent weapon capable of cutting through nearly anything. Wielding it in two hands will allow you to deflect gunfire."
+ force = 20
+ armour_penetration = 100
+ block_chance = 40
+ throwforce = 20
+ throw_speed = 4
+ sharpness = SHARP_EDGED
+ attack_verb = list("cut", "sliced", "diced")
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+/obj/item/vibro_weapon/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force, \
+ force_wielded = 20, \
+ icon_wielded = "[base_icon_state]1", \
+ )
+ AddComponent(/datum/component/butchering, 20, 105)
+
+/obj/item/vibro_weapon/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]0"
+
+/obj/item/vibro_weapon/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ final_block_chance *= 2
+ if(HAS_TRAIT(src, TRAIT_WIELDED) || attack_type != PROJECTILE_ATTACK)
+ if(prob(final_block_chance))
+ if(attack_type == PROJECTILE_ATTACK)
+ owner.visible_message(span_danger("[owner] deflects [attack_text] with [src]!"))
+ playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
+ return TRUE
+ else
+ owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!"))
+ return TRUE
+ return FALSE
+
+/obj/item/vibro_weapon/wizard
+ desc = "A blade that was mastercrafted by a legendary blacksmith. Its' enchantments let it slash through anything."
+ force = 8
+ throwforce = 20
+ wound_bonus = 20
+ bare_wound_bonus = 25
+
+/obj/item/vibro_weapon/wizard/attack_self(mob/user, modifiers)
+ if(!iswizard(user))
+ balloon_alert(user, "you're too weak!")
+ return
+ return ..()
diff --git a/code/game/objects/items/two_handed/pitchfork.dm b/code/game/objects/items/two_handed/pitchfork.dm
new file mode 100644
index 000000000000..7deaed424be8
--- /dev/null
+++ b/code/game/objects/items/two_handed/pitchfork.dm
@@ -0,0 +1,95 @@
+/obj/item/pitchfork
+ icon = 'icons/obj/weapons/spears.dmi'
+ icon_state = "pitchfork0"
+ base_icon_state = "pitchfork"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+ name = "pitchfork"
+ desc = "A simple tool used for moving hay."
+ force = 7
+ throwforce = 15
+ w_class = WEIGHT_CLASS_BULKY
+ attack_verb = list("attacked", "impaled", "pierced")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ sharpness = SHARP_POINTY
+ max_integrity = 200
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
+ resistance_flags = FIRE_PROOF
+
+ ///How much damage the pitchfork will do while wielded.
+ var/force_wielded = 8
+
+/obj/item/pitchfork/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force, \
+ force_wielded = force_wielded, \
+ icon_wielded = "[base_icon_state]1", \
+ )
+
+/obj/item/pitchfork/trident
+ icon_state = "trident"
+ name = "trident"
+ desc = "A trident recovered from the ruins of atlantis"
+ slot_flags = ITEM_SLOT_BELT
+ force = 14
+ throwforce = 23
+
+ force_wielded = 6
+
+/obj/item/pitchfork/demonic
+ name = "demonic pitchfork"
+ desc = "A red pitchfork, it looks like the work of the devil."
+ force = 19
+ throwforce = 24
+ light_system = MOVABLE_LIGHT
+ light_range = 3
+ light_power = 6
+ light_color = LIGHT_COLOR_RED
+
+ force_wielded = 6
+
+/obj/item/pitchfork/demonic/greater
+ force = 24
+ throwforce = 50
+
+ force_wielded = 10
+
+/obj/item/pitchfork/demonic/ascended
+ force = 100
+ throwforce = 100
+
+ force_wielded = 500000 // Kills you DEAD.
+
+/obj/item/pitchfork/suicide_act(mob/user)
+ user.visible_message(span_suicide("[user] impales [user.p_them()]self in [user.p_their()] abdomen with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
+ return (BRUTELOSS)
+
+/obj/item/pitchfork/demonic/pickup(mob/living/user)
+ . = ..()
+ if(isliving(user) && user.mind && user.owns_soul() && !is_devil(user))
+ var/mob/living/U = user
+ U.visible_message(span_warning("As [U] picks [src] up, [U]'s arms briefly catch fire."), \
+ span_warning("\"As you pick up [src] your arms ignite, reminding you of all your past sins.\""))
+ if(ishuman(U))
+ var/mob/living/carbon/human/H = U
+ H.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ else
+ U.adjustFireLoss(rand(force/2,force))
+
+/obj/item/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user)
+ if(user.mind && user.owns_soul() && !is_devil(user))
+ to_chat(user, "[src] burns in your hands.")
+ user.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ return ..()
+
+/obj/item/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity)
+ . = ..()
+ if(!proximity || !HAS_TRAIT(src, TRAIT_WIELDED))
+ return
+ if(iswallturf(target))
+ var/turf/closed/wall/W = target
+ user.visible_message(span_danger("[user] blasts \the [target] with \the [src]!"))
+ playsound(target, 'sound/magic/disintegrate.ogg', 100, 1)
+ W.break_wall()
+ W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
diff --git a/code/game/objects/items/two_handed/spears.dm b/code/game/objects/items/two_handed/spears.dm
new file mode 100644
index 000000000000..1133aa0ee564
--- /dev/null
+++ b/code/game/objects/items/two_handed/spears.dm
@@ -0,0 +1,246 @@
+//spears
+/obj/item/melee/spear
+ icon = 'icons/obj/weapons/spears.dmi'
+ icon_state = "spearglass0"
+ base_icon_state = "spearglass"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+ name = "spear"
+ desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
+ force = 10
+ max_integrity = 100
+ weapon_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 1, DAMAGE_LOW = 2, DAMAGE_HIGH = 5)
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ throwforce = 20
+ throw_speed = 4
+ embedding = list("embedded_impact_pain_multiplier" = 3)
+ armour_penetration = 10
+ materials = list(/datum/material/iron=1150, /datum/material/glass=2075)
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
+ sharpness = SHARP_EDGED
+ max_integrity = 200
+ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
+ break_message = "%SRC's cable binding suddenly snaps"
+ wound_bonus = -15
+ bare_wound_bonus = 15
+
+ ///How much damage to deal when wielded.
+ var/force_wielded = 8
+ ///Whether the spear can have an explosive attached to it.
+ var/can_be_explosive = TRUE
+
+/obj/item/melee/spear/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force, \
+ force_wielded = force_wielded, \
+ icon_wielded = "[base_icon_state]1", \
+ wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0.4, ENCUMBRANCE_TIME = 5, REACH = 2, DAMAGE_LOW = 2, DAMAGE_HIGH = 5), \
+ )
+ AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad.
+
+/obj/item/melee/spear/suicide_act(mob/living/carbon/user)
+ user.visible_message(span_suicide("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
+ return BRUTELOSS
+
+/obj/item/melee/spear/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/jousting)
+
+/obj/item/melee/spear/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state]0"
+
+/obj/item/melee/spear/deconstruct() //we drop our rod and maybe the glass shard used
+ new /obj/item/stack/rods(get_turf(src))
+ if(!prob(20)) //20% chance to save our spearhead
+ break_message += " and its head smashes into pieces!"
+ return ..()
+ var/spearhead = base_icon_state == "spear_plasma" ? /obj/item/shard/plasma : /obj/item/shard //be honest we have this stored //we do NOT have this stored
+ new spearhead(get_turf(src))
+ break_message += "!"
+ ..()
+
+/obj/item/melee/spear/CheckParts(list/parts_list)
+ var/obj/item/shard/tip = locate() in parts_list
+ if (istype(tip, /obj/item/shard/plasma))
+ force_wielded += 1
+ force += 1
+ throwforce += 1
+ righthand_file = 'yogstation/icons/mob/inhands/weapons/polearms_righthand.dmi' //yogs
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi' //yogs
+ base_icon_state = "spearplasma"
+ update_appearance(UPDATE_ICON)
+ qdel(tip)
+ var/obj/item/grenade/G = locate() in parts_list
+ if(G && can_be_explosive)
+ var/obj/item/melee/spear/explosive/lance = new /obj/item/melee/spear/explosive(src.loc, G)
+ lance.force_wielded = force_wielded
+ lance.force = force
+ lance.throwforce = throwforce
+ lance.base_icon_state = base_icon_state
+ parts_list -= G
+ qdel(src)
+ ..()
+
+
+/obj/item/melee/spear/explosive
+ name = "explosive lance"
+ base_icon_state = "spearbomb"
+
+ ///The grenade attached to the explosive spear.
+ var/obj/item/grenade/explosive
+ ///The war cry, editable by the player, that gets yelled when attacking.
+ var/war_cry = "AAAAARGH!!!"
+
+/obj/item/melee/spear/explosive/Initialize(mapload, obj/item/grenade/default_grenade)
+ . = ..()
+ if(!default_grenade)
+ default_grenade = new /obj/item/grenade/iedcasing() //For admin-spawned explosive lances
+ default_grenade.forceMove(src)
+ explosive = default_grenade
+ desc = "A makeshift spear with [default_grenade] attached to it"
+ update_appearance(UPDATE_ICON)
+
+/obj/item/melee/spear/explosive/suicide_act(mob/living/carbon/user)
+ user.visible_message(span_suicide("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
+ user.say("[war_cry]", forced = "spear warcry")
+ explosive.forceMove(user)
+ explosive.prime()
+ user.gib()
+ qdel(src)
+ return BRUTELOSS
+
+/obj/item/melee/spear/explosive/examine(mob/user)
+ . = ..()
+ . += span_notice("Alt-click to set your war cry.")
+
+/obj/item/melee/spear/explosive/AltClick(mob/user)
+ if(!user.canUseTopic(src, BE_CLOSE))
+ return
+ . = ..()
+ if(istype(user) && loc == user)
+ var/input = stripped_input(user,"What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50)
+ if(input)
+ war_cry = input
+
+/obj/item/melee/spear/explosive/afterattack(atom/movable/AM, mob/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
+ user.say("[war_cry]", forced = "spear warcry")
+ explosive.forceMove(AM)
+ explosive.prime()
+ qdel(src)
+
+/**
+ * Grey Tide
+ */
+/obj/item/melee/spear/grey_tide
+ icon_state = "spearglass0"
+ name = "\improper Grey Tide"
+ desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces."
+ force = 15
+ weapon_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 1, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
+ throwforce = 20
+ throw_speed = 4
+ attack_verb = list("gored")
+
+ force_wielded = 10
+
+/obj/item/melee/spear/grey_tide/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force, \
+ force_wielded = force_wielded, \
+ icon_wielded = "[base_icon_state]1", \
+ wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 2, DAMAGE_LOW = 0, DAMAGE_HIGH = 0), \
+ )
+
+/obj/item/melee/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity)
+ . = ..()
+ if(!proximity)
+ return
+ user.faction |= "greytide([REF(user)])"
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(istype (L, /mob/living/simple_animal/hostile/illusion))
+ return
+ if(!L.stat && prob(50))
+ var/mob/living/simple_animal/hostile/illusion/M = new(user.loc)
+ M.faction = user.faction.Copy()
+ M.Copy_Parent(user, 100, user.health/2.5, 12, 30)
+ M.GiveTarget(L)
+
+/*
+ * Bone Spear
+ */
+/obj/item/melee/spear/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification.
+ icon = 'icons/obj/weapons/spears.dmi'
+ icon_state = "bone_spear0"
+ base_icon_state = "bone_spear"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+ name = "bone spear"
+ desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology."
+ force = 11
+ max_integrity = 100
+ weapon_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 1, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ throwforce = 22
+ throw_speed = 4
+ embedding = list("embedded_impact_pain_multiplier" = 3)
+ armour_penetration = 15 //Enhanced armor piercing
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
+ sharpness = SHARP_EDGED
+
+ force_wielded = 9 //I have no idea how to balance
+ can_be_explosive = FALSE
+
+/obj/item/melee/spear/bonespear/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force, \
+ force_wielded = force_wielded, \
+ icon_wielded = "[base_icon_state]1", \
+ wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0.4, ENCUMBRANCE_TIME = 5, REACH = 2, DAMAGE_LOW = 0, DAMAGE_HIGH = 0), \
+ )
+
+/obj/item/melee/spear/bonespear/chitinspear //like a mix of a bone spear and bone axe, but more like a bone spear. And better.
+ icon = 'icons/obj/weapons/spears.dmi'
+ icon_state = "chitin_spear0"
+ base_icon_state = "chitin_spear"
+ name = "chitin spear"
+ desc = "A well constructed spear with a sharpened edge akin to a naginata, making it equally great for slicing and throwing."
+ force = 13
+ throwforce = 25
+ attack_verb = list("attacked", "poked", "jabbed", "torn", "gored", "sliced", "ripped", "cut")
+
+ force_wielded = 10
+
+/obj/item/melee/spear/bamboospear
+ icon = 'icons/obj/weapons/spears.dmi'
+ icon_state = "bamboo_spear0"
+ base_icon_state = "bamboo_spear"
+ lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+ name = "bamboo spear"
+ desc = "A haphazardly-constructed bamboo stick with a sharpened tip, ready to poke holes into unsuspecting people."
+ force = 10
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ throwforce = 22
+ throw_speed = 4
+ embedding = list("embedded_impact_pain_multiplier" = 2)
+ armour_penetration = 10
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
+ sharpness = SHARP_EDGED
+
+ force_wielded = 8
+ can_be_explosive = FALSE
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
deleted file mode 100644
index 9dad7e549220..000000000000
--- a/code/game/objects/items/twohanded.dm
+++ /dev/null
@@ -1,1484 +0,0 @@
-/* Two-handed Weapons
- * Contains:
- * Twohanded
- * Fireaxe
- * Double-Bladed Energy Swords
- * Spears
- * CHAINSAWS
- * Bone Axe and Spear
- * Vxtvul Hammer
- */
-
-/*##################################################################
-##################### TWO HANDED WEAPONS BE HERE~ -Agouri :3 ########
-####################################################################*/
-
-//Rewrote TwoHanded weapons stuff and put it all here. Just copypasta fireaxe to make new ones ~Carn
-//This rewrite means we don't have two variables for EVERY item which are used only by a few weapons.
-//It also tidies stuff up elsewhere.
-
-
-
-
-/*
- * Twohanded
- */
-/obj/item/twohanded
- /// Is the item currently wielded with two hands
- var/wielded = FALSE
- /// How much additonal force to give
- var/force_wielded = 0
- /// Sound made when you wield it
- var/wieldsound = null
- /// Sound made when you unwield it
- var/unwieldsound = null
- /// stat list for wielded/unwielded, switches with weapon_stats when wielding or unwielding
- var/list/wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 1, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
-
-/obj/item/twohanded/proc/unwield(mob/living/carbon/user, show_message = TRUE)
- if(!wielded || !user)
- return
- wielded = FALSE
- force -= force_wielded
- var/sf = findtext(name, " (Wielded)", -10)//10 == length(" (Wielded)")
- if(sf)
- name = copytext(name, 1, sf)
- else //something wrong
- name = "[initial(name)]"
- update_appearance(UPDATE_ICON)
- if(user.get_item_by_slot(ITEM_SLOT_BACK) == src)
- user.update_inv_back()
- else
- user.update_inv_hands()
- if(show_message)
- if(iscyborg(user))
- to_chat(user, span_notice("You free up your module."))
- else
- to_chat(user, span_notice("You are now carrying [src] with one hand."))
- if(unwieldsound)
- playsound(loc, unwieldsound, 50, 1)
- var/obj/item/twohanded/offhand/O = user.get_inactive_held_item()
- if(O && istype(O))
- O.unwield()
- var/list/stats = weapon_stats
- weapon_stats = wielded_stats
- wielded_stats = stats
- return
-
-/obj/item/twohanded/proc/wield(mob/living/carbon/user)
- if(wielded)
- return
- if(ismonkey(user))
- to_chat(user, span_warning("It's too heavy for you to wield fully."))
- return
- if(user.get_inactive_held_item())
- to_chat(user, span_warning("You need your other hand to be empty!"))
- return
- var/obj/item/twohanded/offhand/O = new(user) // Reserve other hand
- // Cyborgs are snowflakes hand wise
- if(iscyborg(user))
- user.put_in_inactive_hand(O)
- else
- if(!user.put_in_inactive_hand(O))
- to_chat(user, span_notice("You try to wield it... but it seems you're missing the matching arm.")) // should be better text but dunno what
- return
- wielded = TRUE
- if(force_wielded)
- force += force_wielded
- name = "[name] (Wielded)"
- update_appearance(UPDATE_ICON)
- if(iscyborg(user))
- to_chat(user, span_notice("You dedicate your module to [src]."))
- else
- to_chat(user, span_notice("You grab [src] with both hands."))
- if (wieldsound)
- playsound(loc, wieldsound, 50, 1)
- var/list/stats = weapon_stats
- weapon_stats = wielded_stats
- wielded_stats = stats
- O.name = "[name] - offhand"
- O.desc = "Your second grip on [src]."
- O.wielded = TRUE
- return
-
-/obj/item/twohanded/dropped(mob/user)
- . = ..()
- //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand
- if(!wielded)
- return
- unwield(user)
-
-/obj/item/twohanded/attack_self(mob/user)
- . = ..()
- if(wielded) //Trying to unwield it
- unwield(user)
- else //Trying to wield it
- wield(user)
-
-/obj/item/twohanded/equip_to_best_slot(mob/M)
- if(..())
- if(istype(src, /obj/item/twohanded/required))
- return // unwield forces twohanded-required items to be dropped.
- unwield(M)
- return
-
-/obj/item/twohanded/equipped(mob/user, slot)
- ..()
- if(!user.is_holding(src) && wielded && !istype(src, /obj/item/twohanded/required))
- unwield(user)
-
-///////////OFFHAND///////////////
-/obj/item/twohanded/offhand
- name = "offhand"
- icon_state = "offhand"
- w_class = WEIGHT_CLASS_HUGE
- item_flags = ABSTRACT
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
-
-/obj/item/twohanded/offhand/Destroy()
- wielded = FALSE
- return ..()
-
-/obj/item/twohanded/offhand/dropped(mob/living/user, show_message = TRUE) //Only utilized by dismemberment since you can't normally switch to the offhand to drop it.
- SHOULD_CALL_PARENT(FALSE)
- var/obj/I = user.get_active_held_item()
- if(I && istype(I, /obj/item/twohanded))
- var/obj/item/twohanded/thw = I
- thw.unwield(user, show_message)
- if(istype(thw, /obj/item/twohanded/required))
- user.dropItemToGround(thw)
- if(!QDELETED(src))
- qdel(src)
-
-/obj/item/twohanded/offhand/unwield()
- if(wielded)//Only delete if we're wielded
- wielded = FALSE
- qdel(src)
-
-/obj/item/twohanded/offhand/wield()
- if(wielded)//Only delete if we're wielded
- wielded = FALSE
- qdel(src)
-
-/obj/item/twohanded/offhand/attack_self(mob/living/carbon/user) //You should never be able to do this in standard use of two handed items. This is a backup for lingering offhands.
- var/obj/item/twohanded/O = user.get_inactive_held_item()
- if (istype(O) && !istype(O, /obj/item/twohanded/offhand/)) //If you have a proper item in your other hand that the offhand is for, do nothing. This should never happen.
- return
- if (QDELETED(src))
- return
- qdel(src) //If it's another offhand, or literally anything else, qdel. If I knew how to add logging messages I'd put one here.
-
-///////////Two hand required objects///////////////
-//This is for objects that require two hands to even pick up
-/obj/item/twohanded/required
- w_class = WEIGHT_CLASS_HUGE
-
-/obj/item/twohanded/required/attack_self()
- return
-
-/obj/item/twohanded/required/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
- if(wielded && !slot_flags)
- if(!disable_warning)
- to_chat(M, span_warning("[src] is too cumbersome to carry with anything but your hands!"))
- return 0
- return ..()
-
-/obj/item/twohanded/required/attack_hand(mob/user)//Can't even pick it up without both hands empty
- var/obj/item/twohanded/required/H = user.get_inactive_held_item()
- if(get_dist(src,user) > 1)
- return
- if(H != null)
- to_chat(user, span_notice("[src] is too cumbersome to carry in one hand!"))
- return
- if(loc != user)
- wield(user)
- . = ..()
-
-/obj/item/twohanded/required/equipped(mob/user, slot)
- ..()
- if(slot_flags & slot)
- var/datum/O = user.is_holding_item_of_type(/obj/item/twohanded/offhand)
- if(!O || QDELETED(O))
- return
- qdel(O)
- return
- if(slot == ITEM_SLOT_HANDS)
- wield(user)
- else
- unwield(user)
-
-/obj/item/twohanded/required/dropped(mob/living/user, show_message = TRUE)
- unwield(user, show_message)
- ..()
-
-/obj/item/twohanded/required/wield(mob/living/carbon/user)
- ..()
- if(!wielded)
- user.dropItemToGround(src)
-
-/obj/item/twohanded/required/unwield(mob/living/carbon/user, show_message = TRUE)
- if(!wielded)
- return
- if(show_message)
- to_chat(user, span_notice("You drop [src]."))
- ..(user, FALSE)
-
-/*
- * Fireaxe
- */
-/obj/item/twohanded/fireaxe // DEM AXES MAN, marker -Agouri
- icon = 'icons/obj/tools.dmi'
- icon_state = "fireaxe0"
- lefthand_file = 'icons/mob/inhands/weapons/axes_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/axes_righthand.dmi'
- name = "fire axe"
- desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
- force = 5
- throwforce = 15
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- force_wielded = 19
- attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut", "axed")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = SHARP_EDGED
- max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
- resistance_flags = FIRE_PROOF
- wound_bonus = -15
- bare_wound_bonus = 20
-
-/obj/item/twohanded/fireaxe/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools
-
-/obj/item/twohanded/fireaxe/update_icon(updates=ALL) //Currently only here to fuck with the on-mob icons.
- . = ..()
- icon_state = "fireaxe[wielded]"
-
-/obj/item/twohanded/fireaxe/suicide_act(mob/user)
- user.visible_message(span_suicide("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!"))
- return (BRUTELOSS)
-
-/obj/item/twohanded/fireaxe/afterattack(atom/A, mob/user, proximity)
- . = ..()
- if(!proximity)
- return
- if(wielded && !QDELETED(A)) //destroys windows and grilles in one or two hits, most of the time
- if(istype(A, /obj/structure/window))
- var/obj/structure/window/W = A
- W.take_damage(W.max_integrity*2, BRUTE, MELEE, FALSE, null, armour_penetration)
- else if(istype(A, /obj/structure/grille))
- var/obj/structure/grille/G = A
- G.take_damage(G.max_integrity*2, BRUTE, MELEE, FALSE, null, armour_penetration)
- else if(istype(A, /obj/machinery/door)) //Nines hits for reinforced airlock, seven for normal
- var/obj/machinery/door/D = A
- D.take_damage((force+25), BRUTE, MELEE, FALSE, null, armour_penetration)
- else if(istype(A, /obj/structure/door_assembly)) //Two hits for frames left behind
- var/obj/machinery/door/D = A
- D.take_damage((force+25), BRUTE, MELEE, FALSE, null, armour_penetration)
-
-/*
- * Metal Hydrogen Axe
- */
-/obj/item/twohanded/fireaxe/metal_h2_axe // Blatant imitation of the fireaxe, but made out of metallic hydrogen
- icon_state = "metalh2_axe0"
- name = "metallic hydrogen axe"
- desc = "A large, menacing axe made of an unknown substance that the most elder atmosians call Metallic Hydrogen. Truly an otherworldly weapon."
- force_wielded = 18
-
-/obj/item/twohanded/fireaxe/metal_h2_axe/update_icon(updates=ALL) //Currently only here to fuck with the on-mob icons.
- . = ..()
- icon_state = "metalh2_axe[wielded]"
- return
-
-/*
- * Energy Fire Axe
- */
-
-/obj/item/twohanded/fireaxe/energy
- name = "energy fire axe"
- desc = "A massive, two handed, energy-based hardlight axe capable of cutting through solid metal. 'Glory to atmosia' is carved on the side of the handle."
- icon = 'icons/obj/weapons/energy.dmi'
- icon_state = "energy-fireaxe0"
- force_wielded = 25
- armour_penetration = 50 // Probably doesn't care much for armor given how it can destroy solid metal structures
- block_chance = 50 // Big handle and large flat energy blade, good for blocking things
- heat = 1800 // It's a FIRE axe
- w_class = WEIGHT_CLASS_NORMAL
- var/w_class_on = WEIGHT_CLASS_BULKY
- hitsound = "swing_hit"
- wieldsound = 'sound/weapons/saberon.ogg'
- unwieldsound = 'sound/weapons/saberoff.ogg'
- light_system = MOVABLE_LIGHT
- light_range = 6 //This is NOT a stealthy weapon
- light_color = "#ff4800" //red-orange
- light_on = FALSE
- sharpness = SHARP_NONE
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
-/obj/item/twohanded/fireaxe/energy/wield(mob/living/carbon/M) //Specific wield () to switch hitsounds.
- ..()
- if(wielded)
- sharpness = SHARP_EDGED
- w_class = w_class_on
- hitsound = 'sound/weapons/blade1.ogg'
- START_PROCESSING(SSobj, src)
- set_light_on(TRUE)
-
-/obj/item/twohanded/fireaxe/energy/unwield() //Specific unwield () to switch hitsounds.
- sharpness = initial(sharpness)
- w_class = initial(w_class)
- ..()
- hitsound = "swing_hit"
- STOP_PROCESSING(SSobj, src)
- set_light_on(FALSE)
-
-/obj/item/twohanded/fireaxe/energy/attack(mob/living/M, mob/living/user)
- ..()
- M.ignite_mob() // Ignites you if you're flammable
-
-/obj/item/twohanded/fireaxe/energy/afterattack(atom/A, mob/user, proximity)
- . = ..()
- if(!proximity)
- return
- if(wielded && !QDELETED(A)) // Does x2 damage against inanimate objects like machines, structures, mechs, etc
- if(isobj(A) && !isitem(A))
- var/obj/O = A
- O.take_damage(force, BRUTE, MELEE, FALSE, null, armour_penetration)
-
-/obj/item/twohanded/fireaxe/energy/update_icon(updates=ALL)
- . = ..()
- icon_state = "energy-fireaxe[wielded]"
- SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_TYPE_BLOOD)
-
-/obj/item/twohanded/fireaxe/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type)
- if(!wielded)
- return 0 // large energy blade can only block stuff if it's actually on
- return ..()
-
-/obj/item/twohanded/fireaxe/energy/ignition_effect(atom/A, mob/user)
- if(!wielded)
- return "[user] tries to light [A] with [src] while it's off. Nothing happens."
- playsound(loc, hitsound, get_clamped_volume(), 1, -1)
- return "[user] casually raises [src] up to [user.p_their()] face and lights [A]. Hot damn."
-
-/obj/item/twohanded/fireaxe/energy/is_hot()
- if(!wielded)
- return FALSE // Shouldn't be able to ignite stuff if it's off
- ..()
-
-/obj/item/twohanded/fireaxe/energy/process()
- if(!wielded)
- STOP_PROCESSING(SSobj, src)
- return PROCESS_KILL
- open_flame(heat)
-
-/*
- * Double-Bladed Energy Swords - Cheridan
- */
-/obj/item/twohanded/dualsaber
- icon = 'icons/obj/weapons/energy.dmi'
- icon_state = "dualsaber0"
- lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- name = "double-bladed energy sword"
- desc = "A more powerful version on the energy sword, it is more capable of blocking energy projectiles than its single bladed counterpart. 'At last we will have revenge' is carved on the side of the handle."
- force = 3
- throwforce = 5
- throw_speed = 3
- throw_range = 5
- w_class = WEIGHT_CLASS_SMALL
- var/w_class_on = WEIGHT_CLASS_BULKY
- force_wielded = 31
- wieldsound = 'sound/weapons/saberon.ogg'
- unwieldsound = 'sound/weapons/saberoff.ogg'
- hitsound = "swing_hit"
- armour_penetration = 35
- var/saber_color = "green"
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- block_chance = 75
- max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70)
- resistance_flags = FIRE_PROOF
- light_system = MOVABLE_LIGHT
- light_range = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
- light_color = "#00ff00" //green
- light_on = FALSE
- wound_bonus = -10
- bare_wound_bonus = 20
- var/hacked = FALSE
- var/list/possible_colors = list("red", "blue", "green", "purple")
-
-/obj/item/twohanded/dualsaber/suicide_act(mob/living/carbon/user)
- if(wielded)
- user.visible_message(span_suicide("[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!"))
-
- var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code
- var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
- B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea
- var/randdir
- for(var/i in 1 to 24)//like a headless chicken!
- if(user.is_holding(src))
- randdir = pick(GLOB.alldirs)
- user.Move(get_step(user, randdir),randdir)
- user.emote("spin")
- if (i == 3 && myhead)
- myhead.drop_limb()
- sleep(0.3 SECONDS)
- else
- user.visible_message(span_suicide("[user] panics and starts choking to death!"))
- return OXYLOSS
-
-
- else
- user.visible_message(span_suicide("[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!"))
- return BRUTELOSS
-
-/obj/item/twohanded/dualsaber/Initialize(mapload)
- . = ..()
- if(LAZYLEN(possible_colors))
- saber_color = pick(possible_colors)
- var/new_color
- switch(saber_color)
- if("red")
- new_color = LIGHT_COLOR_RED
- if("green")
- new_color = LIGHT_COLOR_GREEN
- if("blue")
- new_color = LIGHT_COLOR_LIGHT_CYAN
- if("purple")
- new_color = LIGHT_COLOR_LAVENDER
- set_light_color(new_color)
-
-/obj/item/twohanded/dualsaber/Destroy()
- STOP_PROCESSING(SSobj, src)
- . = ..()
-
-/obj/item/twohanded/dualsaber/update_icon(updates=ALL)
- . = ..()
- if(wielded)
- icon_state = "dualsaber[saber_color][wielded]"
- else
- icon_state = "dualsaber0"
- SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_TYPE_BLOOD)
-
-/obj/item/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user)
- if(user.has_dna())
- if(user.dna.check_mutation(HULK) || user.dna.check_mutation(ACTIVE_HULK))
- to_chat(user, span_warning("You grip the blade too hard and accidentally close it!"))
- unwield()
- return
- ..()
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40))
- impale(user)
- return
- if((wielded) && prob(50))
- INVOKE_ASYNC(src, PROC_REF(jedi_spin), user)
-
-/obj/item/twohanded/dualsaber/proc/jedi_spin(mob/living/user)
- for(var/i in list(NORTH,SOUTH,EAST,WEST,EAST,SOUTH,NORTH,SOUTH,EAST,WEST,EAST,SOUTH))
- user.setDir(i)
- if(i == WEST)
- user.emote("flip")
- sleep(0.1 SECONDS)
-
-/obj/item/twohanded/dualsaber/proc/impale(mob/living/user)
- to_chat(user, span_warning("You twirl around a bit before losing your balance and impaling yourself on [src]."))
- if (force_wielded)
- user.take_bodypart_damage(20,25,check_armor = TRUE)
- else
- user.adjustStaminaLoss(25)
-
-/obj/item/twohanded/dualsaber/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(wielded)
- return ..()
- return 0
-
-/obj/item/twohanded/dualsaber/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
- if(wielded)
- to_chat(user, span_warning("You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!"))
- return 1
-
-/obj/item/twohanded/dualsaber/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
- if(M.has_dna())
- if(M.dna.check_mutation(HULK) || M.dna.check_mutation(ACTIVE_HULK))
- to_chat(M, span_warning("You lack the grace to wield this!"))
- return
- ..()
- if(wielded)
- sharpness = SHARP_EDGED
- w_class = w_class_on
- hitsound = 'sound/weapons/blade1.ogg'
- START_PROCESSING(SSobj, src)
- set_light_on(TRUE)
-
-/obj/item/twohanded/dualsaber/unwield() //Specific unwield () to switch hitsounds.
- sharpness = initial(sharpness)
- w_class = initial(w_class)
- ..()
- hitsound = "swing_hit"
- STOP_PROCESSING(SSobj, src)
- set_light_on(FALSE)
-
-/obj/item/twohanded/dualsaber/process()
- if(wielded)
- if(hacked)
- light_color = pick(LIGHT_COLOR_RED, LIGHT_COLOR_GREEN, LIGHT_COLOR_LIGHT_CYAN, LIGHT_COLOR_LAVENDER)
- open_flame()
- else
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/twohanded/dualsaber/IsReflect()
- if(wielded)
- return TRUE
-
-/obj/item/twohanded/dualsaber/ignition_effect(atom/A, mob/user)
- // same as /obj/item/melee/transforming/energy, mostly
- if(!wielded)
- return ""
- var/in_mouth = ""
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- if(C.wear_mask)
- in_mouth = ", barely missing [user.p_their()] nose"
- . = span_warning("[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process.")
- playsound(loc, hitsound, get_clamped_volume(), 1, -1)
- add_fingerprint(user)
- // Light your candles while spinning around the room
- INVOKE_ASYNC(src, PROC_REF(jedi_spin), user)
-
-/obj/item/twohanded/dualsaber/green
- possible_colors = list("green")
-
-/obj/item/twohanded/dualsaber/red
- possible_colors = list("red")
-
-/obj/item/twohanded/dualsaber/blue
- possible_colors = list("blue")
-
-/obj/item/twohanded/dualsaber/purple
- possible_colors = list("purple")
-
-/obj/item/twohanded/dualsaber/attackby(obj/item/W, mob/user, params)
- if(W.tool_behaviour == TOOL_MULTITOOL)
- if(!hacked)
- hacked = TRUE
- to_chat(user, span_warning("2XRNBW_ENGAGE"))
- saber_color = "rainbow"
- update_appearance(UPDATE_ICON)
- else
- to_chat(user, span_warning("It's starting to look like a triple rainbow - no, nevermind."))
- else
- return ..()
-
-/obj/item/twohanded/dualsaber/makeshift
- name = "makeshift double-bladed energy sword"
- desc = "Two energy swords taped crudely together. 'at last we finally get some revenge' is scribbled on the side with crayon."
- force_wielded = 27 //total of 30 to be equal to an esword, it's literally just two duct taped together
-
-/obj/item/twohanded/dualsaber/makeshift/IsReflect()//only 50% chance to reflect, so it still has the cool effect, but not 100% chance
- if(prob(50))
- return ..()
- return FALSE
-
-//spears
-/obj/item/twohanded/spear
- icon = 'icons/obj/weapons/spears.dmi'
- icon_state = "spearglass0"
- lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
- name = "spear"
- desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
- force = 10
- max_integrity = 100
- weapon_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 1, DAMAGE_LOW = 2, DAMAGE_HIGH = 5)
- wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0.4, ENCUMBRANCE_TIME = 5, REACH = 2, DAMAGE_LOW = 2, DAMAGE_HIGH = 5)
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- force_wielded = 8
- throwforce = 20
- throw_speed = 4
- embedding = list("embedded_impact_pain_multiplier" = 3)
- armour_penetration = 10
- materials = list(/datum/material/iron=1150, /datum/material/glass=2075)
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
- sharpness = SHARP_EDGED
- max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30)
- break_message = "%SRC's cable binding suddenly snaps"
- var/war_cry = "AAAAARGH!!!"
- var/icon_prefix = "spearglass"
- wound_bonus = -15
- bare_wound_bonus = 15
-
-/obj/item/twohanded/spear/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad.
-
-/obj/item/twohanded/spear/suicide_act(mob/living/carbon/user)
- user.visible_message(span_suicide("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
- return BRUTELOSS
-
-/obj/item/twohanded/spear/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/jousting)
-
-/obj/item/twohanded/spear/update_icon(updates=ALL)
- . = ..()
- icon_state = "[icon_prefix][wielded]"
-
-/obj/item/twohanded/spear/deconstruct() //we drop our rod and maybe the glass shard used
- new /obj/item/stack/rods(get_turf(src))
- if(!prob(20)) //20% chance to save our spearhead
- break_message += " and its head smashes into pieces!"
- return ..()
- var/spearhead = icon_prefix == "spear_plasma" ? /obj/item/shard/plasma : /obj/item/shard //be honest we have this stored //we do NOT have this stored
- new spearhead(get_turf(src))
- break_message += "!"
- ..()
-
-/obj/item/twohanded/spear/CheckParts(list/parts_list)
- var/obj/item/shard/tip = locate() in parts_list
- if (istype(tip, /obj/item/shard/plasma))
- force_wielded += 1
- force += 1
- throwforce += 1
- righthand_file = 'yogstation/icons/mob/inhands/weapons/polearms_righthand.dmi' //yogs
- mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi' //yogs
- icon_prefix = "spearplasma"
- update_appearance(UPDATE_ICON)
- qdel(tip)
- var/obj/item/grenade/G = locate() in parts_list
- if(G)
- var/obj/item/twohanded/spear/explosive/lance = new /obj/item/twohanded/spear/explosive(src.loc, G)
- lance.force_wielded = force_wielded
- lance.force = force
- lance.throwforce = throwforce
- lance.icon_prefix = icon_prefix
- parts_list -= G
- qdel(src)
- ..()
-
-
-/obj/item/twohanded/spear/explosive
- name = "explosive lance"
- var/obj/item/grenade/explosive = null
-
-/obj/item/twohanded/spear/explosive/Initialize(mapload, obj/item/grenade/G)
- . = ..()
- if (!G)
- G = new /obj/item/grenade/iedcasing() //For admin-spawned explosive lances
- G.forceMove(src)
- explosive = G
- desc = "A makeshift spear with [G] attached to it"
- update_appearance(UPDATE_ICON)
-
-/obj/item/twohanded/spear/explosive/suicide_act(mob/living/carbon/user)
- user.visible_message(span_suicide("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
- user.say("[war_cry]", forced="spear warcry")
- explosive.forceMove(user)
- explosive.prime()
- user.gib()
- qdel(src)
- return BRUTELOSS
-
-/obj/item/twohanded/spear/explosive/examine(mob/user)
- . = ..()
- . += span_notice("Alt-click to set your war cry.")
-
-/obj/item/twohanded/spear/explosive/update_icon(updates=ALL)
- . = ..()
- icon_state = "spearbomb[wielded]"
-
-/obj/item/twohanded/spear/explosive/AltClick(mob/user)
- if(user.canUseTopic(src, BE_CLOSE))
- ..()
- if(istype(user) && loc == user)
- var/input = stripped_input(user,"What do you want your war cry to be? You will shout it when you hit someone in melee.", ,"", 50)
- if(input)
- src.war_cry = input
-
-/obj/item/twohanded/spear/explosive/afterattack(atom/movable/AM, mob/user, proximity)
- . = ..()
- if(!proximity)
- return
- if(wielded)
- user.say("[war_cry]", forced="spear warcry")
- explosive.forceMove(AM)
- explosive.prime()
- qdel(src)
-
-// CHAINSAW
-
-/datum/action/item_action/startchainsaw
- name = "Pull The Starting Cord"
-
-/obj/item/twohanded/required/chainsaw
- name = "chainsaw"
- desc = "A versatile power tool. Useful for limbing trees and delimbing humans."
- icon = 'icons/obj/tools.dmi'
- icon_state = "chainsaw_off"
- var/icon_name = "chainsaw"
- lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
- flags_1 = CONDUCT_1
- force = 13
- var/force_on = 24
- w_class = WEIGHT_CLASS_HUGE
- throwforce = 13
- throw_speed = 2
- throw_range = 4
- materials = list(/datum/material/iron=13000)
- attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
- hitsound = "swing_hit"
- sharpness = SHARP_EDGED
- actions_types = list(/datum/action/item_action/startchainsaw)
- var/on = FALSE
-
-/obj/item/twohanded/required/chainsaw/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/butchering, 30, 100, 0, 'sound/weapons/chainsawhit.ogg', TRUE)
-
-/obj/item/twohanded/required/chainsaw/suicide_act(mob/living/carbon/user)
- if(on)
- user.visible_message(span_suicide("[user] begins to tear [user.p_their()] head off with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
- playsound(src, 'sound/weapons/chainsawhit.ogg', 100, 1)
- var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)
- if(myhead)
- myhead.dismember()
- else
- user.visible_message(span_suicide("[user] smashes [src] into [user.p_their()] neck, destroying [user.p_their()] esophagus! It looks like [user.p_theyre()] trying to commit suicide!"))
- playsound(src, 'sound/weapons/genhit1.ogg', 100, 1)
- return(BRUTELOSS)
-
-/obj/item/twohanded/required/chainsaw/attack_self(mob/user)
- on = !on
- to_chat(user, "As you pull the starting cord dangling from [src], [on ? "it begins to whirr." : "the chain stops moving."]")
- force = on ? force_on : initial(force)
- throwforce = on ? force_on : initial(force)
- icon_state = "[icon_name]_[on ? "on" : "off"]"
- var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
- butchering.butchering_enabled = on
-
- if(on)
- hitsound = 'sound/weapons/chainsawhit.ogg'
- else
- hitsound = "swing_hit"
-
- if(src == user.get_active_held_item()) //update inhands
- user.update_inv_hands()
- for(var/X in actions)
- var/datum/action/A = X
- A.build_all_button_icons()
-
-/obj/item/twohanded/required/chainsaw/doomslayer
- name = "THE GREAT COMMUNICATOR"
- desc = span_warning("VRRRRRRR!!!")
- armour_penetration = 100
- force_on = 30
-
-/obj/item/twohanded/required/chainsaw/doomslayer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(attack_type == PROJECTILE_ATTACK)
- owner.visible_message(span_danger("Ranged attacks just make [owner] angrier!"))
- playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
- return 1
- return 0
-
-/obj/item/twohanded/required/chainsaw/demon
- name = "demon chainsaw"
- desc = "Show me your dreams."
- icon_state = "demon_off"
- force_on = 30
- icon_name = "demon"
-
-/obj/item/twohanded/required/chainsaw/demon/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/lifesteal, 30)
-
-//GREY TIDE
-/obj/item/twohanded/spear/grey_tide
- icon_state = "spearglass0"
- name = "\improper Grey Tide"
- desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces."
- force = 15
- force_wielded = 10
- weapon_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 1, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
- wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 2, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
- throwforce = 20
- throw_speed = 4
- attack_verb = list("gored")
-
-/obj/item/twohanded/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity)
- . = ..()
- if(!proximity)
- return
- user.faction |= "greytide([REF(user)])"
- if(isliving(AM))
- var/mob/living/L = AM
- if(istype (L, /mob/living/simple_animal/hostile/illusion))
- return
- if(!L.stat && prob(50))
- var/mob/living/simple_animal/hostile/illusion/M = new(user.loc)
- M.faction = user.faction.Copy()
- M.Copy_Parent(user, 100, user.health/2.5, 12, 30)
- M.GiveTarget(L)
-
-/obj/item/twohanded/pitchfork
- icon = 'icons/obj/weapons/spears.dmi'
- icon_state = "pitchfork0"
- lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
- name = "pitchfork"
- desc = "A simple tool used for moving hay."
- force = 7
- throwforce = 15
- w_class = WEIGHT_CLASS_BULKY
- force_wielded = 8
- attack_verb = list("attacked", "impaled", "pierced")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = SHARP_POINTY
- max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30)
- resistance_flags = FIRE_PROOF
-
-/obj/item/twohanded/pitchfork/trident
- icon_state = "trident"
- name = "trident"
- desc = "A trident recovered from the ruins of atlantis"
- slot_flags = ITEM_SLOT_BELT
- force = 14
- throwforce = 23
- force_wielded = 6
-
-/obj/item/twohanded/pitchfork/demonic
- name = "demonic pitchfork"
- desc = "A red pitchfork, it looks like the work of the devil."
- force = 19
- throwforce = 24
- force_wielded = 6
- light_system = MOVABLE_LIGHT
- light_range = 3
- light_power = 6
- light_color = LIGHT_COLOR_RED
-
-/obj/item/twohanded/pitchfork/demonic/greater
- force = 24
- throwforce = 50
- force_wielded = 10
-
-/obj/item/twohanded/pitchfork/demonic/ascended
- force = 100
- throwforce = 100
- force_wielded = 500000 // Kills you DEAD.
-
-/obj/item/twohanded/pitchfork/update_icon(updates=ALL)
- . = ..()
- icon_state = "pitchfork[wielded]"
-
-/obj/item/twohanded/pitchfork/suicide_act(mob/user)
- user.visible_message(span_suicide("[user] impales [user.p_them()]self in [user.p_their()] abdomen with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
- return (BRUTELOSS)
-
-/obj/item/twohanded/pitchfork/demonic/pickup(mob/living/user)
- . = ..()
- if(isliving(user) && user.mind && user.owns_soul() && !is_devil(user))
- var/mob/living/U = user
- U.visible_message(span_warning("As [U] picks [src] up, [U]'s arms briefly catch fire."), \
- span_warning("\"As you pick up [src] your arms ignite, reminding you of all your past sins.\""))
- if(ishuman(U))
- var/mob/living/carbon/human/H = U
- H.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
- else
- U.adjustFireLoss(rand(force/2,force))
-
-/obj/item/twohanded/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user)
- if(user.mind && user.owns_soul() && !is_devil(user))
- to_chat(user, "[src] burns in your hands.")
- user.apply_damage(rand(force/2, force), BURN, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
- ..()
-
-/obj/item/twohanded/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity)
- . = ..()
- if(!proximity || !wielded)
- return
- if(iswallturf(target))
- var/turf/closed/wall/W = target
- user.visible_message(span_danger("[user] blasts \the [target] with \the [src]!"))
- playsound(target, 'sound/magic/disintegrate.ogg', 100, 1)
- W.break_wall()
- W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
- return
-
-//HF blade
-
-/obj/item/twohanded/vibro_weapon
- icon = 'icons/obj/weapons/swords.dmi'
- icon_state = "hfrequency0"
- lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
- name = "vibro sword"
- desc = "A potent weapon capable of cutting through nearly anything. Wielding it in two hands will allow you to deflect gunfire."
- force = 20
- force_wielded = 20
- armour_penetration = 100
- block_chance = 40
- throwforce = 20
- throw_speed = 4
- sharpness = SHARP_EDGED
- attack_verb = list("cut", "sliced", "diced")
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/twohanded/vibro_weapon/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/butchering, 20, 105)
-
-/obj/item/twohanded/vibro_weapon/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(wielded)
- final_block_chance *= 2
- if(wielded || attack_type != PROJECTILE_ATTACK)
- if(prob(final_block_chance))
- if(attack_type == PROJECTILE_ATTACK)
- owner.visible_message(span_danger("[owner] deflects [attack_text] with [src]!"))
- playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
- return 1
- else
- owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!"))
- return 1
- return 0
-
-/obj/item/twohanded/vibro_weapon/update_icon(updates=ALL)
- . = ..()
- icon_state = "hfrequency[wielded]"
-
-/obj/item/twohanded/vibro_weapon/wizard
- desc = "A blade that was mastercrafted by a legendary blacksmith. Its' enchantments let it slash through anything."
- force = 8
- throwforce = 20
- wound_bonus = 20
- bare_wound_bonus = 25
-
-/obj/item/twohanded/vibro_weapon/wizard/wizard/attack_self(mob/user, modifiers)
- if(!iswizard(user))
- balloon_alert(user, "you're too weak!")
- return
- return ..()
-
-/*
- * Bone Axe
- */
-/obj/item/twohanded/fireaxe/boneaxe // Blatant imitation of the fireaxe, but made out of bone.
- icon_state = "bone_axe0"
- name = "bone axe"
- desc = "A large, vicious axe crafted out of several sharpened bone plates and crudely tied together. Made of monsters, by killing monsters, for killing monsters."
- force_wielded = 18
-
-/obj/item/twohanded/fireaxe/boneaxe/update_icon(updates=ALL)
- . = ..()
- icon_state = "bone_axe[wielded]"
-
-/*
- * Bone Spear
- */
-/obj/item/twohanded/bonespear //Blatant imitation of spear, but made out of bone. Not valid for explosive modification.
- icon = 'icons/obj/weapons/spears.dmi'
- icon_state = "bone_spear0"
- lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
- name = "bone spear"
- desc = "A haphazardly-constructed yet still deadly weapon. The pinnacle of modern technology."
- force = 11
- max_integrity = 100
- weapon_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 1, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
- wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0.4, ENCUMBRANCE_TIME = 5, REACH = 2, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- force_wielded = 9 //I have no idea how to balance
- throwforce = 22
- throw_speed = 4
- embedding = list("embedded_impact_pain_multiplier" = 3)
- armour_penetration = 15 //Enhanced armor piercing
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
- sharpness = SHARP_EDGED
-
-/obj/item/twohanded/bonespear/update_icon(updates=ALL)
- . = ..()
- icon_state = "bone_spear[wielded]"
-
-/obj/item/twohanded/bonespear/chitinspear //like a mix of a bone spear and bone axe, but more like a bone spear. And better.
- icon = 'icons/obj/weapons/spears.dmi'
- icon_state = "chitin_spear0"
- name = "chitin spear"
- desc = "A well constructed spear with a sharpened edge akin to a naginata, making it equally great for slicing and throwing."
- force = 13
- force_wielded = 10
- throwforce = 25
- attack_verb = list("attacked", "poked", "jabbed", "torn", "gored", "sliced", "ripped", "cut")
-
-/obj/item/twohanded/bonespear/chitinspear/update_icon(updates=ALL)
- . = ..()
- icon_state = "chitin_spear[wielded]"
-
-/obj/item/twohanded/binoculars
- name = "binoculars"
- desc = "Used for long-distance surveillance."
- icon = 'icons/obj/tools.dmi'
- item_state = "binoculars"
- icon_state = "binoculars"
- lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- slot_flags = ITEM_SLOT_BELT
- w_class = WEIGHT_CLASS_SMALL
- var/mob/listeningTo
- var/zoom_out_amt = 6
- var/zoom_amt = 10
-
-/obj/item/twohanded/binoculars/Destroy()
- listeningTo = null
- return ..()
-
-/obj/item/twohanded/binoculars/wield(mob/user)
- . = ..()
- if(!wielded)
- return
- RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(unwield))
- RegisterSignal(user, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate))
- listeningTo = user
- user.visible_message("[user] holds [src] up to [user.p_their()] eyes.","You hold [src] up to your eyes.")
- item_state = "binoculars_wielded"
- user.regenerate_icons()
- user.client.view_size.zoomOut(zoom_out_amt, zoom_amt, user.dir)
-
-/obj/item/twohanded/binoculars/unwield(mob/user)
- . = ..()
- UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED)
- UnregisterSignal(user, COMSIG_ATOM_DIR_CHANGE)
- listeningTo = null
- item_state = "binoculars"
- user.regenerate_icons()
- user.client.view_size.zoomIn()
-
-/obj/item/twohanded/binoculars/proc/rotate(atom/thing, old_dir, new_dir)
- if(ismob(thing))
- var/mob/lad = thing
- lad.regenerate_icons()
- lad.client.view_size.zoomOut(zoom_out_amt, zoom_amt, new_dir)
-
-/obj/item/twohanded/bamboospear
- icon = 'icons/obj/weapons/spears.dmi'
- icon_state = "bamboo_spear0"
- lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
- name = "bamboo spear"
- desc = "A haphazardly-constructed bamboo stick with a sharpened tip, ready to poke holes into unsuspecting people."
- force = 10
- w_class = WEIGHT_CLASS_BULKY
- slot_flags = ITEM_SLOT_BACK
- force_wielded = 8
- throwforce = 22
- throw_speed = 4
- embedding = list("embedded_impact_pain_multiplier" = 2)
- armour_penetration = 10
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
- sharpness = SHARP_EDGED
-
-/obj/item/twohanded/bamboospear/update_icon(updates=ALL)
- . = ..()
- icon_state = "bamboo_spear[wielded]"
-
-/*
- * Vxtvul Hammer
- */
-
-/datum/action/item_action/charge_hammer
- name = "Charge the Blast Pads"
-
-/datum/action/item_action/charge_hammer/Trigger()
- var/obj/item/twohanded/vxtvulhammer/vxtvulhammer = target
- if(istype(vxtvulhammer))
- vxtvulhammer.charge_hammer(owner)
-
-/obj/item/twohanded/vxtvulhammer
- icon = 'icons/obj/weapons/misc.dmi'
- icon_state = "vxtvul_hammer0-0"
- lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
- name = "Vxtvul Hammer"
- desc = "A relic sledgehammer with charge packs wired to two blast pads on its head. \
- While wielded in two hands, the user can charge a massive blow that will shatter construction and hurl bodies."
- force = 4 //It's heavy as hell
- force_wielded = 24
- armour_penetration = 50 //Designed for shattering walls in a single blow, I don't think it cares much about armor
- throwforce = 18
- attack_verb = list("attacked", "hit", "struck", "bludgeoned", "bashed", "smashed")
- block_chance = 30 //Only works in melee, but I bet your ass you could raise its handle to deflect a sword
- sharpness = SHARP_NONE //Blunt, breaks bones
- wound_bonus = -10
- bare_wound_bonus = 15
- max_integrity = 200
- resistance_flags = ACID_PROOF | FIRE_PROOF
- w_class = WEIGHT_CLASS_HUGE
- hitsound = 'sound/effects/hammerhitbasic.ogg'
- slot_flags = ITEM_SLOT_BACK
- actions_types = list(/datum/action/item_action/charge_hammer)
- light_system = MOVABLE_LIGHT
- light_color = LIGHT_COLOR_HALOGEN
- light_range = 2
- light_power = 2
- var/datum/effect_system/spark_spread/spark_system //It's a surprise tool that'll help us later
- var/charging = FALSE
- var/supercharged = FALSE
- var/toy = FALSE
-
-/obj/item/twohanded/vxtvulhammer/Initialize(mapload) //For the sparks when you begin to charge it
- . = ..()
- spark_system = new
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
- set_light_on(FALSE)
-
-/obj/item/twohanded/vxtvulhammer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(attack_type == PROJECTILE_ATTACK || !wielded) //Doesn't work against ranged or if it's not wielded
- final_block_chance = 0 //Please show me how you can block a bullet with an industrial hammer I would LOVE to see it
- return ..()
-
-/obj/item/twohanded/vxtvulhammer/Destroy() //Even though the hammer won't probably be destroyed, Everâ„¢
- QDEL_NULL(spark_system)
- return ..()
-
-/obj/item/twohanded/vxtvulhammer/update_icon(updates=ALL)
- . = ..()
- icon_state = "vxtvul_hammer[wielded]-[supercharged]"
-
-/obj/item/twohanded/vxtvulhammer/examine(mob/living/carbon/user)
- . = ..()
- if(supercharged)
- . += "Electric sparks are bursting from the blast pads!"
-
-/obj/item/twohanded/vxtvulhammer/unwield(mob/living/carbon/user)
- ..()
- if(supercharged) //So you can't one-hand the charged hit
- to_chat(user, span_notice("Your hammer loses its power as you adjust your grip."))
- user.visible_message(span_warning("The sparks from [user]'s hammer suddenly stop!"))
- supercharge()
- if(charging) //So you can't one-hand while charging
- to_chat(user, span_notice("You flip the switch off as you adjust your grip."))
- user.visible_message(span_warning("[user] flicks the hammer off!"))
- charging = FALSE
-
-/obj/item/twohanded/vxtvulhammer/attack(mob/living/carbon/human/target, mob/living/carbon/user) //This doesn't consider objects, only people
- if (charging) //So you can't attack while charging
- to_chat(user, span_notice("You flip the switch off before your attack."))
- user.visible_message(span_warning("[user] flicks the hammer off and raises it!"))
- charging = FALSE
- return ..()
-
-/obj/item/twohanded/vxtvulhammer/AltClick(mob/living/carbon/user)
- charge_hammer(user)
-
-/obj/item/twohanded/vxtvulhammer/proc/supercharge() //Proc to handle when it's charged for light + sprite + damage
- supercharged = !supercharged
- if(supercharged)
- set_light_on(TRUE) //Glows when charged
- if(!toy)
- force = initial(force) + (wielded ? force_wielded : 0) + 12 //12 additional damage for a total of 40 has to be a massively irritating check because of how force_wielded works
- armour_penetration = 100
- else
- set_light_on(FALSE)
- force = initial(force) + (wielded ? force_wielded : 0)
- armour_penetration = initial(armour_penetration)
- update_appearance(UPDATE_ICON)
-
-/obj/item/twohanded/vxtvulhammer/proc/charge_hammer(mob/living/carbon/user)
- if(!wielded)
- to_chat(user, span_warning("The hammer must be wielded in two hands in order to charge it!"))
- return
- if(supercharged)
- to_chat(user, span_warning("The hammer is already supercharged!"))
- else
- charging = TRUE
- to_chat(user, span_notice("You begin charging the weapon, concentration flowing into it..."))
- user.visible_message(span_warning("[user] flicks the hammer on, tilting [user.p_their()] head down as if in thought."))
- spark_system.start() //Generates sparks when you charge
- if(!do_mob(user, user, ispreternis(user)? 5 SECONDS : 6 SECONDS))
- if(!charging) //So no duplicate messages
- return
- to_chat(user, span_notice("You flip the switch off as you lose your focus."))
- user.visible_message(span_warning("[user]'s concentration breaks!"))
- charging = FALSE
- if(!charging) //No charging for you if you cheat
- return //Has to double-check return because attacking or one-handing won't actually proc !do_mob, so the channel will seem to continue despite the message that pops out, but this actually ensures that it won't charge despite attacking or one-handing
- to_chat(user, span_notice("You complete charging the weapon."))
- user.visible_message(span_warning("[user] looks up as [user.p_their()] hammer begins to crackle and hum!"))
- playsound(loc, 'sound/magic/lightningshock.ogg', 60, TRUE) //Mainly electric crack
- playsound(loc, 'sound/effects/magic.ogg', 40, TRUE) //Reverb undertone
- supercharge()
- charging = FALSE
-
-/obj/item/twohanded/vxtvulhammer/afterattack(atom/target, mob/living/carbon/user, proximity) //Afterattack to properly be able to smack walls
- . = ..()
- if(!proximity)
- return
- if(isfloorturf(target)) //So you don't just lose your supercharge if you miss and wack the floor. No I will NOT let people space with this thing
- return
-
- if(charging) //Needs a special snowflake check if you hit something that isn't a mob
- if(ismachinery(target) || isstructure(target) || ismecha(target))
- to_chat(user, span_notice("You flip the switch off after your blow."))
- user.visible_message(span_warning("[user] flicks the hammer off after striking [target]!"))
- charging = FALSE
-
- if(supercharged)
- var/turf/target_turf = get_turf(target) //Does the nice effects first so whatever happens to what's about to get clapped doesn't affect it
- var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
- K.color = color
- playsound(loc, 'sound/effects/powerhammerhit.ogg', 65, FALSE) //Mainly this sound
- playsound(loc, 'sound/effects/explosion3.ogg', 20, TRUE) //Bit of a reverb
- supercharge() //At start so it doesn't give an unintentional message if you hit yourself
-
- if(ismachinery(target) && !toy)
- var/obj/machinery/machine = target
- machine.take_damage(machine.max_integrity * 2, armour_penetration = 100) //Should destroy machines in one hit
- if(istype(target, /obj/machinery/door))
- for(var/obj/structure/door_assembly/door in target_turf) //Will destroy airlock assembly left behind, but drop the parts
- door.take_damage(door.max_integrity * 2)
- else
- for(var/obj/structure/frame/base in target_turf) //Will destroy machine or computer frame left behind, but drop the parts
- base.take_damage(base.max_integrity * 2)
- for(var/obj/structure/light_construct/light in target_turf) //Also light frames because why not
- light.take_damage(light.max_integrity * 2)
- user.visible_message(span_danger("The hammer thunders against the [target.name], demolishing it!"))
-
- else if(isstructure(target) && !toy)
- var/obj/structure/struct = target
- struct.take_damage(struct.max_integrity * 2, armour_penetration = 100) //Destroy structures in one hit too
- if(istype(target, /obj/structure/table))
- for(var/obj/structure/table_frame/platform in target_turf)
- platform.take_damage(platform.max_integrity * 2, armour_penetration = 100) //Destroys table frames left behind
- user.visible_message(span_danger("The hammer thunders against the [target.name], destroying it!"))
-
- else if(iswallturf(target) && !toy)
- var/turf/closed/wall/fort = target
- fort.dismantle_wall(1) //Deletes the wall but drop the materials, just like destroying a machine above
- user.visible_message(span_danger("The hammer thunders against the [target.name], shattering it!"))
- playsound(loc, 'sound/effects/meteorimpact.ogg', 50, TRUE) //Otherwise there's no sound for hitting the wall, since it's just dismantled
-
- else if(ismecha(target) && !toy)
- var/obj/mecha/mech = target
- mech.take_damage(mech.max_integrity/3, armour_penetration = armour_penetration) //A third of its max health is dealt as an untyped damage, in addition to the normal damage of the weapon (which has high AP)
- user.visible_message(span_danger("The hammer thunders as it massively dents the plating of the [target.name]!"))
-
- else if(isliving(target))
- var/atom/throw_target = get_edge_target_turf(target, user.dir)
- var/mob/living/victim = target
- if(toy)
- ADD_TRAIT(victim, TRAIT_IMPACTIMMUNE, "Toy Hammer")
- victim.safe_throw_at(throw_target, rand(1,2), 3, callback = CALLBACK(src, PROC_REF(afterimpact), victim))
- else
- victim.throw_at(throw_target, 15, 5) //Same distance as maxed out power fist with three extra force
- victim.Paralyze(2 SECONDS)
- user.visible_message(span_danger("The hammer thunders as it viscerally strikes [target.name]!"))
- to_chat(victim, span_userdanger("Agony sears through you as [user]'s blow cracks your body off its feet!"))
- victim.emote("scream")
-
-/obj/item/twohanded/vxtvulhammer/proc/afterimpact(mob/living/victim)
- REMOVE_TRAIT(victim, TRAIT_IMPACTIMMUNE, "Toy Hammer")
-
-/obj/item/twohanded/vxtvulhammer/pirate //Exact same but different text and sprites
- icon_state = "vxtvul_hammer_pirate0-0"
- name = "pirate Vxtvul Hammer"
- desc = "A relic sledgehammer with charge packs wired to two blast pads on its head. This one has been defaced by Syndicate pirates. \
- While wielded in two hands, the user can charge a massive blow that will shatter construction and hurl bodies."
-
-/obj/item/twohanded/vxtvulhammer/pirate/update_icon(updates=ALL)
- . = ..()
- icon_state = "vxtvul_hammer_pirate[wielded]-[supercharged]"
-
-// Baseball Bats
-/obj/item/twohanded/required/baseball_bat
- name = "baseball bat"
- desc = "A traditional tool for a game of Baseball. Modern wood isn't very strong, try not to crack the bat!"
- icon = 'icons/obj/weapons/misc.dmi'
- icon_state = "baseball_bat"
- item_state = "baseball_bat"
- lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- force = 16
- wound_bonus = 5
- armour_penetration = -30
- bare_wound_bonus = 40
- throwforce = 0
- attack_verb = list("beat", "smacked")
- sharpness = SHARP_NONE
- w_class = WEIGHT_CLASS_HUGE
- var/homerun_ready = 0
- var/homerun_able = 0
- var/flimsy = TRUE //spesswood? only used for knockback check now
-
-/obj/item/twohanded/required/baseball_bat/homerun
- name = "home run bat"
- desc = "This thing looks dangerous... Dangerously good at baseball, that is."
- homerun_able = 1
-
-
-/obj/item/twohanded/required/baseball_bat/attack_self(mob/user)
- if(!homerun_able)
- ..()
- return
- if(homerun_ready)
- to_chat(user, span_notice("You're already ready to do a home run!"))
- return
- to_chat(user, span_warning("You begin gathering strength..."))
- playsound(get_turf(src), 'sound/magic/lightning_chargeup.ogg', 65, 1)
- if(do_after(user, 9 SECONDS, src))
- to_chat(user, span_userdanger("You gather power! Time for a home run!"))
- homerun_ready = 1
- ..()
-
-/obj/item/twohanded/required/baseball_bat/attack(mob/living/target, mob/living/user)
- . = ..()
- var/atom/throw_target = get_edge_target_turf(target, user.dir)
- if(target == user)
- return
- if(homerun_ready)
- user.visible_message(span_userdanger("It's a home run!"))
- target.throw_at(throw_target, rand(8,10), 14, user)
- SSexplosions.medturf += throw_target
- playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, 1)
- homerun_ready = 0
- return
- else if(!flimsy && !target.anchored)
- var/whack_speed = (prob(50) ? 1 : 6)
- target.throw_at(throw_target, rand(1, 2), whack_speed, user) // sorry friends, 7 speed batting caused wounds to absolutely delete whoever you knocked your target into (and said target)
-
-/obj/item/twohanded/required/baseball_bat/metal_bat
- name = "titanium baseball bat"
- desc = "This bat is made of titanium, it feels light yet strong."
- icon_state = "baseball_bat_metal"
- item_state = "baseball_bat_metal"
- hitsound = 'yogstation/sound/weapons/bat_hit.ogg'
- force = 18
- throwforce = 0
- flimsy = FALSE
- wound_bonus = 15
- armour_penetration = -25
- bare_wound_bonus = 50
- w_class = WEIGHT_CLASS_HUGE
-
-/obj/item/twohanded/required/baseball_bat/metal_bat/attack(mob/living/target, mob/living/user)
- . = ..()
- if(user.zone_selected == BODY_ZONE_HEAD && get_location_accessible(target, BODY_ZONE_HEAD))
- if(prob(30))
- target.Paralyze(40)
- else
- return TRUE
-
-/obj/item/twohanded/bigspoon
- name = "comically large spoon"
- desc = "For when you're only allowed one spoonful of something."
- icon = 'yogstation/icons/obj/kitchen.dmi'
- mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi'
- icon_state = "bigspoon"
- item_state = "bigspoon0"
- lefthand_file = 'yogstation/icons/mob/inhands/weapons/bigspoon_lefthand.dmi'
- righthand_file = 'yogstation/icons/mob/inhands/weapons/bigspoon_righthand.dmi'
- force = 2 //It's a big unwieldy for one hand
- force_wielded = 16 //cleaver is 15 and sharp, this at least gets to be on-par with a nullrod
- sharpness = SHARP_NONE //issa spoon
- armour_penetration = -50 //literally couldn't possibly be a worse weapon for hitting armour
- throwforce = 1 //it's terribly weighted, what do you expect?
- hitsound = 'sound/items/trayhit1.ogg'
- attack_verb = list("scooped", "bopped", "spooned", "wacked")
- block_chance = 30 //Only works in melee, but I bet your ass you could raise its handle to deflect a sword
- wound_bonus = -10
- bare_wound_bonus = -15
- materials = list(/datum/material/iron=18000)
- w_class = WEIGHT_CLASS_HUGE
- slot_flags = ITEM_SLOT_BACK
-
-/obj/item/twohanded/bigspoon/update_icon(updates=ALL)
- . = ..()
- hitsound = wielded ? 'yogstation/sound/weapons/bat_hit.ogg' : 'sound/items/trayhit1.ogg' //big donk if wielded
- item_state = "bigspoon[wielded]" //i don't know why it's item_state rather than icon_state like every other wielded weapon
-
-/*
-Broom
-*/
-
-#define BROOM_PUSH_LIMIT 20
-/obj/item/twohanded/broom
- name = "broom"
- desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move."
- icon = 'icons/obj/janitor.dmi'
- icon_state = "broom0"
- lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
- force = 8
- throwforce = 10
- throw_speed = 3
- throw_range = 7
- w_class = WEIGHT_CLASS_BULKY
- force_wielded = 4
- attack_verb = list("swept", "brushed off", "bludgeoned", "whacked")
- resistance_flags = FLAMMABLE
-
-/obj/item/twohanded/broom/update_icon(updates=ALL)
- . = ..()
- icon_state = "broom[wielded]"
-
-/obj/item/twohanded/broom/wield(mob/user)
- . = ..()
- if(!wielded)
- return
-
- to_chat(user, span_notice("You brace the [src] against the ground in a firm sweeping stance."))
- RegisterSignal(user, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(sweep))
-
-/obj/item/twohanded/broom/unwield(mob/user)
- . = ..()
- UnregisterSignal(user, COMSIG_MOVABLE_PRE_MOVE)
-
-/obj/item/twohanded/broom/afterattack(atom/A, mob/user, proximity)
- . = ..()
- if(!proximity)
- return
- sweep(user, A)
-
-/obj/item/twohanded/broom/proc/sweep(mob/user, atom/A)
-
- var/turf/current_item_loc = isturf(A) ? A : get_turf(A)
- if (!isturf(current_item_loc))
- return
- var/turf/new_item_loc = get_step(current_item_loc, user.dir)
- var/obj/machinery/disposal/bin/target_bin = locate(/obj/machinery/disposal/bin) in new_item_loc.contents
- var/i = 1
- for (var/obj/item/garbage in current_item_loc.contents)
- if (!garbage.anchored)
- if (target_bin)
- garbage.forceMove(target_bin)
- else
- garbage.Move(new_item_loc, user.dir)
- i++
- if (i > BROOM_PUSH_LIMIT)
- break
- if (i > 1)
- if (target_bin)
- target_bin.update_appearance(UPDATE_ICON)
- to_chat(user, span_notice("You sweep the pile of garbage into [target_bin]."))
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1)
-
-/obj/item/twohanded/broom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta
- J.put_in_cart(src, user)
- J.mybroom=src
- J.update_appearance(UPDATE_ICON)
-
-/obj/item/twohanded/broom/cyborg
- name = "robotic push broom"
-
-/obj/item/twohanded/broom/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
- to_chat(user, span_notice("You cannot place your [src] into the [J]"))
- return FALSE
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index 0ea32fd47df9..a23b145cde24 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -333,7 +333,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/wirerod/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/shard))
- var/obj/item/twohanded/spear/S = new /obj/item/twohanded/spear
+ var/obj/item/melee/spear/S = new /obj/item/melee/spear
remove_item_from_storage(user)
if (!user.transferItemToLoc(I, S))
@@ -588,7 +588,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/mounted_chainsaw/Destroy()
var/obj/item/bodypart/part
- new /obj/item/twohanded/required/chainsaw(get_turf(src))
+ new /obj/item/melee/chainsaw(get_turf(src))
if(iscarbon(loc))
var/mob/living/carbon/holder = loc
var/index = holder.get_held_index_of_item(src)
@@ -823,20 +823,3 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
to_chat(user, span_warning("[M] is too close to use [src] on."))
return
M.attack_hand(user)
-
-/obj/item/twohanded/required/raisedhands
- name = "raised hands"
- desc = "What are you, French?"
- icon = 'icons/obj/toy.dmi'
- icon_state = "latexballon"
- item_state = "nothing"
- force = 0
- throwforce = 0
- item_flags = DROPDEL | ABSTRACT
-
-/obj/item/twohanded/required/raisedhands/attack(mob/living/M, mob/living/user)
- return
-
-/obj/item/twohanded/required/raisedhands/dropped(mob/user)
- user.visible_message(span_userdanger(("[user] lowers their hands!")))
- ..()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index af6f0c163afc..3fc060b7b56d 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -136,7 +136,7 @@
new /obj/item/clothing/shoes/sneakers/white(src)
new /obj/item/radio/headset/headset_medcargo(src)
new /obj/item/clothing/mask/gas/explorer(src)
- new /obj/item/twohanded/binoculars(src)
+ new /obj/item/binoculars(src)
new /obj/item/pinpointer/crew(src)
new /obj/item/sensor_device(src)
new /obj/item/bodybag/environmental(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 8658b81c86f5..12a29dddd2fe 100755
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -178,7 +178,7 @@
new /obj/item/clothing/suit/armor/vest/det_suit(src)
new /obj/item/storage/belt/holster/full(src)
new /obj/item/pinpointer/crew(src)
- new /obj/item/twohanded/binoculars(src)
+ new /obj/item/binoculars(src)
new /obj/item/storage/backpack/duffelbag/clothing/sec/detective(src)
new /obj/item/barrier_taperoll/police(src)
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index 5569b85082ee..c584efd74012 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -10,9 +10,9 @@
integrity_failure = 50
var/locked = TRUE
var/open = FALSE
- var/obj/item/twohanded/fireaxe/fireaxe
+ var/obj/item/fireaxe/fireaxe
var/obj/item/card/id/captains_spare/spareid
- var/obj/item/twohanded/fishingrod/collapsible/miningmedic/olreliable //what the fuck?
+ var/obj/item/fishingrod/collapsible/miningmedic/olreliable //what the fuck?
var/alert = TRUE
var/axe = TRUE
@@ -66,9 +66,9 @@
//yogs end
else if(open || broken)
//Fireaxe cabinet is open or broken, so we can access it's axe slot
- if(istype(I, /obj/item/twohanded/fireaxe) && !fireaxe && axe)
- var/obj/item/twohanded/fireaxe/F = I
- if(F.wielded)
+ if(istype(I, /obj/item/fireaxe) && !fireaxe && axe)
+ var/obj/item/fireaxe/F = I
+ if(HAS_TRAIT(F, TRAIT_WIELDED))
to_chat(user, span_warning("Unwield the [F.name] first."))
return
if(!user.transferItemToLoc(F, src))
@@ -85,8 +85,8 @@
to_chat(user, span_caution("You place the [S.name] back in the [name]."))
update_appearance(UPDATE_ICON)
return
- else if(istype(I, /obj/item/twohanded/fishingrod/collapsible/miningmedic) && !olreliable && !axe)
- var/obj/item/twohanded/fishingrod/collapsible/miningmedic/R = I
+ else if(istype(I, /obj/item/fishingrod/collapsible/miningmedic) && !olreliable && !axe)
+ var/obj/item/fishingrod/collapsible/miningmedic/R = I
if(R.opened)
to_chat(user, span_caution("[R.name] won't seem to fit!"))
return
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 93a4cacd3c57..678e3983b9d8 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -305,7 +305,7 @@
icon_state = "fullgrass_[rand(1, 3)]"
. = ..()
-/obj/item/twohanded/required/kirbyplants
+/obj/item/kirbyplants
name = "potted plant"
icon = 'icons/obj/flora/plants.dmi'
icon_state = "plant-01"
@@ -317,23 +317,24 @@
throw_speed = 2
throw_range = 4
-/obj/item/twohanded/required/kirbyplants/Initialize(mapload)
+/obj/item/kirbyplants/Initialize(mapload)
. = ..()
+ AddComponent(/datum/component/two_handed, require_twohands = TRUE)
AddComponent(/datum/component/tactical)
-/obj/item/twohanded/required/kirbyplants/random
+/obj/item/kirbyplants/random
icon = 'icons/obj/flora/_flora.dmi'
icon_state = "random_plant"
var/list/static/states
-/obj/item/twohanded/required/kirbyplants/random/Initialize(mapload)
+/obj/item/kirbyplants/random/Initialize(mapload)
. = ..()
icon = 'icons/obj/flora/plants.dmi'
if(!states)
generate_states()
icon_state = pick(states)
-/obj/item/twohanded/required/kirbyplants/random/proc/generate_states()
+/obj/item/kirbyplants/random/proc/generate_states()
states = list()
for(var/i in 1 to 34) //yogs changed 25 plants to 34
var/number
@@ -345,19 +346,19 @@
states += "applebush"
-/obj/item/twohanded/required/kirbyplants/dead
+/obj/item/kirbyplants/dead
name = "RD's potted plant"
desc = "A gift from the botanical staff, presented after the RD's reassignment. There's a tag on it that says \"Y'all come back now, y'hear?\"\nIt doesn't look very healthy..."
icon_state = "plant-25"
-/obj/item/twohanded/required/kirbyplants/photosynthetic
+/obj/item/kirbyplants/photosynthetic
name = "photosynthetic potted plant"
desc = "A bioluminescent plant."
icon_state = "plant-09"
light_color = "#2cb2e8"
light_range = 3
-/obj/item/twohanded/required/kirbyplants/Initialize(mapload)
+/obj/item/kirbyplants/Initialize(mapload)
. = ..()
AddComponent(/datum/component/storage/concrete/kirbyplants)
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index e6923a09f890..5fd05218b157 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -99,7 +99,7 @@
uniform = /obj/item/clothing/under/tribal
head = /obj/item/clothing/head/helmet/skull
suit = /obj/item/clothing/suit/armor/bone/heavy
- back = /obj/item/twohanded/bonespear
+ back = /obj/item/melee/spear/bonespear
gloves = /obj/item/clothing/gloves/bracer
belt = /obj/item/storage/belt/mining/primitive
shoes = /obj/item/clothing/shoes/xeno_wraps
@@ -111,7 +111,7 @@
uniform = /obj/item/clothing/under/ash_robe/chief
head = /obj/item/clothing/head/crown/resin
suit = /obj/item/clothing/suit/armor/bone
- back = /obj/item/twohanded/bonespear/chitinspear
+ back = /obj/item/melee/spear/bonespear/chitinspear
gloves = /obj/item/clothing/gloves/color/black/goliath
shoes = /obj/item/clothing/shoes/xeno_wraps/goliath
neck = /obj/item/clothing/neck/cloak/tribalmantle
diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm
index 7aeaefa09634..a696e0681bd2 100644
--- a/code/game/objects/structures/headpike.dm
+++ b/code/game/objects/structures/headpike.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/structures.dmi'
density = FALSE
anchored = TRUE
- var/obj/item/twohanded/spear/spear
+ var/obj/item/melee/spear/spear
var/obj/item/bodypart/head/victim
/obj/structure/headpike/glass //for regular spears
@@ -23,15 +23,15 @@
update_appearance(UPDATE_ICON)
/obj/structure/headpike/glass/CheckParts(list/parts_list)
- spear = locate(/obj/item/twohanded/spear) in parts_list
+ spear = locate(/obj/item/melee/spear) in parts_list
..()
/obj/structure/headpike/bone/CheckParts(list/parts_list)
- spear = locate(/obj/item/twohanded/bonespear) in parts_list
+ spear = locate(/obj/item/melee/spear/bonespear) in parts_list
..()
/obj/structure/headpike/bamboo/CheckParts(list/parts_list)
- spear = locate(/obj/item/twohanded/bamboospear) in parts_list
+ spear = locate(/obj/item/melee/spear/bamboospear) in parts_list
..()
/obj/structure/headpike/Initialize(mapload)
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 1a3387d984cb..c3f0083b70e6 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -9,7 +9,7 @@
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
var/obj/item/storage/bag/trash/mybag
var/obj/item/mop/mymop
- var/obj/item/twohanded/broom/mybroom
+ var/obj/item/broom/mybroom
var/obj/item/reagent_containers/spray/cleaner/myspray
var/obj/item/lightreplacer/myreplacer
var/obj/item/paint/paint_remover/myremover
@@ -94,9 +94,9 @@
l.janicart_insert(user,src)
else
to_chat(user, fail_msg)
- else if(istype(I, /obj/item/twohanded/broom))
+ else if(istype(I, /obj/item/broom))
if(!mybroom)
- var/obj/item/twohanded/broom/b=I
+ var/obj/item/broom/b=I
b.janicart_insert(user,src)
else
to_chat(user, fail_msg)
diff --git a/code/game/objects/structures/mjollnir.dm b/code/game/objects/structures/mjollnir.dm
index 98b4707e64bf..45665b1efebd 100644
--- a/code/game/objects/structures/mjollnir.dm
+++ b/code/game/objects/structures/mjollnir.dm
@@ -16,7 +16,7 @@
to_chat(user, span_notice("You place your hands firmly around the handle of the hammer but feel it resist the pull of a nonmagical host! This will take a while."))
if(do_after(user, pull_time * (user.mind.assigned_role == ROLE_WIZARD || user.mind.special_role == ROLE_WIZARD ? 1 : 2), src)) //if it is a wizard, it takes normal time
to_chat(user, span_userdanger("You successfully free Mjolnir from the ground and can feel its power returning once more!")) //if it's crew, it takes twice as long
- var/obj/item/twohanded/mjollnir/M = new /obj/item/twohanded/mjollnir
+ var/obj/item/mjolnir/M = new /obj/item/mjolnir
playsound(user, 'sound/magic/lightningbolt.ogg', 50, 1) //keep this at 50 for half volume it's so fucking loud
user.put_in_hands(M) //firmly grasp it
qdel(src) //byebye
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 0bdf3d8c713f..f731c9115fd5 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -826,7 +826,7 @@
stage = GIBTONITE_DETONATE
explosion(bombturf,1,2,5, adminlog = 0)
if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
- var/obj/item/twohanded/required/gibtonite/G = new (src)
+ var/obj/item/melee/gibtonite/G = new (src)
if(det_time <= 0)
G.quality = 3
G.icon_state = "Gibtonite ore 3"
diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm
index 796fe71a52d3..8407b937aaff 100644
--- a/code/game/turfs/simulated/wall/mineral_walls.dm
+++ b/code/game/turfs/simulated/wall/mineral_walls.dm
@@ -148,7 +148,7 @@
/turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user)
if(W.is_sharp() && W.force)
var/duration = (48/W.force) * 2 //In seconds, for now.
- if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/twohanded/fireaxe))
+ if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/fireaxe))
duration /= 4 //Much better with hatchets and axes.
if(do_after(user, duration*10, src)) //Into deciseconds.
dismantle_wall(FALSE,FALSE)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 7dd6c1b46906..e63c25cd1f3b 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -187,7 +187,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
target.zImpact(A, levels)
return TRUE
-/turf/proc/handleRCL(obj/item/twohanded/rcl/C, mob/user)
+/turf/proc/handleRCL(obj/item/rcl/C, mob/user)
if(C.loaded)
for(var/obj/structure/cable/LC in src)
if(!LC.d1 || !LC.d2)
@@ -210,7 +210,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
coil.place_turf(src, user)
return TRUE
- else if(istype(C, /obj/item/twohanded/rcl))
+ else if(istype(C, /obj/item/rcl))
handleRCL(C, user)
return FALSE
diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm
index 4d03bdd61615..c444519e7ae1 100644
--- a/code/modules/admin/fun_balloon.dm
+++ b/code/modules/admin/fun_balloon.dm
@@ -126,7 +126,7 @@
L.forceMove(LA)
L.remove_status_effect(/datum/status_effect/hallucination)
to_chat(L, "The battle is won. Your bloodlust subsides.")
- for(var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw in L)
+ for(var/obj/item/melee/chainsaw/doomslayer/chainsaw in L)
qdel(chainsaw)
else
to_chat(L, "You are not yet worthy of passing. Drag a severed head to the barrier to be allowed entry to the hall of champions.")
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index d02738d80ecd..15916f9e5423 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -103,34 +103,34 @@ GLOBAL_PROTECT(LastAdminCalledProc)
GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention)
GLOBAL_PROTECT(AdminProcCallSpamPrevention)
+
+/// Wrapper for proccalls where the datum is flagged as vareditted
/proc/WrapAdminProcCall(datum/target, procname, list/arguments)
- if(target != GLOBAL_PROC && procname == "Del")
- to_chat(usr, span_warning("Calling Del() is not allowed"), confidential=TRUE)
+ SIGNAL_HANDLER
+ if(target && procname == "Del")
+ to_chat(usr, "Calling Del() is not allowed", confidential = TRUE)
return
-
if(target != GLOBAL_PROC && !target.CanProcCall(procname))
to_chat(usr, "Proccall on [target.type]/proc/[procname] is disallowed!", confidential=TRUE)
return
+
var/current_caller = GLOB.AdminProcCaller
- var/ckey = usr ? usr.client.ckey : GLOB.AdminProcCaller
- if(!ckey)
+ var/user_identifier = usr ? usr.client?.ckey : GLOB.AdminProcCaller
+ if(!user_identifier)
CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]")
- if(current_caller && current_caller != ckey)
- if(!GLOB.AdminProcCallSpamPrevention[ckey])
- to_chat(usr, span_adminnotice("Another set of admin called procs are still running, your proc will be run after theirs finish."), confidential=TRUE)
- GLOB.AdminProcCallSpamPrevention[ckey] = TRUE
- UNTIL(!GLOB.AdminProcCaller)
- to_chat(usr, span_adminnotice("Running your proc"), confidential=TRUE)
- GLOB.AdminProcCallSpamPrevention -= ckey
- else
- UNTIL(!GLOB.AdminProcCaller)
+ if(current_caller && current_caller != user_identifier)
+ to_chat(usr, span_adminnotice("Another set of admin called procs are still running. Try again later."), confidential = TRUE)
+ return
+
GLOB.LastAdminCalledProc = procname
if(target != GLOBAL_PROC)
- GLOB.LastAdminCalledTargetRef = "[REF(target)]"
- GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you
+ GLOB.LastAdminCalledTargetRef = REF(target)
+
+ GLOB.AdminProcCaller = user_identifier //if this runtimes, too bad for you
++GLOB.AdminProcCallCount
. = world.WrapAdminProcCall(target, procname, arguments)
- if(--GLOB.AdminProcCallCount == 0)
+ GLOB.AdminProcCallCount--
+ if(GLOB.AdminProcCallCount == 0)
GLOB.AdminProcCaller = null
//adv proc call this, ya nerds
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 9e01314bf471..06b2fe749d1b 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -792,7 +792,7 @@
var/turf/T = get_turf(user)
qdel(src)
var/datum/action/innate/cult/spear/S = new(user)
- var/obj/item/twohanded/cult_spear/rite = new(T)
+ var/obj/item/cult_spear/rite = new(T)
S.Grant(user, rite)
rite.spear_act = S
if(user.put_in_hands(rite))
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 1ae73e4be031..948206ec059d 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -89,7 +89,7 @@
user.apply_damage(30, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
user.dropItemToGround(src)
-/obj/item/twohanded/required/cult_bastard
+/obj/item/melee/cult_bastard
name = "bloody bastard sword"
desc = "An enormous sword used by Nar'sien cultists to rapidly harvest the souls of non-believers."
w_class = WEIGHT_CLASS_HUGE
@@ -120,30 +120,33 @@
var/spin_cooldown = 25 SECONDS
var/dash_toggled = TRUE
-/obj/item/twohanded/required/cult_bastard/Initialize(mapload)
+/obj/item/melee/cult_bastard/Initialize(mapload)
. = ..()
+ AddComponent(/datum/component/two_handed, \
+ require_twohands = TRUE, \
+ )
jaunt = new(src)
linked_action = new(src)
AddComponent(/datum/component/butchering, 50, 80)
-/obj/item/twohanded/required/cult_bastard/examine(mob/user)
+/obj/item/melee/cult_bastard/examine(mob/user)
. = ..()
if(contents.len)
. += "There are [contents.len] souls trapped within the sword's core."
else
. += "The sword appears to be quite lifeless."
-/obj/item/twohanded/required/cult_bastard/can_be_pulled(user)
+/obj/item/cult_bastard/can_be_pulled(user)
return FALSE
-/obj/item/twohanded/required/cult_bastard/attack_self(mob/user)
+/obj/item/melee/cult_bastard/attack_self(mob/user)
dash_toggled = !dash_toggled
if(dash_toggled)
to_chat(loc, span_notice("You raise [src] and prepare to jaunt with it."))
else
to_chat(loc, span_notice("You lower [src] and prepare to swing it normally."))
-/obj/item/twohanded/required/cult_bastard/pickup(mob/living/user)
+/obj/item/melee/cult_bastard/pickup(mob/living/user)
. = ..()
if(!iscultist(user))
if(!is_servant_of_ratvar(user))
@@ -163,20 +166,20 @@
linked_action.Grant(user, src)
user.update_icons()
-/obj/item/twohanded/required/cult_bastard/dropped(mob/user)
+/obj/item/melee/cult_bastard/dropped(mob/user)
. = ..()
linked_action.Remove(user)
jaunt.Remove(user)
user.update_icons()
-/obj/item/twohanded/required/cult_bastard/IsReflect()
+/obj/item/melee/cult_bastard/IsReflect()
if(spinning)
playsound(src, pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg', 'sound/weapons/effects/ric3.ogg', 'sound/weapons/effects/ric4.ogg', 'sound/weapons/effects/ric5.ogg'), 100, 1)
return TRUE
else
..()
-/obj/item/twohanded/required/cult_bastard/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+/obj/item/melee/cult_bastard/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(prob(final_block_chance))
if(attack_type == PROJECTILE_ATTACK)
owner.visible_message(span_danger("[owner] deflects [attack_text] with [src]!"))
@@ -188,7 +191,7 @@
return TRUE
return FALSE
-/obj/item/twohanded/required/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters)
+/obj/item/melee/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters)
. = ..()
if(dash_toggled && !proximity)
jaunt.Teleport(user, target)
@@ -233,7 +236,7 @@
button_icon_state = "sintouch"
var/cooldown = 0
var/mob/living/carbon/human/holder
- var/obj/item/twohanded/required/cult_bastard/sword
+ var/obj/item/melee/cult_bastard/sword
/datum/action/innate/cult/spin2win/Grant(mob/user, obj/bastard)
. = ..()
@@ -662,60 +665,68 @@ GLOBAL_VAR_INIT(curselimit, 0)
to_chat(user, span_warning("\The [src] can only transport items!"))
-/obj/item/twohanded/cult_spear
+/obj/item/cult_spear
name = "blood halberd"
desc = "A sickening spear composed entirely of crystallized blood."
icon = 'icons/obj/weapons/spears.dmi'
icon_state = "bloodspear0"
+ base_icon_state = "bloodspear"
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
slot_flags = 0
force = 12
- force_wielded = 16
throwforce = 35
throw_speed = 2
armour_penetration = 20
weapon_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 1, DAMAGE_LOW = 2, DAMAGE_HIGH = 5)
- wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0.4, ENCUMBRANCE_TIME = 5, REACH = 2, DAMAGE_LOW = 2, DAMAGE_HIGH = 5)
attack_verb = list("attacked", "impaled", "stabbed", "torn", "gored")
sharpness = SHARP_POINTY
hitsound = 'sound/weapons/bladeslice.ogg'
var/datum/action/innate/cult/spear/spear_act
-/obj/item/twohanded/cult_spear/Initialize(mapload)
+/obj/item/cult_spear/Initialize(mapload)
. = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 12, \
+ force_wielded = 16, \
+ icon_wielded = "[base_icon_state]1", \
+ wielded_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0.4, ENCUMBRANCE_TIME = 5, REACH = 2, DAMAGE_LOW = 2, DAMAGE_HIGH = 5), \
+ )
AddComponent(/datum/component/butchering, 100, 90)
-/obj/item/twohanded/cult_spear/Destroy()
+/obj/item/cult_spear/Destroy()
if(spear_act)
qdel(spear_act)
..()
-/obj/item/twohanded/cult_spear/update_icon_state()
+/obj/item/cult_spear/update_icon_state()
. = ..()
- icon_state = "bloodspear[wielded]"
+ icon_state = "[base_icon_state]0"
-/obj/item/twohanded/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- var/turf/T = get_turf(hit_atom)
- if(isliving(hit_atom))
- var/mob/living/L = hit_atom
- if(iscultist(L))
- playsound(src, 'sound/weapons/throwtap.ogg', 50)
- if(L.put_in_active_hand(src))
- L.visible_message(span_warning("[L] catches [src] out of the air!"))
- else
- L.visible_message(span_warning("[src] bounces off of [L], as if repelled by an unseen force!"))
- else if(!..())
- if(!L.anti_magic_check())
- if(is_servant_of_ratvar(L))
- L.Paralyze(20)
- else
- L.Paralyze(10)
- break_spear(T)
- else
- ..()
+/obj/item/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ if(!isliving(hit_atom))
+ return ..()
+
+ var/mob/living/L = hit_atom
+ if(iscultist(L))
+ playsound(src, 'sound/weapons/throwtap.ogg', 50)
+ if(L.put_in_active_hand(src))
+ L.visible_message(span_warning("[L] catches [src] out of the air!"))
+ else
+ L.visible_message(span_warning("[src] bounces off of [L], as if repelled by an unseen force!"))
+ return
+
+ . = ..()
+ if(.)
+ return
+ if(!L.anti_magic_check())
+ if(is_servant_of_ratvar(L))
+ L.Paralyze(20)
+ else
+ L.Paralyze(10)
+ break_spear(get_turf(hit_atom))
-/obj/item/twohanded/cult_spear/proc/break_spear(turf/T)
+/obj/item/cult_spear/proc/break_spear(turf/T)
if(src)
if(!T)
T = get_turf(src)
@@ -734,7 +745,7 @@ GLOBAL_VAR_INIT(curselimit, 0)
button_icon_state = "bloodspear"
default_button_position = "6:157,4:-2"
- var/obj/item/twohanded/cult_spear/spear
+ var/obj/item/cult_spear/spear
var/cooldown = 0
/datum/action/innate/cult/spear/Grant(mob/user, obj/blood_spear)
diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm
index 45bd95f03ac1..8219ad234158 100644
--- a/code/modules/antagonists/fugitive/fugitive_outfits.dm
+++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm
@@ -5,7 +5,7 @@
r_pocket = /obj/item/kitchen/knife/carrotshiv
var/list/rhand_items = list(
/obj/item/storage/toolbox/mechanical,
- /obj/item/twohanded/spear,
+ /obj/item/melee/spear,
/obj/item/gun/ballistic/automatic/surplus,
/obj/item/melee/baton/cattleprod
) //Prisoners get a random item from this list
diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm
index a1ea599bf96b..51de65512872 100644
--- a/code/modules/antagonists/revolution/revolution.dm
+++ b/code/modules/antagonists/revolution/revolution.dm
@@ -458,5 +458,5 @@
uniform = /obj/item/clothing/under/yogs/soviet_dress_uniform
head = /obj/item/clothing/head/ushanka
gloves = /obj/item/clothing/gloves/color/black
- l_hand = /obj/item/twohanded/spear
+ l_hand = /obj/item/melee/spear
r_hand = /obj/item/assembly/flash
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index a8d38d361538..fa3fdf8a3742 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -272,7 +272,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), ITEM_SLOT_FEET)
H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE)
H.put_in_hands(new /obj/item/claymore(H), TRUE)
- H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), ITEM_SLOT_BACK)
+ H.equip_to_slot_or_del(new /obj/item/melee/spear(H), ITEM_SLOT_BACK)
/obj/item/voodoo
diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm
index 0cd5736bba0c..c7568497afc4 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm
@@ -92,13 +92,13 @@
/datum/spellbook_entry/item/mjolnir
name = "Mjolnir"
desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power."
- item_path = /obj/item/twohanded/mjollnir
+ item_path = /obj/item/mjolnir
category = "Offensive"
/datum/spellbook_entry/item/singularity_hammer
name = "Singularity Hammer"
desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact."
- item_path = /obj/item/twohanded/singularityhammer
+ item_path = /obj/item/singularityhammer
category = "Offensive"
/datum/spellbook_entry/item/spellblade
@@ -110,6 +110,6 @@
/datum/spellbook_entry/item/highfrequencyblade
name = "High Frequency Blade"
desc = "An incredibly swift enchanted blade resonating at a frequency high enough to be able to slice through anything."
- item_path = /obj/item/twohanded/vibro_weapon/wizard
+ item_path = /obj/item/vibro_weapon/wizard
category = "Offensive"
cost = 3
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 31e7d7fa5d59..01b5e24f6f59 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -9,7 +9,7 @@
-/obj/item/twohanded/ctf
+/obj/item/ctf_flag
name = "banner"
icon = 'icons/obj/banners.dmi'
icon_state = "banner"
@@ -31,16 +31,16 @@
var/obj/effect/ctf/flag_reset/reset
var/reset_path = /obj/effect/ctf/flag_reset
-/obj/item/twohanded/ctf/Destroy()
+/obj/item/ctf_flag/Destroy()
QDEL_NULL(reset)
return ..()
-/obj/item/twohanded/ctf/Initialize(mapload)
+/obj/item/ctf_flag/Initialize(mapload)
. = ..()
if(!reset)
reset = new reset_path(get_turf(src))
-/obj/item/twohanded/ctf/process()
+/obj/item/ctf_flag/process()
if(is_ctf_target(loc)) //don't reset from someone's hands.
return PROCESS_KILL
if(world.time > reset_cooldown)
@@ -52,7 +52,7 @@
STOP_PROCESSING(SSobj, src)
//ATTACK HAND IGNORING PARENT RETURN VALUE
-/obj/item/twohanded/ctf/attack_hand(mob/living/user)
+/obj/item/ctf_flag/attack_hand(mob/living/user)
if(!is_ctf_target(user) && !anyonecanpickup)
to_chat(user, "Non players shouldn't be moving the flag!")
return
@@ -76,7 +76,7 @@
STOP_PROCESSING(SSobj, src)
..()
-/obj/item/twohanded/ctf/dropped(mob/user)
+/obj/item/ctf_flag/dropped(mob/user)
..()
user.anchored = FALSE
user.status_flags |= CANPUSH
@@ -89,7 +89,7 @@
anchored = TRUE
-/obj/item/twohanded/ctf/red
+/obj/item/ctf_flag/red
name = "red flag"
icon_state = "banner-red"
item_state = "banner-red"
@@ -98,7 +98,7 @@
reset_path = /obj/effect/ctf/flag_reset/red
-/obj/item/twohanded/ctf/blue
+/obj/item/ctf_flag/blue
name = "blue flag"
icon_state = "banner-blue"
item_state = "banner-blue"
@@ -279,8 +279,8 @@
attack_ghost(ghost)
/obj/machinery/capture_the_flag/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/twohanded/ctf))
- var/obj/item/twohanded/ctf/flag = I
+ if(istype(I, /obj/item/ctf_flag))
+ var/obj/item/ctf_flag/flag = I
if(flag.team != src.team)
user.transferItemToLoc(flag, get_turf(flag.reset), TRUE)
points++
@@ -297,7 +297,7 @@
if(istype(mob_area, /area/ctf))
to_chat(M, "[team] team wins!")
to_chat(M, span_userdanger("Teams have been cleared. Click on the machines to vote to begin another round."))
- for(var/obj/item/twohanded/ctf/W in M)
+ for(var/obj/item/ctf_flag/W in M)
M.dropItemToGround(W)
M.dust()
for(var/obj/machinery/control_point/control in GLOB.machines)
@@ -338,7 +338,7 @@
var/list/ctf_object_typecache = typecacheof(list(
/obj/machinery,
/obj/effect/ctf,
- /obj/item/twohanded/ctf
+ /obj/item/ctf_flag
))
for(var/atm in A)
if (isturf(A) || ismob(A) || isarea(A))
diff --git a/code/modules/awaymissions/mission_code/mining.dm b/code/modules/awaymissions/mission_code/mining.dm
index 6a74b4522a3a..2be2b71b6922 100644
--- a/code/modules/awaymissions/mission_code/mining.dm
+++ b/code/modules/awaymissions/mission_code/mining.dm
@@ -163,7 +163,7 @@
name = "Kinetic Crusher Chest"
desc = "Contains an assortment of kinetic crusher equipment."
respawn_loot = list(
- /obj/item/twohanded/kinetic_crusher=1,
+ /obj/item/kinetic_crusher=1,
/obj/item/crusher_trophy/vortex_talisman=1,
/obj/item/crusher_trophy/demon_claws=1,
/obj/item/crusher_trophy/tail_spike=1,
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index 81a01c7a101b..0f09fe7b60b2 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -516,11 +516,11 @@
/obj/effect/spawner/lootdrop/snowdin/dungeonheavy
name = "dungeon heavy"
- loot = list(/obj/item/twohanded/singularityhammer = 25,
- /obj/item/twohanded/mjollnir = 10,
- /obj/item/twohanded/fireaxe = 25,
+ loot = list(/obj/item/singularityhammer = 25,
+ /obj/item/mjolnir = 10,
+ /obj/item/fireaxe = 25,
/obj/item/organ/brain/alien = 17,
- /obj/item/twohanded/dualsaber = 15,
+ /obj/item/melee/dualsaber = 15,
/obj/item/organ/heart/demon = 7,
/obj/item/gun/ballistic/automatic/c20r/unrestricted = 16,
/obj/item/gun/magic/wand/resurrection/inert = 15,
@@ -541,7 +541,7 @@
loot = list(/obj/item/stack/sheet/mineral/snow{amount = 25} = 10,
/obj/item/toy/snowball = 15,
/obj/item/shovel = 10,
- /obj/item/twohanded/spear = 8,
+ /obj/item/melee/spear = 8,
)
//special items//--
diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm
index 080eaaea724a..188b472963f3 100644
--- a/code/modules/cargo/bounties/assistant.dm
+++ b/code/modules/cargo/bounties/assistant.dm
@@ -35,7 +35,7 @@
description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears."
reward = 2000
required_count = 5
- wanted_types = list(/obj/item/twohanded/spear)
+ wanted_types = list(/obj/item/melee/spear)
/datum/bounty/item/assistant/toolbox
name = "Toolboxes"
@@ -68,7 +68,7 @@
description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream."
reward = 3500
required_count = 5
- wanted_types = list(/obj/item/twohanded/required/baseball_bat)
+ wanted_types = list(/obj/item/melee/baseball_bat)
/datum/bounty/item/assistant/extendohand
name = "Extendo-Hand"
@@ -150,7 +150,7 @@
description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants."
reward = 2000
required_count = 8
- wanted_types = list(/obj/item/twohanded/required/kirbyplants)
+ wanted_types = list(/obj/item/kirbyplants)
/datum/bounty/item/assistant/earmuffs
name = "Earmuffs"
@@ -176,7 +176,7 @@
name = "Chainsaw"
description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please."
reward = 2500
- wanted_types = list(/obj/item/twohanded/required/chainsaw)
+ wanted_types = list(/obj/item/melee/chainsaw)
/datum/bounty/item/assistant/ied
name = "IED"
diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm
index e907263cb8a6..a2dad0de195f 100644
--- a/code/modules/cargo/bounties/engineering.dm
+++ b/code/modules/cargo/bounties/engineering.dm
@@ -70,7 +70,7 @@
description = "Nanotrasen is requiring new axes to be made. Ship them some metallic hydrogen helmets."
reward = 7500
required_count = 3
- wanted_types = list(/obj/item/twohanded/fireaxe/metal_h2_axe)
+ wanted_types = list(/obj/item/fireaxe/metal_h2_axe)
/datum/bounty/item/supermatter_silver
name = "Supermatter Silvers"
diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm
index fd757cab241f..d9c8602660b6 100644
--- a/code/modules/cargo/bounties/mining.dm
+++ b/code/modules/cargo/bounties/mining.dm
@@ -22,7 +22,7 @@
name = "Bone Axe"
description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement."
reward = 7500
- wanted_types = list(/obj/item/twohanded/fireaxe/boneaxe)
+ wanted_types = list(/obj/item/fireaxe/boneaxe)
/datum/bounty/item/mining/bone_bow
name = "Bone Bow"
diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm
index d056cdb28c3b..95d4cb6996f6 100644
--- a/code/modules/cargo/exports/lavaland.dm
+++ b/code/modules/cargo/exports/lavaland.dm
@@ -39,7 +39,7 @@
/obj/item/clothing/under/drip, //Drip is very valuable to many investors in high fashion
/obj/item/clothing/shoes/drip,
/obj/item/gun/energy/plasmacutter/adv/robocutter,
- /obj/item/twohanded/bonespear/stalwartpike)
+ /obj/item/melee/spear/bonespear/stalwartpike)
//Megafauna loot, except for stalwart, ash drakes, and legion
diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm
index 6e5cd533033d..ed290227e2a3 100644
--- a/code/modules/cargo/exports/weapons.dm
+++ b/code/modules/cargo/exports/weapons.dm
@@ -73,4 +73,4 @@
/datum/export/weapon/gibtonite
cost = 1000
unit_name = "Gibtonite Chunk"
- export_types = list(/obj/item/twohanded/required/gibtonite)
+ export_types = list(/obj/item/melee/gibtonite)
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 32d40865f650..59f74be474bc 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1831,7 +1831,7 @@
/obj/item/reagent_containers/glass/bucket,
/obj/item/reagent_containers/glass/bucket,
/obj/item/mop,
- /obj/item/twohanded/broom,
+ /obj/item/broom,
/obj/item/clothing/suit/caution,
/obj/item/clothing/suit/caution,
/obj/item/clothing/suit/caution,
@@ -2283,11 +2283,11 @@
name = "Potted Plants Crate"
desc = "Spruce up the station with these lovely plants! Contains a random assortment of five potted plants from Nanotrasen's potted plant research division. Warranty void if thrown."
cost = 700
- contains = list(/obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random,
- /obj/item/twohanded/required/kirbyplants/random)
+ contains = list(/obj/item/kirbyplants/random,
+ /obj/item/kirbyplants/random,
+ /obj/item/kirbyplants/random,
+ /obj/item/kirbyplants/random,
+ /obj/item/kirbyplants/random)
crate_name = "potted plants crate"
crate_type = /obj/structure/closet/crate/hydroponics
diff --git a/code/modules/clothing/outfits/imperial.dm b/code/modules/clothing/outfits/imperial.dm
index 264e5c04a55c..9a60ee5d8f33 100644
--- a/code/modules/clothing/outfits/imperial.dm
+++ b/code/modules/clothing/outfits/imperial.dm
@@ -143,7 +143,7 @@
new /obj/item/reagent_containers/autoinjector/medipen(src)
new /obj/item/restraints/handcuffs/cable/zipties(src)
new /obj/item/jawsoflife/jimmy(src)
- new /obj/item/twohanded/binoculars(src)
+ new /obj/item/binoculars(src)
/obj/item/storage/belt/military/imperial/sergeant/Initialize(mapload) // Sergeant
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index eee636bc41d0..5e24db298e40 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -126,7 +126,7 @@
l_pocket = /obj/item/reagent_containers/food/snacks/grown/banana
r_pocket = /obj/item/bikehorn
id = /obj/item/card/id
- r_hand = /obj/item/twohanded/fireaxe
+ r_hand = /obj/item/fireaxe
/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
@@ -152,7 +152,7 @@
suit = /obj/item/clothing/suit/apron
l_pocket = /obj/item/kitchen/knife
r_pocket = /obj/item/scalpel
- r_hand = /obj/item/twohanded/fireaxe
+ r_hand = /obj/item/fireaxe
/datum/outfit/psycho/post_equip(mob/living/carbon/human/H)
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 0771eb245110..0a7d42b83ab3 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -430,7 +430,7 @@
hardsuit_type = "syndi"
w_class = WEIGHT_CLASS_NORMAL
armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 25, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, WOUND = 25)
- allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/twohanded/fireaxe/energy)
+ allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/fireaxe/energy)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
jetpack = /obj/item/tank/jetpack/suit
@@ -1209,7 +1209,7 @@
item_state = "advpa1_hardsuit"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/powerarmor_advanced
hardsuit_type = "advancedpa1"
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/twohanded/kinetic_crusher, /obj/item/pickaxe, /obj/item/pickaxe/drill/jackhammer, /obj/item/shield/riot/goliath, /obj/item/shield/riot/roman)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/kinetic_crusher, /obj/item/pickaxe, /obj/item/pickaxe/drill/jackhammer, /obj/item/shield/riot/goliath, /obj/item/shield/riot/roman)
armor = list(MELEE = 50, BULLET = 10, LASER = 25, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 10, WOUND = 0)
slowdown = 0
strip_delay = 180
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 13adea2c2404..1500e7d0059e 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -144,7 +144,7 @@
/obj/item/clothing/suit/armor/bone
name = "bone armor"
desc = "A mass of bones wrapped together into a protective shell. Not as effective as modern protection, but it still offers notable protection."
- allowed = list (/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/tank/internals/ipc_coolant, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
+ allowed = list (/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/tank/internals/ipc_coolant, /obj/item/melee/spear, /obj/item/melee/spear/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
icon_state = "bonearmor"
item_state = "bonearmor"
blood_overlay_type = "armor"
@@ -163,7 +163,7 @@
/obj/item/clothing/suit/armor/tribalcoat
name = "tribal coat"
desc = "A light, yet tough leather coat, reinforced with bone pauldrons. Often worn by tribal leaders."
- allowed = list (/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/tank/internals/ipc_coolant, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
+ allowed = list (/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/tank/internals/ipc_coolant, /obj/item/melee/spear, /obj/item/melee/spear/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
icon_state = "tribalcoat"
item_state = "tribalcoat"
blood_overlay_type = "armor"
@@ -174,7 +174,7 @@
/obj/item/clothing/suit/armor/pathfinder
name = "pathfinder cloak"
desc = "A thick cloak woven from sinew and hides, designed to protect its wearer from hazardous weather."
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/melee/spear, /obj/item/melee/spear/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
icon_state = "pathcloak"
item_state = "pathcloak"
armor = list(MELEE = 30, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 15)
@@ -344,7 +344,7 @@
name = "goliath cloak"
icon_state = "goliath_cloak"
desc = "A staunch, practical cape made out of numerous monster materials. It is coveted amongst exiles and hermits."
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/melee/spear, /obj/item/melee/spear/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 35, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
resistance_flags = FIRE_PROOF
hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
@@ -380,7 +380,7 @@
name = "drake armour"
icon_state = "dragon"
desc = "A suit of armour fashioned from the remains of an ash drake."
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/melee/spear, /obj/item/melee/spear/bonespear, /obj/item/claymore/bone, /obj/item/gun/ballistic/bow, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat)
armor = list(MELEE = 70, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 60, BIO = 60, RAD = 50, FIRE = 100, ACID = 100)
hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
index 43f6a6d66fa3..15f8468282a9 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
@@ -149,7 +149,7 @@
/datum/crafting_recipe/food/baseballburger
name = "Home Run Baseball Burger"
reqs = list(
- /obj/item/twohanded/required/baseball_bat = 1,
+ /obj/item/melee/baseball_bat = 1,
/obj/item/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/reagent_containers/food/snacks/burger/baseball
diff --git a/code/modules/goals/station_goals/bluespace_tap.dm b/code/modules/goals/station_goals/bluespace_tap.dm
index e91795e7a065..0caca8c1b0f1 100644
--- a/code/modules/goals/station_goals/bluespace_tap.dm
+++ b/code/modules/goals/station_goals/bluespace_tap.dm
@@ -98,7 +98,7 @@
/obj/item/gun/ballistic/automatic/l6_saw/toy,
/obj/item/gun/ballistic/shotgun/toy,
/obj/item/gun/ballistic/shotgun/toy/crossbow,
- /obj/item/twohanded/dualsaber/toy,
+ /obj/item/melee/dualsaber/toy,
/obj/machinery/smoke_machine,
/obj/item/clothing/head/kitty,
/obj/item/coin/antagtoken,
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index 64b76dd43476..df7ddf02efe3 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -122,7 +122,7 @@
/obj/item/toy/balloon,
/obj/item/toy/gun,
/obj/item/toy/sword,
- /obj/item/twohanded/vxtvulhammer/toy,
+ /obj/item/melee/vxtvulhammer/toy,
/obj/item/toy/foamblade,
/obj/item/toy/prize/ripley,
/obj/item/toy/prize/honk,
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index 1bc51eabc4a9..d953bda62c20 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -1,14 +1,14 @@
/*********************Mining Hammer****************/
-/obj/item/twohanded/kinetic_crusher
+/obj/item/kinetic_crusher
icon = 'icons/obj/mining.dmi'
icon_state = "mining_hammer0"
+ base_icon_state = "mining_hammer"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
name = "proto-kinetic crusher"
desc = "An early design of the proto-kinetic accelerator, it is little more than a combination of various mining tools cobbled together, forming a high-tech club. \
While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna."
force = 0 //Can't be used if not wielded
- force_wielded = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
w_class = WEIGHT_CLASS_BULKY
obj_flags = UNIQUE_RENAME
slot_flags = ITEM_SLOT_BACK
@@ -27,34 +27,34 @@
var/charge_time = 15
var/detonation_damage = 50
var/backstab_bonus = 30
+ var/projectile_type = /obj/item/projectile/destabilizer
-/obj/item/twohanded/kinetic_crusher/update_icon_state() //Updates the sprite for in-hand and on-mob.
+/obj/item/kinetic_crusher/update_icon_state()
. = ..()
- icon_state = "mining_hammer[wielded]"
+ item_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent
-/obj/item/twohanded/kinetic_crusher/Initialize(mapload)
+/obj/item/kinetic_crusher/Initialize(mapload)
. = ..()
AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it
+ AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=20)
-/obj/item/twohanded/kinetic_crusher/Destroy()
+/obj/item/kinetic_crusher/Destroy()
QDEL_LIST(trophies)
return ..()
-/obj/item/twohanded/kinetic_crusher/examine(mob/living/user)
+/obj/item/kinetic_crusher/examine(mob/living/user)
. = ..()
. += span_notice("Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage.")
. += span_notice("Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].")
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
+ for(var/obj/item/crusher_trophy/T as anything in trophies)
. += span_notice("It has \a [T] attached, which causes [T.effect_desc()].")
-/obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user)
+/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user)
if(I.tool_behaviour == TOOL_CROWBAR)
if(LAZYLEN(trophies))
to_chat(user, span_notice("You remove [src]'s trophies."))
I.play_tool_sound(src)
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
+ for(var/obj/item/crusher_trophy/T as anything in trophies)
T.remove_from(src, user)
else
to_chat(user, span_warning("There are no trophies on [src]."))
@@ -64,8 +64,8 @@
else
return ..()
-/obj/item/twohanded/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
- if(!wielded)
+/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
to_chat(user, span_warning("[src] is too heavy to use with one hand!"))
return
var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
@@ -73,25 +73,23 @@
C = target.apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/target_health = target.health
..()
- for(var/t in trophies)
+ for(var/obj/item/crusher_trophy/T as anything in trophies)
if(!QDELETED(target))
- var/obj/item/crusher_trophy/T = t
T.on_melee_hit(target, user)
if(!QDELETED(C) && !QDELETED(target))
C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
-/obj/item/twohanded/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams, magmite = FALSE)
+/obj/item/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams, magmite = FALSE)
. = ..()
- if(!wielded)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
to_chat(user, span_warning("[src] is too heavy to use with one hand!"))
- return
+ return FALSE
if(!proximity_flag && charged)//Mark a target, or mine a tile.
var/turf/proj_turf = user.loc
if(!isturf(proj_turf))
return
- var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
- for(var/t in trophies)
- var/obj/item/crusher_trophy/T = t
+ var/obj/item/projectile/destabilizer/D = new projectile_type(proj_turf)
+ for(var/obj/item/crusher_trophy/T as anything in trophies)
T.on_projectile_fire(D, user)
D.preparePixelProjectile(target, user, clickparams)
D.firer = user
@@ -99,8 +97,8 @@
playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
D.fire()
charged = FALSE
- icon_state = "mining_hammer0_uncharged"
- addtimer(CALLBACK(src, PROC_REF(Recharge)), charge_time)
+ icon_state = "[base_icon_state]_uncharged"
+ addtimer(CALLBACK(src, PROC_REF(recharge)), charge_time)
return
if(proximity_flag && isliving(target))
var/mob/living/L = target
@@ -130,14 +128,10 @@
C.total_damage += detonation_damage
L.apply_damage(detonation_damage, BRUTE, blocked = def_check)
-/obj/item/twohanded/kinetic_crusher/proc/Recharge(magmite = FALSE)
- if(magmite == TRUE)
- charged = TRUE
- icon_state = "magmite_crusher0"
- playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+/obj/item/kinetic_crusher/proc/recharge(magmite = FALSE)
if(!charged)
charged = TRUE
- icon_state = "mining_hammer0"
+ icon_state = "[base_icon_state]0"
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
//destablizing force
@@ -150,7 +144,7 @@
flag = BOMB
range = 6
log_override = TRUE
- var/obj/item/twohanded/kinetic_crusher/hammer_synced
+ var/obj/item/kinetic_crusher/hammer_synced
/obj/item/projectile/destabilizer/Destroy()
hammer_synced = null
@@ -170,7 +164,24 @@
var/turf/closed/mineral/M = target_turf
new /obj/effect/temp_visual/kinetic_blast(M)
M.attempt_drill(firer)
- ..()
+ return ..()
+
+/obj/item/projectile/destabilizer/mega
+ icon_state = "pulse0"
+ var/mine_range = 4
+
+/obj/item/projectile/destabilizer/mega/on_hit(atom/target, blocked = FALSE)
+ var/target_turf = get_turf(target)
+ if(ismineralturf(target_turf))
+ var/turf/closed/mineral/M = target_turf
+ M.attempt_drill(firer)
+ if(mine_range)
+ mine_range--
+ range++
+ if(range > 0)
+ return BULLET_ACT_FORCE_PIERCE
+ return ..()
+
//trophies
/obj/item/crusher_trophy
@@ -189,14 +200,13 @@
return "errors"
/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user)
- if(istype(A, /obj/item/twohanded/kinetic_crusher))
+ if(istype(A, /obj/item/kinetic_crusher))
add_to(A, user)
else
..()
-/obj/item/crusher_trophy/proc/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
- for(var/t in H.trophies)
- var/obj/item/crusher_trophy/T = t
+/obj/item/crusher_trophy/proc/add_to(obj/item/kinetic_crusher/H, mob/living/user)
+ for(var/obj/item/crusher_trophy/T as anything in H.trophies)
if(istype(T, denied_type) || istype(src, T.denied_type))
to_chat(user, span_warning("You can't seem to attach [src] to [H]. Maybe remove a few trophies?"))
return FALSE
@@ -206,7 +216,7 @@
to_chat(user, span_notice("You attach [src] to [H]."))
return TRUE
-/obj/item/crusher_trophy/proc/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/proc/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
forceMove(get_turf(H))
H.trophies -= src
return TRUE
@@ -330,12 +340,12 @@
/obj/item/crusher_trophy/legion_skull/effect_desc()
return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster"
-/obj/item/crusher_trophy/legion_skull/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/legion_skull/add_to(obj/item/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.charge_time -= bonus_value
-/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.charge_time += bonus_value
@@ -388,19 +398,19 @@
/obj/item/crusher_trophy/demon_claws/effect_desc()
return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1], with 5X effect on mark detonation"
-/obj/item/crusher_trophy/demon_claws/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/demon_claws/add_to(obj/item/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.force += bonus_value * 0.2
- H.force_wielded += bonus_value * 0.2
H.detonation_damage += bonus_value * 0.8
+ AddComponent(/datum/component/two_handed, force_wielded=(20 + bonus_value * 0.2))
-/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
+/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.force -= bonus_value * 0.2
- H.force_wielded -= bonus_value * 0.2
H.detonation_damage -= bonus_value * 0.8
+ AddComponent(/datum/component/two_handed, force_wielded=20)
/obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user)
user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order)
@@ -465,66 +475,22 @@
/obj/item/crusher_trophy/malformed_bone/effect_desc()
return "mark detonation to have a [bonus_value]% chance to mark nearby targets"
-/obj/item/crusher_trophy/malformed_bone/on_mark_detonation(mob/living/target, mob/living/user, obj/item/twohanded/kinetic_crusher/hammer_synced)
- if(hammer_synced)
- for(var/mob/living/L in oview(2,user))//fuck you and everything around you with a mark
- if(prob(bonus_value) && !L.has_status_effect(STATUS_EFFECT_CRUSHERMARK))
- L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK,hammer_synced)
-
-//Magmite Crusher
-
-/obj/item/twohanded/kinetic_crusher/mega
- icon_state = "magmite_crusher0"
- lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
- name = "mega proto-kinetic crusher"
- desc = "An early design of the proto-kinetic accelerator, it is now a combination of various mining tools infused with magmite, forming a high-tech club, increasing its capacity as a mining tool. \
- It does little to aid any but the most skilled and/or suicidal miners against local fauna."
-
-/obj/item/twohanded/kinetic_crusher/mega/attack(mob/living/target, mob/living/carbon/user)
- if(!wielded)
- to_chat(user, span_warning("[src] is too heavy to use with one hand!"))
+/obj/item/crusher_trophy/malformed_bone/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/hammer_synced)
+ if(!hammer_synced)
return
- ..()
+ for(var/mob/living/L in oview(2,user))//fuck you and everything around you with a mark
+ if(prob(bonus_value) && !L.has_status_effect(STATUS_EFFECT_CRUSHERMARK))
+ L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK, hammer_synced)
-/obj/item/twohanded/kinetic_crusher/mega/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
- if(!wielded)
- to_chat(user, span_warning("[src] is too heavy to use with one hand!"))
- return
- if(!proximity_flag && charged)
- var/turf/proj_turf = user.loc
- if(!isturf(proj_turf))
- return
- var/obj/item/projectile/destabilizer/mega/D = new /obj/item/projectile/destabilizer/mega(proj_turf)
- D.preparePixelProjectile(target, user, clickparams)
- D.firer = user
- D.hammer_synced = src
- playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
- D.fire()
- icon_state = "magmite_crusher_uncharged"
- charged = FALSE
- addtimer(CALLBACK(src, PROC_REF(Recharge), TRUE), charge_time)
- return
- ..()
-
-
-/obj/item/twohanded/kinetic_crusher/mega/update_icon_state()
- . = ..()
- icon_state = "magmite_crusher[wielded]"
+//Magmite Crusher
-/obj/item/projectile/destabilizer/mega
- name = "destabilizing force"
- icon_state = "pulse0"
- var/mine_range = 4
+/obj/item/kinetic_crusher/mega
+ icon_state = "magmite_crusher0"
+ base_icon_state = "magmite_crusher"
+ lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+ name = "mega proto-kinetic crusher"
+ desc = "An early design of the proto-kinetic accelerator, it is now a combination of various mining tools infused with magmite, forming a high-tech club, increasing its capacity as a mining tool. \
+ It does little to aid any but the most skilled and/or suicidal miners against local fauna."
-/obj/item/projectile/destabilizer/mega/on_hit(atom/target, blocked = FALSE)
- var/target_turf = get_turf(target)
- if(ismineralturf(target_turf))
- var/turf/closed/mineral/M = target_turf
- M.attempt_drill(firer)
- if(mine_range)
- mine_range--
- range++
- if(range > 0)
- return BULLET_ACT_FORCE_PIERCE
- ..()
+ projectile_type = /obj/item/projectile/destabilizer/mega
diff --git a/code/modules/mining/equipment/upgrades.dm b/code/modules/mining/equipment/upgrades.dm
index d990070d4beb..3ab67d8be93c 100644
--- a/code/modules/mining/equipment/upgrades.dm
+++ b/code/modules/mining/equipment/upgrades.dm
@@ -67,13 +67,13 @@
user.put_in_hand(newgun)
to_chat(user,"Harsh tendrils wrap around the plasma cutter shotgun, merging the parts and cutter to form a mega plasma cutter shotgun.")
qdel(src)
- if(/obj/item/twohanded/kinetic_crusher)
- var/obj/item/twohanded/kinetic_crusher/gun = target
+ if(/obj/item/kinetic_crusher)
+ var/obj/item/kinetic_crusher/gun = target
for(var/t in gun.trophies)
var/obj/item/crusher_trophy/T = t
T.remove_from(gun, user)
qdel(gun)
- var/obj/item/twohanded/kinetic_crusher/mega/newgun = new(get_turf(user))
+ var/obj/item/kinetic_crusher/mega/newgun = new(get_turf(user))
user.put_in_hand(newgun)
to_chat(user,"Harsh tendrils wrap around the kinetic crusher, merging the parts and cutter to form a mega kinetic crusher.")
qdel(src)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 3bebd07549cb..b7759d5de036 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -1729,18 +1729,17 @@ GLOBAL_LIST_EMPTY(aide_list)
selfcharge = 1
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
-/obj/item/twohanded/bonespear/stalwartpike
+/obj/item/melee/spear/bonespear/stalwartpike
icon = 'icons/obj/weapons/spears.dmi'
icon_state = "stalwart_spear0"
+ base_icon_state = "stalwart_spear"
lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
name = "ancient control rod"
//don't want your rare megafauna loot shattering easily
max_integrity = 2000
desc = "A mysterious crystaline rod of exceptional length, humming with ancient power. Too unweildy for use in one hand."
- wielded_stats = list(SWING_SPEED = 0.8, ENCUMBRANCE = 0.2, ENCUMBRANCE_TIME = 2, REACH = 3, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
w_class = WEIGHT_CLASS_SMALL
- var/w_class_on = WEIGHT_CLASS_HUGE
slot_flags = ITEM_SLOT_BELT
force = 0
throwforce = 0
@@ -1748,41 +1747,43 @@ GLOBAL_LIST_EMPTY(aide_list)
materials = list(/datum/material/bluespace = 8000, /datum/material/diamond = 2000, /datum/material/dilithium = 2000)
sharpness = SHARP_NONE
block_chance = 0
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ var/w_class_on = WEIGHT_CLASS_HUGE
var/fauna_damage_bonus = 0
var/fauna_damage_type = BRUTE
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
-/obj/item/twohanded/bonespear/stalwartpike/update_icon_state()
+/obj/item/melee/spear/bonespear/stalwartpike/Initialize(mapload)
. = ..()
- if(wielded)
- icon_state = "stalwart_spear1"
- else
- icon_state = "stalwart_spear0"
- SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_TYPE_BLOOD)
-
-/obj/item/twohanded/bonespear/stalwartpike/wield(mob/living/carbon/M)
- . = ..()
- if(wielded)
- playsound(src, 'sound/magic/summonitems_generic.ogg', 50, 1)
- sharpness = SHARP_POINTY
- w_class = w_class_on
- block_chance = 25
- force = 8
- fauna_damage_bonus = 52
-
-/obj/item/twohanded/bonespear/stalwartpike/unwield(mob/living/carbon/M)
- if(wielded)
- playsound(src, 'sound/magic/teleport_diss.ogg', 50, 1)
- sharpness = initial(sharpness)
- w_class = initial(w_class)
- force = initial(force)
- block_chance = initial(block_chance)
- fauna_damage_bonus = initial(fauna_damage_bonus)
+ AddComponent(/datum/component/two_handed, \
+ icon_wielded = "[base_icon_state]1", \
+ wielded_stats = list(SWING_SPEED = 0.8, ENCUMBRANCE = 0.2, ENCUMBRANCE_TIME = 2, REACH = 3, DAMAGE_LOW = 0, DAMAGE_HIGH = 0), \
+ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \
+ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \
+ )
+
+/obj/item/melee/spear/bonespear/stalwartpike/update_icon_state()
. = ..()
+ SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_TYPE_BLOOD)
-/obj/item/twohanded/bonespear/stalwartpike/afterattack(atom/target, mob/user, proximity)
+/obj/item/melee/spear/bonespear/stalwartpike/proc/on_wield(atom/source, mob/living/carbon/M)
+ playsound(src, 'sound/magic/summonitems_generic.ogg', 50, 1)
+ sharpness = SHARP_POINTY
+ w_class = w_class_on
+ block_chance = 25
+ force = 8
+ fauna_damage_bonus = 52
+
+/obj/item/melee/spear/bonespear/stalwartpike/proc/on_unwield(atom/source, mob/living/carbon/M)
+ playsound(src, 'sound/magic/teleport_diss.ogg', 50, 1)
+ sharpness = initial(sharpness)
+ w_class = initial(w_class)
+ force = initial(force)
+ block_chance = initial(block_chance)
+ fauna_damage_bonus = initial(fauna_damage_bonus)
+
+/obj/item/melee/spear/bonespear/stalwartpike/afterattack(atom/target, mob/user, proximity)
. = ..()
- if(!proximity || !wielded)
+ if(!proximity || !HAS_TRAIT(src, TRAIT_WIELDED))
return
if(isliving(target))
var/mob/living/L = target
@@ -1801,7 +1802,7 @@ GLOBAL_LIST_EMPTY(aide_list)
new /obj/item/gun/energy/plasmacutter/adv/robocutter(src)
new /obj/item/gem/purple(src)
if(2)
- new /obj/item/twohanded/bonespear/stalwartpike(src)
+ new /obj/item/melee/spear/bonespear/stalwartpike(src)
new /obj/item/ai_cpu/stalwart(src)
//Just some minor stuff
diff --git a/code/modules/mining/lavaland/world_anvil.dm b/code/modules/mining/lavaland/world_anvil.dm
index 05673d281cd4..473ee598042d 100644
--- a/code/modules/mining/lavaland/world_anvil.dm
+++ b/code/modules/mining/lavaland/world_anvil.dm
@@ -40,8 +40,8 @@
. += "It currently has [forge_charges] forge[forge_charges != 1 ? "s" : ""] remaining."
/obj/structure/world_anvil/attackby(obj/item/I, mob/living/user, params)
- if(istype(I,/obj/item/twohanded/required/gibtonite))
- var/obj/item/twohanded/required/gibtonite/placed_ore = I
+ if(istype(I,/obj/item/melee/gibtonite))
+ var/obj/item/melee/gibtonite/placed_ore = I
forge_charges = forge_charges + placed_ore.quality
to_chat(user,"You place down the gibtonite on the World Anvil, and watch as the gibtonite melts into it. The World Anvil is now heated enough for [forge_charges] forge[forge_charges > 1 ? "s" : ""].")
qdel(placed_ore)
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 199f179584a3..cd67b979af49 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -19,7 +19,7 @@
var/icon_deny = "mining-deny"
var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750, VENDING_WEAPON),
- new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750, VENDING_WEAPON),
+ new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/kinetic_crusher, 750, VENDING_WEAPON),
new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800, VENDING_WEAPON),
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500, VENDING_WEAPON),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000, VENDING_WEAPON),
@@ -225,7 +225,7 @@
new /obj/item/stack/marker_beacon/thirty(drop_location)
if("Crusher Kit")
new /obj/item/extinguisher/mini(drop_location)
- new /obj/item/twohanded/kinetic_crusher(drop_location)
+ new /obj/item/kinetic_crusher(drop_location)
if("Mining Conscription Kit")
new /obj/item/storage/backpack/duffelbag/mining_conscript(drop_location)
if("Mini Plasma Cutter Kit")
@@ -369,7 +369,7 @@
new /obj/item/borg/upgrade/modkit/minebot_passthrough(drop_location)
if("Crusher Kit")
new /obj/item/extinguisher/mini(drop_location)
- new /obj/item/twohanded/kinetic_crusher(drop_location)
+ new /obj/item/kinetic_crusher(drop_location)
if("Advanced Scanner")
new /obj/item/t_scanner/adv_mining_scanner(drop_location)
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index c76af3e8265d..801182067313 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -222,13 +222,13 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
item_state = "slag"
singular_name = "slag chunk"
-/obj/item/twohanded/required/gibtonite
+/obj/item/melee/gibtonite
name = "gibtonite ore"
desc = "Extremely explosive if struck with mining equipment, Gibtonite is often used by miners to speed up their work by using it as a mining charge. This material is illegal to possess by unauthorized personnel under space law."
icon = 'icons/obj/mining.dmi'
icon_state = "Gibtonite ore"
item_state = "Gibtonite ore"
- w_class = WEIGHT_CLASS_BULKY
+ w_class = WEIGHT_CLASS_HUGE
throw_range = 0
var/primed = FALSE
var/det_time = 100
@@ -236,12 +236,16 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
var/attacher = "UNKNOWN"
var/det_timer
-/obj/item/twohanded/required/gibtonite/Destroy()
+/obj/item/melee/gibtonite/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, require_twohands = TRUE)
+
+/obj/item/melee/gibtonite/Destroy()
qdel(wires)
wires = null
return ..()
-/obj/item/twohanded/required/gibtonite/attackby(obj/item/I, mob/user, params)
+/obj/item/melee/gibtonite/attackby(obj/item/I, mob/user, params)
if(!wires && istype(I, /obj/item/assembly/igniter))
user.visible_message("[user] attaches [I] to [src].", span_notice("You attach [I] to [src]."))
wires = new /datum/wires/explosive/gibtonite(src)
@@ -277,20 +281,20 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
return
..()
-/obj/item/twohanded/required/gibtonite/attack_self(user)
+/obj/item/melee/gibtonite/attack_self(user)
if(wires)
wires.interact(user)
else
..()
-/obj/item/twohanded/required/gibtonite/bullet_act(obj/item/projectile/P)
+/obj/item/melee/gibtonite/bullet_act(obj/item/projectile/P)
GibtoniteReaction(P.firer)
. = ..()
-/obj/item/twohanded/required/gibtonite/ex_act()
+/obj/item/melee/gibtonite/ex_act()
GibtoniteReaction(null, 1)
-/obj/item/twohanded/required/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0)
+/obj/item/melee/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0)
if(!primed)
primed = TRUE
playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1)
@@ -313,7 +317,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
log_bomber(user, "has primed a", src, "for detonation", notify_admins)
det_timer = addtimer(CALLBACK(src, PROC_REF(detonate), notify_admins), det_time, TIMER_STOPPABLE)
-/obj/item/twohanded/required/gibtonite/proc/detonate(notify_admins)
+/obj/item/melee/gibtonite/proc/detonate(notify_admins)
if(primed)
switch(quality)
if(GIBTONITE_QUALITY_HIGH)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a84894f41b7e..0c7f0a1de1af 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -28,17 +28,17 @@
/mob/living/carbon/initialize_footstep()
AddComponent(/datum/component/footstep, 1, 2)
-/mob/living/carbon/swap_hand(held_index)
+/mob/living/carbon/perform_hand_swap(held_index)
+ . = ..()
+ if(!.)
+ return
+
if(!held_index)
held_index = (active_hand_index % held_items.len)+1
+
+ if(!isnum(held_index))
+ CRASH("You passed [held_index] into swap_hand instead of a number. WTF man")
- var/obj/item/item_in_hand = src.get_active_held_item()
- if(item_in_hand) //this segment checks if the item in your hand is twohanded.
- var/obj/item/twohanded/TH = item_in_hand
- if(istype(TH))
- if(TH.wielded == 1)
- to_chat(usr, span_warning("Your other hand is too busy holding [TH]."))
- return
var/oindex = active_hand_index
active_hand_index = held_index
if(hud_used)
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index d6a0b67b1711..a13bd92a71d4 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -213,7 +213,7 @@
return
for(var/obj/item/I in user.held_items)
user.drop_all_held_items(I, TRUE)
- var/obj/item/twohanded/required/raisedhands/L = new(user)
+ var/obj/item/raisedhands/L = new(user)
user.put_in_hands(L)
/datum/emote/living/jump
@@ -571,4 +571,4 @@
key_third_person = "cluelesses"
message = "looks clueless."
message_param = "looks cluelessly at %t"
- stat_allowed = SOFT_CRIT
\ No newline at end of file
+ stat_allowed = SOFT_CRIT
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index c4d4d6a15e4e..20d648663cf2 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -410,5 +410,5 @@
if(slot_num > 4) // not >3 otherwise cycling with just one item on module 3 wouldn't work
slot_num = 1 //Wrap around.
-/mob/living/silicon/robot/swap_hand()
+/mob/living/silicon/robot/perform_hand_swap()
cycle_modules()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 1f18949e94e4..3950f73c3d82 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -638,7 +638,7 @@
basic_modules = list(
/obj/item/assembly/flash/cyborg/combat,
/obj/item/reagent_containers/borghypo/syndicate,
- /obj/item/twohanded/shockpaddles/syndicate,
+ /obj/item/shockpaddles/syndicate,
/obj/item/healthanalyzer,
/obj/item/retractor,
/obj/item/hemostat,
diff --git a/code/modules/mob/living/simple_animal/friendly/catslug.dm b/code/modules/mob/living/simple_animal/friendly/catslug.dm
index 744858cdf902..7641151a6ab0 100644
--- a/code/modules/mob/living/simple_animal/friendly/catslug.dm
+++ b/code/modules/mob/living/simple_animal/friendly/catslug.dm
@@ -22,14 +22,14 @@
melee_damage_lower = 0
melee_damage_upper = 0
attacktext = "stabs"
- var/obj/item/twohanded/spear/weapon
+ var/obj/item/melee/spear/weapon
/mob/living/simple_animal/pet/catslug/UnarmedAttack(atom/A)
. = ..()
if(!isitem(A))
return
- if(!weapon && istype(A, /obj/item/twohanded/spear))
+ if(!weapon && istype(A, /obj/item/melee/spear))
visible_message(span_notice("[src] wields the [A]."), span_notice("You wield the [A]."))
weapon = A
weapon.forceMove(src)
@@ -40,7 +40,7 @@
sharpness = weapon.sharpness
attack_sound = weapon.hitsound
update_icons()
- else if(!weapon && !istype(A, /obj/item/twohanded/spear))
+ else if(!weapon && !istype(A, /obj/item/melee/spear))
to_chat(src, span_warning("You do not know how to wield the [A]!"))
/mob/living/simple_animal/pet/catslug/RangedAttack(atom/A, params)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index a7d0ba7379dd..f51deb8a3ba1 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -340,7 +340,7 @@
suit = /obj/item/clothing/suit/armor/bone
gloves = /obj/item/clothing/gloves/bracer
if(prob(5))
- back = pickweight(list(/obj/item/twohanded/bonespear = 3, /obj/item/twohanded/fireaxe/boneaxe = 2))
+ back = pickweight(list(/obj/item/melee/spear/bonespear = 3, /obj/item/fireaxe/boneaxe = 2))
if(prob(10))
belt = /obj/item/storage/belt/mining/primitive
if(prob(30))
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
index c192919cd07b..034d1006afc1 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
@@ -51,7 +51,7 @@
melee_damage_upper = 20
deathmessage = "collapses into a pile of bones, its gear falling to the floor!"
loot = list(/obj/effect/decal/remains/human,
- /obj/item/twohanded/spear,
+ /obj/item/melee/spear,
/obj/item/clothing/shoes/winterboots,
/obj/item/clothing/suit/hooded/wintercoat)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 1182725f8ead..5421f3db3ed9 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -523,18 +523,14 @@
else
mode()
-/mob/living/simple_animal/swap_hand(hand_index)
+/mob/living/simple_animal/perform_hand_swap(hand_index)
+ . = ..()
+ if(!.)
+ return
if(!dextrous)
return ..()
if(!hand_index)
hand_index = (active_hand_index % held_items.len)+1
- var/obj/item/held_item = get_active_held_item()
- if(held_item)
- if(istype(held_item, /obj/item/twohanded))
- var/obj/item/twohanded/T = held_item
- if(T.wielded == 1)
- to_chat(usr, span_warning("Your other hand is too busy holding [T]."))
- return
var/oindex = active_hand_index
active_hand_index = hand_index
if(hud_used)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 98aff0bbb93a..073b4f1198b6 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -940,8 +940,24 @@
/mob/proc/IsAdvancedToolUser()
return FALSE
-/mob/proc/swap_hand()
- return
+/mob/proc/swap_hand(held_index)
+ SHOULD_NOT_OVERRIDE(TRUE) // Override perform_hand_swap instead
+
+ var/obj/item/held_item = get_active_held_item()
+ if(SEND_SIGNAL(src, COMSIG_MOB_SWAPPING_HANDS, held_item) & COMPONENT_BLOCK_SWAP)
+ to_chat(src, span_warning("Your other hand is too busy holding [held_item]."))
+ return FALSE
+
+ var/result = perform_hand_swap(held_index)
+ if (result)
+ SEND_SIGNAL(src, COMSIG_MOB_SWAP_HANDS)
+
+ return result
+
+/// Performs the actual ritual of swapping hands, such as setting the held index variables
+/mob/proc/perform_hand_swap(held_index)
+ PROTECTED_PROC(TRUE)
+ return TRUE
/mob/proc/activate_hand(selhand)
return
diff --git a/code/modules/pool/components/swimming.dm b/code/modules/pool/components/swimming.dm
index 85acbfb237a8..220eb5b66fe5 100644
--- a/code/modules/pool/components/swimming.dm
+++ b/code/modules/pool/components/swimming.dm
@@ -75,8 +75,8 @@
/datum/component/swimming/process()
var/mob/living/L = parent
var/floating = FALSE
- var/obj/item/twohanded/required/pool/helditem = L.get_active_held_item()
- if(istype(helditem) && helditem.wielded)
+ var/obj/item/pool/helditem = L.get_active_held_item()
+ if(istype(helditem) && HAS_TRAIT(helditem, TRAIT_WIELDED))
bob_tick ++
animate(L, time=0.95 SECONDS, pixel_y = (L.pixel_y == bob_height_max) ? bob_height_min : bob_height_max)
floating = TRUE
@@ -95,8 +95,8 @@
L.adjust_fire_stacks(-3)
/datum/component/swimming/proc/is_drowning(mob/living/victim)
- var/obj/item/twohanded/required/pool/helditem = victim.get_active_held_item()
- if(istype(helditem) && helditem.wielded)
+ var/obj/item/pool/helditem = victim.get_active_held_item()
+ if(istype(helditem) && HAS_TRAIT(helditem, TRAIT_WIELDED))
return
if(iscarbon(victim))
var/mob/living/carbon/C = victim
diff --git a/code/modules/pool/components/swimming_felinid.dm b/code/modules/pool/components/swimming_felinid.dm
index 62006b528f11..339cebb32f4b 100644
--- a/code/modules/pool/components/swimming_felinid.dm
+++ b/code/modules/pool/components/swimming_felinid.dm
@@ -6,8 +6,8 @@
/datum/component/swimming/felinid/process()
..()
var/mob/living/L = parent
- var/obj/item/twohanded/required/pool/helditem = L.get_active_held_item()
- if(istype(helditem) && helditem.wielded)
+ var/obj/item/pool/helditem = L.get_active_held_item()
+ if(istype(helditem) && HAS_TRAIT(helditem, TRAIT_WIELDED))
return
switch(rand(1, 100))
if(1 to 4)
diff --git a/code/modules/pool/pool_items.dm b/code/modules/pool/pool_items.dm
index 1896c263f62f..036dc5778622 100644
--- a/code/modules/pool/pool_items.dm
+++ b/code/modules/pool/pool_items.dm
@@ -1,26 +1,28 @@
-/obj/item/twohanded/required/pool
+/obj/item/pool
icon = 'icons/obj/pool.dmi'
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- force = 0
+ force = 5
damtype = STAMINA
- force_wielded = 5
- wieldsound = 'sound/weapons/tap.ogg'
- unwieldsound = 'sound/weapons/tap.ogg'
w_class = WEIGHT_CLASS_BULKY
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
-/obj/item/twohanded/required/pool/Initialize(mapload)
+/obj/item/pool/Initialize(mapload)
. = ..()
//Pick a random color
+ AddComponent(/datum/component/two_handed, \
+ wieldsound = 'sound/weapons/tap.ogg', \
+ unwieldsound = 'sound/weapons/tap.ogg', \
+ require_twohands = TRUE, \
+ )
color = pick(COLOR_YELLOW, COLOR_LIME, COLOR_RED, COLOR_BLUE_LIGHT, COLOR_CYAN, COLOR_MAGENTA)
-/obj/item/twohanded/required/pool/rubber_ring
+/obj/item/pool/rubber_ring
name = "inflatable"
desc = "An inflatable ring used for keeping people afloat. Throw at drowning people to save them."
icon_state = "rubber_ring"
-/obj/item/twohanded/required/pool/rubber_ring/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+/obj/item/pool/rubber_ring/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(ishuman(hit_atom))
var/mob/living/carbon/human/H = hit_atom
@@ -34,7 +36,7 @@
if(H.put_in_active_hand(src))
visible_message("The [src] lands over [H]'s head!")
-/obj/item/twohanded/required/pool/pool_noodle
+/obj/item/pool/pool_noodle
icon_state = "pool_noodle"
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
@@ -42,15 +44,15 @@
desc = "A long noodle made of foam. Helping those with fears of swimming swim since the 1980s."
var/suiciding = FALSE
-/obj/item/twohanded/required/pool/pool_noodle/attack(mob/target, mob/living/carbon/human/user)
+/obj/item/pool/pool_noodle/attack(mob/target, mob/living/carbon/human/user)
. = ..()
- if(wielded && prob(50))
+ if(HAS_TRAIT(src, TRAIT_WIELDED) && prob(50))
INVOKE_ASYNC(src, PROC_REF(jedi_spin), user)
-/obj/item/twohanded/required/pool/pool_noodle/proc/jedi_spin(mob/living/user) //rip complex code, but this fucked up blocking
+/obj/item/pool/pool_noodle/proc/jedi_spin(mob/living/user) //rip complex code, but this fucked up blocking
user.emote("flip")
-/obj/item/twohanded/required/pool/pool_noodle/suicide_act(mob/user)
+/obj/item/pool/pool_noodle/suicide_act(mob/user)
if(suiciding)
return SHAME
suiciding = TRUE
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index e36e23e24337..3313c7e3a1c1 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -145,8 +145,8 @@ By design, d1 is the smallest direction and d2 is the highest
return
coil.cable_join(src, user)
- else if(istype(W, /obj/item/twohanded/rcl))
- var/obj/item/twohanded/rcl/R = W
+ else if(istype(W, /obj/item/rcl))
+ var/obj/item/rcl/R = W
if(R.loaded)
R.loaded.cable_join(src, user)
R.is_empty(user)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 10e7e985b1c1..7dc2fbe9767c 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -582,7 +582,7 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
/obj/item/circular_saw,
/obj/item/gun/energy/plasmacutter,
/obj/item/melee/transforming/energy,
- /obj/item/twohanded/required/chainsaw,
+ /obj/item/melee/chainsaw,
/obj/item/nullrod/claymore/chainsaw_sword,
/obj/item/nullrod/chainsaw,
/obj/item/mounted_chainsaw)))
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 6547eb712ddc..d518e2ac46c6 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -453,23 +453,24 @@
name = "vial"
desc = "A vial for holding smaller amounts of reagents than a beaker."
icon_state = "viallarge"
+ base_icon_state = "viallarge"
item_state = "atoxinbottle"
- unique_reskin = list("vial" = "viallarge",
- "white vial" = "viallarge_white",
- "red vial" = "viallarge_red",
- "blue vial" = "viallarge_blue",
- "green vial" = "viallarge_green",
- "orange vial" = "viallarge_orange",
- "purple vial" = "viallarge_purple",
- "black vial" = "viallarge_black"
- )
+ unique_reskin = list(
+ "vial" = "vial",
+ "white vial" = "vial_white",
+ "red vial" = "vial_red",
+ "blue vial" = "vial_blue",
+ "green vial" = "vial_green",
+ "orange vial" = "vial_orange",
+ "purple vial" = "vial_purple",
+ "black vial" = "vial_black"
+ )
possible_transfer_amounts = list(5, 10, 15, 30)
spillable = FALSE
volume = 30
disease_amount = 30
/// Name that used as the base for pen renaming, so subtypes can have different names without having to worry about messing with it
var/base_name = "vial"
- var/base_icon_state = "viallarge"
/// List of icon_states that require the stripe overlay to look good. Not a very good way of doing it, but its the best I can come up with right now.
var/list/striped_vial_skins = list("vial_white", "vial_red", "vial_blue", "vial_green", "vial_orange", "vial_purple", "vial_black", "viallarge_white", "viallarge_red", "viallarge_blue", "viallarge_green", "viallarge_orange", "viallarge_purple", "viallarge_black")
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 59a4e6a1ec27..9c55f066ac4e 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -34,7 +34,7 @@
id="broom"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 2000)
- build_path = /obj/item/twohanded/broom
+ build_path = /obj/item/broom
category = list("initial","Tools","Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index 3ff7a98c9456..e000200bc506 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -49,7 +49,7 @@ Slimecrossing Weapons
return ..()
//Adamantine shield - Chilling Adamantine
-/obj/item/twohanded/required/adamantineshield
+/obj/item/adamantineshield
name = "adamantine shield"
desc = "A gigantic shield made of solid adamantium."
icon = 'icons/obj/slimecrossing.dmi'
@@ -66,6 +66,10 @@ Slimecrossing Weapons
attack_verb = list("bashed","pounded","slammed")
item_flags = SLOWS_WHILE_IN_HAND
+/obj/item/adamantineshield/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, require_twohands = TRUE)
+
//Bloodchiller - Chilling Green
/obj/item/gun/magic/bloodchill
name = "blood chiller"
diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm
index 4a64bb6fe39b..9d83b34df81f 100644
--- a/code/modules/research/xenobiology/crossbreeding/burning.dm
+++ b/code/modules/research/xenobiology/crossbreeding/burning.dm
@@ -300,7 +300,7 @@ Burning extracts:
/obj/item/slimecross/burning/adamantine/do_effect(mob/user)
user.visible_message(span_notice("[src] crystallizes into a large shield!"))
- new /obj/item/twohanded/required/adamantineshield(get_turf(user))
+ new /obj/item/adamantineshield(get_turf(user))
..()
/obj/item/slimecross/burning/rainbow
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index fa10bbc0f116..202b0029dafb 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -8,15 +8,15 @@
school = SCHOOL_CONJURATION
invocation_type = INVOCATION_NONE
- item_type = /obj/item/twohanded/pitchfork/demonic
+ item_type = /obj/item/pitchfork/demonic
cooldown_time = 15 SECONDS
spell_requirements = NONE
/datum/action/cooldown/spell/conjure_item/summon_pitchfork/greater
- item_type = /obj/item/twohanded/pitchfork/demonic/greater
+ item_type = /obj/item/pitchfork/demonic/greater
/datum/action/cooldown/spell/conjure_item/summon_pitchfork/ascended
- item_type = /obj/item/twohanded/pitchfork/demonic/ascended
+ item_type = /obj/item/pitchfork/demonic/ascended
/datum/action/cooldown/spell/conjure_item/violin
name = "Summon golden violin"
diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm
index c0438b2fca00..abdb3819d3af 100644
--- a/code/modules/surgery/advanced/revival.dm
+++ b/code/modules/surgery/advanced/revival.dm
@@ -29,16 +29,16 @@
/datum/surgery_step/revive
name = "shock brain"
- implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60, /obj/item/melee/touch_attack/shock = 100, /obj/item/rod_of_asclepius = 100)
+ implements = list(/obj/item/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60, /obj/item/melee/touch_attack/shock = 100, /obj/item/rod_of_asclepius = 100)
time = 12 SECONDS
success_sound = 'sound/magic/lightningbolt.ogg'
failure_sound = 'sound/machines/defib_zap.ogg'
/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool)
. = TRUE
- if(istype(tool, /obj/item/twohanded/shockpaddles))
- var/obj/item/twohanded/shockpaddles/S = tool
- if((S.req_defib && !S.defib.powered) || !S.wielded || S.cooldown || S.busy)
+ if(istype(tool, /obj/item/shockpaddles))
+ var/obj/item/shockpaddles/S = tool
+ if((S.req_defib && !S.defib.powered) || !HAS_TRAIT(S, TRAIT_WIELDED) || S.cooldown || S.busy)
to_chat(user, span_warning("You need to wield both paddles, and [S.defib] must be powered!"))
return FALSE
if(istype(tool, /obj/item/melee/baton))
@@ -61,7 +61,7 @@
target.notify_ghost_cloning("Someone is trying to zap your brain.", source = target)
/datum/surgery_step/revive/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(istype(tool, /obj/item/twohanded/shockpaddles))
+ if(istype(tool, /obj/item/shockpaddles))
playsound(tool, 'sound/machines/defib_charge.ogg', 75, 0)
else
..()
diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 8028bec15537..73712ab4f036 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -21,7 +21,7 @@
/datum/surgery_step/sever_limb
name = "sever limb"
- implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/twohanded/required/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25)
+ implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/melee/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25)
time = 6.4 SECONDS
preop_sound = 'sound/surgery/scalpel1.ogg'
success_sound = 'sound/surgery/organ2.ogg'
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 429d22cd5100..084b48e0de16 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -119,13 +119,13 @@
/datum/surgery_step/saw
name = "saw bone"
implements = list(TOOL_SAW = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100,
- /obj/item/melee/arm_blade = 75, /obj/item/mounted_chainsaw = 65, /obj/item/twohanded/required/chainsaw = 50,
- /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25)
+ /obj/item/melee/arm_blade = 75, /obj/item/mounted_chainsaw = 65, /obj/item/melee/chainsaw = 50,
+ /obj/item/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25)
time = 5.4 SECONDS
preop_sound = list(
/obj/item/circular_saw = 'sound/surgery/saw.ogg',
/obj/item/melee/arm_blade = 'sound/surgery/scalpel1.ogg',
- /obj/item/twohanded/fireaxe = 'sound/surgery/scalpel1.ogg',
+ /obj/item/fireaxe = 'sound/surgery/scalpel1.ogg',
/obj/item/hatchet = 'sound/surgery/scalpel1.ogg',
/obj/item/kitchen/knife/butcher = 'sound/surgery/scalpel1.ogg',
/obj/item = 'sound/surgery/scalpel1.ogg',
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 3b082efe3cab..c2702e38e037 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -408,7 +408,7 @@
/obj/item/organ/cyberimp/arm/syndie_hammer
name = "Vxtvul Hammer implant"
desc = "A folded Vxtvul Hammer designed to be incorporated into preterni chassis. Surgery can permit it to fit in other organic bodies."
- contents = newlist(/obj/item/twohanded/vxtvulhammer)
+ contents = newlist(/obj/item/melee/vxtvulhammer)
syndicate_implant = TRUE
/obj/item/organ/cyberimp/arm/nt_mantis
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index beda133348e9..760c1d75f11b 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -35,7 +35,7 @@
/datum/surgery_step/add_prosthetic
name = "add prosthetic"
- implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/twohanded/required/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100, /obj/item/medbeam_arm = 100)
+ implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/melee/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100, /obj/item/medbeam_arm = 100)
time = 3.2 SECONDS
var/organ_rejection_dam = 0
@@ -110,7 +110,7 @@
"[user] finishes attaching [tool]!",
"[user] finishes the attachment procedure!")
qdel(tool)
- if(istype(tool, /obj/item/twohanded/required/chainsaw))
+ if(istype(tool, /obj/item/melee/chainsaw))
var/obj/item/mounted_chainsaw/new_arm = new(target)
target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
return TRUE
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 17147bb77179..140aa030d7c8 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -412,7 +412,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Double-Bladed Energy Sword"
desc = "The double-bladed energy sword does slightly more damage than a standard energy sword and will deflect \
all energy projectiles, but requires two hands to wield."
- item = /obj/item/twohanded/dualsaber
+ item = /obj/item/melee/dualsaber
player_minimum = 25
cost = 16
include_modes = list(/datum/game_mode/nuclear) // yogs: infiltration
@@ -439,7 +439,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous/bostaff
name = "Bo Staff"
desc = "A wielded wooden staff that can be used to incapacitate opponents if intending to disarm."
- item = /obj/item/twohanded/bostaff
+ item = /obj/item/melee/bostaff
cost = 8
exclude_modes = list(/datum/game_mode/infiltration) // yogs: infiltration
@@ -534,7 +534,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
This weapon must be wielded in two hands to be used effectively, but possesses high armor penetration. \
In addition, the user can charge the hammer to enable a thunderous blow that will decimate construction in a single hit, \
do sizeable damage to mechs, or shatter people off of their feet. The battery is charged by the user's concentration."
- item = /obj/item/twohanded/vxtvulhammer
+ item = /obj/item/melee/vxtvulhammer
cost = 8
include_modes = list(/datum/game_mode/nuclear) //Only traitor preterni can buy the implant version
@@ -623,7 +623,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Energy Fire Axe"
desc = "A terrifying axe with a blade of pure energy, able to tear down structures with ease. \
Easier to store than a standard fire axe while inactive."
- item = /obj/item/twohanded/fireaxe/energy
+ item = /obj/item/fireaxe/energy
cost = 10
include_modes = list(/datum/game_mode/nuclear)
surplus = 0
@@ -2603,7 +2603,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "Energy Fire Axe"
desc = "A terrifying axe with a blade of pure energy, able to tear down structures with ease. \
Easier to store than a standard fire axe while inactive."
- item = /obj/item/twohanded/fireaxe/energy
+ item = /obj/item/fireaxe/energy
cost = 10
restricted_roles = list("Station Engineer","Atmospheric Technician","Network Admin","Chief Engineer")
diff --git a/code/modules/vending/dinnerware.dm b/code/modules/vending/dinnerware.dm
index 4aae403e7875..b6acfbe8c18b 100644
--- a/code/modules/vending/dinnerware.dm
+++ b/code/modules/vending/dinnerware.dm
@@ -17,10 +17,11 @@
/obj/item/reagent_containers/glass/mixbowl = 3, // Yogs -- chef's mixing bowl
/obj/item/reagent_containers/food/condiment/cinnamon = 5, // Yogs -- cinnamon shakers!
/obj/item/plate = 10)
- contraband = list(/obj/item/kitchen/knife/butcher = 2,
- /obj/item/melee/fryingpan = 2, // Yogs -- Pan
- /obj/item/twohanded/bigspoon = 2, // Yogs -- Big spoon
- )
+ contraband = list(
+ /obj/item/kitchen/knife/butcher = 2,
+ /obj/item/melee/fryingpan = 2, // Yogs -- Pan
+ /obj/item/bigspoon = 2, // Yogs -- Big spoon
+ )
refill_canister = /obj/item/vending_refill/dinnerware
default_price = 5
extra_price = 50
@@ -34,4 +35,4 @@
if(I.type in products)
if(istype(I, /obj/item/reagent_containers/food/condiment)) //feels weird to put food back
return FALSE
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 67342c251aee..141df9a93cae 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -11,7 +11,7 @@
/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10,
/obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
/obj/item/toy/sword = 10,
- /obj/item/twohanded/vxtvulhammer/toy = 7,
+ /obj/item/melee/vxtvulhammer/toy = 7,
/obj/item/ammo_box/foambox = 20,
/obj/item/toy/foamblade = 10,
/obj/item/toy/syndicateballoon = 10,
@@ -22,7 +22,7 @@
/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot = 10,
/obj/item/ammo_box/foambox/riot = 20,
/obj/item/toy/katana = 10,
- /obj/item/twohanded/dualsaber/toy = 5,
+ /obj/item/melee/dualsaber/toy = 5,
/obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50)
resistance_flags = FIRE_PROOF
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index e11d814d0d02..92a1419fea2e 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -11,7 +11,7 @@
/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = 10,
/obj/item/gun/ballistic/shotgun/toy/unrestricted = 10,
/obj/item/toy/sword = 10,
- /obj/item/twohanded/vxtvulhammer/toy = 7,
+ /obj/item/melee/vxtvulhammer/toy = 7,
/obj/item/ammo_box/foambox = 20,
/obj/item/toy/foamblade = 10,
/obj/item/toy/foamblade/baseball = 10,
@@ -27,8 +27,9 @@
/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted = 10,
/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted = 10,
/obj/item/toy/katana = 10,
- /obj/item/twohanded/dualsaber/toy = 5,
- /obj/item/organ/cyberimp/chest/spinalspeed/toy = 5)
+ /obj/item/melee/dualsaber/toy = 5,
+ /obj/item/organ/cyberimp/chest/spinalspeed/toy = 5,
+ )
armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50)
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/donksoft
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 75b83965918c..97e8716b0b14 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -356,7 +356,7 @@
/obj/item/clothing/under/janimaid = 2,
/obj/item/clothing/gloves/color/black = 2,
/obj/item/clothing/head/soft/purple = 2,
- /obj/item/twohanded/broom = 2,
+ /obj/item/broom = 2,
/obj/item/paint/paint_remover = 2,
/obj/item/melee/flyswatter = 2,
/obj/item/flashlight = 2,
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index f5c8325c1721..3878383b74f3 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/tools/mapmerge2/map_scripts/19365_twohanded.txt b/tools/mapmerge2/map_scripts/19365_twohanded.txt
new file mode 100644
index 000000000000..a6e0ddd7eddd
--- /dev/null
+++ b/tools/mapmerge2/map_scripts/19365_twohanded.txt
@@ -0,0 +1,12 @@
+# start off with snowflake stuff we're changing the paths of
+
+/obj/item/twohanded/bonespear : /obj/item/melee/spear/bonespear
+/obj/item/twohanded/bonespear/chitinspear : /obj/item/melee/spear/bonespear/chitinspear
+/obj/item/twohanded/bamboospear : /obj/item/melee/spear/bamboospear
+/obj/item/twohanded/required/cult_bastard : /obj/item/melee/cult_bastard
+/obj/item/twohanded/required/chainsaw : /obj/item/melee/chainsaw
+
+# now we'll do the generic paths, removing 'required' entirely.
+
+/obj/item/twohanded/required/@SUBTYPES : /obj/item/@SUBTYPES
+/obj/item/twohanded/@SUBTYPES : /obj/item/@SUBTYPES
diff --git a/yogstation.dme b/yogstation.dme
index 5f79b8d59d5c..49e427bcddad 100644
--- a/yogstation.dme
+++ b/yogstation.dme
@@ -156,6 +156,7 @@
#include "code\__DEFINES\dcs\signals\signals_storage.dm"
#include "code\__DEFINES\dcs\signals\signals_subsystem.dm"
#include "code\__DEFINES\dcs\signals\signals_turf.dm"
+#include "code\__DEFINES\dcs\signals\signals_twohand.dm"
#include "code\__DEFINES\dcs\signals\signals_wash.dm"
#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_attack.dm"
#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_lighting.dm"
@@ -550,6 +551,7 @@
#include "code\datums\components\tactical.dm"
#include "code\datums\components\tether.dm"
#include "code\datums\components\thermite.dm"
+#include "code\datums\components\twohanded.dm"
#include "code\datums\components\uplink.dm"
#include "code\datums\components\waddling.dm"
#include "code\datums\components\wearertargeting.dm"
@@ -1090,6 +1092,7 @@
#include "code\game\objects\items\ashtray.dm"
#include "code\game\objects\items\barriertape.dm"
#include "code\game\objects\items\bell.dm"
+#include "code\game\objects\items\binoculars.dm"
#include "code\game\objects\items\blueprints.dm"
#include "code\game\objects\items\body_egg.dm"
#include "code\game\objects\items\bodybag.dm"
@@ -1144,6 +1147,7 @@
#include "code\game\objects\items\pneumaticCannon.dm"
#include "code\game\objects\items\powerfist.dm"
#include "code\game\objects\items\puzzle_pieces.dm"
+#include "code\game\objects\items\raised_hand.dm"
#include "code\game\objects\items\RCD.dm"
#include "code\game\objects\items\RCL.dm"
#include "code\game\objects\items\religion.dm"
@@ -1166,7 +1170,6 @@
#include "code\game\objects\items\theft_tools.dm"
#include "code\game\objects\items\toys.dm"
#include "code\game\objects\items\trash.dm"
-#include "code\game\objects\items\twohanded.dm"
#include "code\game\objects\items\vending_items.dm"
#include "code\game\objects\items\weaponry.dm"
#include "code\game\objects\items\circuitboards\circuitboard.dm"
@@ -1334,6 +1337,14 @@
#include "code\game\objects\items\tools\weldingtool.dm"
#include "code\game\objects\items\tools\wirecutters.dm"
#include "code\game\objects\items\tools\wrench.dm"
+#include "code\game\objects\items\two_handed\baseball_bat.dm"
+#include "code\game\objects\items\two_handed\broom.dm"
+#include "code\game\objects\items\two_handed\chainsaw.dm"
+#include "code\game\objects\items\two_handed\dualsaber.dm"
+#include "code\game\objects\items\two_handed\fireaxe.dm"
+#include "code\game\objects\items\two_handed\highfrequencyblade.dm"
+#include "code\game\objects\items\two_handed\pitchfork.dm"
+#include "code\game\objects\items\two_handed\spears.dm"
#include "code\game\objects\structures\aliens.dm"
#include "code\game\objects\structures\artstuff.dm"
#include "code\game\objects\structures\barsigns.dm"
@@ -3857,6 +3868,8 @@
#include "yogstation\code\game\objects\items\storage\mre.dm"
#include "yogstation\code\game\objects\items\storage\toolbox.dm"
#include "yogstation\code\game\objects\items\storage\uplink_kits.dm"
+#include "yogstation\code\game\objects\items\wielded\big_spoon.dm"
+#include "yogstation\code\game\objects\items\wielded\vxtvulhammer.dm"
#include "yogstation\code\game\objects\structures\bedsheet_bin.dm"
#include "yogstation\code\game\objects\structures\fireaxe.dm"
#include "yogstation\code\game\objects\structures\ghost_role_spawners.dm"
diff --git a/yogstation/code/_globalvars/lists/maintenance_loot.dm b/yogstation/code/_globalvars/lists/maintenance_loot.dm
index f035370728ab..03d9337959fd 100644
--- a/yogstation/code/_globalvars/lists/maintenance_loot.dm
+++ b/yogstation/code/_globalvars/lists/maintenance_loot.dm
@@ -424,7 +424,7 @@ GLOBAL_LIST_INIT(maintenance_loot_traditional,list(
/obj/item/toy/snappop/phoenix = W_LEGENDARY,
/obj/item/toy/spinningtoy = W_RARE,
/obj/item/toy/sword = W_RARE,
- /obj/item/twohanded/vxtvulhammer/toy = W_RARE,
+ /obj/item/melee/vxtvulhammer/toy = W_RARE,
/obj/item/toy/syndicateballoon = W_RARE,
/obj/item/toy/talking/AI = W_RARE,
/obj/item/toy/talking/codex_gigas = W_RARE,
@@ -437,7 +437,7 @@ GLOBAL_LIST_INIT(maintenance_loot_traditional,list(
/obj/item/toy/turn_tracker = W_RARE,
/obj/item/toy/windupToolbox = W_RARE,
/obj/item/toy/xmas_cracker = W_UNCOMMON,
- /obj/item/twohanded/dualsaber/toy = W_RARE,
+ /obj/item/melee/dualsaber/toy = W_RARE,
/obj/item/clothing/gloves/rapid/hug = W_MYTHICAL,
/obj/item/clothing/mask/cigarette/pipe = W_UNCOMMON,
/obj/item/clothing/mask/cigarette/pipe/cobpipe = W_COMMON,
@@ -518,8 +518,8 @@ GLOBAL_LIST_INIT(maintenance_loot_makeshift,list(
/obj/item/storage/fancy/rollingpapers = W_RARE,
/obj/item/storage/box/hug = W_RARE,
/obj/item/tank/jetpack/improvised = W_MYTHICAL,
- /obj/item/twohanded/rcl/ghetto = W_MYTHICAL,
- /obj/item/twohanded/required/baseball_bat = W_RARE,
+ /obj/item/rcl/ghetto = W_MYTHICAL,
+ /obj/item/melee/baseball_bat = W_RARE,
/obj/item/weaponcrafting/receiver = W_UNCOMMON,
/obj/item/weaponcrafting/silkstring = W_UNCOMMON,
/obj/item/weaponcrafting/stock = W_UNCOMMON,
@@ -763,7 +763,7 @@ GLOBAL_LIST_INIT(maintenance_loot_minor,list(
/obj/item/surgicaldrill = W_RARE,
/obj/item/toy/crayon/spraycan/lubecan = W_MYTHICAL,
/obj/item/toy/crayon/spraycan/mimecan = W_MYTHICAL,
- /obj/item/twohanded/rcl = W_MYTHICAL,
+ /obj/item/rcl = W_MYTHICAL,
/obj/item/watertank = W_MYTHICAL,
/obj/item/watertank/atmos = W_MYTHICAL,
/obj/item/watertank/janitor = W_MYTHICAL,
@@ -892,7 +892,7 @@ GLOBAL_LIST_INIT(maintenance_loot_moderate,list(
/obj/item/toy/cards/deck/syndicate = W_MYTHICAL,
/obj/item/toy/crayon/spraycan/hellcan = W_MYTHICAL,
/obj/item/toy/eightball/haunted = W_RARE,
- /obj/item/twohanded/binoculars = W_RARE,
+ /obj/item/binoculars = W_RARE,
/obj/item/clothing/gloves/chameleon/broken = W_RARE,
/obj/item/clothing/head/chameleon/broken = W_RARE,
/obj/item/clothing/head/foilhat = W_RARE,
diff --git a/yogstation/code/game/gamemodes/battle_royale/loot.dm b/yogstation/code/game/gamemodes/battle_royale/loot.dm
index ae30d65696bf..8de67924bc84 100644
--- a/yogstation/code/game/gamemodes/battle_royale/loot.dm
+++ b/yogstation/code/game/gamemodes/battle_royale/loot.dm
@@ -144,29 +144,29 @@ GLOBAL_LIST_INIT(battleroyale_weapon, list(
/obj/item/kitchen/knife/carrotshiv = 5,
/obj/item/kitchen/knife/combat/survival = 4,
- /obj/item/twohanded/required/baseball_bat = 4,
- /obj/item/twohanded/spear = 4,
+ /obj/item/melee/baseball_bat = 4,
+ /obj/item/melee/spear = 4,
/obj/item/pen/edagger = 3,
- /obj/item/twohanded/bigspoon = 3,
+ /obj/item/bigspoon = 3,
/obj/item/kitchen/knife/combat = 2,
- /obj/item/twohanded/bonespear = 2,
+ /obj/item/melee/spear/bonespear = 2,
/obj/item/nullrod/hammer = 2,
/obj/item/nullrod/tribal_knife = 2,
/obj/item/nullrod/vibro = 2,
/obj/item/flamethrower/full/tank = 1,
- /obj/item/twohanded/required/chainsaw = 1,
- /obj/item/twohanded/fireaxe/metal_h2_axe = 1,
+ /obj/item/melee/chainsaw = 1,
+ /obj/item/fireaxe/metal_h2_axe = 1,
/obj/item/nullrod/whip = 1,
- /obj/item/twohanded/vxtvulhammer = 0,
+ /obj/item/melee/vxtvulhammer = 0,
/obj/item/gun/ballistic/shotgun/riot = 0,
/obj/item/gun/ballistic/shotgun/automatic/dual_tube = 0,
/obj/item/gun/ballistic/revolver/detective = 0,
- /obj/item/twohanded/required/baseball_bat/homerun = 0,
- /obj/item/twohanded/fireaxe = 0,
+ /obj/item/melee/baseball_bat/homerun = 0,
+ /obj/item/fireaxe = 0,
/obj/item/nullrod/talking = 0,
/obj/item/melee/powerfist = -1,
@@ -174,7 +174,7 @@ GLOBAL_LIST_INIT(battleroyale_weapon, list(
/obj/item/gun/ballistic/shotgun/doublebarrel = -1,
/obj/item/melee/transforming/energy/sword = -1,
/obj/item/gun/energy/laser/retro/old = -1,
- /obj/item/twohanded/required/baseball_bat/metal_bat = -1,
+ /obj/item/melee/baseball_bat/metal_bat = -1,
/obj/item/gun/ballistic/shotgun/automatic/combat = -2,
/obj/item/gun/ballistic/shotgun/automatic/combat/compact = -2,
@@ -194,16 +194,16 @@ GLOBAL_LIST_INIT(battleroyale_weapon, list(
/obj/item/gun/ballistic/automatic/mini_uzi = -3,
/obj/item/gun/ballistic/automatic/tommygun = -3,
/obj/item/gun/ballistic/rifle/sniper_rifle = -3, //Not a stun anymore
- /obj/item/twohanded/vibro_weapon = -3, //Strong melee weapon, but not enough to be -5
+ /obj/item/vibro_weapon = -3, //Strong melee weapon, but not enough to be -5
/obj/item/autosurgeon/arm/syndicate/syndie_mantis = -4,
- /obj/item/twohanded/dualsaber = -4,
+ /obj/item/melee/dualsaber = -4,
/obj/item/battleroyale/itemspawner/breakbow = -4, //Strong melee weapon, along with infinte arrows
/obj/item/gun/energy/beam_rifle = -4,
/obj/item/melee/fryingpan/bananium = -5,
/obj/item/his_grace = -5,
- /obj/item/twohanded/required/chainsaw/doomslayer = -5,
+ /obj/item/melee/chainsaw/doomslayer = -5,
/obj/item/gun/ballistic/bow/energy/ert = -5,
))
diff --git a/yogstation/code/game/objects/items/fishing/rods.dm b/yogstation/code/game/objects/items/fishing/rods.dm
index b979e654c32a..80a4c449a9ba 100644
--- a/yogstation/code/game/objects/items/fishing/rods.dm
+++ b/yogstation/code/game/objects/items/fishing/rods.dm
@@ -1,4 +1,4 @@
-/obj/item/twohanded/fishingrod
+/obj/item/fishingrod
name = "fishing rod"
desc = "A rod used for fishing. Despite ordinary appearances, fishing has evolved to suit the cosmos with various features, like auto-reeling."
icon = 'yogstation/icons/obj/fishing/fishing.dmi'
@@ -21,16 +21,22 @@
var/mob/fisher
var/bite = FALSE
-/obj/item/twohanded/fishingrod/examine(mob/user)
+/obj/item/fishingrod/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 2, \
+ )
+
+/obj/item/fishingrod/examine(mob/user)
. = ..()
. += "Its current fishing power is [fishing_power]."
-/obj/item/twohanded/fishingrod/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+/obj/item/fishingrod/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
var/datum/component/fishable/fc = target.GetComponent(/datum/component/fishable)
if(!fc)
return ..()
if(!fishing)
- if(!wielded)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
to_chat(user, span_warning("You need to wield the rod in both hands before you can cast it!"))
return
cast(fc,user)
@@ -40,7 +46,7 @@
return
reel_in() //intentionally able to reel in with one hand
-/obj/item/twohanded/fishingrod/process()
+/obj/item/fishingrod/process()
if(!fishing)
return PROCESS_KILL
if(bite)
@@ -63,11 +69,11 @@
fishing_turf?.add_overlay(bobber_down)
do_fishing_alert(fisher)
-/obj/item/twohanded/fishingrod/Destroy()
+/obj/item/fishingrod/Destroy()
STOP_PROCESSING(SSobj,src)
return ..()
-/obj/item/twohanded/fishingrod/proc/cast(datum/component/fishable/fc,mob/user)
+/obj/item/fishingrod/proc/cast(datum/component/fishable/fc,mob/user)
fishing = TRUE
fishing_component = fc
var/turf/fishing_turf = fishing_component.parent
@@ -80,7 +86,7 @@
playsound(fishing_component, 'sound/effects/splash.ogg', 50, FALSE, -5)
to_chat(fisher, span_italics("You cast out your fishing rod..."))
-/obj/item/twohanded/fishingrod/proc/reel_in(forced = FALSE)
+/obj/item/fishingrod/proc/reel_in(forced = FALSE)
if(!forced && bite) // we got something!!!
playsound(fishing_component, 'sound/effects/water_emerge.ogg', 50, FALSE, -5)
var/power = 0
@@ -114,17 +120,17 @@
fishing_component = null
bite = FALSE //just to be safe
-/obj/item/twohanded/fishingrod/proc/reel_in_forced()
+/obj/item/fishingrod/proc/reel_in_forced()
reel_in(forced = TRUE)
-/obj/item/twohanded/fishingrod/proc/do_fishing_alert(atom/A)
+/obj/item/fishingrod/proc/do_fishing_alert(atom/A)
playsound(A.loc, 'sound/machines/chime.ogg', 50, FALSE, -5)
var/image/I = image('icons/obj/closet.dmi', A, "cardboard_special", A.layer+1)
flick_overlay_view(I, A, 8)
I.alpha = 0
animate(I, pixel_z = 32, alpha = 255, time = 2, easing = ELASTIC_EASING)
-/obj/item/twohanded/fishingrod/proc/spawn_reward(fishing_power = 0)
+/obj/item/fishingrod/proc/spawn_reward(fishing_power = 0)
var/picked_reward = fishing_component.get_reward(fishing_power)
if(prob(14.29) || !picked_reward || picked_reward == FISHING_LOOT_NOTHING) //14.29% to always fail, sorry, also handles failures.
fisher.visible_message(span_notice("[fisher] tugs on the rod and the line snaps!"), span_notice("Your line snaps! Whatever was on it sinks back into the deep."))
@@ -137,13 +143,12 @@
return
fisher.visible_message(span_notice("[fisher] reels in [reward_item]!"), span_notice("You reel in [reward_item]!"))
if(fisher.Adjacent(fishing_component.parent))
- unwield(fisher, show_message = FALSE)
if(fisher.put_in_hands(reward_item))
return
reward_item.throw_at(get_step(fishing_component,get_dir(fishing_component,fisher)),2,3,fisher) //whip it at them!
-/obj/item/twohanded/fishingrod/attackby(obj/item/B, mob/user, params)
+/obj/item/fishingrod/attackby(obj/item/B, mob/user, params)
if(!istype(B,/obj/item/reagent_containers/food/snacks/bait))
return
@@ -158,7 +163,7 @@
add_overlay("fishing_rod_[bait.icon_state]")
recalculate_power()
-/obj/item/twohanded/fishingrod/AltClick(mob/living/user)
+/obj/item/fishingrod/AltClick(mob/living/user)
if(bait)
user.put_in_hands(bait)
to_chat(user, span_notice("You take the [bait] off the fishing rod."))
@@ -166,22 +171,22 @@
bait = null
recalculate_power()
-/obj/item/twohanded/fishingrod/proc/recalculate_power()
+/obj/item/fishingrod/proc/recalculate_power()
fishing_power = initial(fishing_power)
if(bait)
fishing_power += bait.fishing_power
-/obj/item/twohanded/fishingrod/collapsible
+/obj/item/fishingrod/collapsible
name = "collapsible fishing rod"
desc = "A collapsible fishing rod! This one can fit into your backpack for space hikes and the like."
icon_state = "fishing_rod_collapse_c"
+ base_icon_state = "fishing_rod_collapse"
fishing_power = 15
w_class = WEIGHT_CLASS_SMALL //it starts collapsed and small
var/opened = FALSE
- var/rod_icon_state = "fishing_rod_collapse"
-/obj/item/twohanded/fishingrod/collapsible/attackby(obj/item/B, mob/user, params)
+/obj/item/fishingrod/collapsible/attackby(obj/item/B, mob/user, params)
if(!istype(B,/obj/item/reagent_containers/food/snacks/bait))
return
if(!opened)
@@ -189,13 +194,13 @@
return
..()
-/obj/item/twohanded/fishingrod/collapsible/AltClick(mob/living/user)
+/obj/item/fishingrod/collapsible/AltClick(mob/living/user)
if(bait)
return ..()
toggle(user)
-/obj/item/twohanded/fishingrod/collapsible/proc/toggle(mob/user)
- if(wielded)
+/obj/item/fishingrod/collapsible/proc/toggle(mob/user)
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
to_chat(user,"You can't collapse the rod if you are holding it with both hands")
return
if(fishing)
@@ -209,26 +214,26 @@
update_appearance(UPDATE_ICON)
user.regenerate_icons()
-/obj/item/twohanded/fishingrod/collapsible/update_icon_state()
+/obj/item/fishingrod/collapsible/update_icon_state()
. = ..()
item_state = opened ? "fishing_rod" : ""
- icon_state = "[rod_icon_state][opened ? "" : "_c"]"
+ icon_state = "[base_icon_state][opened ? "" : "_c"]"
-/obj/item/twohanded/fishingrod/collapsible/attack_self(mob/user)
+/obj/item/fishingrod/collapsible/attack_self(mob/user)
if(!opened)
toggle(user)
return
..()
-/obj/item/twohanded/fishingrod/collapsible/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+/obj/item/fishingrod/collapsible/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(!opened)
to_chat(user,"The collapsible rod has to be open before you can do anything!")
return
..()
-/obj/item/twohanded/fishingrod/collapsible/miningmedic
+/obj/item/fishingrod/collapsible/miningmedic
name = "ol' reliable"
desc = "Hey! I caught a miner!"
icon_state = "fishing_rod_miningmedic_c"
- rod_icon_state = "fishing_rod_miningmedic"
+ base_icon_state = "fishing_rod_miningmedic"
fishing_power = 1 //Rescue Yo Miners Bitch Damn! Fuck You Doin Fishin For!
diff --git a/yogstation/code/game/objects/items/wielded/big_spoon.dm b/yogstation/code/game/objects/items/wielded/big_spoon.dm
new file mode 100644
index 000000000000..25fb6a13368e
--- /dev/null
+++ b/yogstation/code/game/objects/items/wielded/big_spoon.dm
@@ -0,0 +1,42 @@
+/obj/item/bigspoon
+ name = "comically large spoon"
+ desc = "For when you're only allowed one spoonful of something."
+ icon = 'yogstation/icons/obj/kitchen.dmi'
+ mob_overlay_icon = 'yogstation/icons/mob/clothing/back.dmi'
+ icon_state = "bigspoon"
+ item_state = "bigspoon0"
+ base_icon_state = "bigspoon"
+ lefthand_file = 'yogstation/icons/mob/inhands/weapons/bigspoon_lefthand.dmi'
+ righthand_file = 'yogstation/icons/mob/inhands/weapons/bigspoon_righthand.dmi'
+ force = 2 //It's a big unwieldy for one hand
+ sharpness = SHARP_NONE //issa spoon
+ armour_penetration = -50 //literally couldn't possibly be a worse weapon for hitting armour
+ throwforce = 1 //it's terribly weighted, what do you expect?
+ hitsound = 'sound/items/trayhit1.ogg'
+ attack_verb = list("scooped", "bopped", "spooned", "wacked")
+ block_chance = 30 //Only works in melee, but I bet your ass you could raise its handle to deflect a sword
+ wound_bonus = -10
+ bare_wound_bonus = -15
+ materials = list(/datum/material/iron=18000)
+ w_class = WEIGHT_CLASS_HUGE
+ slot_flags = ITEM_SLOT_BACK
+
+/obj/item/bigspoon/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = 2, \
+ force_wielded = 16, \
+ icon_wielded = "[base_icon_state]1", \
+ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \
+ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \
+ )
+
+/obj/item/bigspoon/proc/on_wield(atom/source, mob/living/user)
+ hitsound = 'yogstation/sound/weapons/bat_hit.ogg'
+
+/obj/item/bigspoon/proc/on_unwield(atom/source, mob/living/user)
+ hitsound = initial(hitsound)
+
+/obj/item/bigspoon/update_icon_state()
+ . = ..()
+ item_state = "[base_icon_state]0" //i don't know why it's item_state rather than icon_state like every other wielded weapon //because you're changing in-hand icons not the inventory icon
diff --git a/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm b/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm
new file mode 100644
index 000000000000..61669d8568c3
--- /dev/null
+++ b/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm
@@ -0,0 +1,209 @@
+/*
+ * Vxtvul Hammer
+ */
+/obj/item/melee/vxtvulhammer
+ icon = 'icons/obj/weapons/misc.dmi'
+ icon_state = "vxtvul_hammer0-0"
+ base_icon_state = "vxtvul_hammer"
+ lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+ name = "Vxtvul Hammer"
+ desc = "A relic sledgehammer with charge packs wired to two blast pads on its head. \
+ While wielded in two hands, the user can charge a massive blow that will shatter construction and hurl bodies."
+ force = 4 //It's heavy as hell
+ armour_penetration = 50 //Designed for shattering walls in a single blow, I don't think it cares much about armor
+ throwforce = 18
+ attack_verb = list("attacked", "hit", "struck", "bludgeoned", "bashed", "smashed")
+ block_chance = 30 //Only works in melee, but I bet your ass you could raise its handle to deflect a sword
+ sharpness = SHARP_NONE //Blunt, breaks bones
+ wound_bonus = -10
+ bare_wound_bonus = 15
+ max_integrity = 200
+ resistance_flags = ACID_PROOF | FIRE_PROOF
+ w_class = WEIGHT_CLASS_HUGE
+ hitsound = 'sound/effects/hammerhitbasic.ogg'
+ slot_flags = ITEM_SLOT_BACK
+ actions_types = list(/datum/action/item_action/charge_hammer)
+ light_system = MOVABLE_LIGHT
+ light_color = LIGHT_COLOR_HALOGEN
+ light_range = 2
+ light_power = 2
+
+ var/force_wielded = 24
+ var/datum/effect_system/spark_spread/spark_system //It's a surprise tool that'll help us later
+ var/charging = FALSE
+ var/supercharged = FALSE
+ var/toy = FALSE
+
+/obj/item/melee/vxtvulhammer/Initialize(mapload) //For the sparks when you begin to charge it
+ . = ..()
+ spark_system = new
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+ set_light_on(FALSE)
+ AddComponent(/datum/component/two_handed, \
+ force_unwielded = force, \
+ force_wielded = force_wielded, \
+ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \
+ )
+
+/obj/item/melee/vxtvulhammer/Destroy() //Even though the hammer won't probably be destroyed, Everâ„¢
+ QDEL_NULL(spark_system)
+ return ..()
+
+/obj/item/melee/vxtvulhammer/update_icon_state()
+ . = ..()
+ icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]-[supercharged]"
+
+/obj/item/melee/vxtvulhammer/examine(mob/living/carbon/user)
+ . = ..()
+ if(supercharged)
+ . += "Electric sparks are bursting from the blast pads!"
+
+/obj/item/melee/vxtvulhammer/proc/on_unwield(atom/source, mob/living/carbon/user)
+ if(supercharged) //So you can't one-hand the charged hit
+ to_chat(user, span_notice("Your hammer loses its power as you adjust your grip."))
+ user.visible_message(span_warning("The sparks from [user]'s hammer suddenly stop!"))
+ supercharge()
+ if(charging) //So you can't one-hand while charging
+ to_chat(user, span_notice("You flip the switch off as you adjust your grip."))
+ user.visible_message(span_warning("[user] flicks the hammer off!"))
+ charging = FALSE
+
+/obj/item/melee/vxtvulhammer/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(attack_type == PROJECTILE_ATTACK || !HAS_TRAIT(src, TRAIT_WIELDED)) //Doesn't work against ranged or if it's not wielded
+ final_block_chance = 0 //Please show me how you can block a bullet with an industrial hammer I would LOVE to see it
+ return ..()
+
+/obj/item/melee/vxtvulhammer/attack(mob/living/carbon/human/target, mob/living/carbon/user) //This doesn't consider objects, only people
+ if (charging) //So you can't attack while charging
+ to_chat(user, span_notice("You flip the switch off before your attack."))
+ user.visible_message(span_warning("[user] flicks the hammer off and raises it!"))
+ charging = FALSE
+ return ..()
+
+/obj/item/melee/vxtvulhammer/AltClick(mob/living/carbon/user)
+ charge_hammer(user)
+
+/obj/item/melee/vxtvulhammer/proc/supercharge() //Proc to handle when it's charged for light + sprite + damage
+ supercharged = !supercharged
+ if(supercharged)
+ set_light_on(TRUE) //Glows when charged
+ if(!toy)
+ force = initial(force) + (HAS_TRAIT(src, TRAIT_WIELDED) ? force_wielded : 0) + 12 //12 additional damage for a total of 40 has to be a massively irritating check because of how force_wielded works
+ armour_penetration = 100
+ else
+ set_light_on(FALSE)
+ force = initial(force) + (HAS_TRAIT(src, TRAIT_WIELDED) ? force_wielded : 0)
+ armour_penetration = initial(armour_penetration)
+ update_appearance(UPDATE_ICON)
+
+/obj/item/melee/vxtvulhammer/proc/charge_hammer(mob/living/carbon/user)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
+ to_chat(user, span_warning("The hammer must be wielded in two hands in order to charge it!"))
+ return
+ if(supercharged)
+ to_chat(user, span_warning("The hammer is already supercharged!"))
+ else
+ charging = TRUE
+ to_chat(user, span_notice("You begin charging the weapon, concentration flowing into it..."))
+ user.visible_message(span_warning("[user] flicks the hammer on, tilting [user.p_their()] head down as if in thought."))
+ spark_system.start() //Generates sparks when you charge
+ if(!do_mob(user, user, ispreternis(user)? 5 SECONDS : 6 SECONDS))
+ if(!charging) //So no duplicate messages
+ return
+ to_chat(user, span_notice("You flip the switch off as you lose your focus."))
+ user.visible_message(span_warning("[user]'s concentration breaks!"))
+ charging = FALSE
+ if(!charging) //No charging for you if you cheat
+ return //Has to double-check return because attacking or one-handing won't actually proc !do_mob, so the channel will seem to continue despite the message that pops out, but this actually ensures that it won't charge despite attacking or one-handing
+ to_chat(user, span_notice("You complete charging the weapon."))
+ user.visible_message(span_warning("[user] looks up as [user.p_their()] hammer begins to crackle and hum!"))
+ playsound(loc, 'sound/magic/lightningshock.ogg', 60, TRUE) //Mainly electric crack
+ playsound(loc, 'sound/effects/magic.ogg', 40, TRUE) //Reverb undertone
+ supercharge()
+ charging = FALSE
+
+/obj/item/melee/vxtvulhammer/afterattack(atom/target, mob/living/carbon/user, proximity) //Afterattack to properly be able to smack walls
+ . = ..()
+ if(!proximity)
+ return
+ if(isfloorturf(target)) //So you don't just lose your supercharge if you miss and wack the floor. No I will NOT let people space with this thing
+ return
+
+ if(charging) //Needs a special snowflake check if you hit something that isn't a mob
+ if(ismachinery(target) || isstructure(target) || ismecha(target))
+ to_chat(user, span_notice("You flip the switch off after your blow."))
+ user.visible_message(span_warning("[user] flicks the hammer off after striking [target]!"))
+ charging = FALSE
+
+ if(supercharged)
+ var/turf/target_turf = get_turf(target) //Does the nice effects first so whatever happens to what's about to get clapped doesn't affect it
+ var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
+ K.color = color
+ playsound(loc, 'sound/effects/powerhammerhit.ogg', 80, FALSE) //Mainly this sound
+ playsound(loc, 'sound/effects/explosion3.ogg', 20, TRUE) //Bit of a reverb
+ supercharge() //At start so it doesn't give an unintentional message if you hit yourself
+
+ if(ismachinery(target) && !toy)
+ var/obj/machinery/machine = target
+ machine.take_damage(machine.max_integrity * 2) //Should destroy machines in one hit
+ if(istype(target, /obj/machinery/door))
+ for(var/obj/structure/door_assembly/door in target_turf) //Will destroy airlock assembly left behind, but drop the parts
+ door.take_damage(door.max_integrity * 2)
+ else
+ for(var/obj/structure/frame/base in target_turf) //Will destroy machine or computer frame left behind, but drop the parts
+ base.take_damage(base.max_integrity * 2)
+ for(var/obj/structure/light_construct/light in target_turf) //Also light frames because why not
+ light.take_damage(light.max_integrity * 2)
+ user.visible_message(span_danger("The hammer thunders against the [target.name], demolishing it!"))
+
+ else if(isstructure(target) && !toy)
+ var/obj/structure/struct = target
+ struct.take_damage(struct.max_integrity * 2) //Destroy structures in one hit too
+ if(istype(target, /obj/structure/table))
+ for(var/obj/structure/table_frame/platform in target_turf)
+ platform.take_damage(platform.max_integrity * 2) //Destroys table frames left behind
+ user.visible_message(span_danger("The hammer thunders against the [target.name], destroying it!"))
+
+ else if(iswallturf(target) && !toy)
+ var/turf/closed/wall/fort = target
+ fort.dismantle_wall(1) //Deletes the wall but drop the materials, just like destroying a machine above
+ user.visible_message(span_danger("The hammer thunders against the [target.name], shattering it!"))
+ playsound(loc, 'sound/effects/meteorimpact.ogg', 50, TRUE) //Otherwise there's no sound for hitting the wall, since it's just dismantled
+
+ else if(ismecha(target) && !toy)
+ var/obj/mecha/mech = target
+ mech.take_damage(mech.max_integrity/3) //A third of its max health is dealt as an untyped damage, in addition to the normal damage of the weapon (which has high AP)
+ user.visible_message(span_danger("The hammer thunders as it massively dents the plating of the [target.name]!"))
+
+ else if(isliving(target))
+ var/atom/throw_target = get_edge_target_turf(target, user.dir)
+ var/mob/living/victim = target
+ if(toy)
+ ADD_TRAIT(victim, TRAIT_IMPACTIMMUNE, "Toy Hammer")
+ victim.safe_throw_at(throw_target, rand(1,2), 3, callback = CALLBACK(src, PROC_REF(afterimpact), victim))
+ else
+ victim.throw_at(throw_target, 15, 5) //Same distance as maxed out power fist with three extra force
+ victim.Paralyze(2 SECONDS)
+ user.visible_message(span_danger("The hammer thunders as it viscerally strikes [target.name]!"))
+ to_chat(victim, span_userdanger("Agony sears through you as [user]'s blow cracks your body off its feet!"))
+ victim.emote("scream")
+
+/obj/item/melee/vxtvulhammer/proc/afterimpact(mob/living/victim)
+ REMOVE_TRAIT(victim, TRAIT_IMPACTIMMUNE, "Toy Hammer")
+
+/obj/item/melee/vxtvulhammer/pirate //Exact same but different text and sprites
+ icon_state = "vxtvul_hammer_pirate0-0"
+ base_icon_state = "vxtvul_hammer_pirate"
+ name = "pirate Vxtvul Hammer"
+ desc = "A relic sledgehammer with charge packs wired to two blast pads on its head. This one has been defaced by Syndicate pirates. \
+ While wielded in two hands, the user can charge a massive blow that will shatter construction and hurl bodies."
+
+/datum/action/item_action/charge_hammer
+ name = "Charge the Blast Pads"
+
+/datum/action/item_action/charge_hammer/Trigger()
+ var/obj/item/melee/vxtvulhammer/vxtvulhammer = target
+ if(istype(vxtvulhammer))
+ vxtvulhammer.charge_hammer(owner)
diff --git a/yogstation/code/modules/donor/unique_donator_items.dm b/yogstation/code/modules/donor/unique_donator_items.dm
index dbcd8769d879..59ec68301e5b 100644
--- a/yogstation/code/modules/donor/unique_donator_items.dm
+++ b/yogstation/code/modules/donor/unique_donator_items.dm
@@ -597,7 +597,7 @@ Uncomment this and use atomproccall as necessary, then copypaste the output into
unlock_path = /obj/item/toy/sword
/datum/donator_gear/hammer
name = "toy sledgehammer"
- unlock_path = /obj/item/twohanded/vxtvulhammer/toy
+ unlock_path = /obj/item/melee/vxtvulhammer/toy
//plushies - kill me, for fuck sake
/datum/donator_gear/plushvar
diff --git a/yogstation/code/modules/jobs/job_types/clerk.dm b/yogstation/code/modules/jobs/job_types/clerk.dm
index 9ba5a203c724..d7d9a2d4a114 100644
--- a/yogstation/code/modules/jobs/job_types/clerk.dm
+++ b/yogstation/code/modules/jobs/job_types/clerk.dm
@@ -27,7 +27,7 @@
/obj/effect/spawner/lootdrop/plushies = 20,
/obj/item/toy/minimeteor = 15,
/obj/item/circuitboard/computer/slot_machine = 15,
- /obj/item/twohanded/dualsaber/toy = 10,
+ /obj/item/melee/dualsaber/toy = 10,
/obj/item/toy/windupToolbox = 10,
/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 5,
/obj/item/storage/fancy/heart_box = 5,
diff --git a/yogstation/code/modules/jobs/job_types/tourist.dm b/yogstation/code/modules/jobs/job_types/tourist.dm
index 53da5a78e611..d5ebb5c1e177 100644
--- a/yogstation/code/modules/jobs/job_types/tourist.dm
+++ b/yogstation/code/modules/jobs/job_types/tourist.dm
@@ -19,7 +19,7 @@
mail_goodies = list(
/obj/effect/spawner/lootdrop/plushies = 15,
/obj/item/fakeartefact = 5,
- /obj/item/twohanded/binoculars = 5,
+ /obj/item/binoculars = 5,
/obj/item/storage/photo_album = 4,
/obj/item/clothing/glasses/sunglasses = 1
)
diff --git a/yogstation/code/modules/vending/fishing.dm b/yogstation/code/modules/vending/fishing.dm
index 465e82103cc4..d6a7322dac98 100644
--- a/yogstation/code/modules/vending/fishing.dm
+++ b/yogstation/code/modules/vending/fishing.dm
@@ -9,7 +9,7 @@
icon_deny = "fishing-deny"
product_slogans = "Don't tell my wife which bank I went to!;Fish fear me. Women love me.;If you want me to listen to you... talk about FISHING!;Good things come to those who bait.;Why did the lizard cross the road?"
vend_reply = "Go get 'em, tiger!"
- products = list(/obj/item/twohanded/fishingrod = 3,
+ products = list(/obj/item/fishingrod = 3,
/obj/item/reagent_containers/food/snacks/bait/apprentice = 15,
/obj/item/reagent_containers/food/snacks/bait/journeyman = 10,
/obj/item/clothing/head/fishing = 3,