diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm
index b1489f60ed5..045cc0f9167 100644
--- a/code/_helpers/atmospherics.dm
+++ b/code/_helpers/atmospherics.dm
@@ -45,4 +45,4 @@
if(P) return atmosanalyzer_scan(src, src.P.air_contents, user)
/obj/item/flamethrower/atmosanalyze(var/mob/user)
- if(ptank) return atmosanalyzer_scan(src, ptank.air_contents, user)
+ if(gas_tank) return atmosanalyzer_scan(src, gas_tank.air_contents, user)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index d35b0939cfe..de2cabf214a 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -35,7 +35,7 @@
uniform = /obj/item/clothing/under/rank/chief_engineer
head = /obj/item/clothing/head/hardhat/white
- belt = /obj/item/storage/belt/utility
+ belt = /obj/item/storage/belt/utility/ce
tab_pda = /obj/item/modular_computer/handheld/pda/engineering/ce
wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/engineering/ce
tablet = /obj/item/modular_computer/handheld/preset/engineering/ce
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 55c622c9649..1858fbdd718 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -944,3 +944,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
if(SP.current_slide == src && (SP.projection in view(world.view, user)))
return TRUE
return FALSE
+
+/obj/item/proc/get_belt_overlay() //Returns the icon used for overlaying the object on a belt
+ return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state)
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 210aedc63f1..0ea4f187559 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -1,6 +1,5 @@
/**
* Multitool -- A multitool is used for hacking electronic devices.
- * TO-DO -- Using it as a power measurement tool for cables etc. Nannek.
*
*/
@@ -8,12 +7,11 @@
name = "multitool"
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors."
desc_info = "You can use this on airlocks or APCs to try to hack them without cutting wires."
+ icon = 'icons/obj/contained_items/tools/multitool.dmi'
icon_state = "multitool"
item_state = "multitool"
- item_icons = list(
- slot_l_hand_str = 'icons/mob/items/lefthand_tools.dmi',
- slot_r_hand_str = 'icons/mob/items/righthand_tools.dmi',
- )
+ item_icons = null
+ contained_sprite = TRUE
flags = CONDUCT
force = 5.0
w_class = ITEMSIZE_SMALL
@@ -32,6 +30,9 @@
var/buffer_name
var/atom/buffer_object
+ var/datum/integrated_io/selected_io = null
+ var/mode = 0
+
/obj/item/device/multitool/Destroy()
unregister_buffer(buffer_object)
return ..()
@@ -81,3 +82,68 @@
user.AddTopicPrint(src)
MT.interact(src, user)
return 1
+
+/obj/item/device/multitool/attack_self(mob/user)
+ if(selected_io)
+ selected_io = null
+ to_chat(user, "You clear the wired connection from the multitool.")
+ else
+ ..()
+ update_icon()
+
+/obj/item/device/multitool/update_icon()
+ if(selected_io)
+ if(buffer || connecting || buffer_object)
+ icon_state = "multitool_tracking"
+ else
+ icon_state = "multitool_red"
+ else
+ if(buffer || connecting || buffer_object)
+ icon_state = "multitool_tracking_fail"
+ else
+ icon_state = "multitool"
+
+/obj/item/device/multitool/proc/wire(datum/integrated_io/io, mob/user)
+ if(!io.holder.assembly)
+ to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.")
+ return
+
+ if(selected_io)
+ if(io == selected_io)
+ to_chat(user, "Wiring \the [selected_io.holder]'s '[selected_io.name]' pin into itself is rather pointless.")
+ return
+ if(io.io_type != selected_io.io_type)
+ to_chat(user, "Those two types of channels are incompatable. The first is a [selected_io.io_type], \
+ while the second is a [io.io_type].")
+ return
+ if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly)
+ to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.")
+ return
+ selected_io.linked |= io
+ io.linked |= selected_io
+
+ to_chat(user, "You connect \the [selected_io.holder]'s '[selected_io.name]' pin to \the [io.holder]'s '[io.name]' pin.")
+ selected_io.holder.interact(user) // This is to update the UI.
+ selected_io = null
+
+ else
+ selected_io = io
+ to_chat(user, "You link \the multitool to \the [selected_io.holder]'s [selected_io.name] data channel.")
+
+ update_icon()
+
+/obj/item/device/multitool/proc/unwire(datum/integrated_io/io1, datum/integrated_io/io2, mob/user)
+ if(!io1.linked.len || !io2.linked.len)
+ to_chat(user, "There is nothing connected to the data channel.")
+ return
+
+ if(!(io1 in io2.linked) || !(io2 in io1.linked) )
+ to_chat(user, "These data pins aren't connected!")
+ return
+ else
+ io1.linked.Remove(io2)
+ io2.linked.Remove(io1)
+ to_chat(user, "You clip the data connection between the [io1.holder.displayed_name]'s \
+ '[io1.name]' pin and the [io2.holder.displayed_name]'s '[io2.name]' pin.")
+ io1.holder.interact(user) // This is to update the UI.
+ update_icon()
\ No newline at end of file
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index db114649a73..b152e9e9122 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -322,8 +322,10 @@ BREATH ANALYZER
/obj/item/device/analyzer
name = "analyzer"
desc = "A hand-held environmental scanner which reports current gas levels."
- icon_state = "atmos"
+ icon = 'icons/obj/contained_items/tools/air_analyzer.dmi'
+ icon_state = "analyzer"
item_state = "analyzer"
+ contained_sprite = TRUE
w_class = ITEMSIZE_SMALL
flags = CONDUCT
slot_flags = SLOT_BELT
diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm
index 64a12a2e188..89bcae91812 100644
--- a/code/game/objects/items/devices/t_scanner.dm
+++ b/code/game/objects/items/devices/t_scanner.dm
@@ -3,10 +3,12 @@
/obj/item/device/t_scanner
name = "\improper T-ray scanner"
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
+ icon = 'icons/obj/contained_items/tools/t_scanner.dmi'
icon_state = "t-ray0"
+ item_state = "t-ray"
+ contained_sprite = TRUE
slot_flags = SLOT_BELT
w_class = ITEMSIZE_SMALL
- item_state = "electronic"
matter = list(DEFAULT_WALL_MATERIAL = 150)
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
action_button_name = "Toggle T-Ray scanner"
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 8edf6e71d0e..c6efb9d462b 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -1,9 +1,10 @@
/obj/item/flamethrower
name = "flamethrower"
desc = "A flamethrower created by modifying a welding tool to fit an external gas tank."
- icon = 'icons/obj/flamethrower.dmi'
- icon_state = "flamethrowerbase"
+ icon = 'icons/obj/contained_items/weapons/flamethrower.dmi'
+ icon_state = "flamethrower"
item_state = "flamethrower_0"
+ contained_sprite = TRUE
var/fire_sound = 'sound/weapons/flamethrower.ogg'
flags = CONDUCT
force = 3.0
@@ -20,13 +21,13 @@
var/turf/previousturf = null
var/obj/item/weldingtool/weldtool = null
var/obj/item/device/assembly/igniter/igniter = null
- var/obj/item/tank/phoron/ptank = null
+ var/obj/item/tank/gas_tank = null
/obj/item/flamethrower/examine(mob/user)
..()
if(Adjacent(user))
- if(ptank)
- to_chat(user, SPAN_NOTICE("Release pressure is set to [throw_amount] kPa. The tank has about [round(ptank.air_contents.return_pressure(), 10)] kPa left in it."))
+ if(gas_tank)
+ to_chat(user, SPAN_NOTICE("Release pressure is set to [throw_amount] kPa. The tank has about [round(gas_tank.air_contents.return_pressure(), 10)] kPa left in it."))
else
to_chat(user, SPAN_WARNING("It has no gas tank installed."))
if(igniter)
@@ -39,8 +40,8 @@
qdel(weldtool)
if(igniter)
qdel(igniter)
- if(ptank)
- qdel(ptank)
+ if(gas_tank)
+ qdel(gas_tank)
return ..()
@@ -61,8 +62,10 @@
cut_overlays()
if(igniter)
add_overlay("+igniter[secured]")
- if(ptank)
- add_overlay("+ptank")
+ if(istype(gas_tank, /obj/item/tank/phoron))
+ add_overlay("+phoron_tank")
+ else if(istype(gas_tank, /obj/item/tank/hydrogen))
+ add_overlay("+hydro_tank")
if(lit)
add_overlay("+lit")
item_state = "flamethrower_1"
@@ -75,9 +78,9 @@
/obj/item/flamethrower/afterattack(atom/target, mob/user, proximity)
if(proximity)
return
- if(!ptank)
+ if(!gas_tank)
return
- if(ptank.air_contents.get_by_flag(XGM_GAS_FUEL) < 1)
+ if(gas_tank.air_contents.get_by_flag(XGM_GAS_FUEL) < 1)
to_chat(user, SPAN_WARNING("\The [src] doesn't have enough fuel left to throw!"))
return
// Make sure our user is still holding us
@@ -99,9 +102,9 @@
if(igniter)
igniter.forceMove(T)
igniter = null
- if(ptank)
- ptank.forceMove(T)
- ptank = null
+ if(gas_tank)
+ gas_tank.forceMove(T)
+ gas_tank = null
new /obj/item/stack/rods(T)
qdel(src)
return
@@ -125,12 +128,12 @@
update_icon()
return
- else if(istype(W, /obj/item/tank/phoron))
- if(ptank)
+ else if(istype(W, /obj/item/tank/phoron) || istype(W, /obj/item/tank/hydrogen))
+ if(gas_tank)
to_chat(user, SPAN_WARNING("There appears to already be a tank loaded in \the [src]!"))
return
user.drop_from_inventory(W, src)
- ptank = W
+ gas_tank = W
update_icon()
return
@@ -149,7 +152,7 @@
/obj/item/flamethrower/attack_self(mob/user)
if(use_check_and_message(user))
return
- if(!ptank)
+ if(!gas_tank)
to_chat(user, SPAN_WARNING("Attach a phoron tank first!"))
return
var/list/options = list(
@@ -163,10 +166,10 @@
return
switch(handle)
if("Eject Tank")
- if(!ptank)
+ if(!gas_tank)
return
- user.put_in_hands(ptank)
- ptank = null
+ user.put_in_hands(gas_tank)
+ gas_tank = null
lit = FALSE
if("Light")
attempt_lighting(user)
@@ -194,10 +197,10 @@
if(lit)
to_chat(user, SPAN_WARNING("\The [src] is already lit."))
return
- if(!ptank)
+ if(!gas_tank)
to_chat(user, SPAN_WARNING("\The [src] doesn't have a tank installed."))
return
- if(ptank.air_contents.get_by_flag(XGM_GAS_FUEL) < 1)
+ if(gas_tank.air_contents.get_by_flag(XGM_GAS_FUEL) < 1)
to_chat(user, SPAN_WARNING("\The [src] doesn't have any flammable fuel to light!"))
return
lit = TRUE
@@ -233,13 +236,13 @@
/obj/item/flamethrower/proc/ignite_turf(turf/target)
- var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(0.02 * (throw_amount / 100))
+ var/datum/gas_mixture/air_transfer = gas_tank.air_contents.remove_ratio(0.02 * (throw_amount / 100))
new /obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(target, air_transfer.get_by_flag(XGM_GAS_FUEL) * 15, get_dir(loc, target))
for(var/g in air_transfer.gas)
if(gas_data.flags[g] & XGM_GAS_FUEL)
air_transfer.gas[g] = 0
target.assume_air(air_transfer)
- target.hotspot_expose((ptank.air_contents.temperature*2) + 400, 500)
+ target.hotspot_expose((gas_tank.air_contents.temperature*2) + 400, 500)
/obj/item/flamethrower/full/Initialize()
. = ..()
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 8e488ae1638..565d4cc8da1 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -14,12 +14,20 @@
pickup_sound = 'sound/items/pickup/toolbelt.ogg'
var/flipped = FALSE
var/show_above_suit = FALSE
+ var/content_overlays = FALSE //If this is true, the belt will gain overlays based on what it's holding
/obj/item/storage/belt/proc/update_clothing_icon()
if(ismob(src.loc))
var/mob/M = src.loc
M.update_inv_belt()
+/obj/item/storage/belt/update_icon()
+ cut_overlays()
+ if(content_overlays)
+ for(var/obj/item/I in contents)
+ add_overlay(I.get_belt_overlay())
+ ..()
+
/obj/item/storage/belt/verb/toggle_layer()
set name = "Switch Belt Layer"
set category = "Object"
@@ -34,6 +42,10 @@
. = ..()
update_flip_verb()
+/obj/item/storage/belt/fill()
+ . = ..()
+ update_icon()
+
/obj/item/storage/belt/proc/update_flip_verb()
if(("[initial(icon_state)]_flip") in icon_states(icon)) // Check for whether it has a flipped icon. Prevents invisible sprites.
verbs += /obj/item/storage/belt/proc/flipbelt
@@ -86,7 +98,11 @@
/obj/item/device/debugger,
/obj/item/device/eftpos
)
+ content_overlays = TRUE
+/obj/item/storage/belt/utility/ce
+ icon_state = "utilitybelt_ce"
+ item_state = "utility_ce"
/obj/item/storage/belt/utility/full
starts_with = list(
@@ -258,6 +274,7 @@
/obj/item/device/holowarrant,
/obj/item/device/radio
)
+ content_overlays = TRUE
/obj/item/storage/belt/soulstone
name = "soul stone belt"
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 9e283afce3e..482d567af43 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -90,9 +90,9 @@
if (istype(W, /obj/item/flamethrower))
var/obj/item/flamethrower/F = W
- if ((!F.secured)||(F.ptank)) return
+ if ((!F.secured)||(F.gas_tank)) return
src.master = F
- F.ptank = src
+ F.gas_tank = src
user.remove_from_mob(src)
src.forceMove(F)
return
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 5dd1f8c3791..f28fcb6e41f 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -82,6 +82,13 @@
tf.Translate(-3,0) //Could do this with pixel_x but let's just update the appearance once.
transform = tf
+/obj/item/screwdriver/get_belt_overlay()
+ var/mutable_appearance/body = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver")
+ var/mutable_appearance/head = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_head")
+ body.color = color
+ head.add_overlay(body)
+ return head
+
/obj/item/screwdriver/pickup(mob/user)
..()
update_icon()
@@ -150,6 +157,13 @@
tf.Translate(-1,0) //Could do this with pixel_x but let's just update the appearance once.
transform = tf
+/obj/item/wirecutters/get_belt_overlay()
+ var/mutable_appearance/body = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "wirecutters")
+ var/mutable_appearance/head = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "wirecutters_head")
+ body.color = color
+ head.add_overlay(body)
+ return head
+
/obj/item/wirecutters/pickup(mob/user)
..()
update_icon()
@@ -191,20 +205,15 @@
/obj/item/weldingtool
name = "welding tool"
desc = "A welding tool with a built-in fuel tank, designed for welding and cutting metal."
- icon = 'icons/obj/tools.dmi'
- item_icons = list(
- slot_l_hand_str = 'icons/mob/items/lefthand_tools.dmi',
- slot_r_hand_str = 'icons/mob/items/righthand_tools.dmi',
- )
- icon_state = "welder_off"
- item_state = "welder_off"
+ icon = 'icons/obj/contained_items/tools/welding_tools.dmi'
+ icon_state = "welder"
+ item_state = "welder"
+ contained_sprite = TRUE
flags = CONDUCT
slot_flags = SLOT_BELT
drop_sound = 'sound/items/drop/weldingtool.ogg'
pickup_sound = 'sound/items/pickup/weldingtool.ogg'
usesound = 'sound/items/welder.ogg'
- var/base_iconstate = "welder"//These are given an _on/_off suffix before being used
- var/base_itemstate = "welder"
//Amount of OUCH when it's thrown
force = 3
@@ -224,14 +233,16 @@
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 = TRUE
+
/obj/item/weldingtool/iswelder()
return TRUE
/obj/item/weldingtool/largetank
name = "industrial welding tool"
desc = "A welding tool with an extended-capacity built-in fuel tank, standard issue for engineers."
- base_iconstate = "ind_welder"
- base_itemstate = "ind_welder"
+ icon_state = "indwelder"
+ item_state = "welder"
max_fuel = 40
matter = list(DEFAULT_WALL_MATERIAL = 100, MATERIAL_GLASS = 60)
origin_tech = list(TECH_ENGINEERING = 2)
@@ -239,8 +250,8 @@
/obj/item/weldingtool/hugetank
name = "advanced welding tool"
desc = "A rare and powerful welding tool with a super-extended fuel tank."
- base_iconstate = "adv_welder"
- base_itemstate = "adv_welder"
+ icon_state = "advwelder"
+ item_state = "advwelder"
max_fuel = 80
matter = list(DEFAULT_WALL_MATERIAL = 200, MATERIAL_GLASS = 120)
origin_tech = list(TECH_ENGINEERING = 3)
@@ -249,16 +260,16 @@
/obj/item/weldingtool/experimental
name = "experimental welding tool"
desc = "A scientifically-enhanced welding tool that uses fuel-producing microbes to gradually replenish its fuel supply."
- base_iconstate = "exp_welder"
- base_itemstate = "exp_welder"
+ icon_state = "expwelder"
+ item_state = "expwelder"
max_fuel = 40
matter = list(DEFAULT_WALL_MATERIAL = 100, MATERIAL_GLASS = 120)
origin_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4)
-
var/last_gen = 0
var/fuelgen_delay = 400 //The time, in deciseconds, required to regenerate one unit of fuel
//400 = 1 unit per 40 seconds
+ change_icons = FALSE
//Welding tool functionality here
/obj/item/weldingtool/Initialize()
@@ -270,17 +281,27 @@
R.add_reagent(/decl/reagent/fuel, max_fuel)
update_icon()
-/obj/item/weldingtool/update_icon()
- ..()
- var/add = welding ? "_on" : "_off"
- icon_state = base_iconstate + add //These are given an _on/_off suffix before being used
- item_state = base_itemstate + add
+/obj/item/weldingtool/proc/update_torch()
+ if(welding)
+ add_overlay("[initial(icon_state)]-on")
+ item_state = "[initial(item_state)]1"
+ else
+ item_state = "[initial(item_state)]"
+
if(welding == 2)
set_light(0.7, 2, l_color = LIGHT_COLOR_CYAN)
else if (welding == 1)
set_light(0.6, 1.5, l_color = LIGHT_COLOR_LAVA)
else
set_light(0)
+
+/obj/item/weldingtool/update_icon()
+ cut_overlays()
+ if(change_icons)
+ var/ratio = get_fuel() / max_fuel
+ ratio = CEILING(ratio*4, 1) * 25
+ add_overlay("[initial(icon_state)][ratio]")
+ update_torch()
var/mob/M = loc
if(istype(M))
M.update_inv_l_hand()
@@ -712,13 +733,10 @@
/obj/item/powerdrill
name = "impact wrench"
desc = "The screwdriver's big brother."
- icon = 'icons/obj/tools.dmi'
- item_icons = list(
- slot_l_hand_str = 'icons/mob/items/lefthand_tools.dmi',
- slot_r_hand_str = 'icons/mob/items/righthand_tools.dmi',
- )
- icon_state = "powerdrillyellow"
- item_state = "powerdrillyellow"
+ icon = 'icons/obj/contained_items/tools/impact_wrench.dmi'
+ icon_state = "impact_wrench-screw"
+ item_state = "impact_wrench"
+ contained_sprite = TRUE
force = 8
attack_verb = list("gored", "drilled", "screwed", "punctured")
w_class = ITEMSIZE_SMALL
@@ -730,12 +748,8 @@
"wrenchbit"
)
-
/obj/item/powerdrill/Initialize()
. = ..()
- var/drillcolor = pick("red", "blue", "yellow", "green")
- icon_state = "powerdrill[drillcolor]"
- item_state = icon_state
update_tool()
/obj/item/powerdrill/examine(var/mob/user)
@@ -763,13 +777,12 @@
return tools[current_tool] == "screwdriverbit"
/obj/item/powerdrill/proc/update_tool()
- cut_overlays()
if(isscrewdriver())
usesound = 'sound/items/air_wrench.ogg'
- add_overlay("screwdriverbit")
+ icon_state = "impact_wrench-screw"
else if(iswrench())
usesound = 'sound/items/drill_use.ogg'
- add_overlay("wrenchbit")
+ icon_state = "impact_wrench-wrench"
/obj/item/powerdrill/attack_self(var/mob/user)
if(++current_tool > tools.len)
diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm
index 5052ea23b50..cf8e710f2d6 100644
--- a/code/modules/integrated_electronics/core/tools.dm
+++ b/code/modules/integrated_electronics/core/tools.dm
@@ -165,75 +165,6 @@
io.holder.interact(user) // This is to update the UI.
-/obj/item/device/multitool
- var/datum/integrated_io/selected_io = null
- var/mode = 0
-
-/obj/item/device/multitool/attack_self(mob/user)
- if(selected_io)
- selected_io = null
- to_chat(user, "You clear the wired connection from the multitool.")
- else
- ..()
- update_icon()
-
-/obj/item/device/multitool/update_icon()
- if(selected_io)
- if(buffer || connecting || buffer_object)
- icon_state = "multitool_tracking"
- else
- icon_state = "multitool_red"
- else
- if(buffer || connecting || buffer_object)
- icon_state = "multitool_tracking_fail"
- else
- icon_state = "multitool"
-
-/obj/item/device/multitool/proc/wire(datum/integrated_io/io, mob/user)
- if(!io.holder.assembly)
- to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.")
- return
-
- if(selected_io)
- if(io == selected_io)
- to_chat(user, "Wiring \the [selected_io.holder]'s '[selected_io.name]' pin into itself is rather pointless.")
- return
- if(io.io_type != selected_io.io_type)
- to_chat(user, "Those two types of channels are incompatable. The first is a [selected_io.io_type], \
- while the second is a [io.io_type].")
- return
- if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly)
- to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.")
- return
- selected_io.linked |= io
- io.linked |= selected_io
-
- to_chat(user, "You connect \the [selected_io.holder]'s '[selected_io.name]' pin to \the [io.holder]'s '[io.name]' pin.")
- selected_io.holder.interact(user) // This is to update the UI.
- selected_io = null
-
- else
- selected_io = io
- to_chat(user, "You link \the multitool to \the [selected_io.holder]'s [selected_io.name] data channel.")
-
- update_icon()
-
-/obj/item/device/multitool/proc/unwire(datum/integrated_io/io1, datum/integrated_io/io2, mob/user)
- if(!io1.linked.len || !io2.linked.len)
- to_chat(user, "There is nothing connected to the data channel.")
- return
-
- if(!(io1 in io2.linked) || !(io2 in io1.linked) )
- to_chat(user, "These data pins aren't connected!")
- return
- else
- io1.linked.Remove(io2)
- io2.linked.Remove(io1)
- to_chat(user, "You clip the data connection between the [io1.holder.displayed_name]'s \
- '[io1.name]' pin and the [io2.holder.displayed_name]'s '[io2.name]' pin.")
- io1.holder.interact(user) // This is to update the UI.
- update_icon()
-
/obj/item/device/integrated_electronics/detailer
name = "assembly detailer"
desc = "A combination autopainter and flash anodizer designed to give electronic assemblies a colorful, wear-resistant finish."
diff --git a/code/modules/mob/living/silicon/robot/items/robot_tools.dm b/code/modules/mob/living/silicon/robot/items/robot_tools.dm
index 1e16bb53e9e..5b98876e99b 100644
--- a/code/modules/mob/living/silicon/robot/items/robot_tools.dm
+++ b/code/modules/mob/living/silicon/robot/items/robot_tools.dm
@@ -19,6 +19,7 @@
/obj/item/weldingtool/robotic
icon = 'icons/obj/robot_items.dmi'
+ change_icons = FALSE
/obj/item/soap/drone
name = "integrated soap"
diff --git a/html/changelogs/geeves-tool_resprite.yml b/html/changelogs/geeves-tool_resprite.yml
new file mode 100644
index 00000000000..294adfac249
--- /dev/null
+++ b/html/changelogs/geeves-tool_resprite.yml
@@ -0,0 +1,6 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - imageadd: "Ported and tweaked sprites for: Toolbelts, Belt Overlays, Welding Tools, Impact Wrench, Air Analyzer, T-ray Scanner, Flamethrower, Multitool."
\ No newline at end of file
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 5469d7a1ea9..bf528a4c08f 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/items/device/lefthand_device.dmi b/icons/mob/items/device/lefthand_device.dmi
index 9a35b91b9bd..6707f167379 100644
Binary files a/icons/mob/items/device/lefthand_device.dmi and b/icons/mob/items/device/lefthand_device.dmi differ
diff --git a/icons/mob/items/device/righthand_device.dmi b/icons/mob/items/device/righthand_device.dmi
index a9acc63d088..087752b205d 100644
Binary files a/icons/mob/items/device/righthand_device.dmi and b/icons/mob/items/device/righthand_device.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index be996b6356f..0037616a661 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/lefthand_tools.dmi b/icons/mob/items/lefthand_tools.dmi
index 04e670c462d..0efbc63e443 100644
Binary files a/icons/mob/items/lefthand_tools.dmi and b/icons/mob/items/lefthand_tools.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index 6a4d877635e..4622c6acc04 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/items/righthand_tools.dmi b/icons/mob/items/righthand_tools.dmi
index b083665204e..037f1cc49c0 100644
Binary files a/icons/mob/items/righthand_tools.dmi and b/icons/mob/items/righthand_tools.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
new file mode 100644
index 00000000000..11da3958454
Binary files /dev/null and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 54894f14c13..f915affe1e5 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/contained_items/tools/air_analyzer.dmi b/icons/obj/contained_items/tools/air_analyzer.dmi
new file mode 100644
index 00000000000..847c696185b
Binary files /dev/null and b/icons/obj/contained_items/tools/air_analyzer.dmi differ
diff --git a/icons/obj/contained_items/tools/impact_wrench.dmi b/icons/obj/contained_items/tools/impact_wrench.dmi
new file mode 100644
index 00000000000..425220a4b87
Binary files /dev/null and b/icons/obj/contained_items/tools/impact_wrench.dmi differ
diff --git a/icons/obj/contained_items/tools/multitool.dmi b/icons/obj/contained_items/tools/multitool.dmi
new file mode 100644
index 00000000000..6ca232e2765
Binary files /dev/null and b/icons/obj/contained_items/tools/multitool.dmi differ
diff --git a/icons/obj/contained_items/tools/t_scanner.dmi b/icons/obj/contained_items/tools/t_scanner.dmi
new file mode 100644
index 00000000000..96d995f9093
Binary files /dev/null and b/icons/obj/contained_items/tools/t_scanner.dmi differ
diff --git a/icons/obj/contained_items/tools/welding_tools.dmi b/icons/obj/contained_items/tools/welding_tools.dmi
new file mode 100644
index 00000000000..3ef86e6dd62
Binary files /dev/null and b/icons/obj/contained_items/tools/welding_tools.dmi differ
diff --git a/icons/obj/contained_items/weapons/flamethrower.dmi b/icons/obj/contained_items/weapons/flamethrower.dmi
new file mode 100644
index 00000000000..d13ec20ea0d
Binary files /dev/null and b/icons/obj/contained_items/weapons/flamethrower.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index a8b889111fd..2abf454ab8b 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/flamethrower.dmi b/icons/obj/flamethrower.dmi
deleted file mode 100644
index dd470c47809..00000000000
Binary files a/icons/obj/flamethrower.dmi and /dev/null differ
diff --git a/icons/obj/robot_items.dmi b/icons/obj/robot_items.dmi
index 8a495202f7f..b6fe254e02e 100644
Binary files a/icons/obj/robot_items.dmi and b/icons/obj/robot_items.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index af6a6fef257..8f89da9e2a6 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ