diff --git a/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm b/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm
index 75b7e390c540..71fc804c71f8 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm
@@ -2441,7 +2441,6 @@
"MB" = (
/obj/structure/flora/ausbushes/sparsegrass,
/obj/effect/decal/cleanable/blood/splatter,
-/obj/item/weldingtool/experimental,
/turf/open/floor/grass,
/area/overmap_encounter/planetoid/jungle/explored)
"MF" = (
diff --git a/_maps/RandomRuins/SpaceRuins/spacemall.dmm b/_maps/RandomRuins/SpaceRuins/spacemall.dmm
index db3f30c15f76..a43da0ba324c 100644
--- a/_maps/RandomRuins/SpaceRuins/spacemall.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacemall.dmm
@@ -7900,10 +7900,6 @@
/obj/item/clothing/head/hardhat/weldhat/dblue{
pixel_y = 5
},
-/obj/item/weldingtool/experimental{
- pixel_y = 5
- },
-/obj/item/weldingtool/experimental,
/obj/effect/turf_decal/siding/wideplating/dark/end{
dir = 8
},
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index d7715e22b561..eb97d1c33079 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -13170,7 +13170,6 @@
/obj/effect/turf_decal/industrial/warning,
/obj/effect/decal/cleanable/dirt,
/obj/structure/reagent_dispensers/fueltank,
-/obj/item/weldingtool/experimental,
/obj/machinery/power/terminal{
dir = 8
},
@@ -16172,7 +16171,6 @@
/area/centcom)
"wbx" = (
/obj/structure/reagent_dispensers/fueltank,
-/obj/item/weldingtool/experimental,
/obj/effect/decal/cleanable/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/industrial/warning,
diff --git a/code/__DEFINES/cells.dm b/code/__DEFINES/cells.dm
new file mode 100644
index 000000000000..376910741b2b
--- /dev/null
+++ b/code/__DEFINES/cells.dm
@@ -0,0 +1,13 @@
+//General defines for items that use power and the cell component.
+/// The minimal amount of power an item can use.
+#define POWER_CELL_USE_MINIMUM 1
+/// For items that barely use any power at all.
+#define POWER_CELL_USE_VERY_LOW 10
+/// For items that generally wouldn't use very much power.
+#define POWER_CELL_USE_LOW 30
+/// For items that use a average amount of power.
+#define POWER_CELL_USE_NORMAL 50
+/// For items that use a high amount of power.
+#define POWER_CELL_USE_HIGH 70
+/// For items that use A LOT OF POWER.
+#define POWER_CELL_USE_INSANE 100
diff --git a/code/__DEFINES/dcs/signals/signals.dm b/code/__DEFINES/dcs/signals/signals.dm
index 638b5220bc3c..92b5059cffbe 100644
--- a/code/__DEFINES/dcs/signals/signals.dm
+++ b/code/__DEFINES/dcs/signals/signals.dm
@@ -744,3 +744,11 @@
#define COMSIG_ADDED_POINT_OF_INTEREST "added_point_of_interest"
/// Sent from base of /datum/controller/subsystem/points_of_interest/proc/on_poi_element_removed : (atom/old_poi)
#define COMSIG_REMOVED_POINT_OF_INTEREST "removed_point_of_interest"
+
+// Power signals
+/// Sent when an obj/item calls item_use_power: (use_amount, user, check_only)
+#define COMSIG_ITEM_POWER_USE "item_use_power"
+ #define NO_COMPONENT NONE
+ #define COMPONENT_POWER_SUCCESS (1<<0)
+ #define COMPONENT_NO_CELL (1<<1)
+ #define COMPONENT_NO_CHARGE (1<<2)
diff --git a/code/datums/components/cell_component.dm b/code/datums/components/cell_component.dm
new file mode 100644
index 000000000000..97df22729d24
--- /dev/null
+++ b/code/datums/components/cell_component.dm
@@ -0,0 +1,178 @@
+/*
+CELL COMPONENT
+
+What we aim to achieve with cell components is a universal framework for all items that would logically use batteries,
+Be it a flashlight, T-ray scanner or multitool. All of them would logically require batteries right? Well, welcome,
+to the cell component.
+
+General logic:
+Component attaches to parent(flashlight etc)
+Registers onhit signal to check if it's being slapped by a battery
+Component moves battery to equipment loc, keeps a record, and then communicates with
+the equipment and controls the behaviour of said equipment.
+
+If it's a robot, it uses the robot cell - Using certified shitcode.(this needs redone)
+
+If you are adding this to an item that is active for a period of time, register signal to COMSIG_CELL_START_USE when it would start using the cell
+and COMSIG_CELL_STOP_USE when it should stop. To handle the turning off of said item once the cell is depleted, add your code into the
+component_cell_out_of_charge/component_cell_removed proc using loc where necessary, processing is done in the component!
+*/
+
+/datum/component/cell
+ /// Our reference to the inserted cell, which will be stored in the parent.
+ var/obj/item/stock_parts/cell/inserted_cell
+ /// The item reference to parent.
+ var/obj/item/equipment
+ /// How much power do we use each process?
+ var/power_use_amount = POWER_CELL_USE_NORMAL
+ /// Are we using a robot's powersource?
+ var/inside_robot = FALSE
+ /// Callback interaction for when the cell is removed.
+ var/datum/callback/on_cell_removed = null
+ ///Can this cell be removed from the parent?
+ var/cell_can_be_removed = TRUE
+ ///Our reference to the cell overlay
+ var/mutable_appearance/cell_overlay = null
+
+/datum/component/cell/Initialize(cell_override, _on_cell_removed, _power_use_amount, start_with_cell = TRUE, _cell_can_be_removed)
+ if(!isitem(parent)) //Currently only compatable with items.
+ return COMPONENT_INCOMPATIBLE
+
+ equipment = parent //We'd like a simple reference to the atom this component is attached to instead of having to declare it every time we use it.
+
+ if(_on_cell_removed)
+ src.on_cell_removed = _on_cell_removed
+
+ if(_power_use_amount)
+ power_use_amount = _power_use_amount
+ else
+ power_use_amount = equipment.power_use_amount
+
+ if(_cell_can_be_removed)
+ cell_can_be_removed = _cell_can_be_removed
+
+ if(start_with_cell)
+ var/obj/item/stock_parts/cell/new_cell
+ if(cell_override)
+ new_cell = new cell_override()
+ else
+ new_cell = new /obj/item/stock_parts/cell/upgraded()
+ inserted_cell = new_cell
+ new_cell.forceMove(parent) //We use the parents location so things like EMP's can interact with the cell.
+ handle_cell_overlays()
+ return ..()
+
+/datum/component/cell/RegisterWithParent()
+ //Component to Parent signal registries
+ RegisterSignal(parent, COMSIG_ITEM_POWER_USE, .proc/simple_power_use)
+ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/insert_cell)
+ RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT , .proc/remove_cell)
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine_cell)
+
+/datum/component/cell/UnregisterFromParent()
+ UnregisterSignal(parent, COMSIG_ITEM_POWER_USE)
+ UnregisterSignal(parent, COMSIG_PARENT_ATTACKBY)
+ UnregisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT)
+ UnregisterSignal(parent, COMSIG_PARENT_EXAMINE)
+
+/datum/component/cell/Destroy(force, silent)
+ if(on_cell_removed)
+ QDEL_NULL(on_cell_removed)
+ if(inserted_cell)
+ if(!inside_robot) //We really don't want to be deleting the robot's cell.
+ QDEL_NULL(inserted_cell)
+ inserted_cell = null
+ return ..()
+
+/// This proc is the basic way of processing the cell, with included feedback. It will return a bitflag if it failed to use the power, or COMPONENT_POWER_SUCCESS if it succeeds.
+/// The user is sent the feedback, use_amount is an override, check_only will only return if it can use the cell and feedback relating to that.
+/datum/component/cell/proc/simple_power_use(datum/source, use_amount, mob/user, check_only)
+ SIGNAL_HANDLER
+
+ if(!use_amount)
+ use_amount = power_use_amount
+
+ if(!inserted_cell)
+ if(user)
+ to_chat(user, "There is no cell inside [equipment]")
+ return COMPONENT_NO_CELL
+
+ if(check_only && inserted_cell.charge < use_amount)
+ if(user)
+ to_chat(user, "The cell inside [equipment] does not have enough charge to perform this action!")
+ return COMPONENT_NO_CHARGE
+
+ if(!inserted_cell.use(use_amount))
+ inserted_cell.update_appearance() //Updates the attached cell sprite - Why does this not happen in cell.use?
+ if(user)
+ to_chat(user, "The cell inside [equipment] does not have enough charge to perform this action!")
+ return COMPONENT_NO_CHARGE
+
+ inserted_cell.update_appearance()
+
+ return COMPONENT_POWER_SUCCESS
+
+/datum/component/cell/proc/examine_cell(atom/A, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ if(!inserted_cell)
+ examine_list += "It does not have a cell inserted!"
+ else if(!inside_robot)
+ examine_list += "It has [inserted_cell] inserted. It has [inserted_cell.percent()]% charge left."
+ else
+ examine_list += "It is drawing power from an external powersource, reading [inserted_cell.percent()]% charge."
+
+/// Handling of cell removal.
+/datum/component/cell/proc/remove_cell(datum/source, mob/user)
+ if(!equipment.can_interact(user))
+ return
+
+ if(inside_robot)
+ return
+
+ if(!cell_can_be_removed)
+ return
+
+ if(inserted_cell)
+ to_chat(user, "You remove [inserted_cell] from [equipment]!")
+ playsound(equipment, 'sound/weapons/magout.ogg', 40, TRUE)
+ inserted_cell.forceMove(get_turf(equipment))
+ INVOKE_ASYNC(user, /mob/living.proc/put_in_hands, inserted_cell)
+ inserted_cell = null
+ if(on_cell_removed)
+ on_cell_removed.Invoke()
+ handle_cell_overlays(TRUE)
+ else
+ to_chat(user, "There is no cell inserted in [equipment]!")
+
+/// Handling of cell insertion.
+/datum/component/cell/proc/insert_cell(datum/source, obj/item/inserting_item, mob/living/user, params)
+ if(!equipment.can_interact(user))
+ return
+
+ if(inside_robot) //More robot shitcode, if we allowed them to remove the cell, it would cause the universe to implode.
+ return
+
+ if(!istype(inserting_item, /obj/item/stock_parts/cell))
+ return
+
+ if(inserted_cell) //No quickswap compatibility
+ to_chat(user, "There is already a cell inserted in [equipment]!")
+ return
+
+ to_chat(user, "You insert [inserting_item] into [equipment]!")
+ playsound(equipment, 'sound/weapons/magin.ogg', 40, TRUE)
+ inserted_cell = inserting_item
+ inserting_item.forceMove(parent)
+ handle_cell_overlays(FALSE)
+
+/datum/component/cell/proc/handle_cell_overlays(update_overlays)
+ if(inserted_cell)
+ cell_overlay = mutable_appearance(equipment.icon, "[initial(equipment.icon_state)]_cell")
+ equipment.add_overlay(cell_overlay)
+ else
+ QDEL_NULL(cell_overlay)
+ cell_overlay = null
+ if(update_overlays)
+ equipment.overlays.Cut()
+ equipment.update_overlays()
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 69679c95079f..9021d6e783d1 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -38,7 +38,6 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
"Standard Tools",
"Spawn Flashlight" = "hsbspawn&path=[/obj/item/flashlight]",
"Spawn Toolbox" = "hsbspawn&path=[/obj/item/storage/toolbox/mechanical]",
- "Spawn Experimental Welding tool" = "hsbspawn&path=[/obj/item/weldingtool/experimental]",
"Spawn Light Replacer" = "hsbspawn&path=[/obj/item/lightreplacer]",
"Spawn Medical Kit" = "hsbspawn&path=[/obj/item/storage/firstaid/regular]",
"Spawn All-Access ID" = "hsbaaid",
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index edd6a6d1c885..dcd8c8ceb42d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -146,6 +146,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
var/strip_delay = 40
///How long it takes to resist out of the item (cuffs and such)
var/breakouttime = 0
+ ///How much power would this item use?
+ var/power_use_amount = POWER_CELL_USE_NORMAL
/// Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/list/attack_verb
@@ -965,6 +967,11 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/remove_outline()
remove_filter(HOVER_OUTLINE_FILTER)
+/// Use the power of an attached component that posesses power handling, will return the signal bitflag.
+/obj/item/proc/item_use_power(use_amount, mob/user, check_only)
+ SHOULD_CALL_PARENT(TRUE)
+ return SEND_SIGNAL(src, COMSIG_ITEM_POWER_USE, use_amount, user, check_only)
+
/// Called when a mob tries to use the item as a tool.Handles most checks.
/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks)
// we have no target, why are we even doing this?
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index c6d55e03ef48..ebb9ca235100 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -87,7 +87,6 @@
/obj/item/storage/belt/utility/chief/full/PopulateContents()
new /obj/item/screwdriver/power(src)
new /obj/item/crowbar/power(src)
- new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much
new /obj/item/multitool(src)
new /obj/item/stack/cable_coil(src,MAXCOIL,pick("red","yellow","orange"))
new /obj/item/extinguisher/mini(src)
@@ -143,7 +142,6 @@
/obj/item/storage/belt/utility/full/ert/PopulateContents()
new /obj/item/screwdriver/power(src)
new /obj/item/crowbar/power(src)
- new /obj/item/weldingtool/experimental(src)
new /obj/item/multitool(src)
new /obj/item/construction/rcd/combat(src)
new /obj/item/extinguisher/mini(src)
diff --git a/code/game/objects/items/tools/electric_weldingtool.dm b/code/game/objects/items/tools/electric_weldingtool.dm
new file mode 100644
index 000000000000..09f12589ade3
--- /dev/null
+++ b/code/game/objects/items/tools/electric_weldingtool.dm
@@ -0,0 +1,82 @@
+/obj/item/weldingtool/electric
+ name = "electrical welding tool"
+ desc = "An experimental welding tool capable of welding functionality through the use of electricity. The flame seems almost cold."
+ icon_state = "elwelder"
+ light_power = 1
+ light_color = LIGHT_COLOR_HALOGEN
+ tool_behaviour = NONE
+ toolspeed = 0.5 //twice as fast, but doesn't require welding fuel
+ power_use_amount = POWER_CELL_USE_LOW
+ // We don't use fuel
+ change_icons = FALSE
+ var/cell_override = /obj/item/stock_parts/cell/high
+ var/powered = FALSE
+ max_fuel = 20 //uses fuel anyways like a boss
+
+/obj/item/weldingtool/electric/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/cell, cell_override, CALLBACK(src, PROC_REF(switched_off)))
+
+/obj/item/weldingtool/electric/attack_self(mob/user, modifiers)
+ . = ..()
+ if(!powered)
+ if(!(item_use_power(power_use_amount, user, TRUE) & COMPONENT_POWER_SUCCESS))
+ return
+ powered = !powered
+ playsound(src, 'sound/effects/sparks4.ogg', 100, TRUE)
+ if(powered)
+ to_chat(user, span_notice("You turn [src] on."))
+ switched_on()
+ return
+ to_chat(user, span_notice("You turn [src] off."))
+ switched_off()
+
+/obj/item/weldingtool/electric/switched_on(mob/user)
+ welding = TRUE
+ tool_behaviour = TOOL_WELDER
+ light_on = TRUE
+ force = 15
+ damtype = BURN
+ hitsound = 'sound/items/welder.ogg'
+ set_light_on(powered)
+ update_appearance()
+ START_PROCESSING(SSobj, src)
+
+/obj/item/weldingtool/electric/switched_off(mob/user)
+ powered = FALSE
+ welding = FALSE
+ light_on = FALSE
+ force = initial(force)
+ damtype = BRUTE
+ set_light_on(powered)
+ tool_behaviour = NONE
+ update_appearance()
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/weldingtool/electric/process(seconds_per_tick)
+ if(!powered)
+ switched_off()
+ return
+ if(!(item_use_power(power_use_amount) & COMPONENT_POWER_SUCCESS))
+ switched_off()
+ return
+
+// We don't need to know how much fuel it has, because it doesn't use any.
+/obj/item/weldingtool/electric/examine(mob/user)
+ . = ..()
+ . -= "It contains [get_fuel()] unit\s of fuel out of [max_fuel]."
+
+// This is what uses fuel in the parent. We override it here to not use fuel
+/obj/item/weldingtool/electric/use(used = 0)
+ return isOn()
+
+/obj/item/weldingtool/electric/examine()
+ . = ..()
+ . += "[src] is currently [powered ? "powered" : "unpowered"]."
+
+/obj/item/weldingtool/electric/update_icon_state()
+ if(powered)
+ mob_overlay_icon = "[initial(mob_overlay_icon)]1"
+ else
+ mob_overlay_icon = "[initial(mob_overlay_icon)]"
+ return ..()
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index f953a3604367..fcccb13b4b27 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -351,29 +351,6 @@
/obj/item/weldingtool/hugetank/empty
start_full = FALSE
-/obj/item/weldingtool/experimental
- name = "experimental welding tool"
- desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
- icon_state = "exwelder"
- item_state = "exwelder"
- max_fuel = 40
- custom_materials = list(/datum/material/iron=70, /datum/material/glass=120)
- /*WS Begin - Better Tool sprites
- change_icons = 0
- WS End */
- can_off_process = 1
- light_range = 1
- toolspeed = 0.5
- wall_decon_damage = 100
- var/last_gen = 0
- var/nextrefueltick = 0
-
-/obj/item/weldingtool/experimental/process()
- ..()
- if(get_fuel() < max_fuel && nextrefueltick < world.time)
- nextrefueltick = world.time + 10
- reagents.add_reagent(/datum/reagent/fuel, 1)
-
/obj/item/weldingtool/old
desc = "A standard edition welder provided by Nanotrasen. This one seems to leak a little bit."
icon = 'icons/obj/tools.dmi'
diff --git a/code/game/objects/structures/salvaging.dm b/code/game/objects/structures/salvaging.dm
index f4aad715db19..5c79fa74fc20 100644
--- a/code/game/objects/structures/salvaging.dm
+++ b/code/game/objects/structures/salvaging.dm
@@ -540,7 +540,7 @@
/obj/effect/spawner/lootdrop/tool_engie_adv
loot = list(
/obj/item/screwdriver/power = 1,
- /obj/item/weldingtool/experimental = 1,
+ /obj/item/weldingtool/electric = 1,
/obj/item/crowbar/power = 1,
)
diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm
index 0849efb6ede4..18fc501da945 100644
--- a/code/modules/cargo/bounties/science.dm
+++ b/code/modules/cargo/bounties/science.dm
@@ -28,13 +28,6 @@
reward = 10000
wanted_types = list(/obj/item/clothing/glasses/night, /obj/item/clothing/glasses/meson/night, /obj/item/clothing/glasses/hud/health/night, /obj/item/clothing/glasses/hud/security/night, /obj/item/clothing/glasses/hud/diagnostic/night)
-/datum/bounty/item/science/experimental_welding_tool
- name = "Experimental Welding Tool"
- description = "A recent accident has left most of CentCom's welding tools exploded. Ship replacements to be rewarded."
- reward = 10000
- required_count = 3
- wanted_types = list(/obj/item/weldingtool/experimental)
-
/datum/bounty/item/science/cryostasis_beaker
name = "Cryostasis Beaker"
description = "Chemists at Central Command have discovered a new chemical that can only be held in cryostasis beakers. The only problem is they don't have any! Rectify this to receive payment."
diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm
index 287fba69aaa0..efb0cfdb4a57 100644
--- a/code/modules/cargo/exports/tools.dm
+++ b/code/modules/cargo/exports/tools.dm
@@ -96,10 +96,6 @@
exclude_types = list(/obj/item/radio/mech)
//Advanced/Power Tools.
-/datum/export/weldingtool/experimental
- cost = 90
- unit_name = "experimental welding tool"
- export_types = list(/obj/item/weldingtool/experimental)
/datum/export/jawsoflife
cost = 100
diff --git a/code/modules/clothing/factions/clip.dm b/code/modules/clothing/factions/clip.dm
index 7ac3668aaf77..d8781911244d 100644
--- a/code/modules/clothing/factions/clip.dm
+++ b/code/modules/clothing/factions/clip.dm
@@ -449,7 +449,7 @@
/obj/item/storage/belt/military/clip/engi/PopulateContents()
new /obj/item/screwdriver/power(src)
new /obj/item/crowbar/power(src)
- new /obj/item/weldingtool/experimental(src)
+ new /obj/item/weldingtool/electric(src)
new /obj/item/multitool(src)
new /obj/item/construction/rcd/combat(src)
new /obj/item/extinguisher/mini(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
index 4869d4a95c1c..58c491504961 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
@@ -376,7 +376,7 @@
/obj/item/stock_parts/micro_laser/high = 2,
/obj/item/stock_parts/matter_bin/adv = 2,
/obj/item/survey_handheld = 1,
- /obj/item/weldingtool/experimental = 1,
+ /obj/item/weldingtool/electric = 1,
/obj/item/mmi/posibrain = 1,
/obj/item/reagent_containers/glass/beaker/plastic = 1,
/obj/item/organ/eyes/robotic/shield = 1,
diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm
index 86a8b542712b..b57dca9d785b 100644
--- a/code/modules/research/designs/tool_designs.dm
+++ b/code/modules/research/designs/tool_designs.dm
@@ -32,16 +32,6 @@
category = list("Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_ENGINEERING
-/datum/design/exwelder
- name = "Experimental Welding Tool"
- desc = "An experimental welder capable of self-fuel generation."
- id = "exwelder"
- build_type = PROTOLATHE
- materials = list(/datum/material/iron = 1000, /datum/material/glass = 500, /datum/material/plasma = 1500, /datum/material/uranium = 200)
- build_path = /obj/item/weldingtool/experimental
- category = list("Tool Designs")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
-
/datum/design/rpd
name = "Rapid Pipe Dispenser (RPD)"
id = "rpd_loaded"
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 12dee3405a8c..ec19194a4e31 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -594,7 +594,7 @@
id = "exp_tools"
display_name = "Experimental Tools"
description = "Highly advanced tools."
- design_ids = list("exwelder", "jawsoflife", "handdrill", "laserscalpel", "mechanicalpinches", "searingtool")
+ design_ids = list("jawsoflife", "handdrill", "laserscalpel", "mechanicalpinches", "searingtool")
prereq_ids = list("adv_engi")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 731cd15fcfb8..b6555b72550a 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/shiptest.dme b/shiptest.dme
index 7515bfcece79..a82050b70bb5 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -40,6 +40,7 @@
#include "code\__DEFINES\botany.dm"
#include "code\__DEFINES\callbacks.dm"
#include "code\__DEFINES\cargo.dm"
+#include "code\__DEFINES\cells.dm"
#include "code\__DEFINES\chat.dm"
#include "code\__DEFINES\cinematics.dm"
#include "code\__DEFINES\cleaning.dm"
@@ -490,6 +491,7 @@
#include "code\datums\components\bloodysoles.dm"
#include "code\datums\components\butchering.dm"
#include "code\datums\components\caltrop.dm"
+#include "code\datums\components\cell_component.dm"
#include "code\datums\components\chasm.dm"
#include "code\datums\components\connect_containers.dm"
#include "code\datums\components\connect_loc_behalf.dm"
@@ -1369,6 +1371,7 @@
#include "code\game\objects\items\tanks\watertank.dm"
#include "code\game\objects\items\tools\chisel.dm"
#include "code\game\objects\items\tools\crowbar.dm"
+#include "code\game\objects\items\tools\electric_weldingtool.dm"
#include "code\game\objects\items\tools\screwdriver.dm"
#include "code\game\objects\items\tools\weldingtool.dm"
#include "code\game\objects\items\tools\wirecutters.dm"