diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm
index 70535e03ad0..c15747c8fc1 100644
--- a/_maps/map_files/BirdStation/BirdStation.dmm
+++ b/_maps/map_files/BirdStation/BirdStation.dmm
@@ -1410,7 +1410,7 @@
"aBf" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/white,/area/maintenance/asmaint2)
"aBg" = (/obj/item/clothing/gloves/color/latex/nitrile,/turf/open/floor/plasteel/white,/area/maintenance/asmaint2)
"aBh" = (/turf/open/floor/plasteel/white,/area/maintenance/asmaint2)
-"aBi" = (/obj/structure/table,/obj/item/weapon/melee/baton/cattleprod,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/restraints/handcuffs,/obj/item/clothing/tie/stethoscope,/turf/open/floor/plasteel/white,/area/space)
+"aBi" = (/obj/structure/table,/obj/item/weapon/wirerod,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/restraints/handcuffs,/obj/item/clothing/tie/stethoscope,/turf/open/floor/plasteel/white,/area/space)
"aBj" = (/obj/machinery/light,/turf/open/floor/plasteel,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aBk" = (/obj/structure/cable/cyan{icon_state = "1-2"},/turf/open/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aBl" = (/obj/machinery/portable_atmospherics/canister/air,/turf/open/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"})
diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm
index c4454c5a061..a2c597f1c0a 100644
--- a/_maps/map_files/DreamStation/dreamstation04.dmm
+++ b/_maps/map_files/DreamStation/dreamstation04.dmm
@@ -12173,7 +12173,7 @@
"ayJ" = (
/obj/structure/rack,
/obj/item/weapon/lipstick/jade,
-/obj/item/weapon/melee/baton/cattleprod,
+/obj/item/weapon/wirerod,
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 3;
name = "3maintenance loot spawner"
@@ -77150,7 +77150,7 @@
tag = "icon-1-2";
icon_state = "1-2"
},
-/obj/item/weapon/melee/baton/cattleprod,
+/obj/item/weapon/wirerod,
/turf/open/floor/plating/airless,
/area/engine/engineering)
"cQP" = (
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 9fbf3d8fd00..df61d13b779 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -62391,6 +62391,7 @@
"cwy" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/table_frame,
+/obj/item/weapon/wirerod,
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/asmaint2)
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 3975886caea..218f2fba57c 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -12,6 +12,7 @@
w_class = 3
materials = list(MAT_METAL=500)
origin_tech = "combat=1;plasmatech=1"
+ var/status = 0
var/throw_amount = 100
var/lit = 0 //on or off
var/operating = 0//cooldown
@@ -48,7 +49,7 @@
/obj/item/weapon/flamethrower/update_icon()
overlays.Cut()
if(igniter)
- overlays += "+igniter1"
+ overlays += "+igniter[status]"
if(ptank)
overlays += "+ptank"
if(lit)
@@ -69,7 +70,41 @@
flame_turf(turflist)
/obj/item/weapon/flamethrower/attackby(obj/item/W, mob/user, params)
- if(istype(W,/obj/item/weapon/tank/internals/plasma))
+ if(istype(W, /obj/item/weapon/wrench) && !status)//Taking this apart
+ var/turf/T = get_turf(src)
+ if(weldtool)
+ weldtool.loc = T
+ weldtool = null
+ if(igniter)
+ igniter.loc = T
+ igniter = null
+ if(ptank)
+ ptank.loc = T
+ ptank = null
+ new /obj/item/stack/rods(T)
+ qdel(src)
+ return
+
+ else if(istype(W, /obj/item/weapon/screwdriver) && igniter && !lit)
+ status = !status
+ user << "[igniter] is now [status ? "secured" : "unsecured"]!"
+ update_icon()
+ return
+
+ else if(isigniter(W))
+ var/obj/item/device/assembly/igniter/I = W
+ if(I.secured)
+ return
+ if(igniter)
+ return
+ if(!user.unEquip(W))
+ return
+ I.loc = src
+ igniter = I
+ update_icon()
+ return
+
+ else if(istype(W,/obj/item/weapon/tank/internals/plasma))
if(ptank)
user << "There appears to already be a plasma tank loaded in [src]!"
return
@@ -110,6 +145,8 @@
if(href_list["light"])
if(!ptank)
return
+ if(!status)
+ return
lit = !lit
if(lit)
SSobj.processing |= src
@@ -137,7 +174,9 @@
..()
weldtool = locate(/obj/item/weapon/weldingtool) in contents
igniter = locate(/obj/item/device/assembly/igniter) in contents
+ weldtool.status = 0
igniter.secured = 0
+ status = 1
update_icon()
//Called from turf.dm turf/dblclick
@@ -179,9 +218,11 @@
..()
if(!weldtool)
weldtool = new /obj/item/weapon/weldingtool(src)
+ weldtool.status = 0
if(!igniter)
igniter = new /obj/item/device/assembly/igniter(src)
igniter.secured = 0
+ status = 1
update_icon()
/obj/item/weapon/flamethrower/full/tank/New(var/loc)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index c88ddc1843d..bd261f6a22c 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -151,6 +151,37 @@
desc = "Fake handcuffs meant for erotic roleplay."
icon_state = "handcuffGag"
+/obj/item/weapon/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params)
+ ..()
+ if(istype(I, /obj/item/stack/rods))
+ var/obj/item/stack/rods/R = I
+ if (R.use(1))
+ var/obj/item/weapon/wirerod/W = new /obj/item/weapon/wirerod
+ if(!remove_item_from_storage(user))
+ user.unEquip(src)
+ user.put_in_hands(W)
+ user << "You wrap the cable restraint around the top of the rod."
+ qdel(src)
+ else
+ user << "You need one rod to make a wired rod!"
+ return
+ else if(istype(I, /obj/item/stack/sheet/metal))
+ var/obj/item/stack/sheet/metal/M = I
+ if(M.amount < 6)
+ user << "You need at least six metal sheets to make good enough weights!"
+ return
+ user << "You begin to apply [I] to [src]..."
+ if(do_after(user, 35, target = src))
+ var/obj/item/weapon/restraints/legcuffs/bola/S = new /obj/item/weapon/restraints/legcuffs/bola
+ M.use(6)
+ user.put_in_hands(S)
+ user << "You make some weights out of [I] and tie them to [src]."
+ if(!remove_item_from_storage(user))
+ user.unEquip(src)
+ qdel(src)
+ else
+ return ..()
+
/obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user)
if(isrobot(user))
if(!C.handcuffed)
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 2177daf2c1d..54eb7d7910f 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -93,7 +93,7 @@
/obj/item/weapon/tank/internals/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/flamethrower))
var/obj/item/weapon/flamethrower/F = W
- if(F.ptank)
+ if ((!F.status)||(F.ptank))
return
src.master = F
F.ptank = src
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index bd69eea0d60..9f7b37c2542 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -202,6 +202,7 @@
materials = list(MAT_METAL=70, MAT_GLASS=30)
origin_tech = "engineering=1"
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
+ var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
var/change_icons = 1
var/can_off_process = 0
@@ -243,6 +244,16 @@
user.visible_message("[user] welds \his every orifice closed! It looks like \he's trying to commit suicide..")
return (FIRELOSS)
+
+/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ flamethrower_screwdriver(I, user)
+ else if(istype(I, /obj/item/stack/rods))
+ flamethrower_rods(I, user)
+ else
+ return ..()
+
+
/obj/item/weapon/weldingtool/attack(mob/living/carbon/human/H, mob/user)
if(!istype(H))
return ..()
@@ -356,6 +367,9 @@
//Toggles the welder off and on
/obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0)
+ if(!status)
+ user << "[src] can't be turned on while unsecured!"
+ return
welding = !welding
if(welding)
if(get_fuel() >= 1)
@@ -381,6 +395,33 @@
/obj/item/weapon/weldingtool/is_hot()
return welding * heat
+/obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
+ if(welding)
+ user << "Turn it off first!"
+ return
+ status = !status
+ if(status)
+ user << "You resecure [src]."
+ else
+ user << "[src] can now be attached and modified."
+ add_fingerprint(user)
+
+/obj/item/weapon/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user)
+ if(!status)
+ var/obj/item/stack/rods/R = I
+ if (R.use(1))
+ var/obj/item/weapon/flamethrower/F = new /obj/item/weapon/flamethrower(user.loc)
+ if(!remove_item_from_storage(F))
+ user.unEquip(src)
+ loc = F
+ F.weldtool = src
+ add_fingerprint(user)
+ user << "You add a rod to a welder, starting to build a flamethrower."
+ user.put_in_hands(F)
+ else
+ user << "You need one rod to start building a flamethrower!"
+ return
+
/obj/item/weapon/weldingtool/largetank
name = "industrial welding tool"
desc = "A slightly larger welder with a larger tank."
@@ -396,6 +437,10 @@
icon_state = "indwelder"
toolspeed = 2
+/obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver()
+ return
+
+
/obj/item/weapon/weldingtool/mini
name = "emergency welding tool"
desc = "A miniature welder used during emergencies."
@@ -405,6 +450,10 @@
materials = list(MAT_METAL=30, MAT_GLASS=10)
change_icons = 0
+/obj/item/weapon/weldingtool/mini/flamethrower_screwdriver()
+ return
+
+
/obj/item/weapon/weldingtool/hugetank
name = "upgraded industrial welding tool"
desc = "An upgraded welder based of the industrial welder."
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 58696ae9573..c389b785427 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -78,6 +78,46 @@
user.visible_message("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
return(BRUTELOSS)
+/obj/item/weapon/wirerod
+ name = "wired rod"
+ desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit."
+ icon_state = "wiredrod"
+ item_state = "rods"
+ flags = CONDUCT
+ force = 9
+ throwforce = 10
+ w_class = 3
+ materials = list(MAT_METAL=1150, MAT_GLASS=75)
+ attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
+
+/obj/item/weapon/wirerod/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/shard))
+ var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear
+
+ if(!remove_item_from_storage(user))
+ user.unEquip(src)
+ user.unEquip(I)
+
+ user.put_in_hands(S)
+ user << "You fasten the glass shard to the top of the rod with the cable."
+ qdel(I)
+ qdel(src)
+
+ else if(istype(I, /obj/item/device/assembly/igniter) && !(I.flags & NODROP))
+ var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod
+
+ if(!remove_item_from_storage(user))
+ user.unEquip(src)
+ user.unEquip(I)
+
+ user.put_in_hands(P)
+ user << "You fasten [I] to the top of the rod with the cable."
+ qdel(I)
+ qdel(src)
+ else
+ return ..()
+
+
/obj/item/weapon/throwing_star
name = "throwing star"
desc = "An ancient weapon still used to this day due to it's ease of lodging itself into victim's body parts"
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 9dc01f1c627..77cce99d702 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -9,14 +9,6 @@
var/chem_catalysts[] = list() //like tools but for reagents
var/category = CAT_NONE //where it shows up in the crafting UI
-/datum/crafting_recipe/spear
- name = "Spear"
- result = /obj/item/weapon/twohanded/spear
- reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
- /obj/item/weapon/shard = 1,
- /obj/item/stack/rods = 1)
- time = 40
- category = CAT_WEAPON
/datum/crafting_recipe/pin_removal
name = "Pin Removal"
diff --git a/icons/obj/flamethrower.dmi b/icons/obj/flamethrower.dmi
index 748737acff8..dd470c47809 100644
Binary files a/icons/obj/flamethrower.dmi and b/icons/obj/flamethrower.dmi differ