diff --git a/baystation12.dme b/baystation12.dme
index 4154609d277..145a1df8ca3 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -2486,6 +2486,7 @@
#include "code\modules\modular_computers\computers\modular_computer\power.dm"
#include "code\modules\modular_computers\computers\modular_computer\variables.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_console.dm"
+#include "code\modules\modular_computers\computers\subtypes\dev_exonet_connection_system.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_laptop.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_pda.dm"
#include "code\modules\modular_computers\computers\subtypes\dev_tablet.dm"
@@ -2634,6 +2635,7 @@
#include "code\modules\organs\internal\appendix.dm"
#include "code\modules\organs\internal\brain.dm"
#include "code\modules\organs\internal\cooling_system.dm"
+#include "code\modules\organs\internal\exonet_connection_system.dm"
#include "code\modules\organs\internal\eyes.dm"
#include "code\modules\organs\internal\heart.dm"
#include "code\modules\organs\internal\kidneys.dm"
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 21c7386e1f4..0f0fcbe2366 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -203,6 +203,7 @@
#define BP_APPENDIX "appendix"
#define BP_CELL "cell"
#define BP_COOLING "cooling system"
+#define BP_EXONET "exonet connection slot"
#define BP_HIVE "hive node"
#define BP_LARVA "alien larva" //INF
#define BP_MIMIC "mimic sac" //INF
diff --git a/code/datums/extensions/interactive.dm b/code/datums/extensions/interactive.dm
index ae74d78fdf8..77156ea275e 100644
--- a/code/datums/extensions/interactive.dm
+++ b/code/datums/extensions/interactive.dm
@@ -33,4 +33,4 @@
/datum/extension/interactive/Topic(var/href, var/list/href_list)
if(..())
return TRUE
- return extension_act(href, href_list, usr)
\ No newline at end of file
+ return extension_act(href, href_list, usr)
diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm
index 0885c76ccb1..4a5b15966c1 100644
--- a/code/game/machinery/bioprinter.dm
+++ b/code/game/machinery/bioprinter.dm
@@ -122,6 +122,7 @@
BP_R_HAND = list(/obj/item/organ/external/hand/right, 40),
BP_CELL = list(/obj/item/organ/internal/cell/print, 25),
BP_COOLING = list(/obj/item/organ/internal/cooling_system, 25),
+ BP_EXONET = list(/obj/item/organ/internal/ecs, 35),
)
machine_name = "prosthetic organ fabricator"
diff --git a/code/game/objects/topic.dm b/code/game/objects/topic.dm
index ca36fa2c94d..5ecba0249c4 100644
--- a/code/game/objects/topic.dm
+++ b/code/game/objects/topic.dm
@@ -50,4 +50,4 @@
return
target.add_hiddenprint(src)
-/atom/proc/CouldNotUseTopic(var/mob/user)
\ No newline at end of file
+/atom/proc/CouldNotUseTopic(var/mob/user)
diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm
index e82f4d8cee5..8ba992fec9f 100644
--- a/code/modules/modular_computers/computers/modular_computer/core.dm
+++ b/code/modules/modular_computers/computers/modular_computer/core.dm
@@ -72,6 +72,8 @@
to_chat(user, "\The [src] was already emagged.")
return NO_EMAG_ACT
else
+ if(src.type == /obj/item/modular_computer/ecs)
+ return NO_EMAG_ACT
computer_emagged = TRUE
to_chat(user, "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.")
return 1
@@ -98,7 +100,9 @@
return
if(tesla_link)
tesla_link.enabled = 1
- var/issynth = issilicon(user) // Robots and AIs get different activation messages.
+ var/issynth = FALSE
+ if((user.is_species(SPECIES_IPC) && istype(src, /obj/item/modular_computer/ecs)) || issilicon(user))
+ issynth = TRUE // Robots and AIs and IPCs get different activation messages.
if(damage > broken_damage)
if(issynth)
to_chat(user, "You send an activation signal to \the [src], but it responds with an error code. It must be damaged.")
diff --git a/code/modules/modular_computers/computers/modular_computer/hardware.dm b/code/modules/modular_computers/computers/modular_computer/hardware.dm
index 6fddadf4388..4ba1ec3cecf 100644
--- a/code/modules/modular_computers/computers/modular_computer/hardware.dm
+++ b/code/modules/modular_computers/computers/modular_computer/hardware.dm
@@ -166,4 +166,4 @@
all_components.Add(tesla_link)
if(scanner)
all_components.Add(scanner)
- return all_components
\ No newline at end of file
+ return all_components
diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm
index 1ffb62fd50f..9bee09aae30 100644
--- a/code/modules/modular_computers/computers/modular_computer/interaction.dm
+++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm
@@ -31,7 +31,10 @@
if(enabled)
bsod = 1
update_icon()
- to_chat(usr, "You press a hard-reset button on \the [src]. It displays a brief debug screen before shutting down.")
+ if((usr.is_species(SPECIES_IPC) && istype(src, /obj/item/modular_computer/ecs)))
+ to_chat(usr, "You send signal for a hard-reset on \the [src].")
+ else
+ to_chat(usr, "You press a hard-reset button on \the [src]. It displays a brief debug screen before shutting down.")
shutdown_computer(FALSE)
spawn(2 SECONDS)
bsod = 0
@@ -164,10 +167,12 @@
if(istype(W, /obj/item/stock_parts/computer))
var/obj/item/stock_parts/computer/C = W
- if(C.hardware_size <= max_hardware_size)
+ if((C.hardware_size <= max_hardware_size) && (!exonets_ipc_computer))
+ try_install_component(user, C)
+ else if(exonets_ipc_computer && C.exonets_ipc_computer_suitable)
try_install_component(user, C)
else
- to_chat(user, "This component is too large for \the [src].")
+ to_chat(user, "This component is not suitable for \the [src].")
if(isWrench(W))
var/list/components = get_all_components()
if(components.len)
diff --git a/code/modules/modular_computers/computers/modular_computer/variables.dm b/code/modules/modular_computers/computers/modular_computer/variables.dm
index 8196399b603..666f389822b 100644
--- a/code/modules/modular_computers/computers/modular_computer/variables.dm
+++ b/code/modules/modular_computers/computers/modular_computer/variables.dm
@@ -50,8 +50,10 @@
var/modifiable = TRUE // can't be modified or damaged if false
+ var/exonets_ipc_computer = FALSE // Checks if it suitable to install for IPCs head computers
+
var/stores_pen = FALSE
var/obj/item/pen/stored_pen
var/interact_sounds
- var/interact_sound_volume = 40
\ No newline at end of file
+ var/interact_sound_volume = 40
diff --git a/code/modules/modular_computers/computers/subtypes/dev_exonet_connection_system.dm b/code/modules/modular_computers/computers/subtypes/dev_exonet_connection_system.dm
new file mode 100644
index 00000000000..d099bef01c3
--- /dev/null
+++ b/code/modules/modular_computers/computers/subtypes/dev_exonet_connection_system.dm
@@ -0,0 +1,39 @@
+//// INTERNAL IPCs COMPUTER
+/obj/item/modular_computer/ecs
+ name = "exonet connection system"
+ desc = "A cirquit with some ports and wires."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "ecs_on"
+ icon_state_unpowered = "ecs_off"
+ anchored = FALSE
+ w_class = ITEM_SIZE_NORMAL
+ base_idle_power_usage = 5
+ base_active_power_usage = 50
+ light_strength = 0
+ max_damage = 100
+ broken_damage = 60
+ max_hardware_size = 2
+ hardware_flag = PROGRAM_LAPTOP
+ exonets_ipc_computer = TRUE
+
+
+/obj/item/modular_computer/ecs/install_default_hardware()
+ ..()
+ processor_unit = new/obj/item/stock_parts/computer/processor_unit(src)
+ hard_drive = new/obj/item/stock_parts/computer/hard_drive/advanced(src)
+ network_card = new/obj/item/stock_parts/computer/network_card/advanced(src)
+ battery_module = new/obj/item/stock_parts/computer/battery_module/converter(src)
+
+/obj/item/modular_computer/ecs/install_default_programs()
+ ..()
+ hard_drive.store_file(new/datum/computer_file/program/email_client())
+ hard_drive.store_file(new/datum/computer_file/program/wordprocessor())
+
+
+/obj/item/modular_computer/ecs/attack_self(var/mob/user) // Оставляем возможность вызывать окно только через абилку ИПСа
+ return
+
+
+/obj/item/modular_computer/ecs/proc/open_terminal_ecs(var/mob/user)
+ var/datum/extension/interactive/ntos/os = get_extension(src, /datum/extension/interactive/ntos)
+ return os.open_terminal(user)
diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm
index bbed0bd2f71..ff5ed015f66 100644
--- a/code/modules/modular_computers/hardware/_hardware.dm
+++ b/code/modules/modular_computers/hardware/_hardware.dm
@@ -14,6 +14,7 @@
var/malfunction_probability = 10// Chance of malfunction when the component is damaged
var/usage_flags = PROGRAM_ALL
var/external_slot // Whether attackby will be passed on it even with a closed panel
+ var/exonets_ipc_computer_suitable = FALSE
/obj/item/stock_parts/computer/attackby(var/obj/item/W as obj, var/mob/living/user as mob)
// Multitool. Runs diagnostics
diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm
index 55cb68ec3cd..4b467f7fa04 100644
--- a/code/modules/modular_computers/hardware/battery_module.dm
+++ b/code/modules/modular_computers/hardware/battery_module.dm
@@ -48,6 +48,14 @@
origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1)
battery_rating = 60
+/obj/item/stock_parts/computer/battery_module/converter
+ name = "Converter battery"
+ desc = "A tiny device with sole purpose to connect main IPC battery"
+ icon_state = "battery_nano"
+ origin_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1)
+ battery_rating = 80
+ exonets_ipc_computer_suitable = TRUE
+
// This is not intended to be obtainable in-game. Intended for adminbus and debugging purposes.
/obj/item/stock_parts/computer/battery_module/lambda
name = "lambda coil"
diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm
index 0cfeeb519ab..7016a77fc3f 100644
--- a/code/modules/modular_computers/hardware/hard_drive.dm
+++ b/code/modules/modular_computers/hardware/hard_drive.dm
@@ -5,6 +5,7 @@
icon_state = "hdd_normal"
hardware_size = 1
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
+ exonets_ipc_computer_suitable = TRUE
var/max_capacity = 128
var/used_capacity = 0
var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY!
diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm
index bc85e427c66..4b98d8d8c9a 100644
--- a/code/modules/modular_computers/hardware/network_card.dm
+++ b/code/modules/modular_computers/hardware/network_card.dm
@@ -14,6 +14,7 @@ var/global/ntnet_card_uid = 1
var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks.
var/proxy_id // If set, uses the value to funnel connections through another network card.
malfunction_probability = 1
+ exonets_ipc_computer_suitable = TRUE
/obj/item/stock_parts/computer/network_card/diagnostics()
. = ..()
diff --git a/code/modules/modular_computers/hardware/portable_hard_drive.dm b/code/modules/modular_computers/hardware/portable_hard_drive.dm
index 491684b496b..f35de05e7bf 100644
--- a/code/modules/modular_computers/hardware/portable_hard_drive.dm
+++ b/code/modules/modular_computers/hardware/portable_hard_drive.dm
@@ -7,6 +7,7 @@
hardware_size = 1
max_capacity = 16
origin_tech = list(TECH_DATA = 1)
+ exonets_ipc_computer_suitable = TRUE
/obj/item/stock_parts/computer/hard_drive/portable/advanced
name = "advanced data crystal"
@@ -38,4 +39,4 @@
/obj/item/stock_parts/computer/hard_drive/portable/merchant/Initialize()
. = ..()
- store_file(new/datum/computer_file/program/merchant(src))
\ No newline at end of file
+ store_file(new/datum/computer_file/program/merchant(src))
diff --git a/code/modules/modular_computers/hardware/processor_unit.dm b/code/modules/modular_computers/hardware/processor_unit.dm
index 46e324c58d4..79368db92da 100644
--- a/code/modules/modular_computers/hardware/processor_unit.dm
+++ b/code/modules/modular_computers/hardware/processor_unit.dm
@@ -10,7 +10,7 @@
critical = 1
malfunction_probability = 1
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2)
-
+ exonets_ipc_computer_suitable = TRUE
var/processing_power = 2 // Used for DDoS speed calculations
/obj/item/stock_parts/computer/processor_unit/small
diff --git a/code/modules/modular_computers/ntos/ntos.dm b/code/modules/modular_computers/ntos/ntos.dm
index f1712fa7557..e80159455a6 100644
--- a/code/modules/modular_computers/ntos/ntos.dm
+++ b/code/modules/modular_computers/ntos/ntos.dm
@@ -23,7 +23,6 @@
var/update_postshutdown
var/list/terminals
-
//[INF]
var/is_remote_ui = 0
GLOBAL_LIST_EMPTY(CreatedOSes)
@@ -61,7 +60,7 @@ GLOBAL_LIST_EMPTY(CreatedOSes)
on = FALSE
for(var/datum/computer_file/program/P in running_programs)
kill_program(P, 1)
-
+
var/obj/item/stock_parts/computer/network_card/network_card = get_component(PART_NETWORK)
if(network_card)
ntnet_global.unregister(network_card.identification_id)
@@ -201,4 +200,4 @@ GLOBAL_LIST_EMPTY(CreatedOSes)
LAZYADD(terminals, new /datum/terminal/(user, src))
/datum/extension/interactive/ntos/proc/emagged()
- return FALSE
\ No newline at end of file
+ return FALSE
diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm
index e2b97f64838..722abd09114 100644
--- a/code/modules/nano/interaction/default.dm
+++ b/code/modules/nano/interaction/default.dm
@@ -95,3 +95,7 @@ GLOBAL_DATUM_INIT(default_state, /datum/topic_state/default, new)
. = min(., shared_living_nano_distance(src_object))
if(. == STATUS_UPDATE && (psi && !psi.suppressed && psi.get_rank(PSI_PSYCHOKINESIS) >= PSI_RANK_OPERANT))
return STATUS_INTERACTIVE
+ if(is_species(SPECIES_IPC))
+ var/obj/item/modular_computer/ecs/computer = src_object
+ if(computer.type == /obj/item/modular_computer/ecs)
+ return STATUS_INTERACTIVE
diff --git a/code/modules/organs/internal/exonet_connection_system.dm b/code/modules/organs/internal/exonet_connection_system.dm
new file mode 100644
index 00000000000..2834ea1092a
--- /dev/null
+++ b/code/modules/organs/internal/exonet_connection_system.dm
@@ -0,0 +1,77 @@
+/obj/item/organ/internal/ecs
+ name = "exonet connection port"
+ icon_state = "setup_large"
+ organ_tag = BP_EXONET
+ parent_organ = BP_HEAD
+ status = ORGAN_ROBOTIC
+ desc = "The internal port is designed to establish communication between the positronic brain and the computer."
+ w_class = ITEM_SIZE_NORMAL
+ max_damage = 100
+ var/obj/item/modular_computer/ecs/computer = /obj/item/modular_computer/ecs
+ var/open = FALSE
+
+
+/obj/item/organ/internal/ecs/Initialize()
+ if(ispath(computer))
+ computer = new computer(src)
+ . = ..()
+
+
+/obj/item/organ/internal/ecs/Process()
+ ..()
+ if(!owner)
+ return
+ if(owner.stat == DEAD)
+ return
+ if(!computer)
+ return
+ if(computer.battery_module.battery.charge < (computer.battery_module.battery.maxcharge))
+ transfer_charge()
+
+/obj/item/organ/internal/ecs/proc/transfer_charge()
+ var/obj/item/organ/internal/cell/potato = owner.internal_organs_by_name[BP_CELL]
+ var/charge_needed =(computer.battery_module.battery.maxcharge - computer.battery_module.battery.charge)
+ if(charge_needed)
+ potato.cell.charge -= charge_needed
+ computer.battery_module.battery.charge += charge_needed
+
+/obj/item/organ/internal/ecs/attackby(obj/item/W, mob/user)
+ if(isScrewdriver(W))
+ if(open)
+ open = FALSE
+ to_chat(user, "You screw the exonet connection slot panel in place.")
+ else
+ open = TRUE
+ to_chat(user, "You unscrew the exonet connection slot panel.")
+
+ if(isCrowbar(W))
+ if(open)
+ if(computer)
+ user.put_in_hands(computer)
+ to_chat(user, "You remove \the [computer] from \the [src].")
+ computer = null
+ icon_state = "setup_large-open"
+
+ if (istype(W, /obj/item/modular_computer/ecs))
+ if(open)
+ if(computer)
+ to_chat(user, "There \the [computer] already installed.")
+ else if(user.unEquip(W, src))
+ computer = W
+ to_chat(user, "You insert \the [computer].")
+ icon_state = "setup_large"
+
+
+/obj/item/organ/internal/ecs/proc/exonet(mob/user)
+ if(!computer)
+ to_chat(user, "You have no exonet connection system installed")
+ return
+ if(!computer.enabled && computer.screen_on)
+ return computer.turn_on(user)
+ switch(alert("Open Terminal or interact with it?", "Open Terminal or interact with it?", "Interact", "Terminal", "Emergency Shutdown"))
+ if("Interact")
+ return computer.ui_interact(user)
+ if("Terminal")
+ return computer.open_terminal_ecs(user)
+ if("Emergency Shutdown")
+ return computer.emergency_shutdown(user)
diff --git a/code/modules/research/designs/designs_modular_computer.dm b/code/modules/research/designs/designs_modular_computer.dm
index 581f9ddea8d..8afbcb5619e 100644
--- a/code/modules/research/designs/designs_modular_computer.dm
+++ b/code/modules/research/designs/designs_modular_computer.dm
@@ -1,6 +1,6 @@
/datum/design/item/modularcomponent
category_items = "Computer Parts"
-
+
// Drives
/datum/design/item/modularcomponent/disk/AssembleDesignName()
..()
@@ -281,6 +281,15 @@
build_path = /obj/item/stock_parts/computer/battery_module/micro
sort_string = "VBAEF"
+/datum/design/item/modularcomponent/battery/converter
+ name = "Converter battery"
+ id = "bat_nano"
+ req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1)
+ build_type = PROTOLATHE
+ materials = list(MATERIAL_STEEL = 200)
+ build_path = /obj/item/stock_parts/computer/battery_module/converter
+ sort_string = "VBAFE"
+
// Processor unit
/datum/design/item/modularcomponent/cpu/AssembleDesignName()
..()
@@ -324,4 +333,14 @@
materials = list(MATERIAL_STEEL = 3200, glass = 1000)
chemicals = list(/datum/reagent/acid = 20)
build_path = /obj/item/stock_parts/computer/processor_unit/photonic/small
- sort_string = "VBAFD"
\ No newline at end of file
+ sort_string = "VBAFD"
+
+/datum/design/item/modularcomponent/ecs
+ name = "exonet connection system"
+ id = "exonet"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
+ build_type = IMPRINTER
+ materials = list(MATERIAL_STEEL = 4000, glass = 3000)
+ chemicals = list(/datum/reagent/acid = 50)
+ build_path = /obj/item/modular_computer/ecs
+ sort_string = "VBAFE"
diff --git a/code/modules/species/station/machine.dm b/code/modules/species/station/machine.dm
index d7a7c9e8487..5f88d65d013 100644
--- a/code/modules/species/station/machine.dm
+++ b/code/modules/species/station/machine.dm
@@ -42,7 +42,8 @@
has_organ = list(
BP_POSIBRAIN = /obj/item/organ/internal/posibrain,
BP_EYES = /obj/item/organ/internal/eyes/robot,
- BP_COOLING = /obj/item/organ/internal/cooling_system
+ BP_COOLING = /obj/item/organ/internal/cooling_system,
+ BP_EXONET = /obj/item/organ/internal/ecs,
)
heat_discomfort_level = 373.15
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 38659260a86..9b02bb8b102 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/infinity/code/modules/mob/living/carbon/human/machine_limb_functions.dm b/infinity/code/modules/mob/living/carbon/human/machine_limb_functions.dm
index 63f83c4cf4b..ef23eba26b6 100644
--- a/infinity/code/modules/mob/living/carbon/human/machine_limb_functions.dm
+++ b/infinity/code/modules/mob/living/carbon/human/machine_limb_functions.dm
@@ -1,5 +1,5 @@
/datum/species/machine
- inherent_verbs = list(/mob/living/carbon/human/proc/detach_limb, /mob/living/carbon/human/proc/attach_limb, /mob/living/carbon/human/proc/IPC_change_screen, /mob/living/carbon/human/proc/IPC_display_text, /mob/living/carbon/human/proc/IPC_toggle_off_screen)
+ inherent_verbs = list(/mob/living/carbon/human/proc/detach_limb, /mob/living/carbon/human/proc/attach_limb, /mob/living/carbon/human/proc/IPC_change_screen, /mob/living/carbon/human/proc/IPC_display_text, /mob/living/carbon/human/proc/IPC_toggle_off_screen, /mob/living/carbon/human/proc/enter_exonet)
/mob/living/carbon/human/proc/detach_limb()
set category = "Abilities"
@@ -172,3 +172,20 @@
f_style = "Off"
R.set_light(0, 0)
update_hair()
+
+
+
+/mob/living/carbon/human/proc/enter_exonet()
+ set category = "Abilities"
+ set name = "Enter Exonet"
+ set desc = ""
+ var/obj/item/organ/external/head/R = src.get_organ(BP_HEAD)
+ var/obj/item/organ/internal/ecs/enter = src.internal_organs_by_name[BP_EXONET]
+
+ if(R.is_stump() || R.is_broken() || !R)
+ return
+ if(!enter)
+ to_chat(usr, "You have no exonet connection port")
+ return
+ else
+ enter.exonet(src)
diff --git a/infinity/code/modules/research/designs/designs_modular_computer.dm b/infinity/code/modules/research/designs/designs_modular_computer.dm
index 4ced39dab5c..39c708ca79e 100644
--- a/infinity/code/modules/research/designs/designs_modular_computer.dm
+++ b/infinity/code/modules/research/designs/designs_modular_computer.dm
@@ -15,3 +15,13 @@
chemicals = list(/datum/reagent/acid = 20)
build_path = /obj/item/stock_parts/computer/network_card/lambda
sort_string = "VBABD"
+
+/datum/design/item/modularcomponent/battery/converter
+ name = "exonet battery converter"
+ id = "ecs_converter"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_POWER = 3)
+ build_type = IMPRINTER
+ materials = list(MATERIAL_STEEL = 1000, MATERIAL_GLASS = 800)
+ chemicals = list(/datum/reagent/acid = 20)
+ build_path = /obj/item/stock_parts/computer/battery_module/converter
+ sort_string = "VBABE"