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"