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"