From 5f8086a4052be5129cabc63efd8ebd34e3f4df23 Mon Sep 17 00:00:00 2001 From: Huz2e <102353096+Huz2e@users.noreply.github.com> Date: Wed, 15 May 2024 18:49:51 +0300 Subject: [PATCH] =?UTF-8?q?Revert=20"=D0=9F=D0=BE=D1=80=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D1=83=D0=B5=D1=82=20=D0=9D=D0=B0=D0=BD=D0=B8=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=9C=D0=B0=D0=BD=D0=BA=D0=B8=20=D0=A1=D1=82=D0=B5?= =?UTF-8?q?=D0=B9=D1=88=D0=B5=D0=BD=D0=B0."?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/__DEFINES/research.dm | 10 - .../~massmeta_defines/nanites_defines.dm | 72 -- .../~massmeta_defines/nanites_signals.dm | 40 - code/_globalvars/lists/mobs.dm | 1 - code/_globalvars/traits/_traits.dm | 2 - code/controllers/subsystem/research.dm | 5 +- code/game/data_huds.dm | 8 +- code/game/machinery/computer/crew.dm | 38 +- code/game/objects/items/pinpointer.dm | 2 - .../mob/living/carbon/carbon_defines.dm | 2 +- .../mob/living/carbon/human/human_defines.dm | 2 +- code/modules/mob/living/living_defines.dm | 2 +- massmeta/code/datums/nanits/nanite_designs.dm | 682 ------------------ massmeta/code/datums/nanits/nanite_mood.dm | 13 - .../datums/nanits/nanites_circuitboard.dm | 56 -- .../code/datums/nanits/nanites_component.dm | 479 ------------ massmeta/code/datums/nanits/nanites_hud.dm | 7 - .../code/datums/nanits/nanites_processing.dm | 22 - .../extra_settings/_extra_settings.dm | 20 - .../extra_settings/boolean.dm | 27 - .../nanites_research/extra_settings/number.dm | 32 - .../nanites_research/extra_settings/text.dm | 21 - .../nanites_research/extra_settings/type.dm | 18 - .../nanits/nanites_research/nanite_chamber.dm | 214 ------ .../nanite_chamber_computer.dm | 109 --- .../nanite_cloud_controller.dm | 263 ------- .../nanites_research/nanite_injector.dm | 9 - .../nanites_research/nanite_program_hub.dm | 142 ---- .../nanites_research/nanite_programmer.dm | 168 ----- .../nanites_research/nanite_programs.dm | 335 --------- .../nanite_programs/buffing.dm | 115 --- .../nanite_programs/healing.dm | 230 ------ .../nanite_programs/protocols.dm | 277 ------- .../nanites_research/nanite_programs/rogue.dm | 116 --- .../nanite_programs/sensor.dm | 312 -------- .../nanite_programs/suppression.dm | 270 ------- .../nanite_programs/utility.dm | 311 -------- .../nanite_programs/weapon.dm | 217 ------ .../nanits/nanites_research/nanite_remote.dm | 233 ------ .../nanits/nanites_research/nanite_scaner.dm | 23 - .../nanits/nanites_research/program_disk.dm | 133 ---- .../nanits/nanites_research/public_chamber.dm | 206 ------ .../datums/nanits/nanites_research/rules.dm | 148 ---- .../code/datums/nanits/nanites_techweb.dm | 180 ----- massmeta/icons/mob/huds/hud.dmi | Bin 407 -> 0 bytes massmeta/icons/obj/machines/nanites.dmi | Bin 22441 -> 0 bytes massmeta/includes.dm | 33 - tgstation.dme | 2 - .../tgui/interfaces/NaniteChamberControl.jsx | 269 ------- .../tgui/interfaces/NaniteCloudControl.jsx | 328 --------- .../tgui/interfaces/NaniteProgramHub.jsx | 151 ---- .../tgui/interfaces/NaniteProgrammer.jsx | 344 --------- .../packages/tgui/interfaces/NaniteRemote.jsx | 177 ----- 53 files changed, 24 insertions(+), 6852 deletions(-) delete mode 100644 code/__DEFINES/~massmeta_defines/nanites_defines.dm delete mode 100644 code/__DEFINES/~massmeta_defines/nanites_signals.dm delete mode 100644 massmeta/code/datums/nanits/nanite_designs.dm delete mode 100644 massmeta/code/datums/nanits/nanite_mood.dm delete mode 100644 massmeta/code/datums/nanits/nanites_circuitboard.dm delete mode 100644 massmeta/code/datums/nanits/nanites_component.dm delete mode 100644 massmeta/code/datums/nanits/nanites_hud.dm delete mode 100644 massmeta/code/datums/nanits/nanites_processing.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/extra_settings/_extra_settings.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/extra_settings/boolean.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/extra_settings/number.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/extra_settings/text.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/extra_settings/type.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_chamber.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_chamber_computer.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_cloud_controller.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_injector.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_program_hub.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programmer.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programs.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programs/buffing.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programs/healing.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programs/protocols.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programs/rogue.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programs/sensor.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programs/suppression.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programs/utility.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_programs/weapon.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_remote.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/nanite_scaner.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/program_disk.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/public_chamber.dm delete mode 100644 massmeta/code/datums/nanits/nanites_research/rules.dm delete mode 100644 massmeta/code/datums/nanits/nanites_techweb.dm delete mode 100644 massmeta/icons/mob/huds/hud.dmi delete mode 100644 massmeta/icons/obj/machines/nanites.dmi delete mode 100644 tgui/packages/tgui/interfaces/NaniteChamberControl.jsx delete mode 100644 tgui/packages/tgui/interfaces/NaniteCloudControl.jsx delete mode 100644 tgui/packages/tgui/interfaces/NaniteProgramHub.jsx delete mode 100644 tgui/packages/tgui/interfaces/NaniteProgrammer.jsx delete mode 100644 tgui/packages/tgui/interfaces/NaniteRemote.jsx diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index 7dc66bcfbea0d..d3f99314f1d8f 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -4,16 +4,6 @@ //! Techweb names for new point types. Can be used to define specific point values for specific types of research (science, security, engineering, etc.) #define TECHWEB_POINT_TYPE_GENERIC "General Research" -#define TECHWEB_POINT_TYPE_NANITES "Nanite Research" //Massmeta Edithen here - -#define TECHWEB_POINT_TYPE_DEFAULT TECHWEB_POINT_TYPE_GENERIC - -//! Associative names for techweb point values, see: [all_nodes][code/modules/research/techweb/all_nodes.dm] -#define TECHWEB_POINT_TYPE_LIST_ASSOCIATIVE_NAMES list(\ - TECHWEB_POINT_TYPE_GENERIC = "General Research",\ - TECHWEB_POINT_TYPE_NANITES = "Nanite Research"\ - ) - //! Amount of points gained per second by a single R&D server, see: [research][code/controllers/subsystem/research.dm] #define TECHWEB_SINGLE_SERVER_INCOME 52.3 diff --git a/code/__DEFINES/~massmeta_defines/nanites_defines.dm b/code/__DEFINES/~massmeta_defines/nanites_defines.dm deleted file mode 100644 index c3c50d0dd0212..0000000000000 --- a/code/__DEFINES/~massmeta_defines/nanites_defines.dm +++ /dev/null @@ -1,72 +0,0 @@ -#define NANITE_SYNC_DELAY 300 - -#define NANITE_SHOCK_IMMUNE 1 -#define NANITE_EMP_IMMUNE 2 - -#define NANITE_PROGRAM_LIMIT 20 - - -#define NANITE_BASE_RESEARCH 3.5 - -#define NANITE_CLOUD_TOGGLE 1 -#define NANITE_CLOUD_DISABLE 2 -#define NANITE_CLOUD_ENABLE 3 - -//Nanite excess thresholds -#define NANITE_EXCESS_MINOR 25 -#define NANITE_EXCESS_VOMIT 100 -#define NANITE_EXCESS_BURST 350 - -///Nanite Protocol types -#define NANITE_PROTOCOL_REPLICATION "nanite_replication" -#define NANITE_PROTOCOL_STORAGE "nanite_storage" - -///Nanite extra settings types: used to help uis know what type an extra setting is -#define NESTYPE_TEXT "text" -#define NESTYPE_NUMBER "number" -#define NESTYPE_TYPE "type" -#define NESTYPE_BOOLEAN "boolean" - -///Nanite Extra Settings - Note that these will also be the names displayed in the UI -#define NES_SENT_CODE "Sent Code" -#define NES_DELAY "Delay" -#define NES_MODE "Mode" -#define NES_COMM_CODE "Comm Code" -#define NES_RELAY_CHANNEL "Relay Channel" -#define NES_HEALTH_PERCENT "Health Percent" -#define NES_DIRECTION "Direction" -#define NES_NANITE_PERCENT "Nanite Percent" -#define NES_DAMAGE_TYPE "Damage Type" -#define NES_DAMAGE "Damage" -#define NES_SENTENCE "Sentence" -#define NES_MESSAGE "Message" -#define NES_DIRECTIVE "Directive" -#define NES_INCLUSIVE_MODE "Inclusive Mode" -#define NES_RACE "Race" -#define NES_HALLUCINATION_TYPE "Hallucination Type" -#define NES_HALLUCINATION_DETAIL "Hallucination Detail" -#define NES_MOOD_MESSAGE "Mood Message" -#define NES_PROGRAM_OVERWRITE "Program Overwrite" -#define NES_CLOUD_OVERWRITE "Cloud Overwrite" -#define NES_SCAN_TYPE "Scan Type" -#define NES_BUTTON_NAME "Button Name" -#define NES_ICON "Icon" - -//_Defines/atom_hud -#define NANITE_HUD "24" -#define DIAG_NANITE_FULL_HUD "25" - -//_Defines/logging -#define INVESTIGATE_NANITES "nanites" - -//_Defines/machines -#define NANITE_COMPILER (1<<7) //Prints nanite disks - -//_Defines/mobs -#define VOMIT_NANITE (1<<6) - -//_Defines/traits/declarations -#define NANITES_TRAIT "nanites" - -/// The mob's nanites are sending a monitoring signal visible on diag HUD // Massmeta editchen -#define TRAIT_NANITE_MONITORING "nanite_monitoring" diff --git a/code/__DEFINES/~massmeta_defines/nanites_signals.dm b/code/__DEFINES/~massmeta_defines/nanites_signals.dm deleted file mode 100644 index ea1b3b7ff1258..0000000000000 --- a/code/__DEFINES/~massmeta_defines/nanites_signals.dm +++ /dev/null @@ -1,40 +0,0 @@ -///() returns TRUE if nanites are found -#define COMSIG_HAS_NANITES "has_nanites" -///() returns TRUE if nanites have stealth -#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" -///() deletes the nanite component -#define COMSIG_NANITE_DELETE "nanite_delete" -///(list/nanite_programs) - makes the input list a copy the nanites' program list -#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" -///(amount) Returns nanite amount -#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" -///(amount) Sets current nanite volume to the given amount -#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" -///(amount) Adjusts nanite volume by the given amount -#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" -///(amount) Sets maximum nanite volume to the given amount -#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" -///(amount(0-100)) Sets cloud ID to the given amount -#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" -///(method) Modify cloud sync status. Method can be toggle, enable or disable -#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" -///(amount) Sets safety threshold to the given amount -#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" -///(amount) Sets regeneration rate to the given amount -#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" -///(code(1-9999)) Called when sending a nanite signal to a mob. -#define COMSIG_NANITE_SIGNAL "nanite_signal" -///(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. -#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" -///(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected -#define COMSIG_NANITE_SCAN "nanite_scan" -///(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs -#define COMSIG_NANITE_UI_DATA "nanite_ui_data" -///(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component -#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" - ///Installation successful - #define COMPONENT_PROGRAM_INSTALLED (1<<0) - ///Installation failed, but there are still nanites - #define COMPONENT_PROGRAM_NOT_INSTALLED (1<<1) -///(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component -#define COMSIG_NANITE_SYNC "nanite_sync" diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 73eaae34ea458..692704be0fffd 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -64,7 +64,6 @@ GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs GLOBAL_LIST_EMPTY(bots_list) GLOBAL_LIST_EMPTY(aiEyes) GLOBAL_LIST_EMPTY(suit_sensors_list) //all people with suit sensors on -GLOBAL_LIST_EMPTY(nanite_sensors_list) // Massmeta editchen /// All alive mobs with clients. GLOBAL_LIST_EMPTY(alive_player_list) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 38842675df030..c1351e99354d6 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -34,8 +34,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, "TRAIT_BLOCKING_EXPLOSIVES" = TRAIT_BLOCKING_EXPLOSIVES, "TRAIT_BOULDER_BREAKER" = TRAIT_BOULDER_BREAKER, - "NANITES_TRAIT" = NANITES_TRAIT, - "TRAIT_NANITE_MONITORING" = TRAIT_NANITE_MONITORING, "TRAIT_CASTABLE_LOC" = TRAIT_CASTABLE_LOC, "TRAIT_DEL_ON_SPACE_DUMP" = TRAIT_DEL_ON_SPACE_DUMP, "TRAIT_FISH_CASE_COMPATIBILE" = TRAIT_FISH_CASE_COMPATIBILE, diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 20d28fce7ee12..612c599c0f62c 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -8,9 +8,6 @@ SUBSYSTEM_DEF(research) var/list/techweb_nodes = list() //associative id = node datum var/list/techweb_designs = list() //associative id = node datum - ///The default Science Techweb. - var/datum/techweb/science/science_tech - ///List of all techwebs, generating points or not. ///Autolathes, Mechfabs, and others all have shared techwebs, for example. var/list/datum/techweb/techwebs = list() @@ -77,7 +74,7 @@ SUBSYSTEM_DEF(research) initialize_all_techweb_designs() initialize_all_techweb_nodes() populate_ordnance_experiments() - science_tech = new /datum/techweb/science + new /datum/techweb/science new /datum/techweb/admin new /datum/techweb/oldstation autosort_categories() diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 9d2e42073b865..a4d59d668ae11 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -18,7 +18,7 @@ /datum/atom_hud/data /datum/atom_hud/data/human/medical - hud_icons = list(STATUS_HUD, HEALTH_HUD, NANITE_HUD) // Massmeta editchen + hud_icons = list(STATUS_HUD, HEALTH_HUD) /datum/atom_hud/data/human/medical/basic @@ -47,7 +47,7 @@ hud_icons = list(ID_HUD) /datum/atom_hud/data/human/security/advanced - hud_icons = list(ID_HUD, IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD, WANTED_HUD, NANITE_HUD) // Massmeta editchen + hud_icons = list(ID_HUD, IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD, WANTED_HUD) /datum/atom_hud/data/human/fan_hud hud_icons = list(FAN_HUD) @@ -55,10 +55,10 @@ /datum/atom_hud/data/diagnostic /datum/atom_hud/data/diagnostic/basic - hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD, NANITE_HUD) // Massmeta editchen + hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD) /datum/atom_hud/data/diagnostic/advanced - hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD, DIAG_PATH_HUD,NANITE_HUD) // Massmeta editchen + hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD, DIAG_PATH_HUD) /datum/atom_hud/data/bot_path // This hud exists so the bot can see itself, that's all diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 8b915377dd08d..268b675871ab2 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -190,7 +190,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) return data_by_z["[z]"] var/list/results = list() - for(var/tracked_mob in GLOB.suit_sensors_list | GLOB.nanite_sensors_list) //massmeta edit + for(var/tracked_mob in GLOB.suit_sensors_list) if(!tracked_mob) stack_trace("Null entry in suit sensors list.") continue @@ -209,31 +209,25 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) if(pos.z != z && (!is_station_level(pos.z) || !is_station_level(z)) && !HAS_TRAIT(tracked_living_mob, TRAIT_MULTIZ_SUIT_SENSORS)) continue - var/sensor_mode + var/mob/living/carbon/human/tracked_human = tracked_living_mob - // Set sensor level based on whether we're in the nanites list or the suit sensor list. - if(tracked_living_mob in GLOB.nanite_sensors_list) //massmeta edit - sensor_mode = SENSOR_COORDS - else - var/mob/living/carbon/human/tracked_human = tracked_living_mob - - // Check their humanity. - if(!ishuman(tracked_human)) - stack_trace("Non-human mob is in suit_sensors_list: [tracked_living_mob] ([tracked_living_mob.type])") - continue + // Check their humanity. + if(!ishuman(tracked_human)) + stack_trace("Non-human mob is in suit_sensors_list: [tracked_living_mob] ([tracked_living_mob.type])") + continue - // Check they have a uniform - var/obj/item/clothing/under/uniform = tracked_human.w_uniform - if (!istype(uniform)) - stack_trace("Human without a suit sensors compatible uniform is in suit_sensors_list: [tracked_human] ([tracked_human.type]) ([uniform?.type])") - continue + // Check they have a uniform + var/obj/item/clothing/under/uniform = tracked_human.w_uniform + if (!istype(uniform)) + stack_trace("Human without a suit sensors compatible uniform is in suit_sensors_list: [tracked_human] ([tracked_human.type]) ([uniform?.type])") + continue - // Check if their uniform is in a compatible mode. - if((uniform.has_sensor <= NO_SENSORS) || !uniform.sensor_mode) - stack_trace("Human without active suit sensors is in suit_sensors_list: [tracked_human] ([tracked_human.type]) ([uniform.type])") - continue + // Check if their uniform is in a compatible mode. + if((uniform.has_sensor <= NO_SENSORS) || !uniform.sensor_mode) + stack_trace("Human without active suit sensors is in suit_sensors_list: [tracked_human] ([tracked_human.type]) ([uniform.type])") + continue - sensor_mode = uniform.sensor_mode + var/sensor_mode = uniform.sensor_mode // The entry for this human var/list/entry = list( diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index c6c6a9d306f39..3a020ec5393ea 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -105,8 +105,6 @@ var/turf/here = get_turf(src) var/turf/there = get_turf(H) if(here && there && (there.z == here.z || (is_station_level(here.z) && is_station_level(there.z)))) // Device and target should be on the same level or different levels of the same station - if (H in GLOB.nanite_sensors_list) //massmeta edit - return TRUE if (istype(H.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = H.w_uniform if(U.has_sensor && (U.sensor_mode >= SENSOR_COORDS || ignore_suit_sensor_level)) // Suit sensors must be on maximum or a contractor pinpointer diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 9e4ff95830be1..d3e57c4ec1df1 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,7 +2,7 @@ blood_volume = BLOOD_VOLUME_NORMAL gender = MALE pressure_resistance = 15 - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) // Massmeta editchen + hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD) has_limbs = TRUE held_items = list(null, null) num_legs = 0 //Populated on init through list/bodyparts diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index ad02e640dada4..84d1c45466873 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -5,7 +5,7 @@ icon = 'icons/mob/human/human.dmi' icon_state = "human_basic" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPSEC_FIRST_HUD,IMPSEC_SECOND_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) // Massmeta editchen + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPSEC_FIRST_HUD,IMPSEC_SECOND_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD) hud_type = /datum/hud/human pressure_resistance = 25 can_buckle = TRUE diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index c90428553adeb..0914cd1112b9d 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -1,6 +1,6 @@ /mob/living see_invisible = SEE_INVISIBLE_LIVING - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) // Massmeta editchen + hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) pressure_resistance = 10 hud_type = /datum/hud/living diff --git a/massmeta/code/datums/nanits/nanite_designs.dm b/massmeta/code/datums/nanits/nanite_designs.dm deleted file mode 100644 index 58430261a9fa0..0000000000000 --- a/massmeta/code/datums/nanits/nanite_designs.dm +++ /dev/null @@ -1,682 +0,0 @@ -/datum/design/board/nanite_chamber_control - name = "Computer Design (Nanite Chamber Control)" - desc = "Allows for the construction of circuit boards used to build a new nanite chamber control console." - id = "nanite_chamber_control" - build_path = /obj/item/circuitboard/computer/nanite_chamber_control - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/board/nanite_cloud_control - name = "Computer Design (Nanite Cloud Control)" - desc = "Allows for the construction of circuit boards used to build a new nanite cloud control console." - id = "nanite_cloud_control" - build_path = /obj/item/circuitboard/computer/nanite_cloud_controller - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/nanite_remote - name = "Nanite Remote" - desc = "Allows for the construction of a nanite remote." - id = "nanite_remote" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/glass = 500, /datum/material/iron = 500) - build_path = /obj/item/nanite_remote - category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/nanite_comm_remote - name = "Nanite Communication Remote" - desc = "Allows for the construction of a nanite communication remote." - id = "nanite_comm_remote" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/glass = 500, /datum/material/iron = 500) - build_path = /obj/item/nanite_remote/comm - category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/nanite_scanner - name = "Nanite Scanner" - desc = "Allows for the construction of a nanite scanner." - id = "nanite_scanner" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/glass = 500, /datum/material/iron = 500) - build_path = /obj/item/nanite_scanner - category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/nanite_disk - name = "Nanite Program Disk" - desc = "Stores nanite programs." - id = "nanite_disk" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = 300, /datum/material/glass = 100) - build_path = /obj/item/disk/nanite_program - category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/board/nanite_chamber - name = "Machine Design (Nanite Chamber Board)" - desc = "The circuit board for a Nanite Chamber." - id = "nanite_chamber" - build_path = /obj/item/circuitboard/machine/nanite_chamber - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/board/public_nanite_chamber - name = "Machine Design (Public Nanite Chamber Board)" - desc = "The circuit board for a Public Nanite Chamber." - id = "public_nanite_chamber" - build_path = /obj/item/circuitboard/machine/public_nanite_chamber - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/board/nanite_programmer - name = "Machine Design (Nanite Programmer Board)" - desc = "The circuit board for a Nanite Programmer." - id = "nanite_programmer" - build_path = /obj/item/circuitboard/machine/nanite_programmer - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/board/nanite_program_hub - name = "Machine Design (Nanite Program Hub Board)" - desc = "The circuit board for a Nanite Program Hub." - id = "nanite_program_hub" - build_path = /obj/item/circuitboard/machine/nanite_program_hub - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/nanites - name = "None" - desc = "Warn a coder if you see this." - id = "default_nanites" - build_type = NANITE_COMPILER - departmental_flags = NONE - construction_time = 50 - category = list() - research_icon = 'massmeta/icons/obj/machines/nanites.dmi' - research_icon_state = "nanite_program" - var/program_type = /datum/nanite_program - -////////////////////UTILITY NANITES////////////////////////////////////// - -/datum/design/nanites/metabolic_synthesis - name = "Metabolic Synthesis" - desc = "The nanites use the metabolic cycle of the host to speed up their replication rate, using their extra nutrition as fuel." - id = "metabolic_nanites" - program_type = /datum/nanite_program/metabolic_synthesis - category = list("Utility Nanites") - -/datum/design/nanites/viral - name = "Viral Replica" - desc = "The nanites constantly send encrypted signals attempting to forcefully copy their own programming into other nanite clusters." - id = "viral_nanites" - program_type = /datum/nanite_program/viral - category = list("Utility Nanites") - -/datum/design/nanites/monitoring - name = "Monitoring" - desc = "The nanites monitor the host's vitals and location, sending them to the suit sensor network." - id = "monitoring_nanites" - program_type = /datum/nanite_program/monitoring - category = list("Utility Nanites") - -/datum/design/nanites/self_scan - name = "Host Scan" - desc = "The nanites display a detailed readout of a body scan to the host." - id = "selfscan_nanites" - program_type = /datum/nanite_program/self_scan - category = list("Utility Nanites") - -/datum/design/nanites/dermal_button - name = "Dermal Button" - desc = "Displays a button on the host's skin, which can be used to send a signal to the nanites." - id = "dermal_button_nanites" - program_type = /datum/nanite_program/dermal_button - category = list("Utility Nanites") - -/datum/design/nanites/stealth - name = "Stealth" - desc = "The nanites hide their activity and programming from superficial scans." - id = "stealth_nanites" - program_type = /datum/nanite_program/stealth - category = list("Utility Nanites") - -/datum/design/nanites/nanite_debugging - name = "Nanite Debugging" - desc = "Enables various high-cost diagnostics in the nanites, making them able to communicate their program list to portable scanners. \ - Doing so uses some power, slightly decreasing their replication speed." - id = "debugging_nanites" - program_type = /datum/nanite_program/nanite_debugging - category = list("Utility Nanites") - -/datum/design/nanites/access - name = "Subdermal ID" - desc = "The nanites store the host's ID access rights in a subdermal magnetic strip. Updates when triggered, copying the host's current access." - id = "access_nanites" - program_type = /datum/nanite_program/access - category = list("Utility Nanites") - -/datum/design/nanites/relay - name = "Relay" - desc = "The nanites receive and relay long-range nanite signals." - id = "relay_nanites" - program_type = /datum/nanite_program/relay - category = list("Utility Nanites") - -/datum/design/nanites/repeater - name = "Signal Repeater" - desc = "When triggered, sends another signal to the nanites, optionally with a delay." - id = "repeater_nanites" - program_type = /datum/nanite_program/sensor/repeat - category = list("Utility Nanites") - -/datum/design/nanites/relay_repeater - name = "Relay Signal Repeater" - desc = "When triggered, sends another signal to a relay channel, optionally with a delay." - id = "relay_repeater_nanites" - program_type = /datum/nanite_program/sensor/relay_repeat - category = list("Utility Nanites") - -/datum/design/nanites/emp - name = "Electromagnetic Resonance" - desc = "The nanites cause an electromagnetic pulse around the host when triggered. Will corrupt other nanite programs!" - id = "emp_nanites" - program_type = /datum/nanite_program/emp - category = list("Utility Nanites") - -/datum/design/nanites/spreading - name = "Infective Exo-Locomotion" - desc = "The nanites gain the ability to survive for brief periods outside of the human body, as well as the ability to start new colonies without an integration process; \ - resulting in an extremely infective strain of nanites." - id = "spreading_nanites" - program_type = /datum/nanite_program/spreading - category = list("Utility Nanites") - -/datum/design/nanites/nanite_sting - name = "Nanite Sting" - desc = "When triggered, projects a nearly invisible spike of nanites that attempts to infect a nearby non-host with a copy of the host's nanites cluster." - id = "nanite_sting_nanites" - program_type = /datum/nanite_program/nanite_sting - category = list("Utility Nanites") - -/datum/design/nanites/mitosis - name = "Mitosis" - desc = "The nanites gain the ability to self-replicate, using bluespace to power the process, instead of drawing from a template. This rapidly speeds up the replication rate,\ - but it causes occasional software errors due to faulty copies." - id = "mitosis_nanites" - program_type = /datum/nanite_program/mitosis - category = list("Utility Nanites") - -////////////////////MEDICAL NANITES////////////////////////////////////// -/datum/design/nanites/regenerative - name = "Accelerated Regeneration" - desc = "The nanites boost the host's natural regeneration, increasing their healing speed." - id = "regenerative_nanites" - program_type = /datum/nanite_program/regenerative - category = list("Medical Nanites") - -/datum/design/nanites/regenerative_advanced - name = "Bio-Reconstruction" - desc = "The nanites manually repair and replace organic cells, acting much faster than normal regeneration. \ - However, this program cannot detect the difference between harmed and unharmed, causing it to consume nanites even if it has no effect." - id = "regenerative_plus_nanites" - program_type = /datum/nanite_program/regenerative_advanced - category = list("Medical Nanites") - -/datum/design/nanites/temperature - name = "Temperature Adjustment" - desc = "The nanites adjust the host's internal temperature to an ideal level." - id = "temperature_nanites" - program_type = /datum/nanite_program/temperature - category = list("Medical Nanites") - -/datum/design/nanites/purging - name = "Blood Purification" - desc = "The nanites purge toxins and chemicals from the host's bloodstream." - id = "purging_nanites" - program_type = /datum/nanite_program/purging - category = list("Medical Nanites") - -/datum/design/nanites/purging_advanced - name = "Selective Blood Purification" - desc = "The nanites purge toxins and dangerous chemicals from the host's bloodstream, while ignoring beneficial chemicals. \ - The added processing power required to analyze the chemicals severely increases the nanite consumption rate." - id = "purging_plus_nanites" - program_type = /datum/nanite_program/purging_advanced - category = list("Medical Nanites") - -/datum/design/nanites/brain_heal - name = "Neural Regeneration" - desc = "The nanites fix neural connections in the host's brain, reversing brain damage and minor traumas." - id = "brainheal_nanites" - program_type = /datum/nanite_program/brain_heal - category = list("Medical Nanites") - -/datum/design/nanites/brain_heal_advanced - name = "Neural Reimaging" - desc = "The nanites are able to backup and restore the host's neural connections, potentially replacing entire chunks of missing or damaged brain matter." - id = "brainheal_plus_nanites" - program_type = /datum/nanite_program/brain_heal_advanced - category = list("Medical Nanites") - -/datum/design/nanites/blood_restoring - name = "Blood Regeneration" - desc = "The nanites stimulate and boost blood cell production in the host." - id = "bloodheal_nanites" - program_type = /datum/nanite_program/blood_restoring - category = list("Medical Nanites") - -/datum/design/nanites/repairing - name = "Mechanical Repair" - desc = "The nanites fix damage in the host's mechanical limbs." - id = "repairing_nanites" - program_type = /datum/nanite_program/repairing - category = list("Medical Nanites") - -/datum/design/nanites/defib - name = "Defibrillation" - desc = "The nanites, when triggered, send a defibrillating shock to the host's heart." - id = "defib_nanites" - program_type = /datum/nanite_program/defib - category = list("Medical Nanites") - - -////////////////////AUGMENTATION NANITES////////////////////////////////////// - -/datum/design/nanites/nervous - name = "Nerve Support" - desc = "The nanites act as a secondary nervous system, reducing the amount of time the host is stunned." - id = "nervous_nanites" - program_type = /datum/nanite_program/nervous - category = list("Augmentation Nanites") - -/datum/design/nanites/hardening - name = "Dermal Hardening" - desc = "The nanites form a mesh under the host's skin, protecting them from melee and bullet impacts." - id = "hardening_nanites" - program_type = /datum/nanite_program/hardening - category = list("Augmentation Nanites") - -/datum/design/nanites/refractive - name = "Dermal Refractive Surface" - desc = "The nanites form a membrane above the host's skin, reducing the effect of laser and energy impacts." - id = "refractive_nanites" - program_type = /datum/nanite_program/refractive - category = list("Augmentation Nanites") - -/datum/design/nanites/coagulating - name = "Vein Repressurization" - desc = "The nanites re-route circulating blood away from open wounds, dramatically reducing bleeding rate." - id = "coagulating_nanites" - program_type = /datum/nanite_program/coagulating - category = list("Augmentation Nanites") - -/datum/design/nanites/conductive - name = "Electric Conduction" - desc = "The nanites act as a grounding rod for electric shocks, protecting the host. Shocks can still damage the nanites themselves." - id = "conductive_nanites" - program_type = /datum/nanite_program/conductive - category = list("Augmentation Nanites") - -/datum/design/nanites/mindshield - name = "Mental Barrier" - desc = "The nanites form a protective membrane around the host's brain, shielding them from abnormal influences while they're active." - id = "mindshield_nanites" - program_type = /datum/nanite_program/mindshield - category = list("Augmentation Nanites") - -////////////////////DEFECTIVE NANITES////////////////////////////////////// - -/datum/design/nanites/glitch - name = "Glitch" - desc = "A heavy software corruption that causes nanites to gradually break down." - id = "glitch_nanites" - program_type = /datum/nanite_program/glitch - category = list("Defective Nanites") - -/datum/design/nanites/necrotic - name = "Necrosis" - desc = "The nanites attack internal tissues indiscriminately, causing widespread damage." - id = "necrotic_nanites" - program_type = /datum/nanite_program/necrotic - category = list("Defective Nanites") - -/datum/design/nanites/toxic - name = "Toxin Buildup" - desc = "The nanites cause a slow but constant toxin buildup inside the host." - id = "toxic_nanites" - program_type = /datum/nanite_program/toxic - category = list("Defective Nanites") - -/datum/design/nanites/suffocating - name = "Hypoxemia" - desc = "The nanites prevent the host's blood from absorbing oxygen efficiently." - id = "suffocating_nanites" - program_type = /datum/nanite_program/suffocating - category = list("Defective Nanites") - -/datum/design/nanites/brain_misfire - name = "Brain Misfire" - desc = "The nanites interfere with neural pathways, causing minor psychological disturbances." - id = "brainmisfire_nanites" - program_type = /datum/nanite_program/brain_misfire - category = list("Defective Nanites") - -/datum/design/nanites/skin_decay - name = "Dermalysis" - desc = "The nanites attack skin cells, causing irritation, rashes, and minor damage." - id = "skindecay_nanites" - program_type = /datum/nanite_program/skin_decay - category = list("Defective Nanites") - -/datum/design/nanites/nerve_decay - name = "Nerve Decay" - desc = "The nanites attack the host's nerves, causing lack of coordination and short bursts of paralysis." - id = "nervedecay_nanites" - program_type = /datum/nanite_program/nerve_decay - category = list("Defective Nanites") - -/datum/design/nanites/brain_decay - name = "Brain-Eating Nanites" - desc = "Damages brain cells, gradually decreasing the host's cognitive functions." - id = "braindecay_nanites" - program_type = /datum/nanite_program/brain_decay - category = list("Defective Nanites") - -////////////////////WEAPONIZED NANITES///////////////////////////////////// - -/datum/design/nanites/flesh_eating - name = "Cellular Breakdown" - desc = "The nanites destroy cellular structures in the host's body, causing brute damage." - id = "flesheating_nanites" - program_type = /datum/nanite_program/flesh_eating - category = list("Weaponized Nanites") - -/datum/design/nanites/poison - name = "Poisoning" - desc = "The nanites deliver poisonous chemicals to the host's internal organs, causing toxin damage and vomiting." - id = "poison_nanites" - program_type = /datum/nanite_program/poison - category = list("Weaponized Nanites") - -/datum/design/nanites/memory_leak - name = "Memory Leak" - desc = "This program invades the memory space used by other programs, causing frequent corruptions and errors." - id = "memleak_nanites" - program_type = /datum/nanite_program/memory_leak - category = list("Weaponized Nanites") - -/datum/design/nanites/aggressive_replication - name = "Aggressive Replication" - desc = "Nanites will consume organic matter to improve their replication rate, damaging the host." - id = "aggressive_nanites" - program_type = /datum/nanite_program/aggressive_replication - category = list("Weaponized Nanites") - -/datum/design/nanites/meltdown - name = "Meltdown" - desc = "Causes an internal meltdown inside the nanites, causing internal burns inside the host as well as rapidly destroying the nanite population.\ - Sets the nanites' safety threshold to 0 when activated." - id = "meltdown_nanites" - program_type = /datum/nanite_program/meltdown - category = list("Weaponized Nanites") - -/datum/design/nanites/cryo - name = "Cryogenic Treatment" - desc = "The nanites rapidly skin heat through the host's skin, lowering their temperature." - id = "cryo_nanites" - program_type = /datum/nanite_program/cryo - category = list("Weaponized Nanites") - -/datum/design/nanites/pyro - name = "Sub-Dermal Combustion" - desc = "The nanites cause buildup of flammable fluids under the host's skin, then ignites them." - id = "pyro_nanites" - program_type = /datum/nanite_program/pyro - category = list("Weaponized Nanites") - -/datum/design/nanites/heart_stop - name = "Heart-Stopper" - desc = "Stops the host's heart when triggered; restarts it if triggered again." - id = "heartstop_nanites" - program_type = /datum/nanite_program/heart_stop - category = list("Weaponized Nanites") - -/datum/design/nanites/explosive - name = "Chain Detonation" - desc = "Blows up all the nanites inside the host in a chain reaction when triggered." - id = "explosive_nanites" - program_type = /datum/nanite_program/explosive - category = list("Weaponized Nanites") - -/datum/design/nanites/mind_control - name = "Mind Control" - desc = "The nanites imprint an absolute directive onto the host's brain while they're active." - id = "mindcontrol_nanites" - program_type = /datum/nanite_program/comm/mind_control - category = list("Weaponized Nanites") - -////////////////////SUPPRESSION NANITES////////////////////////////////////// - -/datum/design/nanites/shock - name = "Electric Shock" - desc = "The nanites shock the host when triggered. Destroys a large amount of nanites!" - id = "shock_nanites" - program_type = /datum/nanite_program/shocking - category = list("Suppression Nanites") - -/datum/design/nanites/stun - name = "Neural Shock" - desc = "The nanites pulse the host's nerves when triggered, inapacitating them for a short period." - id = "stun_nanites" - program_type = /datum/nanite_program/stun - category = list("Suppression Nanites") - -/datum/design/nanites/sleepy - name = "Sleep Induction" - desc = "The nanites cause rapid narcolepsy when triggered." - id = "sleep_nanites" - program_type = /datum/nanite_program/sleepy - category = list("Suppression Nanites") - -/datum/design/nanites/paralyzing - name = "Paralysis" - desc = "The nanites actively suppress nervous pulses, effectively paralyzing the host." - id = "paralyzing_nanites" - program_type = /datum/nanite_program/paralyzing - category = list("Suppression Nanites") - -/datum/design/nanites/fake_death - name = "Death Simulation" - desc = "The nanites induce a death-like coma into the host, able to fool most medical scans." - id = "fakedeath_nanites" - program_type = /datum/nanite_program/fake_death - category = list("Suppression Nanites") - -/datum/design/nanites/pacifying - name = "Pacification" - desc = "The nanites suppress the aggression center of the brain, preventing the host from causing direct harm to others." - id = "pacifying_nanites" - program_type = /datum/nanite_program/pacifying - category = list("Suppression Nanites") - -/datum/design/nanites/blinding - name = "Blindness" - desc = "The nanites suppress the host's ocular nerves, blinding them while they're active." - id = "blinding_nanites" - program_type = /datum/nanite_program/blinding - category = list("Suppression Nanites") - -/datum/design/nanites/mute - name = "Mute" - desc = "The nanites suppress the host's speech, making them mute while they're active." - id = "mute_nanites" - program_type = /datum/nanite_program/mute - category = list("Suppression Nanites") - -/datum/design/nanites/voice - name = "Skull Echo" - desc = "The nanites echo a synthesized message inside the host's skull." - id = "voice_nanites" - program_type = /datum/nanite_program/comm/voice - category = list("Suppression Nanites") - -/datum/design/nanites/speech - name = "Forced Speech" - desc = "The nanites force the host to say a pre-programmed sentence when triggered." - id = "speech_nanites" - program_type = /datum/nanite_program/comm/speech - category = list("Suppression Nanites") - -/datum/design/nanites/hallucination - name = "Hallucination" - desc = "The nanites make the host see and hear things that aren't real." - id = "hallucination_nanites" - program_type = /datum/nanite_program/comm/hallucination - category = list("Suppression Nanites") - -/datum/design/nanites/good_mood - name = "Happiness Enhancer" - desc = "The nanites synthesize serotonin inside the host's brain, creating an artificial sense of happiness." - id = "good_mood_nanites" - program_type = /datum/nanite_program/good_mood - category = list("Suppression Nanites") - -/datum/design/nanites/bad_mood - name = "Happiness Suppressor" - desc = "The nanites suppress the production of serotonin inside the host's brain, creating an artificial state of depression." - id = "bad_mood_nanites" - program_type = /datum/nanite_program/bad_mood - category = list("Suppression Nanites") - -////////////////////SENSOR NANITES////////////////////////////////////// - -/datum/design/nanites/sensor_health - name = "Health Sensor" - desc = "The nanites receive a signal when the host's health is above/below a certain percentage." - id = "sensor_health_nanites" - program_type = /datum/nanite_program/sensor/health - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_damage - name = "Damage Sensor" - desc = "The nanites receive a signal when a host's specific damage type is above/below a target value." - id = "sensor_damage_nanites" - program_type = /datum/nanite_program/sensor/damage - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_crit - name = "Critical Health Sensor" - desc = "The nanites receive a signal when the host first reaches critical health." - id = "sensor_crit_nanites" - program_type = /datum/nanite_program/sensor/crit - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_death - name = "Death Sensor" - desc = "The nanites receive a signal when they detect the host is dead." - id = "sensor_death_nanites" - program_type = /datum/nanite_program/sensor/death - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_voice - name = "Voice Sensor" - desc = "Sends a signal when the nanites hear a determined word or sentence." - id = "sensor_voice_nanites" - program_type = /datum/nanite_program/sensor/voice - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_nanite_volume - name = "Nanite Volume Sensor" - desc = "The nanites receive a signal when the nanite supply is above/below a certain percentage." - id = "sensor_nanite_volume" - program_type = /datum/nanite_program/sensor/nanite_volume - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_species - name = "Species Sensor" - desc = "When triggered, the nanites scan the host to determine their species and output a signal depending on the conditions set in the settings." - id = "sensor_species_nanites" - program_type = /datum/nanite_program/sensor/species - category = list("Sensor Nanites") - -////////////////////NANITE PROTOCOLS////////////////////////////////////// -//Note about the category name: The UI cuts the last 8 characters from the category name to remove the " Nanites" in the other categories -//Because of this, Protocols was getting cut down to "P", so i had to add some padding -/datum/design/nanites/kickstart - name = "Kickstart Protocol" - desc = "Replication Protocol: the nanites focus on early growth, heavily boosting replication rate for a few minutes after the initial implantation." - id = "kickstart_nanites" - program_type = /datum/nanite_program/protocol/kickstart - category = list("Protocols_Nanites") - -/datum/design/nanites/factory - name = "Factory Protocol" - desc = "Replication Protocol: the nanites build a factory matrix within the host, gradually increasing replication speed over time. The factory decays if the protocol is not active." - id = "factory_nanites" - program_type = /datum/nanite_program/protocol/factory - category = list("Protocols_Nanites") - -/datum/design/nanites/pyramid - name = "Pyramid Protocol" - desc = "Replication Protocol: the nanites implement an alternate cooperative replication protocol that is more efficient as long as the saturation level is above 80%." - id = "pyramid_nanites" - program_type = /datum/nanite_program/protocol/pyramid - category = list("Protocols_Nanites") - -/datum/design/nanites/offline - name = "Eclipse Protocol" - desc = "Replication Protocol: while the host is asleep or otherwise unconcious, the nanites exploit the reduced interference to replicate more quickly." - id = "offline_nanites" - program_type = /datum/nanite_program/protocol/offline - category = list("Protocols_Nanites") - -/datum/design/nanites/hive - name = "Hive Protocol" - desc = "Storage Protocol: the nanites use a more efficient grid arrangment for volume storage, increasing maximum volume in a host." - id = "hive_nanites" - program_type = /datum/nanite_program/protocol/hive - category = list("Protocols_Nanites") - -/datum/design/nanites/zip - name = "Zip Protocol" - desc = "Storage Protocol: the nanites are disassembled and compacted when unused, greatly increasing the maximum volume while in a host. However, the process slows down the replication rate slightly." - id = "zip_nanites" - program_type = /datum/nanite_program/protocol/zip - category = list("Protocols_Nanites") - -/datum/design/nanites/free_range - name = "Free-range Protocol" - desc = "Storage Protocol: the nanites discard their default storage protocols in favour of a cheaper and more organic approach. Reduces maximum volume, but increases the replication rate." - id = "free_range_nanites" - program_type = /datum/nanite_program/protocol/free_range - category = list("Protocols_Nanites") - -/datum/design/nanites/unsafe_storage - name = "S.L.O. Protocol" - desc = "Storage Protocol: 'S.L.O.P.', or Storage Level Override Protocol, completely disables the safety measures normally present in nanites,\ - allowing them to reach much higher saturation levels, but at the risk of causing internal damage to the host." - id = "unsafe_storage_nanites" - program_type = /datum/nanite_program/protocol/unsafe_storage - category = list("Protocols_Nanites") diff --git a/massmeta/code/datums/nanits/nanite_mood.dm b/massmeta/code/datums/nanits/nanite_mood.dm deleted file mode 100644 index 33581fbbe5c1c..0000000000000 --- a/massmeta/code/datums/nanits/nanite_mood.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/mood_event/nanite_happiness - description = "+++++++HAPPINESS ENHANCEMENT+++++++" - mood_change = 7 - -/datum/mood_event/nanite_happiness/add_effects(message) - description = "+++++++[message]+++++++" - -/datum/mood_event/nanite_sadness - description = "+++++++HAPPINESS SUPPRESSION+++++++" - mood_change = -7 - -/datum/mood_event/nanite_sadness/add_effects(message) - description = "+++++++[message]+++++++" diff --git a/massmeta/code/datums/nanits/nanites_circuitboard.dm b/massmeta/code/datums/nanits/nanites_circuitboard.dm deleted file mode 100644 index 1e05c222a06e5..0000000000000 --- a/massmeta/code/datums/nanits/nanites_circuitboard.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/item/circuitboard/computer/nanite_chamber_control - name = "Nanite Chamber Control (Computer Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/computer/nanite_chamber_control - -/obj/item/circuitboard/computer/nanite_cloud_controller - name = "Nanite Cloud Control (Computer Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/computer/nanite_cloud_controller - -/obj/item/circuitboard/machine/nanite_chamber - name = "Nanite Chamber (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/nanite_chamber - req_components = list( - /datum/stock_part/scanning_module = 2, - /datum/stock_part/micro_laser = 2, - /datum/stock_part/servo = 1) - -/obj/item/circuitboard/machine/nanite_program_hub - name = "Nanite Program Hub (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/nanite_program_hub - req_components = list( - /datum/stock_part/matter_bin = 1, - /datum/stock_part/servo = 1) - -/obj/item/circuitboard/machine/nanite_programmer - name = "Nanite Programmer (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/nanite_programmer - req_components = list( - /datum/stock_part/servo = 2, - /datum/stock_part/micro_laser = 2, - /datum/stock_part/scanning_module = 1) - -/obj/item/circuitboard/machine/public_nanite_chamber - name = "Public Nanite Chamber (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/public_nanite_chamber - var/cloud_id = 1 - req_components = list( - /datum/stock_part/micro_laser = 2, - /datum/stock_part/servo = 1) - -/obj/item/circuitboard/machine/public_nanite_chamber/multitool_act(mob/living/user) - . = ..() - var/new_cloud = input("Set the public nanite chamber's Cloud ID (1-100).", "Cloud ID", cloud_id) as num|null - if(!new_cloud || (loc != user)) - to_chat(user, span_warning("You must hold the circuitboard to change its Cloud ID!")) - return - cloud_id = clamp(round(new_cloud, 1), 1, 100) - -/obj/item/circuitboard/machine/public_nanite_chamber/examine(mob/user) - . = ..() - . += "Cloud ID is currently set to [cloud_id]." diff --git a/massmeta/code/datums/nanits/nanites_component.dm b/massmeta/code/datums/nanits/nanites_component.dm deleted file mode 100644 index a2d5a962e2495..0000000000000 --- a/massmeta/code/datums/nanits/nanites_component.dm +++ /dev/null @@ -1,479 +0,0 @@ -#define HARMONIC_REGEN_BOOST 0.1 - -/datum/component/nanites - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS - - var/mob/living/host_mob - var/nanite_volume = 100 //amount of nanites in the system, used as fuel for nanite programs - var/max_nanites = 500 //maximum amount of nanites in the system - var/regen_rate = 0.5 //nanites generated per second - var/safety_threshold = 50 //how low nanites will get before they stop processing/triggering - var/cloud_id = 0 //0 if not connected to the cloud, 1-100 to set a determined cloud backup to draw from - var/cloud_active = TRUE //if false, won't sync to the cloud - var/next_sync = 0 - var/list/datum/nanite_program/programs = list() - var/max_programs = NANITE_PROGRAM_LIMIT - - var/list/datum/nanite_program/protocol/protocols = list() ///Separate list of protocol programs, to avoid looping through the whole programs list when cheking for conflicts - var/start_time = 0 ///Timestamp to when the nanites were first inserted in the host - var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans - var/diagnostics = FALSE //if TRUE, displays program list when scanned by nanite scanners - -/datum/component/nanites/Initialize(amount = 100, cloud = 0) - if(!isliving(parent) && !istype(parent, /datum/nanite_cloud_backup)) - return COMPONENT_INCOMPATIBLE - - nanite_volume = amount - cloud_id = cloud - - //Nanites without hosts are non-interactive through normal means - if(isliving(parent)) - host_mob = parent - - if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) //Shouldn't happen, but this avoids HUD runtimes in case a silicon gets them somehow. - return COMPONENT_INCOMPATIBLE - - start_time = world.time - - host_mob.hud_set_nanite_indicator() - START_PROCESSING(SSnanites, src) - - if(cloud_id && cloud_active) - cloud_sync() - -/datum/component/nanites/RegisterWithParent() - RegisterSignal(parent, COMSIG_HAS_NANITES, PROC_REF(confirm_nanites)) - RegisterSignal(parent, COMSIG_NANITE_IS_STEALTHY, PROC_REF(check_stealth)) - RegisterSignal(parent, COMSIG_NANITE_DELETE, PROC_REF(delete_nanites)) - RegisterSignal(parent, COMSIG_NANITE_UI_DATA, PROC_REF(nanite_ui_data)) - RegisterSignal(parent, COMSIG_NANITE_GET_PROGRAMS, PROC_REF(get_programs)) - RegisterSignal(parent, COMSIG_NANITE_SET_VOLUME, PROC_REF(set_volume)) - RegisterSignal(parent, COMSIG_NANITE_ADJUST_VOLUME, PROC_REF(adjust_nanites)) - RegisterSignal(parent, COMSIG_NANITE_SET_MAX_VOLUME, PROC_REF(set_max_volume)) - RegisterSignal(parent, COMSIG_NANITE_SET_CLOUD, PROC_REF(set_cloud)) - RegisterSignal(parent, COMSIG_NANITE_SET_CLOUD_SYNC, PROC_REF(set_cloud_sync)) - RegisterSignal(parent, COMSIG_NANITE_SET_SAFETY, PROC_REF(set_safety)) - RegisterSignal(parent, COMSIG_NANITE_SET_REGEN, PROC_REF(set_regen)) - RegisterSignal(parent, COMSIG_NANITE_ADD_PROGRAM, PROC_REF(add_program)) - RegisterSignal(parent, COMSIG_NANITE_SCAN, PROC_REF(nanite_scan)) - RegisterSignal(parent, COMSIG_NANITE_SYNC, PROC_REF(sync)) - - if(isliving(parent)) - RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp)) - RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_death)) - RegisterSignal(parent, COMSIG_MOB_TRIED_ACCESS, PROC_REF(check_access)) - RegisterSignal(parent, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_shock)) - RegisterSignal(parent, COMSIG_LIVING_MINOR_SHOCK, PROC_REF(on_minor_shock)) - RegisterSignal(parent, COMSIG_SPECIES_GAIN, PROC_REF(check_viable_biotype)) - RegisterSignal(parent, COMSIG_NANITE_SIGNAL, PROC_REF(receive_signal)) - RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, PROC_REF(receive_comm_signal)) - -/datum/component/nanites/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_HAS_NANITES, - COMSIG_NANITE_IS_STEALTHY, - COMSIG_NANITE_DELETE, - COMSIG_NANITE_UI_DATA, - COMSIG_NANITE_GET_PROGRAMS, - COMSIG_NANITE_SET_VOLUME, - COMSIG_NANITE_ADJUST_VOLUME, - COMSIG_NANITE_SET_MAX_VOLUME, - COMSIG_NANITE_SET_CLOUD, - COMSIG_NANITE_SET_CLOUD_SYNC, - COMSIG_NANITE_SET_SAFETY, - COMSIG_NANITE_SET_REGEN, - COMSIG_NANITE_ADD_PROGRAM, - COMSIG_NANITE_SCAN, - COMSIG_NANITE_SYNC, - COMSIG_ATOM_EMP_ACT, - COMSIG_LIVING_DEATH, - COMSIG_MOB_TRIED_ACCESS, - COMSIG_LIVING_ELECTROCUTE_ACT, - COMSIG_LIVING_MINOR_SHOCK, - COMSIG_MOVABLE_HEAR, - COMSIG_SPECIES_GAIN, - COMSIG_NANITE_SIGNAL, - COMSIG_NANITE_COMM_SIGNAL)) - -/datum/component/nanites/Destroy() - STOP_PROCESSING(SSnanites, src) - QDEL_LIST(programs) - if(host_mob) - set_nanite_bar(TRUE) - host_mob.hud_set_nanite_indicator() - host_mob = null - return ..() - -/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, amount, cloud) - if(new_nanites) - adjust_nanites(null, new_nanites.nanite_volume) - else - adjust_nanites(null, amount) //just add to the nanite volume - -/datum/component/nanites/process(seconds_per_tick) - if(!HAS_TRAIT(host_mob, TRAIT_STASIS)) - adjust_nanites(null, (regen_rate + (SSresearch.science_tech.researched_nodes["nanite_harmonic"] ? HARMONIC_REGEN_BOOST : 0)) * seconds_per_tick) - add_research() - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_process() - if(cloud_id && cloud_active && world.time > next_sync) - cloud_sync() - next_sync = world.time + NANITE_SYNC_DELAY - set_nanite_bar() - -///Deletes nanites! -/datum/component/nanites/proc/delete_nanites() - SIGNAL_HANDLER - - qdel(src) - -///Syncs the nanite component to another, making it so programs are the same with the same programming (except activation status) -/datum/component/nanites/proc/sync(datum/signal_source, datum/component/nanites/source, full_overwrite = TRUE, copy_activation = FALSE) - SIGNAL_HANDLER - - var/list/programs_to_remove = programs.Copy() - var/list/programs_to_add = source.programs.Copy() - for(var/X in programs) - var/datum/nanite_program/NP = X - for(var/Y in programs_to_add) - var/datum/nanite_program/SNP = Y - if(NP.type == SNP.type) - programs_to_remove -= NP - programs_to_add -= SNP - SNP.copy_programming(NP, copy_activation) - break - if(full_overwrite) - for(var/X in programs_to_remove) - qdel(X) - for(var/X in programs_to_add) - var/datum/nanite_program/SNP = X - add_program(null, SNP.copy()) - -///Syncs the nanites to their assigned cloud copy, if it is available. If it is not, there is a small chance of a software error instead. -/datum/component/nanites/proc/cloud_sync() - if(cloud_id) - var/datum/nanite_cloud_backup/backup = SSnanites.get_cloud_backup(cloud_id) - if(backup) - var/datum/component/nanites/cloud_copy = backup.nanites - if(cloud_copy) - sync(null, cloud_copy) - return - //Without cloud syncing nanites can accumulate errors and/or defects - if(prob(8) && programs.len) - var/datum/nanite_program/NP = pick(programs) - NP.software_error() - -///Adds a nanite program, replacing existing unique programs of the same type. A source program can be specified to copy its programming onto the new one. -/datum/component/nanites/proc/add_program(datum/source, datum/nanite_program/new_program, datum/nanite_program/source_program) - SIGNAL_HANDLER - - for(var/X in programs) - var/datum/nanite_program/NP = X - if(NP.unique && NP.type == new_program.type) - qdel(NP) - if(programs.len >= max_programs) - return COMPONENT_PROGRAM_NOT_INSTALLED - if(source_program) - source_program.copy_programming(new_program) - programs += new_program - new_program.on_add(src) - return COMPONENT_PROGRAM_INSTALLED - -/datum/component/nanites/proc/consume_nanites(amount, force = FALSE) - if(!force && safety_threshold && (nanite_volume - amount < safety_threshold)) - return FALSE - adjust_nanites(null, -amount) - return (nanite_volume > 0) - -///Modifies the current nanite volume, then checks if the nanites are depleted or exceeding the maximum amount -/datum/component/nanites/proc/adjust_nanites(datum/source, amount) - SIGNAL_HANDLER - - nanite_volume += amount - if(nanite_volume > max_nanites) - reject_excess_nanites() - if(nanite_volume <= 0) //oops we ran out - qdel(src) - -/** - * Handles how nanites leave the host's body if they find out that they're currently exceeding the maximum supported amount - * - * IC explanation: - * Normally nanites simply discard excess volume by slowing replication or 'sweating' it out in imperceptible amounts, - * but if there is a large excess volume, likely due to a programming change that leaves them unable to support their current volume, - * the nanites attempt to leave the host as fast as necessary to prevent nanite poisoning. This can range from minor oozing to nanites - * rapidly bursting out from every possible pathway, causing temporary inconvenience to the host. - */ -/datum/component/nanites/proc/reject_excess_nanites() - var/excess = nanite_volume - max_nanites - nanite_volume = max_nanites - - switch(excess) - if(0 to NANITE_EXCESS_MINOR) //Minor excess amount, the extra nanites are quietly expelled without visible effects - return - if((NANITE_EXCESS_MINOR + 0.1) to NANITE_EXCESS_VOMIT) //Enough nanites getting rejected at once to be visible to the naked eye - host_mob.visible_message(span_warning("A grainy grey slurry starts oozing out of [host_mob]."), span_warning("A grainy grey slurry starts oozing out of your skin."), null, 4); - if((NANITE_EXCESS_VOMIT + 0.1) to NANITE_EXCESS_BURST) //Nanites getting rejected in massive amounts, but still enough to make a semi-orderly exit through vomit - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - host_mob.visible_message(span_warning("[host_mob] vomits a grainy grey slurry!"), span_warning("You suddenly vomit a metallic-tasting grainy grey slurry!"), null); - C.vomit(0, FALSE, TRUE, FLOOR(excess / 100, 1), FALSE, VOMIT_NANITE, FALSE, TRUE, 0) - else - host_mob.visible_message(span_warning("A metallic grey slurry bursts out of [host_mob]'s skin!"), span_userdanger("A metallic grey slurry violently bursts out of your skin!"), null); - if(isturf(host_mob.drop_location())) - var/turf/T = host_mob.drop_location() - T.add_vomit_floor(host_mob, VOMIT_NANITE, 0) - if((NANITE_EXCESS_BURST + 0.1) to INFINITY) //Way too many nanites, they just leave through the closest exit before they harm/poison the host - host_mob.visible_message(span_warning("A torrent of metallic grey slurry violently bursts out of [host_mob]'s face and floods out of [host_mob.p_their()] skin!"), - span_userdanger("A torrent of metallic grey slurry violently bursts out of your eyes, ears, and mouth, and floods out of your skin!")); - - host_mob.adjust_temp_blindness(1.5 SECONDS) //nanites coming out of your eyes - host_mob.Paralyze(120) - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/obj/item/organ/internal/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS) - if(ears) - ears.adjustEarDamage(0, 30) //nanites coming out of your ears - C.vomit(0, FALSE, TRUE, 2, FALSE, VOMIT_NANITE, FALSE, TRUE, 0) //nanites coming out of your mouth - - //nanites everywhere - if(isturf(host_mob.drop_location())) - var/turf/T = host_mob.drop_location() - T.add_vomit_floor(host_mob, VOMIT_NANITE, 0) - for(var/turf/adjacent_turf in oview(host_mob, 1)) - if(adjacent_turf.density || !adjacent_turf.Adjacent(T)) - continue - adjacent_turf.add_vomit_floor(host_mob, VOMIT_NANITE, 0) - -///Updates the nanite volume bar visible in diagnostic HUDs -/datum/component/nanites/proc/set_nanite_bar(remove = FALSE) - var/image/holder = host_mob.hud_list[DIAG_NANITE_FULL_HUD] - var/icon/I = icon(host_mob.icon, host_mob.icon_state, host_mob.dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = null - if(remove || stealth) - return //bye icon - var/nanite_percent = (nanite_volume / max_nanites) * 100 - nanite_percent = clamp(CEILING(nanite_percent, 10), 10, 100) - holder.icon_state = "nanites[nanite_percent]" - -/datum/component/nanites/proc/on_emp(datum/source, severity) - SIGNAL_HANDLER - - nanite_volume *= (rand(60, 90) * 0.01) //Lose 10-40% of nanites - adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume - if(prob(40/severity)) - cloud_id = 0 - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_emp(severity) - - -/datum/component/nanites/proc/on_shock(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) - SIGNAL_HANDLER - - if(flags & SHOCK_ILLUSION || shock_damage < 1) - return - - if(!HAS_TRAIT_NOT_FROM(host_mob, TRAIT_SHOCKIMMUNE, "nanites"))//Another shock protection must protect nanites too, but nanites protect only host - nanite_volume *= (rand(45, 80) * 0.01) //Lose 20-55% of nanites - adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_shock(shock_damage) - -/datum/component/nanites/proc/on_minor_shock(datum/source) - SIGNAL_HANDLER - - adjust_nanites(null, -(rand(5, 15))) //Lose 5-15 flat nanite volume - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_minor_shock() - -/datum/component/nanites/proc/check_stealth(datum/source) - SIGNAL_HANDLER - - return stealth - -/datum/component/nanites/proc/on_death(datum/source, gibbed) - SIGNAL_HANDLER - - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_death(gibbed) - -/datum/component/nanites/proc/receive_signal(datum/source, code, source = "an unidentified source") - SIGNAL_HANDLER - - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.receive_signal(code, source) - -/datum/component/nanites/proc/receive_comm_signal(datum/source, comm_code, comm_message, comm_source = "an unidentified source") - SIGNAL_HANDLER - - for(var/X in programs) - if(istype(X, /datum/nanite_program/comm)) - var/datum/nanite_program/comm/NP = X - NP.receive_comm_signal(comm_code, comm_message, comm_source) - -/datum/component/nanites/proc/check_viable_biotype() - SIGNAL_HANDLER - - if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) - qdel(src) //bodytype no longer sustains nanites - -/datum/component/nanites/proc/check_access(datum/source, obj/O) - SIGNAL_HANDLER - - for(var/datum/nanite_program/access/access_program in programs) - if(access_program.activated) - return O.check_access_list(access_program.access) - else - return FALSE - return FALSE - -/datum/component/nanites/proc/set_volume(datum/source, amount) - SIGNAL_HANDLER - - nanite_volume = clamp(amount, 0, max_nanites) - -/datum/component/nanites/proc/set_max_volume(datum/source, amount) - SIGNAL_HANDLER - - max_nanites = max(1, amount) - -/datum/component/nanites/proc/set_cloud(datum/source, amount) - SIGNAL_HANDLER - - cloud_id = clamp(amount, 0, 100) - -/datum/component/nanites/proc/set_cloud_sync(datum/source, method) - SIGNAL_HANDLER - - switch(method) - if(NANITE_CLOUD_TOGGLE) - cloud_active = !cloud_active - if(NANITE_CLOUD_DISABLE) - cloud_active = FALSE - if(NANITE_CLOUD_ENABLE) - cloud_active = TRUE - -/datum/component/nanites/proc/set_safety(datum/source, amount) - SIGNAL_HANDLER - - safety_threshold = clamp(amount, 0, max_nanites) - -/datum/component/nanites/proc/set_regen(datum/source, amount) - SIGNAL_HANDLER - - regen_rate = amount - -/datum/component/nanites/proc/confirm_nanites() - SIGNAL_HANDLER - - return TRUE //yup i exist - -/datum/component/nanites/proc/get_programs(datum/source, list/nanite_programs) - SIGNAL_HANDLER - - nanite_programs |= programs - -/datum/component/nanites/proc/add_research() - var/research_value = NANITE_BASE_RESEARCH - if(!ishuman(host_mob)) - if(!iscarbon(host_mob)) - research_value *= 0.4 - else - research_value *= 0.8 - if(!host_mob.client) - research_value *= 0.5 - if(host_mob.stat == DEAD) - research_value *= 0.75 - SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_NANITES = research_value)) - -/datum/component/nanites/proc/nanite_scan(datum/source, mob/user, full_scan) - SIGNAL_HANDLER - - if(!full_scan) - if(!stealth) - to_chat(user, span_notice("Nanites Detected")) - to_chat(user, span_notice("Saturation: [nanite_volume]/[max_nanites]")) - return TRUE - else - to_chat(user, span_info("NANITES DETECTED")) - to_chat(user, span_info("================")) - to_chat(user, span_info("Saturation: [nanite_volume]/[max_nanites]")) - to_chat(user, span_info("Safety Threshold: [safety_threshold]")) - to_chat(user, span_info("Cloud ID: [cloud_id ? cloud_id : "None"]")) - to_chat(user, span_info("Cloud Sync: [cloud_active ? "Active" : "Disabled"]")) - to_chat(user, span_info("================")) - to_chat(user, span_info("Program List:")) - if(!diagnostics) - to_chat(user, span_alert("Nanite debugging disabled.")) - else - for(var/X in programs) - var/datum/nanite_program/NP = X - to_chat(user, span_info("[NP.name] | [NP.activated ? "Active" : "Inactive"]")) - return TRUE - -/datum/component/nanites/proc/nanite_ui_data(datum/source, list/data, scan_level) - SIGNAL_HANDLER - - data["has_nanites"] = TRUE - data["nanite_volume"] = nanite_volume - data["regen_rate"] = regen_rate + (SSresearch.science_tech.researched_nodes["nanite_harmonic"] ? HARMONIC_REGEN_BOOST : 0) - data["safety_threshold"] = safety_threshold - data["cloud_id"] = cloud_id - data["cloud_active"] = cloud_active - var/list/mob_programs = list() - var/id = 1 - for(var/X in programs) - var/datum/nanite_program/P = X - var/list/mob_program = list() - mob_program["name"] = P.name - mob_program["desc"] = P.desc - mob_program["id"] = id - - if(scan_level >= 2) - mob_program["activated"] = P.activated - mob_program["use_rate"] = P.use_rate - mob_program["can_trigger"] = P.can_trigger - mob_program["trigger_cost"] = P.trigger_cost - mob_program["trigger_cooldown"] = P.trigger_cooldown / 10 - - if(scan_level >= 3) - mob_program["timer_restart"] = P.timer_restart / 10 - mob_program["timer_shutdown"] = P.timer_shutdown / 10 - mob_program["timer_trigger"] = P.timer_trigger / 10 - mob_program["timer_trigger_delay"] = P.timer_trigger_delay / 10 - var/list/extra_settings = P.get_extra_settings_frontend() - mob_program["extra_settings"] = extra_settings - if(LAZYLEN(extra_settings)) - mob_program["has_extra_settings"] = TRUE - else - mob_program["has_extra_settings"] = FALSE - - if(scan_level >= 4) - mob_program["activation_code"] = P.activation_code - mob_program["deactivation_code"] = P.deactivation_code - mob_program["kill_code"] = P.kill_code - mob_program["trigger_code"] = P.trigger_code - var/list/rules = list() - var/rule_id = 1 - for(var/Z in P.rules) - var/datum/nanite_rule/nanite_rule = Z - var/list/rule = list() - rule["display"] = nanite_rule.display() - rule["program_id"] = id - rule["id"] = rule_id - rules += list(rule) - rule_id++ - mob_program["rules"] = rules - if(LAZYLEN(rules)) - mob_program["has_rules"] = TRUE - id++ - mob_programs += list(mob_program) - data["mob_programs"] = mob_programs - -#undef HARMONIC_REGEN_BOOST diff --git a/massmeta/code/datums/nanits/nanites_hud.dm b/massmeta/code/datums/nanits/nanites_hud.dm deleted file mode 100644 index 3e16ae76ed6f6..0000000000000 --- a/massmeta/code/datums/nanits/nanites_hud.dm +++ /dev/null @@ -1,7 +0,0 @@ -/mob/living/proc/hud_set_nanite_indicator() - var/image/holder = hud_list[NANITE_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = null - if(HAS_TRAIT(src, TRAIT_NANITE_MONITORING)) - holder.icon_state = "nanite_ping" diff --git a/massmeta/code/datums/nanits/nanites_processing.dm b/massmeta/code/datums/nanits/nanites_processing.dm deleted file mode 100644 index b8109a904afe1..0000000000000 --- a/massmeta/code/datums/nanits/nanites_processing.dm +++ /dev/null @@ -1,22 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(nanites) - name = "Nanites" - flags = SS_BACKGROUND|SS_POST_FIRE_TIMING|SS_NO_INIT - wait = 1 SECONDS - - var/list/datum/nanite_cloud_backup/cloud_backups = list() - var/list/mob/living/nanite_monitored_mobs = list() - var/list/datum/nanite_program/relay/nanite_relays = list() - var/neural_network_count = 0 - -/datum/controller/subsystem/processing/nanites/proc/check_hardware(datum/nanite_cloud_backup/backup) - if(QDELETED(backup.storage) || (backup.storage.machine_stat & (NOPOWER|BROKEN))) - return FALSE - return TRUE - -/datum/controller/subsystem/processing/nanites/proc/get_cloud_backup(cloud_id, force = FALSE) - for(var/I in cloud_backups) - var/datum/nanite_cloud_backup/backup = I - if(!force && !check_hardware(backup)) - return - if(backup.cloud_id == cloud_id) - return backup diff --git a/massmeta/code/datums/nanits/nanites_research/extra_settings/_extra_settings.dm b/massmeta/code/datums/nanits/nanites_research/extra_settings/_extra_settings.dm deleted file mode 100644 index b3bef77eb404b..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/extra_settings/_extra_settings.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/nanite_extra_setting - var/setting_type - var/value - -/datum/nanite_extra_setting/proc/get_value() - return value - -/datum/nanite_extra_setting/proc/set_value(value) - src.value = value - -/datum/nanite_extra_setting/proc/get_copy() - return - -//I made the choice to send the name as part of the parameter instead of storing it directly on -//this datum as a way of avoiding duplication of data between the containing assoc list -//and this datum. -//Also make sure to double wrap the list when implementing this as -//+= is interpreted as a combine on lists, so the outer list gets unwrapped -/datum/nanite_extra_setting/proc/get_frontend_list(name) - return diff --git a/massmeta/code/datums/nanits/nanites_research/extra_settings/boolean.dm b/massmeta/code/datums/nanits/nanites_research/extra_settings/boolean.dm deleted file mode 100644 index 7d66eb988ead1..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/extra_settings/boolean.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/nanite_extra_setting/boolean - setting_type = NESTYPE_BOOLEAN - var/true_text - var/false_text - -/datum/nanite_extra_setting/boolean/New(initial, true_text, false_text) - value = initial - src.true_text = true_text - src.false_text = false_text - -/datum/nanite_extra_setting/boolean/set_value(value) - if(isnull(value)) - src.value = !src.value - return - . = ..() - -/datum/nanite_extra_setting/boolean/get_copy() - return new /datum/nanite_extra_setting/boolean(value, true_text, false_text) - -/datum/nanite_extra_setting/boolean/get_frontend_list(name) - return list(list( - "name" = name, - "type" = setting_type, - "value" = value, - "true_text" = true_text, - "false_text" = false_text - )) diff --git a/massmeta/code/datums/nanits/nanites_research/extra_settings/number.dm b/massmeta/code/datums/nanits/nanites_research/extra_settings/number.dm deleted file mode 100644 index 75489635f55f3..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/extra_settings/number.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/nanite_extra_setting/number - setting_type = NESTYPE_NUMBER - var/min - var/max - var/unit = "" - -/datum/nanite_extra_setting/number/New(initial, min, max, unit) - value = initial - src.min = min - src.max = max - if(unit) - src.unit = unit - -/datum/nanite_extra_setting/number/set_value(value) - if(istext(value)) - value = text2num(value) - if(!value || !isnum(value)) - return - src.value = clamp(value, min, max) - -/datum/nanite_extra_setting/number/get_copy() - return new /datum/nanite_extra_setting/number(value, min, max, unit) - -/datum/nanite_extra_setting/number/get_frontend_list(name) - return list(list( - "name" = name, - "type" = setting_type, - "value" = value, - "min" = min, - "max" = max, - "unit" = unit - )) diff --git a/massmeta/code/datums/nanits/nanites_research/extra_settings/text.dm b/massmeta/code/datums/nanits/nanites_research/extra_settings/text.dm deleted file mode 100644 index d3cad27bcf51d..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/extra_settings/text.dm +++ /dev/null @@ -1,21 +0,0 @@ -/datum/nanite_extra_setting/text - setting_type = NESTYPE_TEXT - -/datum/nanite_extra_setting/text/New(initial) - value = initial - -/datum/nanite_extra_setting/text/set_value(value) - src.value = trim(value) - -/datum/nanite_extra_setting/text/get_copy() - return new /datum/nanite_extra_setting/text(value) - -/datum/nanite_extra_setting/text/get_value() - return html_encode(value) - -/datum/nanite_extra_setting/text/get_frontend_list(name) - return list(list( - "name" = name, - "type" = setting_type, - "value" = value - )) diff --git a/massmeta/code/datums/nanits/nanites_research/extra_settings/type.dm b/massmeta/code/datums/nanits/nanites_research/extra_settings/type.dm deleted file mode 100644 index 2085ba510c42a..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/extra_settings/type.dm +++ /dev/null @@ -1,18 +0,0 @@ -/datum/nanite_extra_setting/type - setting_type = NESTYPE_TYPE - var/list/types - -/datum/nanite_extra_setting/type/New(initial, types) - value = initial - src.types = types - -/datum/nanite_extra_setting/type/get_copy() - return new /datum/nanite_extra_setting/type(value, types) - -/datum/nanite_extra_setting/type/get_frontend_list(name) - return list(list( - "name" = name, - "type" = setting_type, - "value" = value, - "types" = types - )) diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_chamber.dm b/massmeta/code/datums/nanits/nanites_research/nanite_chamber.dm deleted file mode 100644 index 015fb44c86ea9..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_chamber.dm +++ /dev/null @@ -1,214 +0,0 @@ -/obj/machinery/nanite_chamber - name = "nanite chamber" - desc = "A device that can scan, reprogram, and inject nanites." - circuit = /obj/item/circuitboard/machine/nanite_chamber - icon = 'massmeta/icons/obj/machines/nanites.dmi' - icon_state = "nanite_chamber" - base_icon_state = "nanite_chamber" - layer = ABOVE_WINDOW_LAYER - use_power = IDLE_POWER_USE - anchored = TRUE - density = TRUE - obj_flags = BLOCKS_CONSTRUCTION // Becomes undense when the door is open - idle_power_usage = 50 - active_power_usage = 300 - - var/locked = FALSE - var/breakout_time = 1200 - var/scan_level - var/busy = FALSE - var/busy_icon_state - var/busy_message - var/message_cooldown = 0 - -/obj/machinery/nanite_chamber/Initialize() - . = ..() - occupant_typecache = GLOB.typecache_living - -/obj/machinery/nanite_chamber/RefreshParts() - . = ..() - scan_level = 0 - for(var/datum/stock_part/scanning_module/P in component_parts) - scan_level += P.tier - -/obj/machinery/nanite_chamber/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Scanning module has been upgraded to level [scan_level].") - -/obj/machinery/nanite_chamber/proc/set_busy(status, message, working_icon) - busy = status - busy_message = message - busy_icon_state = working_icon - update_appearance() - -/obj/machinery/nanite_chamber/proc/set_safety(threshold) - if(!occupant) - return - SEND_SIGNAL(occupant, COMSIG_NANITE_SET_SAFETY, threshold) - -/obj/machinery/nanite_chamber/proc/set_cloud(cloud_id) - if(!occupant) - return - SEND_SIGNAL(occupant, COMSIG_NANITE_SET_CLOUD, cloud_id) - -/obj/machinery/nanite_chamber/proc/inject_nanites() - if(machine_stat & (NOPOWER|BROKEN)) - return - if((machine_stat & MAINT) || panel_open) - return - if(!occupant || busy) - return - - var/locked_state = locked - locked = TRUE - - //TODO OMINOUS MACHINE SOUNDS - set_busy(TRUE, "Initializing injection protocol...", "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Analyzing host bio-structure...", "[initial(icon_state)]_active"),20) - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Priming nanites...", "[initial(icon_state)]_active"),40) - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Injecting...", "[initial(icon_state)]_active"),70) - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Activating nanites...", "[initial(icon_state)]_falling"),110) - addtimer(CALLBACK(src, PROC_REF(complete_injection), locked_state),130) - -/obj/machinery/nanite_chamber/proc/complete_injection(locked_state) - //TODO MACHINE DING - locked = locked_state - set_busy(FALSE) - if(!occupant) - return - occupant.AddComponent(/datum/component/nanites, 100) - -/obj/machinery/nanite_chamber/proc/remove_nanites(datum/nanite_program/NP) - if(machine_stat & (NOPOWER|BROKEN)) - return - if((machine_stat & MAINT) || panel_open) - return - if(!occupant || busy) - return - - var/locked_state = locked - locked = TRUE - - //TODO OMINOUS MACHINE SOUNDS - set_busy(TRUE, "Initializing cleanup protocol...", "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Analyzing host bio-structure...", "[initial(icon_state)]_active"),20) - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Pinging nanites...", "[initial(icon_state)]_active"),40) - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Initiating graceful self-destruct sequence...", "[initial(icon_state)]_active"),70) - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "Removing debris...", "[initial(icon_state)]_falling"),110) - addtimer(CALLBACK(src, PROC_REF(complete_removal), locked_state),130) - -/obj/machinery/nanite_chamber/proc/complete_removal(locked_state) - //TODO MACHINE DING - locked = locked_state - set_busy(FALSE) - if(!occupant) - return - SEND_SIGNAL(occupant, COMSIG_NANITE_DELETE) - -/obj/machinery/nanite_chamber/update_icon_state() - //running and someone in there - if(occupant) - icon_state = busy ? busy_icon_state : "[base_icon_state]_occupied" - return ..() - //running - icon_state = "[base_icon_state][state_open ? "_open" : null]" - return ..() - -/obj/machinery/nanite_chamber/update_overlays() - . = ..() - - if((machine_stat & MAINT) || panel_open) - . += "maint" - return - - if(machine_stat & (NOPOWER|BROKEN)) - return - - if(busy || locked) - . += "red" - if(locked) - . += "bolted" - return - - . += "green" - -/obj/machinery/nanite_chamber/proc/toggle_open(mob/user) - if(panel_open) - to_chat(user, span_notice("Close the maintenance panel first.")) - return - - if(state_open) - close_machine() - return - - else if(locked) - to_chat(user, span_notice("The bolts are locked down, securing the door shut.")) - return - - open_machine() - -/obj/machinery/nanite_chamber/container_resist_act(mob/living/user) - if(!locked) - open_machine() - return - if(busy) - return - user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT - user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \ - span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \ - span_hear("You hear a metallic creaking from [src].")) - if(do_after(user,(breakout_time), target = src)) - if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked || busy) - return - locked = FALSE - user.visible_message(span_warning("[user] successfully broke out of [src]!"), \ - span_notice("You successfully break out of [src]!")) - open_machine() - -/obj/machinery/nanite_chamber/close_machine(mob/living/carbon/user, density_to_set) - if(!state_open) - return FALSE - - ..(user) - return TRUE - -/obj/machinery/nanite_chamber/open_machine(drop, density_to_set) - if(state_open) - return FALSE - - ..() - - return TRUE - -/obj/machinery/nanite_chamber/relaymove(mob/living/user, direction) - if(user.stat || locked) - if(message_cooldown <= world.time) - message_cooldown = world.time + 50 - to_chat(user, span_warning("[src]'s door won't budge!")) - return - open_machine() - -/obj/machinery/nanite_chamber/attackby(obj/item/I, mob/user, params) - if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I))//sent icon_state is irrelevant... - update_appearance()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed - return - - if(default_pry_open(I)) - return - - if(default_deconstruction_crowbar(I)) - return - - return ..() - -/obj/machinery/nanite_chamber/interact(mob/user) - toggle_open(user) - -/obj/machinery/nanite_chamber/MouseDrop_T(mob/target, mob/user) - if(!Adjacent(target) || !user.Adjacent(target) || !iscarbon(target)) - return - if(close_machine(target)) - log_combat(user, target, "inserted", null, "into [src].") - add_fingerprint(user) diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_chamber_computer.dm b/massmeta/code/datums/nanits/nanites_research/nanite_chamber_computer.dm deleted file mode 100644 index 4cc820fe2dd97..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_chamber_computer.dm +++ /dev/null @@ -1,109 +0,0 @@ -/obj/machinery/computer/nanite_chamber_control - name = "nanite chamber control console" - desc = "Controls a connected nanite chamber. Can inoculate nanites, load programs, and analyze existing nanite swarms." - var/obj/machinery/nanite_chamber/chamber - icon_screen = "nanite_chamber_control" - circuit = /obj/item/circuitboard/computer/nanite_chamber_control - -/obj/machinery/computer/nanite_chamber_control/Initialize() - . = ..() - find_chamber() - -/obj/machinery/computer/nanite_chamber_control/proc/find_chamber() - for(var/direction in GLOB.cardinals) - var/C = locate(/obj/machinery/nanite_chamber, get_step(src, direction)) - if(C) - var/obj/machinery/nanite_chamber/NC = C - set_connected_chamber(NC) - -/obj/machinery/computer/nanite_chamber_control/interact() - if(!chamber) - find_chamber() - ..() - -/obj/machinery/computer/nanite_chamber_control/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteChamberControl", name) - ui.open() - -/obj/machinery/computer/nanite_chamber_control/ui_data() - var/list/data = list() - - if(!chamber) - data["status_msg"] = "No chamber detected." - return data - - if(!chamber.occupant) - data["status_msg"] = "No occupant detected." - return data - - var/mob/living/L = chamber.occupant - - if(!(L.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) - data["status_msg"] = "Occupant not compatible with nanites." - return data - - if(chamber.busy) - data["status_msg"] = chamber.busy_message - return data - - data["status_msg"] = null - data["scan_level"] = chamber.scan_level - data["locked"] = chamber.locked - data["occupant_name"] = chamber.occupant.name - - SEND_SIGNAL(L, COMSIG_NANITE_UI_DATA, data, chamber.scan_level) - - return data - -/obj/machinery/computer/nanite_chamber_control/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("toggle_lock") - chamber.locked = !chamber.locked - chamber.update_appearance() - . = TRUE - if("set_safety") - var/threshold = text2num(params["value"]) - if(!isnull(threshold)) - chamber.set_safety(clamp(round(threshold, 1),0,500)) - playsound(src, "terminal_type", 25, FALSE) - chamber.occupant.investigate_log("'s nanites' safety threshold was set to [threshold] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - . = TRUE - if("set_cloud") - var/cloud_id = text2num(params["value"]) - if(!isnull(cloud_id)) - chamber.set_cloud(clamp(round(cloud_id, 1),0,100)) - playsound(src, "terminal_type", 25, FALSE) - chamber.occupant.investigate_log("'s nanites' cloud id was set to [cloud_id] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - . = TRUE - if("connect_chamber") - find_chamber() - . = TRUE - if("remove_nanites") - playsound(src, 'sound/machines/terminal_prompt.ogg', 25, FALSE) - chamber.remove_nanites() - log_combat(usr, chamber.occupant, "cleared nanites from", null, "via [src]") - chamber.occupant.investigate_log("'s nanites were cleared by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - . = TRUE - if("nanite_injection") - playsound(src, 'sound/machines/terminal_prompt.ogg', 25, FALSE) - chamber.inject_nanites() - log_combat(usr, chamber.occupant, "injected", null, "with nanites via [src]") - chamber.occupant.investigate_log("was injected with nanites by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - . = TRUE - -/obj/machinery/computer/nanite_chamber_control/proc/set_connected_chamber(new_chamber) - if(chamber) - UnregisterSignal(chamber, COMSIG_QDELETING) - chamber = new_chamber - if(chamber) - RegisterSignal(chamber, COMSIG_QDELETING, PROC_REF(react_to_chamber_del)) - -/obj/machinery/computer/nanite_chamber_control/proc/react_to_chamber_del(datum/source) - SIGNAL_HANDLER - set_connected_chamber(null) diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_cloud_controller.dm b/massmeta/code/datums/nanits/nanites_research/nanite_cloud_controller.dm deleted file mode 100644 index f997fc6db474c..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_cloud_controller.dm +++ /dev/null @@ -1,263 +0,0 @@ -/obj/machinery/computer/nanite_cloud_controller - name = "nanite cloud controller" - desc = "Stores and controls nanite cloud backups." - icon = 'massmeta/icons/obj/machines/nanites.dmi' - icon_state = "nanite_cloud_controller" - circuit = /obj/item/circuitboard/computer/nanite_cloud_controller - icon_keyboard = null - icon_screen = null - - var/obj/item/disk/nanite_program/disk - var/list/datum/nanite_cloud_backup/cloud_backups = list() - var/current_view = 0 //0 is the main menu, any other number is the page of the backup with that ID - var/new_backup_id = 1 - -/obj/machinery/computer/nanite_cloud_controller/Destroy() - QDEL_LIST(cloud_backups) //rip backups - eject() - return ..() - -/obj/machinery/computer/nanite_cloud_controller/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/nanite_program)) - var/obj/item/disk/nanite_program/N = I - if (user.transferItemToLoc(N, src)) - to_chat(user, span_notice("You insert [N] into [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - if(disk) - eject(user) - disk = N - else - ..() - - -/obj/machinery/computer/nanite_cloud_controller/AltClick(mob/user) - if(disk && !issilicon(user)) - to_chat(user, span_notice("You take out [disk] from [src].")) - eject(user) - return - -/obj/machinery/computer/nanite_cloud_controller/proc/eject(mob/living/user) - if(!disk) - return - if(!istype(user) || !Adjacent(user) ||!user.put_in_active_hand(disk)) - disk.forceMove(drop_location()) - disk = null - -/obj/machinery/computer/nanite_cloud_controller/proc/get_backup(cloud_id) - for(var/I in cloud_backups) - var/datum/nanite_cloud_backup/backup = I - if(backup.cloud_id == cloud_id) - return backup - -/obj/machinery/computer/nanite_cloud_controller/proc/generate_backup(cloud_id, mob/user) - if(SSnanites.get_cloud_backup(cloud_id, TRUE)) - to_chat(user, span_warning("Cloud ID already registered.")) - return - - var/datum/nanite_cloud_backup/backup = new(src) - var/datum/component/nanites/cloud_copy = backup.AddComponent(/datum/component/nanites) - backup.cloud_id = cloud_id - backup.nanites = cloud_copy - investigate_log("[key_name(user)] created a new nanite cloud backup with id #[cloud_id]", INVESTIGATE_NANITES) - -/obj/machinery/computer/nanite_cloud_controller/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteCloudControl", name) - ui.open() - -/obj/machinery/computer/nanite_cloud_controller/ui_data() - var/list/data = list() - - if(disk) - data["has_disk"] = TRUE - var/list/disk_data = list() - var/datum/nanite_program/P = disk.program - if(P) - data["has_program"] = TRUE - disk_data["name"] = P.name - disk_data["desc"] = P.desc - disk_data["use_rate"] = P.use_rate - disk_data["can_trigger"] = P.can_trigger - disk_data["trigger_cost"] = P.trigger_cost - disk_data["trigger_cooldown"] = P.trigger_cooldown / 10 - - disk_data["activated"] = P.activated - disk_data["activation_code"] = P.activation_code - disk_data["deactivation_code"] = P.deactivation_code - disk_data["kill_code"] = P.kill_code - disk_data["trigger_code"] = P.trigger_code - disk_data["timer_restart"] = P.timer_restart / 10 - disk_data["timer_shutdown"] = P.timer_shutdown / 10 - disk_data["timer_trigger"] = P.timer_trigger / 10 - disk_data["timer_trigger_delay"] = P.timer_trigger_delay / 10 - - var/list/extra_settings = P.get_extra_settings_frontend() - disk_data["extra_settings"] = extra_settings - if(LAZYLEN(extra_settings)) - disk_data["has_extra_settings"] = TRUE - if(istype(P, /datum/nanite_program/sensor)) - var/datum/nanite_program/sensor/sensor = P - if(sensor.can_rule) - disk_data["can_rule"] = TRUE - data["disk"] = disk_data - else - data["has_disk"] = FALSE - - data["new_backup_id"] = new_backup_id - - data["current_view"] = current_view - if(current_view) - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - var/datum/component/nanites/nanites = backup.nanites - data["cloud_backup"] = TRUE - var/list/cloud_programs = list() - var/id = 1 - for(var/datum/nanite_program/P in nanites.programs) - var/list/cloud_program = list() - cloud_program["name"] = P.name - cloud_program["desc"] = P.desc - cloud_program["id"] = id - cloud_program["use_rate"] = P.use_rate - cloud_program["can_trigger"] = P.can_trigger - cloud_program["trigger_cost"] = P.trigger_cost - cloud_program["trigger_cooldown"] = P.trigger_cooldown / 10 - cloud_program["activated"] = P.activated - cloud_program["timer_restart"] = P.timer_restart / 10 - cloud_program["timer_shutdown"] = P.timer_shutdown / 10 - cloud_program["timer_trigger"] = P.timer_trigger / 10 - cloud_program["timer_trigger_delay"] = P.timer_trigger_delay / 10 - - cloud_program["activation_code"] = P.activation_code - cloud_program["deactivation_code"] = P.deactivation_code - cloud_program["kill_code"] = P.kill_code - cloud_program["trigger_code"] = P.trigger_code - var/list/rules = list() - var/rule_id = 1 - for(var/X in P.rules) - var/datum/nanite_rule/nanite_rule = X - var/list/rule = list() - rule["display"] = nanite_rule.display() - rule["program_id"] = id - rule["id"] = rule_id - rules += list(rule) - rule_id++ - cloud_program["rules"] = rules - if(LAZYLEN(rules)) - cloud_program["has_rules"] = TRUE - cloud_program["all_rules_required"] = P.all_rules_required - - var/list/extra_settings = P.get_extra_settings_frontend() - cloud_program["extra_settings"] = extra_settings - if(LAZYLEN(extra_settings)) - cloud_program["has_extra_settings"] = TRUE - id++ - cloud_programs += list(cloud_program) - data["cloud_programs"] = cloud_programs - else - var/list/backup_list = list() - for(var/X in cloud_backups) - var/datum/nanite_cloud_backup/backup = X - var/list/cloud_backup = list() - cloud_backup["cloud_id"] = backup.cloud_id - backup_list += list(cloud_backup) - data["cloud_backups"] = backup_list - return data - -/obj/machinery/computer/nanite_cloud_controller/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("eject") - eject(usr) - . = TRUE - if("set_view") - current_view = text2num(params["view"]) - . = TRUE - if("update_new_backup_value") - var/backup_value = text2num(params["value"]) - new_backup_id = backup_value - if("create_backup") - var/cloud_id = new_backup_id - if(!isnull(cloud_id)) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - cloud_id = clamp(round(cloud_id, 1),1,100) - generate_backup(cloud_id, usr) - . = TRUE - if("delete_backup") - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - qdel(backup) - investigate_log("[key_name(usr)] deleted the nanite cloud backup #[current_view]", INVESTIGATE_NANITES) - . = TRUE - if("upload_program") - if(disk?.program) - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - var/datum/component/nanites/nanites = backup.nanites - nanites.add_program(null, disk.program.copy()) - investigate_log("[key_name(usr)] uploaded program [disk.program.name] to cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE - if("remove_program") - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - var/datum/component/nanites/nanites = backup.nanites - var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] - investigate_log("[key_name(usr)] deleted program [P.name] from cloud #[current_view]", INVESTIGATE_NANITES) - qdel(P) - . = TRUE - if("add_rule") - if(disk && disk.program && istype(disk.program, /datum/nanite_program/sensor)) - var/datum/nanite_program/sensor/rule_template = disk.program - if(!rule_template.can_rule) - return - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) - var/datum/component/nanites/nanites = backup.nanites - var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] - var/datum/nanite_rule/rule = rule_template.make_rule(P) - - investigate_log("[key_name(usr)] added rule [rule.display()] to program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE - if("remove_rule") - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) - var/datum/component/nanites/nanites = backup.nanites - var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] - var/datum/nanite_rule/rule = P.rules[text2num(params["rule_id"])] - rule.remove() - - investigate_log("[key_name(usr)] removed rule [rule.display()] from program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE - if("toggle_rule_logic") - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - var/datum/component/nanites/nanites = backup.nanites - var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] - P.all_rules_required = !P.all_rules_required - investigate_log("[key_name(usr)] edited rule logic for program [P.name] into [P.all_rules_required ? "All" : "Any"] in cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE - -/datum/nanite_cloud_backup - var/cloud_id = 0 - var/datum/component/nanites/nanites - var/obj/machinery/computer/nanite_cloud_controller/storage - -/datum/nanite_cloud_backup/New(obj/machinery/computer/nanite_cloud_controller/_storage) - storage = _storage - storage.cloud_backups += src - SSnanites.cloud_backups += src - -/datum/nanite_cloud_backup/Destroy() - storage.cloud_backups -= src - SSnanites.cloud_backups -= src - return ..() diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_injector.dm b/massmeta/code/datums/nanits/nanites_research/nanite_injector.dm deleted file mode 100644 index e94a145940600..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_injector.dm +++ /dev/null @@ -1,9 +0,0 @@ -/obj/item/nanite_injector - name = "nanite injector (FOR TESTING)" - desc = "Injects nanites into the user." - w_class = WEIGHT_CLASS_SMALL - icon = 'massmeta/icons/obj/machines/nanites.dmi' - icon_state = "nanite_remote" - -/obj/item/nanite_injector/attack_self(mob/user) - user.AddComponent(/datum/component/nanites, 150) diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_program_hub.dm b/massmeta/code/datums/nanits/nanites_research/nanite_program_hub.dm deleted file mode 100644 index 95172f93fc348..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_program_hub.dm +++ /dev/null @@ -1,142 +0,0 @@ -/obj/machinery/nanite_program_hub - name = "nanite program hub" - desc = "Compiles nanite programs from the techweb servers and downloads them into disks." - icon = 'massmeta/icons/obj/machines/nanites.dmi' - icon_state = "nanite_program_hub" - use_power = IDLE_POWER_USE - anchored = TRUE - density = TRUE - circuit = /obj/item/circuitboard/machine/nanite_program_hub - - var/obj/item/disk/nanite_program/disk - var/datum/techweb/linked_techweb - var/current_category = "Main" - var/detail_view = TRUE - var/categories = list( - list(name = "Utility Nanites"), - list(name = "Medical Nanites"), - list(name = "Sensor Nanites"), - list(name = "Augmentation Nanites"), - list(name = "Suppression Nanites"), - list(name = "Weaponized Nanites"), - list(name = "Protocols"), - ) - -/obj/machinery/nanite_program_hub/Initialize() - . = ..() - linked_techweb = SSresearch.science_tech - -/obj/machinery/nanite_program_hub/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/nanite_program)) - var/obj/item/disk/nanite_program/N = I - if(user.transferItemToLoc(N, src)) - to_chat(user, span_notice("You insert [N] into [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - if(disk) - eject(user) - disk = N - else - ..() - -/obj/machinery/nanite_program_hub/screwdriver_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - - return default_deconstruction_screwdriver(user, "nanite_program_hub_t", "nanite_program_hub", I) - -/obj/machinery/nanite_program_hub/crowbar_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - - return default_deconstruction_crowbar(I) - -/obj/machinery/nanite_program_hub/proc/eject(mob/living/user) - if(!disk) - return - if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(disk)) - disk.forceMove(drop_location()) - disk = null - -/obj/machinery/nanite_program_hub/AltClick(mob/user) - if(disk && !issilicon(user)) - to_chat(user, span_notice("You take out [disk] from [src].")) - eject(user) - return - -/obj/machinery/nanite_program_hub/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteProgramHub", name) - ui.open() - -/obj/machinery/nanite_program_hub/ui_data() - var/list/data = list() - if(disk) - data["has_disk"] = TRUE - var/list/disk_data = list() - var/datum/nanite_program/P = disk.program - if(P) - data["has_program"] = TRUE - disk_data["name"] = P.name - disk_data["desc"] = P.desc - data["disk"] = disk_data - else - data["has_disk"] = FALSE - - data["detail_view"] = detail_view - - return data - -/obj/machinery/nanite_program_hub/ui_static_data(mob/user) - var/list/data = list() - data["programs"] = list() - for(var/i in linked_techweb.researched_designs) - var/datum/design/nanites/D = SSresearch.techweb_design_by_id(i) - if(!istype(D)) - continue - var/cat_name = D.category[1] //just put them in the first category fuck it - if(isnull(data["programs"][cat_name])) - data["programs"][cat_name] = list() - var/list/program_design = list() - program_design["id"] = D.id - program_design["name"] = D.name - program_design["desc"] = D.desc - data["programs"][cat_name] += list(program_design) - - if(!length(data["programs"])) - data["programs"] = null - - return data - -/obj/machinery/nanite_program_hub/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("eject") - eject(usr) - . = TRUE - if("download") - if(!disk) - return - var/datum/design/nanites/downloaded = linked_techweb.isDesignResearchedID(params["program_id"]) //check if it's a valid design - if(!istype(downloaded)) - return - if(disk.program) - qdel(disk.program) - disk.program = new downloaded.program_type - disk.name = "[initial(disk.name)] \[[disk.program.name]\]" - playsound(src, 'sound/machines/terminal_prompt.ogg', 25, FALSE) - . = TRUE - if("refresh") - update_static_data(usr) - . = TRUE - if("toggle_details") - detail_view = !detail_view - . = TRUE - if("clear") - if(disk?.program) - qdel(disk.program) - disk.program = null - disk.name = initial(disk.name) - . = TRUE diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programmer.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programmer.dm deleted file mode 100644 index fc5d3ac5ddd4f..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programmer.dm +++ /dev/null @@ -1,168 +0,0 @@ -/obj/machinery/nanite_programmer - name = "nanite programmer" - desc = "A device that can edit nanite program disks to adjust their functionality." - var/obj/item/disk/nanite_program/disk - var/datum/nanite_program/program - icon = 'massmeta/icons/obj/machines/nanites.dmi' - icon_state = "nanite_programmer" - use_power = IDLE_POWER_USE - anchored = TRUE - density = TRUE - circuit = /obj/item/circuitboard/machine/nanite_programmer - -/obj/machinery/nanite_programmer/Initialize() - . = ..() - become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) - -/obj/machinery/nanite_programmer/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/nanite_program)) - var/obj/item/disk/nanite_program/N = I - if(user.transferItemToLoc(N, src)) - to_chat(user, span_notice("You insert [N] into [src]")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - if(disk) - eject(user) - disk = N - program = N.program - else - ..() - -/obj/machinery/nanite_programmer/screwdriver_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - - return default_deconstruction_screwdriver(user, "nanite_programmer_t", "nanite_programmer", I) - -/obj/machinery/nanite_programmer/crowbar_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - - return default_deconstruction_crowbar(I) - -/obj/machinery/nanite_programmer/proc/eject(mob/living/user) - if(!disk) - return - if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(disk)) - disk.forceMove(drop_location()) - disk = null - program = null - -/obj/machinery/nanite_programmer/AltClick(mob/user) - if(disk && !issilicon(user)) - to_chat(user, span_notice("You take out [disk] from [src].")) - eject(user) - return - -/obj/machinery/nanite_programmer/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteProgrammer", name) - ui.open() - -/obj/machinery/nanite_programmer/ui_data() - var/list/data = list() - data["has_disk"] = istype(disk) - data["has_program"] = istype(program) - if(program) - data["name"] = program.name - data["desc"] = program.desc - data["use_rate"] = program.use_rate - data["can_trigger"] = program.can_trigger - data["trigger_cost"] = program.trigger_cost - data["trigger_cooldown"] = program.trigger_cooldown / 10 - - data["activated"] = program.activated - data["activation_code"] = program.activation_code - data["deactivation_code"] = program.deactivation_code - data["kill_code"] = program.kill_code - data["trigger_code"] = program.trigger_code - data["timer_restart"] = program.timer_restart / 10 - data["timer_shutdown"] = program.timer_shutdown / 10 - data["timer_trigger"] = program.timer_trigger / 10 - data["timer_trigger_delay"] = program.timer_trigger_delay / 10 - - var/list/extra_settings = program.get_extra_settings_frontend() - data["extra_settings"] = extra_settings - if(LAZYLEN(extra_settings)) - data["has_extra_settings"] = TRUE - - return data - -/obj/machinery/nanite_programmer/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("eject") - eject(usr) - . = TRUE - if("toggle_active") - playsound(src, "terminal_type", 25, FALSE) - program.activated = !program.activated //we don't use the activation procs since we aren't in a mob - investigate_log("[key_name(usr)] edited [program.name]'s initial activation status into [program.activated ? "Activated" : "Deactivated"]", INVESTIGATE_NANITES) - . = TRUE - if("set_code") - var/new_code = text2num(params["code"]) - playsound(src, "terminal_type", 25, FALSE) - var/target_code = params["target_code"] - switch(target_code) - if("activation") - program.activation_code = clamp(round(new_code, 1),0,9999) - investigate_log("[key_name(usr)] edited [program.name]'s activation code into [program.activation_code]", INVESTIGATE_NANITES) - if("deactivation") - program.deactivation_code = clamp(round(new_code, 1),0,9999) - investigate_log("[key_name(usr)] edited [program.name]'s deactivation code into [program.deactivation_code]", INVESTIGATE_NANITES) - if("kill") - program.kill_code = clamp(round(new_code, 1),0,9999) - investigate_log("[key_name(usr)] edited [program.name]'s kill code into [program.kill_code]", INVESTIGATE_NANITES) - if("trigger") - program.trigger_code = clamp(round(new_code, 1),0,9999) - investigate_log("[key_name(usr)] edited [program.name]'s trigger code into [program.trigger_code]", INVESTIGATE_NANITES) - . = TRUE - if("set_extra_setting") - program.set_extra_setting(params["target_setting"], params["value"]) - investigate_log("[key_name(usr)] edited [program.name]'s extra setting '[params["target_setting"]]' into [params["value"]]", INVESTIGATE_NANITES) - playsound(src, "terminal_type", 25, FALSE) - . = TRUE - if("set_restart_timer") - var/timer = text2num(params["delay"]) - if(!isnull(timer)) - playsound(src, "terminal_type", 25, FALSE) - timer = clamp(round(timer, 1), 0, 3600) - timer *= 10 //convert to deciseconds - program.timer_restart = timer - investigate_log("[key_name(usr)] edited [program.name]'s restart timer into [timer/10] s", INVESTIGATE_NANITES) - . = TRUE - if("set_shutdown_timer") - var/timer = text2num(params["delay"]) - if(!isnull(timer)) - playsound(src, "terminal_type", 25, FALSE) - timer = clamp(round(timer, 1), 0, 3600) - timer *= 10 //convert to deciseconds - program.timer_shutdown = timer - investigate_log("[key_name(usr)] edited [program.name]'s shutdown timer into [timer/10] s", INVESTIGATE_NANITES) - . = TRUE - if("set_trigger_timer") - var/timer = text2num(params["delay"]) - if(!isnull(timer)) - playsound(src, "terminal_type", 25, FALSE) - timer = clamp(round(timer, 1), 0, 3600) - timer *= 10 //convert to deciseconds - program.timer_trigger = timer - investigate_log("[key_name(usr)] edited [program.name]'s trigger timer into [timer/10] s", INVESTIGATE_NANITES) - . = TRUE - if("set_timer_trigger_delay") - var/timer = text2num(params["delay"]) - if(!isnull(timer)) - playsound(src, "terminal_type", 25, FALSE) - timer = clamp(round(timer, 1), 0, 3600) - timer *= 10 //convert to deciseconds - program.timer_trigger_delay = timer - investigate_log("[key_name(usr)] edited [program.name]'s trigger delay timer into [timer/10] s", INVESTIGATE_NANITES) - . = TRUE - -/obj/machinery/nanite_programmer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) - . = ..() - var/static/regex/when = regex("(?:^\\W*when|when\\W*$)", "i") //starts or ends with when - if(findtext(raw_message, when) && !istype(speaker, /obj/machinery/nanite_programmer)) - say("When you code it!!") diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programs.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programs.dm deleted file mode 100644 index 0b26b4e79f037..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programs.dm +++ /dev/null @@ -1,335 +0,0 @@ -/datum/nanite_program - var/name = "Generic Nanite Program" - var/desc = "Warn a coder if you can read this." - - var/datum/component/nanites/nanites - var/mob/living/host_mob - - var/use_rate = 0 //Amount of nanites used while active - var/unique = TRUE //If there can be more than one copy in the same nanites - var/can_trigger = FALSE //If the nanites have a trigger function (used for the programming UI) - var/trigger_cost = 0 //Amount of nanites required to trigger - var/trigger_cooldown = 50 //Deciseconds required between each trigger activation - var/next_trigger = 0 //World time required for the next trigger activation - - var/program_flags = NONE - var/passive_enabled = FALSE //If the nanites have an on/off-style effect, it's tracked by this var - - var/list/rogue_types = list(/datum/nanite_program/glitch) //What this can turn into if it glitches. - //As a rule of thumb, these should be: - //A: simpler - //B: negative - //C: affecting the same parts of the body, roughly - //B is mostly a consequence of A: it's always going to be simpler to cause damage than to repair it, so a software bug will not randomly make the flesh eating - //nanites learn how to repair cells. - //Given enough glitch-swapping you'll end up with stuff like necrotic or toxic nanites, which are very simple as they just try to eat what's in front of them - //or just lie around polluting the blood - - - //The following vars are customizable - var/activated = TRUE //If FALSE, the program won't process, disables passive effects, can't trigger and doesn't consume nanites - - var/timer_restart = 0 //When deactivated, the program will wait X deciseconds before self-reactivating. Also works if the program begins deactivated. - var/timer_shutdown = 0 //When activated, the program will wait X deciseconds before self-deactivating. Also works if the program begins activated. - var/timer_trigger = 0 //[Trigger only] While active, the program will attempt to trigger once every x deciseconds. - var/timer_trigger_delay = 0 //[Trigger only] While active, the program will delay trigger signals by X deciseconds. - - //Indicates the next world.time tick where these timers will act - var/timer_restart_next = 0 - var/timer_shutdown_next = 0 - var/timer_trigger_next = 0 - var/timer_trigger_delay_next = 0 - - //Signal codes, these handle remote input to the nanites. If set to 0 they'll ignore signals. - var/activation_code = 0 //Code that activates the program [1-9999] - var/deactivation_code = 0 //Code that deactivates the program [1-9999] - var/kill_code = 0 //Code that permanently removes the program [1-9999] - var/trigger_code = 0 //Code that triggers the program (if available) [1-9999] - - //Extra settings - ///Don't ever override this or I will come to your house and stand menacingly behind a bush - VAR_FINAL/list/extra_settings = list() - - //Rules - //Rules that automatically manage if the program's active without requiring separate sensor programs - var/list/datum/nanite_rule/rules = list() - var/all_rules_required = TRUE //Whether all rules are required for positive condition or any of specified - -/datum/nanite_program/New() - . = ..() - register_extra_settings() - -/datum/nanite_program/Destroy() - extra_settings = null - if(host_mob) - if(activated) - deactivate() - if(passive_enabled) - disable_passive_effect() - on_mob_remove() - if(nanites) - nanites.programs -= src - for(var/datum/nanite_rule/rule as anything in rules) - rule.remove() - rules.Cut() - return ..() - -/datum/nanite_program/proc/copy() - var/datum/nanite_program/new_program = new type() - copy_programming(new_program, TRUE) - - return new_program - -/datum/nanite_program/proc/copy_programming(datum/nanite_program/target, copy_activated = TRUE) - if(copy_activated) - target.activated = activated - target.timer_restart = timer_restart - target.timer_shutdown = timer_shutdown - target.timer_trigger = timer_trigger - target.timer_trigger_delay = timer_trigger_delay - target.activation_code = activation_code - target.deactivation_code = deactivation_code - target.kill_code = kill_code - target.trigger_code = trigger_code - - target.rules = list() - for(var/R in rules) - var/datum/nanite_rule/rule = R - rule.copy_to(target) - target.all_rules_required = all_rules_required - - if(istype(target,src)) - copy_extra_settings_to(target) - -/// Register extra settings by overriding this. -/// -/// `extra_settings[name] = new typepath()` for each extra setting. -/datum/nanite_program/proc/register_extra_settings() - return - -///You can override this if you need to have special behavior after setting certain settings. -/datum/nanite_program/proc/set_extra_setting(setting, value) - var/datum/nanite_extra_setting/ES = extra_settings[setting] - return ES.set_value(value) - -///You probably shouldn't be overriding this one, but I'm not a cop. -/datum/nanite_program/proc/get_extra_setting_value(setting) - var/datum/nanite_extra_setting/ES = extra_settings[setting] - return ES.get_value() - -///Used for getting information about the extra settings to the frontend -/datum/nanite_program/proc/get_extra_settings_frontend() - var/list/out = list() - for(var/name in extra_settings) - var/datum/nanite_extra_setting/ES = extra_settings[name] - out += ES.get_frontend_list(name) - return out - -///Copy of the list instead of direct reference for obvious reasons -/datum/nanite_program/proc/copy_extra_settings_to(datum/nanite_program/target) - var/list/copy_list = list() - for(var/ns_name in extra_settings) - var/datum/nanite_extra_setting/extra_setting = extra_settings[ns_name] - copy_list[ns_name] = extra_setting.get_copy() - target.extra_settings = copy_list - -/datum/nanite_program/proc/on_add(datum/component/nanites/_nanites) - nanites = _nanites - if(nanites.host_mob) - on_mob_add() - -/datum/nanite_program/proc/on_mob_add() - host_mob = nanites.host_mob - if(activated) //apply activation effects depending on initial status; starts the restart and shutdown timers - activate() - else - deactivate() - -/datum/nanite_program/proc/on_mob_remove() - return - -/datum/nanite_program/proc/toggle() - if(!activated) - activate() - else - deactivate() - -/datum/nanite_program/proc/activate() - activated = TRUE - if(timer_shutdown) - timer_shutdown_next = world.time + timer_shutdown - -/datum/nanite_program/proc/deactivate() - if(passive_enabled) - disable_passive_effect() - activated = FALSE - if(timer_restart) - timer_restart_next = world.time + timer_restart - -/datum/nanite_program/proc/on_process() - if(!activated) - if(timer_restart_next && world.time > timer_restart_next) - activate() - timer_restart_next = 0 - return - - if(timer_shutdown_next && world.time > timer_shutdown_next) - deactivate() - timer_shutdown_next = 0 - return - - if(timer_trigger && world.time > timer_trigger_next) - trigger() - timer_trigger_next = world.time + timer_trigger - return - - if(timer_trigger_delay_next && world.time > timer_trigger_delay_next) - trigger(delayed = TRUE) - timer_trigger_delay_next = 0 - return - - if(check_conditions() && consume_nanites(use_rate)) - if(!passive_enabled) - enable_passive_effect() - active_effect() - else - if(passive_enabled) - disable_passive_effect() - -//If false, disables active, passive effects, and triggers without consuming nanites -//Can be used to avoid consuming nanites for nothing -/datum/nanite_program/proc/check_conditions() - if (!LAZYLEN(rules)) - return TRUE - for(var/R in rules) - var/datum/nanite_rule/rule = R - if(!all_rules_required && rule.check_rule()) - return TRUE - if(all_rules_required && !rule.check_rule()) - return FALSE - return all_rules_required ? TRUE : FALSE - -//Constantly procs as long as the program is active -/datum/nanite_program/proc/active_effect() - return - -//Procs once when the program activates -/datum/nanite_program/proc/enable_passive_effect() - passive_enabled = TRUE - -//Procs once when the program deactivates -/datum/nanite_program/proc/disable_passive_effect() - passive_enabled = FALSE - -//Checks conditions then fires the nanite trigger effect -/datum/nanite_program/proc/trigger(delayed = FALSE, comm_message) - if(!can_trigger) - return - if(!activated) - return - if(timer_trigger_delay && !delayed) - timer_trigger_delay_next = world.time + timer_trigger_delay - return - if(world.time < next_trigger) - return - if(!check_conditions()) - return - if(!consume_nanites(trigger_cost)) - return - next_trigger = world.time + trigger_cooldown - on_trigger(comm_message) - -//Nanite trigger effect, requires can_trigger to be used -/datum/nanite_program/proc/on_trigger(comm_message) - return - -/datum/nanite_program/proc/consume_nanites(amount, force = FALSE) - return nanites.consume_nanites(amount, force) - -/datum/nanite_program/proc/on_emp(severity) - if(program_flags & NANITE_EMP_IMMUNE) - return - if(prob(80 / severity)) - host_mob.investigate_log("[src] nanite program received a software error due to emp.", INVESTIGATE_NANITES) - software_error() - -/datum/nanite_program/proc/on_shock(shock_damage) - if(!(program_flags & NANITE_SHOCK_IMMUNE)) - if(prob(10)) - host_mob.investigate_log("[src] nanite program received a software error due to shock.", INVESTIGATE_NANITES) - software_error() - else if(prob(33)) - host_mob.investigate_log("[src] nanite program was deleted due to shock.", INVESTIGATE_NANITES) - qdel(src) - -/datum/nanite_program/proc/on_minor_shock() - if(!(program_flags & NANITE_SHOCK_IMMUNE)) - if(prob(10)) - host_mob.investigate_log("[src] nanite program received a software error due to minor shock.", INVESTIGATE_NANITES) - software_error() - -/datum/nanite_program/proc/on_death() - return - -/datum/nanite_program/proc/software_error(type) - if(!type) - type = rand(1,5) - switch(type) - if(1) - host_mob.investigate_log("[src] nanite program was deleted by software error.", INVESTIGATE_NANITES) - qdel(src) //kill switch - return - if(2) //deprogram codes - host_mob.investigate_log("[src] nanite program was de-programmed by software error.", INVESTIGATE_NANITES) - activation_code = 0 - deactivation_code = 0 - kill_code = 0 - trigger_code = 0 - if(3) - host_mob.investigate_log("[src] nanite program was toggled by software error.", INVESTIGATE_NANITES) - toggle() //enable/disable - if(4) - if(can_trigger) - host_mob.investigate_log("[src] nanite program was triggered by software error.", INVESTIGATE_NANITES) - trigger() - if(5) //Program is scrambled and does something different - var/rogue_type = pick(rogue_types) - var/datum/nanite_program/rogue = new rogue_type - host_mob.investigate_log("[src] nanite program was converted into [rogue.name] by software error.", INVESTIGATE_NANITES) - nanites.add_program(null, rogue, src) - qdel(src) - -/datum/nanite_program/proc/receive_signal(code, source) - if(activation_code && code == activation_code && !activated) - activate() - host_mob.investigate_log("'s [name] nanite program was activated by [source] with code [code].", INVESTIGATE_NANITES) - else if(deactivation_code && code == deactivation_code && activated) - deactivate() - host_mob.investigate_log("'s [name] nanite program was deactivated by [source] with code [code].", INVESTIGATE_NANITES) - if(can_trigger && trigger_code && code == trigger_code) - trigger() - host_mob.investigate_log("'s [name] nanite program was triggered by [source] with code [code].", INVESTIGATE_NANITES) - if(kill_code && code == kill_code) - host_mob.investigate_log("'s [name] nanite program was deleted by [source] with code [code].", INVESTIGATE_NANITES) - qdel(src) - -///A nanite program containing a behaviour protocol. Only one protocol of each class can be active at once. -/datum/nanite_program/protocol - name = "Nanite Protocol" - var/protocol_class = NONE - -/datum/nanite_program/protocol/check_conditions() - . = ..() - for(var/protocol in nanites.protocols) - var/datum/nanite_program/protocol/P = protocol - if(P != src && P.activated && P.protocol_class == protocol_class) - return FALSE - -/datum/nanite_program/protocol/on_add(datum/component/nanites/_nanites) - ..() - nanites.protocols += src - -/datum/nanite_program/protocol/Destroy() - if(nanites) - nanites.protocols -= src - return ..() diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programs/buffing.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programs/buffing.dm deleted file mode 100644 index 2e4e9476106b8..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programs/buffing.dm +++ /dev/null @@ -1,115 +0,0 @@ -//Programs that buff the host in generally passive ways. - -/datum/nanite_program/nervous - name = "Nerve Support" - desc = "The nanites act as a secondary nervous system, reducing the amount of time the host is stunned." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/nervous/enable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.stun_mod *= 0.5 - -/datum/nanite_program/nervous/disable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.stun_mod *= 2 - -/datum/nanite_program/hardening - name = "Dermal Hardening" - desc = "The nanites form a mesh under the host's skin, protecting them from melee and bullet impacts." - use_rate = 0.5 - rogue_types = list(/datum/nanite_program/skin_decay) - -//TODO on_hit effect that turns skin grey for a moment - -/datum/armor/dermal_hardening - melee = 25 - bullet = 20 - -/datum/nanite_program/hardening/enable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.set_armor(H.get_armor().add_other_armor(/datum/armor/dermal_hardening)) - -/datum/nanite_program/hardening/disable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.set_armor(H.get_armor().subtract_other_armor(/datum/armor/dermal_hardening)) - -/datum/armor/refractive - laser = 25 - energy = 20 - -/datum/nanite_program/refractive - name = "Dermal Refractive Surface" - desc = "The nanites form a membrane above the host's skin, reducing the effect of laser and energy impacts." - use_rate = 0.50 - rogue_types = list(/datum/nanite_program/skin_decay) - -/datum/nanite_program/refractive/enable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.set_armor(H.get_armor().add_other_armor(/datum/armor/refractive)) - -/datum/nanite_program/refractive/disable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.set_armor(H.get_armor().subtract_other_armor(/datum/armor/refractive)) - -/datum/nanite_program/coagulating - name = "Vein Repressurization" - desc = "The nanites re-route circulating blood away from open wounds, dramatically reducing bleeding rate." - use_rate = 0.20 - rogue_types = list(/datum/nanite_program/suffocating) - -/datum/nanite_program/coagulating/enable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.bleed_mod *= 0.5 - -/datum/nanite_program/coagulating/disable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.bleed_mod *= 2 - -/datum/nanite_program/conductive - name = "Electric Conduction" - desc = "The nanites act as a grounding rod for electric shocks, protecting the host. Shocks can still damage the nanites themselves." - use_rate = 0.20 - program_flags = NANITE_SHOCK_IMMUNE - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/conductive/enable_passive_effect() - . = ..() - ADD_TRAIT(host_mob, TRAIT_SHOCKIMMUNE, NANITES_TRAIT) - -/datum/nanite_program/conductive/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_SHOCKIMMUNE, NANITES_TRAIT) - -/datum/nanite_program/mindshield - name = "Mental Barrier" - desc = "The nanites form a protective membrane around the host's brain, shielding them from abnormal influences while they're active." - use_rate = 0.40 - rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) - -/datum/nanite_program/mindshield/enable_passive_effect() - . = ..() - if(!host_mob.mind.has_antag_datum(/datum/antagonist/rev, TRUE)) //won't work if on a rev, to avoid having implanted revs. - ADD_TRAIT(host_mob, TRAIT_MINDSHIELD, NANITES_TRAIT) - host_mob.sec_hud_set_implants() - -/datum/nanite_program/mindshield/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_MINDSHIELD, NANITES_TRAIT) - host_mob.sec_hud_set_implants() diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programs/healing.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programs/healing.dm deleted file mode 100644 index 305b3145cd26c..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programs/healing.dm +++ /dev/null @@ -1,230 +0,0 @@ -//Programs that heal the host in some way. - -/datum/nanite_program/regenerative - name = "Accelerated Regeneration" - desc = "The nanites boost the host's natural regeneration, increasing their healing speed. Will not consume nanites while the host is unharmed." - use_rate = 0.5 - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/regenerative/check_conditions() - if(!host_mob.getBruteLoss() && !host_mob.getFireLoss()) - return FALSE - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE,TRUE, required_bodytype = BODYTYPE_ORGANIC) - if(!parts.len) - return FALSE - return ..() - -/datum/nanite_program/regenerative/active_effect() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE,TRUE, required_bodytype = BODYTYPE_ORGANIC) - if(!parts.len) - return - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(0.5/parts.len, 0.5/parts.len, null, BODYTYPE_ORGANIC)) - host_mob.update_damage_overlays() - else - host_mob.adjustBruteLoss(-0.5, TRUE) - host_mob.adjustFireLoss(-0.5, TRUE) - -/datum/nanite_program/temperature - name = "Temperature Adjustment" - desc = "The nanites adjust the host's internal temperature to an ideal level. Will not consume nanites while the host is at a normal body temperature." - use_rate = 3.5 - rogue_types = list(/datum/nanite_program/skin_decay) - -/datum/nanite_program/temperature/check_conditions() - if(host_mob.bodytemperature > (host_mob.get_body_temp_normal(apply_change=FALSE) - 30) && host_mob.bodytemperature < (host_mob.get_body_temp_normal(apply_change=FALSE) + 30)) - return FALSE - return ..() - -/datum/nanite_program/temperature/active_effect() - var/target_temp = host_mob.get_body_temp_normal(apply_change=FALSE) - if(host_mob.bodytemperature > target_temp) - host_mob.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT, target_temp) - else if(host_mob.bodytemperature < (target_temp + 1)) - host_mob.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, target_temp) - -/datum/nanite_program/purging - name = "Blood Purification" - desc = "The nanites purge toxins and chemicals from the host's bloodstream. Consumes nanites even if it has no effect." - use_rate = 1 - rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic) - -/datum/nanite_program/purging/check_conditions() - . = ..() - if(!. || !host_mob.reagents) - return FALSE // No trying to purge simple mobs - -/datum/nanite_program/purging/active_effect() - host_mob.adjustToxLoss(-1) - for(var/datum/reagent/R in host_mob.reagents.reagent_list) - host_mob.reagents.remove_reagent(R.type,1) - -/datum/nanite_program/brain_heal - name = "Neural Regeneration" - desc = "The nanites fix neural connections in the host's brain, reversing brain damage and minor traumas. Will not consume nanites while it would not have an effect." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/brain_decay) - -/datum/nanite_program/brain_heal/check_conditions() - if(host_mob.get_organ_loss(ORGAN_SLOT_BRAIN) > 0) - return ..() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - if ( C.has_trauma_type( resilience = TRAUMA_RESILIENCE_BASIC) ) - return ..() - return FALSE - -/datum/nanite_program/brain_heal/active_effect() - host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1) - if(iscarbon(host_mob) && prob(10)) - var/mob/living/carbon/C = host_mob - C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) - -/datum/nanite_program/blood_restoring - name = "Blood Regeneration" - desc = "The nanites stimulate and boost blood cell production in the host. Will not consume nanites while the host has a safe blood level." - use_rate = 1 - rogue_types = list(/datum/nanite_program/suffocating) - -/datum/nanite_program/blood_restoring/check_conditions() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - if(C.blood_volume >= BLOOD_VOLUME_SAFE) - return FALSE - else - return FALSE - return ..() - -/datum/nanite_program/blood_restoring/active_effect() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - C.blood_volume += 2 - -/datum/nanite_program/repairing - name = "Mechanical Repair" - desc = "The nanites fix damage in the host's mechanical limbs. Will not consume nanites while the host's mechanical limbs are undamaged, or while the host has no mechanical limbs." - use_rate = 0.5 - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/repairing/check_conditions() - if(!host_mob.getBruteLoss() && !host_mob.getFireLoss()) - return FALSE - - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE, TRUE, required_bodytype = BODYTYPE_ROBOTIC) - if(!parts.len) - return FALSE - else - if(!(host_mob.mob_biotypes & MOB_ROBOTIC)) - return FALSE - return ..() - -/datum/nanite_program/repairing/active_effect(mob/living/M) - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE, TRUE, required_bodytype = BODYTYPE_ROBOTIC) - if(!parts.len) - return - var/update = FALSE - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(1/parts.len, 1/parts.len, null, BODYTYPE_ROBOTIC)) //much faster than organic healing - update = TRUE - if(update) - host_mob.update_damage_overlays() - else - host_mob.adjustBruteLoss(-1, TRUE) - host_mob.adjustFireLoss(-1, TRUE) - -/datum/nanite_program/purging_advanced - name = "Selective Blood Purification" - desc = "The nanites purge toxins and dangerous chemicals from the host's bloodstream, while ignoring beneficial chemicals. \ - The added processing power required to analyze the chemicals severely increases the nanite consumption rate. Consumes nanites even if it has no effect." - use_rate = 2 - rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic) - -/datum/nanite_program/purging_advanced/check_conditions() - . = ..() - if(!. || !host_mob.reagents) - return FALSE - -/datum/nanite_program/purging_advanced/active_effect() - host_mob.adjustToxLoss(-1) - for(var/datum/reagent/toxin/R in host_mob.reagents.reagent_list) - host_mob.reagents.remove_reagent(R.type,1) - -/datum/nanite_program/regenerative_advanced - name = "Bio-Reconstruction" - desc = "The nanites manually repair and replace organic cells, acting much faster than normal regeneration. \ - However, this program cannot detect the difference between harmed and unharmed, causing it to consume nanites even if it has no effect." - use_rate = 5.5 - rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic) - -/datum/nanite_program/regenerative_advanced/active_effect() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE,TRUE, required_bodytype = BODYTYPE_ORGANIC) - if(!parts.len) - return - var/update = FALSE - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(2/parts.len, 2/parts.len, null, BODYTYPE_ORGANIC)) - update = TRUE - if(update) - host_mob.update_damage_overlays() - else - host_mob.adjustBruteLoss(-2, TRUE) - host_mob.adjustFireLoss(-2, TRUE) - -/datum/nanite_program/brain_heal_advanced - name = "Neural Reimaging" - desc = "The nanites are able to backup and restore the host's neural connections, potentially replacing entire chunks of missing or damaged brain matter. Consumes nanites even if it has no effect." - use_rate = 3 - rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) - -/datum/nanite_program/brain_heal_advanced/active_effect() - host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2) - if(iscarbon(host_mob) && prob(10)) - var/mob/living/carbon/C = host_mob - C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_LOBOTOMY) - -/datum/nanite_program/defib - name = "Defibrillation" - desc = "The nanites shock the host's heart when triggered, bringing them back to life if the body can sustain it." - can_trigger = TRUE - trigger_cost = 25 - trigger_cooldown = 120 - rogue_types = list(/datum/nanite_program/shocking) - -/datum/nanite_program/defib/on_trigger(comm_message) - host_mob.notify_revival("Your heart is being defibrillated by nanites. Re-enter your corpse if you want to be revived!") - host_mob.grab_ghost() // Shove them back in their body. - addtimer(CALLBACK(src, PROC_REF(zap)), 50) - -/datum/nanite_program/defib/proc/check_revivable() - if(!iscarbon(host_mob)) //nonstandard biology - return FALSE - var/mob/living/carbon/C = host_mob - if(C.get_ghost()) - return FALSE - return C.can_defib() == DEFIB_POSSIBLE - -/datum/nanite_program/defib/proc/zap() - var/mob/living/carbon/C = host_mob - playsound(C, 'sound/machines/defib_charge.ogg', 50, FALSE) - sleep(30) - playsound(C, 'sound/machines/defib_zap.ogg', 50, FALSE) - if(check_revivable()) - playsound(C, 'sound/machines/defib_success.ogg', 50, FALSE) - C.set_heartattack(FALSE) - C.revive() - C.emote("gasp") - C.set_jitter_if_lower(10 SECONDS) - SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) - log_game("[C] has been successfully defibrillated by nanites.") - else - playsound(C, 'sound/machines/defib_failed.ogg', 50, FALSE) diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programs/protocols.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programs/protocols.dm deleted file mode 100644 index 65bbe91d3d3ae..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programs/protocols.dm +++ /dev/null @@ -1,277 +0,0 @@ -//Replication Protocols -/datum/nanite_program/protocol/kickstart - name = "Kickstart Protocol" - desc = "Replication Protocol: the nanites focus on early growth, heavily boosting replication rate for a few minutes after the initial implantation, \ - resulting in an additional 420 nanite volume being produced during the first two minutes." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_REPLICATION - var/boost_duration = 1200 - -/datum/nanite_program/protocol/kickstart/check_conditions() - if(!(world.time < nanites.start_time + boost_duration)) - return FALSE - return ..() - -/datum/nanite_program/protocol/kickstart/active_effect() - nanites.adjust_nanites(null, 3.5) - -/datum/nanite_program/protocol/factory - name = "Factory Protocol" - desc = "Replication Protocol: the nanites build a factory matrix within the host, gradually increasing replication speed over time, \ - granting a maximum of 2 additional nanite production after roughly 17 minutes. \ - The factory decays if the protocol is not active, or if the nanites are disrupted by shocks or EMPs." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_REPLICATION - var/factory_efficiency = 0 - var/max_efficiency = 1000 //Goes up to 2 bonus regen per tick after 16 minutes and 40 seconds - -/datum/nanite_program/protocol/factory/on_process() - if(!activated || !check_conditions()) - factory_efficiency = max(0, factory_efficiency - 5) - ..() - -/datum/nanite_program/protocol/factory/on_emp(severity) - ..() - factory_efficiency = max(0, factory_efficiency - 300) - -/datum/nanite_program/protocol/factory/on_shock(shock_damage) - ..() - factory_efficiency = max(0, factory_efficiency - 200) - -/datum/nanite_program/protocol/factory/on_minor_shock() - ..() - factory_efficiency = max(0, factory_efficiency - 100) - -/datum/nanite_program/protocol/factory/active_effect() - factory_efficiency = min(factory_efficiency + 1, max_efficiency) - nanites.adjust_nanites(null, round(0.002 * factory_efficiency, 0.1)) - -/datum/nanite_program/protocol/pyramid - name = "Pyramid Protocol" - desc = "Replication Protocol: the nanites implement an alternate cooperative replication protocol that is active as long as the nanite saturation level is above 80%, \ - resulting in an additional volume production of 1.2 per second." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_REPLICATION - var/boost = 1.2 - -/datum/nanite_program/protocol/pyramid/check_conditions() - if((nanites.nanite_volume / nanites.max_nanites) < 0.8) - return FALSE - - return ..() - -/datum/nanite_program/protocol/pyramid/active_effect() - nanites.adjust_nanites(null, boost) - -/datum/nanite_program/protocol/offline - name = "Eclipse Protocol" - desc = "Replication Protocol: while the host is asleep or otherwise unconcious, the nanites exploit the reduced interference to replicate more quickly." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_REPLICATION - var/boost = 3 - - -/datum/nanite_program/protocol/offline/check_conditions() - if(nanites.host_mob.stat == CONSCIOUS) - return FALSE - return ..() - - -/datum/nanite_program/protocol/offline/active_effect() - nanites.adjust_nanites(null, boost) - -/datum/nanite_program/protocol/hive - name = "Hive Protocol" - desc = "Storage Protocol: the nanites use a more efficient grid arrangment for volume storage, increasing maximum volume to 750." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_STORAGE - var/extra_volume = 250 - -/datum/nanite_program/protocol/hive/enable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites + extra_volume) - -/datum/nanite_program/protocol/hive/disable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites - extra_volume) - -/datum/nanite_program/protocol/zip - name = "Zip Protocol" - desc = "Storage Protocol: the nanites are disassembled and compacted when unused, increasing the maximum volume to 1000. However, the process slows down their replication rate slightly." - use_rate = 0.2 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_STORAGE - var/extra_volume = 500 - -/datum/nanite_program/protocol/zip/enable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites + extra_volume) - -/datum/nanite_program/protocol/zip/disable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites - extra_volume) - -/datum/nanite_program/protocol/free_range - name = "Free-range Protocol" - desc = "Storage Protocol: the nanites discard their default storage protocols in favour of a cheaper and more organic approach. Reduces maximum volume to 250, but increases the replication rate by 0.5." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_STORAGE - var/boost = 0.5 - var/extra_volume = -250 - -/datum/nanite_program/protocol/free_range/enable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites + extra_volume) - -/datum/nanite_program/protocol/free_range/disable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites - extra_volume) - -/datum/nanite_program/protocol/free_range/active_effect() - nanites.adjust_nanites(null, boost) - -/datum/nanite_program/protocol/unsafe_storage - name = "S.L.O. Protocol" - desc = "Storage Protocol: 'S.L.O.P.', or Storage Level Override Protocol, completely disables the safety measures normally present in nanites, \ - allowing them to reach a whopping maximum volume level of 2000, but at the risk of causing damage to the host at nanite concentrations above the standard limit of 500." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_STORAGE - var/extra_volume = 1500 - var/next_warning = 0 - var/min_warning_cooldown = 120 - var/max_warning_cooldown = 350 - var/volume_warnings_stage_1 = list("You feel a dull pain in your abdomen.", - "You feel a tickling sensation in your abdomen.") - var/volume_warnings_stage_2 = list("You feel a dull pain in your stomach.", - "You feel a dull pain when breathing.", - "Your stomach grumbles.", - "You feel a tickling sensation in your throat.", - "You feel a tickling sensation in your lungs.", - "You feel a tickling sensation in your stomach.", - "Your lungs feel stiff.") - var/volume_warnings_stage_3 = list("You feel a dull pain in your chest.", - "You hear a faint buzzing coming from nowhere.", - "You hear a faint buzzing inside your head.", - "Your head aches.") - var/volume_warnings_stage_4 = list("You feel a dull pain in your ears.", - "You feel a dull pain behind your eyes.", - "You hear a loud, echoing buzz inside your ears.", - "You feel dizzy.", - "You feel an itch coming from behind your eyes.", - "Your eardrums itch.", - "You see tiny grey motes drifting in your field of view.") - var/volume_warnings_stage_5 = list("You feel sick.", - "You feel a dull pain from every part of your body.", - "You feel nauseous.") - var/volume_warnings_stage_6 = list("Your skin itches and burns.", - "Your muscles ache.", - "You feel tired.", - "You feel something skittering under your skin.",) - -/datum/nanite_program/protocol/unsafe_storage/enable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites + extra_volume) - -/datum/nanite_program/protocol/unsafe_storage/disable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites - extra_volume) - -/datum/nanite_program/protocol/unsafe_storage/active_effect() - if(!iscarbon(host_mob)) - if(prob(10)) - host_mob.adjustBruteLoss(((max(nanites.nanite_volume - 450, 0) / 450) ** 2 ) * 0.5) // 0.5 -> 2 -> 4.5 -> 8 damage per successful tick - return - - var/mob/living/carbon/C = host_mob - - if(nanites.nanite_volume < 500) - return - - var/current_stage = 0 - if(nanites.nanite_volume > 500) //Liver is the main hub of nanite replication and the first to be threatened by excess volume - if(prob(10)) - var/obj/item/organ/internal/liver/liver = C.get_organ_slot(ORGAN_SLOT_LIVER) - if(liver) - liver.apply_organ_damage(0.6) - current_stage++ - if(nanites.nanite_volume > 750) //Extra volume spills out in other central organs - if(prob(10)) - var/obj/item/organ/internal/stomach/stomach = C.get_organ_slot(ORGAN_SLOT_STOMACH) - if(stomach) - stomach.apply_organ_damage(0.75) - if(prob(10)) - var/obj/item/organ/internal/lungs/lungs = C.get_organ_slot(ORGAN_SLOT_LUNGS) - if(lungs) - lungs.apply_organ_damage(0.75) - current_stage++ - if(nanites.nanite_volume > 1000) //Extra volume spills out in more critical organs - if(prob(10)) - var/obj/item/organ/internal/heart/heart = C.get_organ_slot(ORGAN_SLOT_HEART) - if(heart) - heart.apply_organ_damage(0.75) - if(prob(10)) - var/obj/item/organ/internal/brain/brain = C.get_organ_slot(ORGAN_SLOT_BRAIN) - if(brain) - brain.apply_organ_damage(0.75) - current_stage++ - if(nanites.nanite_volume > 1250) //Excess nanites start invading smaller organs for more space, including sensory organs - if(prob(13)) - var/obj/item/organ/internal/eyes/eyes = C.get_organ_slot(ORGAN_SLOT_EYES) - if(eyes) - eyes.apply_organ_damage(0.75) - if(prob(13)) - var/obj/item/organ/internal/ears/ears = C.get_organ_slot(ORGAN_SLOT_EARS) - if(ears) - ears.apply_organ_damage(0.75) - current_stage++ - if(nanites.nanite_volume > 1500) //Nanites start spilling into the bloodstream, causing toxicity - if(prob(15)) - C.adjustToxLoss(0.5, TRUE, forced = TRUE) //Not healthy for slimepeople either - current_stage++ - if(nanites.nanite_volume > 1750) //Nanites have almost reached their physical limit, and the pressure itself starts causing tissue damage - if(prob(15)) - C.adjustBruteLoss(0.75, TRUE) - current_stage++ - - volume_warning(current_stage) - -/datum/nanite_program/protocol/unsafe_storage/proc/volume_warning(tier) - if(world.time < next_warning) - return - - var/list/main_warnings - var/list/extra_warnings - - switch(tier) - if(1) - main_warnings = volume_warnings_stage_1 - extra_warnings = null - if(2) - main_warnings = volume_warnings_stage_2 - extra_warnings = volume_warnings_stage_1 - if(3) - main_warnings = volume_warnings_stage_3 - extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 - if(4) - main_warnings = volume_warnings_stage_4 - extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 + volume_warnings_stage_3 - if(5) - main_warnings = volume_warnings_stage_5 - extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 + volume_warnings_stage_3 + volume_warnings_stage_4 - if(6) - main_warnings = volume_warnings_stage_6 - extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 + volume_warnings_stage_3 + volume_warnings_stage_4 + volume_warnings_stage_5 - - if(prob(35)) - to_chat(host_mob, span_warning("[pick(main_warnings)]")) - next_warning = world.time + rand(min_warning_cooldown, max_warning_cooldown) - else if(islist(extra_warnings)) - to_chat(host_mob, span_warning("[pick(extra_warnings)]")) - next_warning = world.time + rand(min_warning_cooldown, max_warning_cooldown) diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programs/rogue.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programs/rogue.dm deleted file mode 100644 index 9188753798268..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programs/rogue.dm +++ /dev/null @@ -1,116 +0,0 @@ -//Programs generated through degradation of other complex programs. -//They generally cause minor damage or annoyance. - -//Last stop of the error train -/datum/nanite_program/glitch - name = "Glitch" - desc = "A heavy software corruption that causes nanites to gradually break down." - use_rate = 1.5 - unique = FALSE - rogue_types = list() - -//Generic body-affecting programs will decay into this -/datum/nanite_program/necrotic - name = "Necrosis" - desc = "The nanites attack internal tissues indiscriminately, causing widespread damage." - use_rate = 0.75 - unique = FALSE - rogue_types = list(/datum/nanite_program/glitch) - -/datum/nanite_program/necrotic/active_effect() - host_mob.adjustBruteLoss(0.75, TRUE) - if(prob(1)) - to_chat(host_mob, span_warning("You feel a mild ache from somewhere inside you.")) - -//Programs that don't directly interact with the body will decay into this -/datum/nanite_program/toxic - name = "Toxin Buildup" - desc = "The nanites cause a slow but constant toxin buildup inside the host." - use_rate = 0.25 - unique = FALSE - rogue_types = list(/datum/nanite_program/glitch) - -/datum/nanite_program/toxic/active_effect() - host_mob.adjustToxLoss(0.5) - if(prob(1)) - to_chat(host_mob, span_warning("You feel a bit sick.")) - -//Generic blood-affecting programs will decay into this -/datum/nanite_program/suffocating - name = "Hypoxemia" - desc = "The nanites prevent the host's blood from absorbing oxygen efficiently." - use_rate = 0.75 - unique = FALSE - rogue_types = list(/datum/nanite_program/glitch) - -/datum/nanite_program/suffocating/active_effect() - host_mob.adjustOxyLoss(3, 0) - if(prob(1)) - to_chat(host_mob, span_warning("You feel short of breath.")) - -//Generic brain-affecting programs will decay into this -/datum/nanite_program/brain_decay - name = "Neuro-Necrosis" - desc = "The nanites seek and attack brain cells, causing extensive neural damage to the host." - use_rate = 0.75 - unique = FALSE - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/brain_decay/active_effect() - if(prob(4)) - host_mob.adjust_hallucinations(1.5 SECONDS) - host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) - -//Generic brain-affecting programs can also decay into this -/datum/nanite_program/brain_misfire - name = "Brain Misfire" - desc = "The nanites interfere with neural pathways, causing minor psychological disturbances." - use_rate = 0.50 - unique = FALSE - rogue_types = list(/datum/nanite_program/brain_decay) - -/datum/nanite_program/brain_misfire/active_effect() - if(prob(10)) - switch(rand(1,4)) - if(1) - host_mob.adjust_hallucinations(1.5 SECONDS) - if(2) - host_mob.adjust_confusion(1 SECONDS) - if(3) - host_mob.adjust_drugginess(1 SECONDS) - if(4) - host_mob.adjust_slurring(1 SECONDS) - -//Generic skin-affecting programs will decay into this -/datum/nanite_program/skin_decay - name = "Dermalysis" - desc = "The nanites attack skin cells, causing irritation, rashes, and minor damage." - use_rate = 0.25 - unique = FALSE - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/skin_decay/active_effect() - host_mob.adjustBruteLoss(0.25) - if(prob(5)) //itching - var/picked_bodypart = pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - var/obj/item/bodypart/bodypart = host_mob.get_bodypart(picked_bodypart) - var/can_scratch = !host_mob.incapacitated() && get_location_accessible(host_mob, picked_bodypart) - - host_mob.visible_message("[can_scratch ? span_warning("[host_mob] scratches [host_mob.p_their()] [bodypart.name].") : ""]",\ - span_warning("Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]")) - -//Generic nerve-affecting programs will decay into this -/datum/nanite_program/nerve_decay - name = "Nerve Decay" - desc = "The nanites attack the host's nerves, causing lack of coordination and short bursts of paralysis." - use_rate = 1 - unique = FALSE - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/nerve_decay/active_effect() - if(prob(5)) - to_chat(host_mob, span_warning("You feel unbalanced!")) - host_mob.adjust_confusion(1 SECONDS) - else if(prob(4)) - to_chat(host_mob, span_warning("You can't feel your hands!")) - host_mob.drop_all_held_items() diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programs/sensor.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programs/sensor.dm deleted file mode 100644 index 4e8a48ea48c42..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programs/sensor.dm +++ /dev/null @@ -1,312 +0,0 @@ -/datum/nanite_program/sensor - name = "Sensor Nanites" - desc = "These nanites send a signal code when a certain condition is met." - unique = FALSE - var/can_rule = FALSE - -/datum/nanite_program/sensor/register_extra_settings() - extra_settings[NES_SENT_CODE] = new /datum/nanite_extra_setting/number(0, 1, 9999) - -/datum/nanite_program/sensor/proc/check_event() - return FALSE - -/datum/nanite_program/sensor/proc/send_code() - if(activated) - var/datum/nanite_extra_setting/ES = extra_settings[NES_SENT_CODE] - SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, ES.value, "a [name] program") - -/datum/nanite_program/sensor/active_effect() - if(check_event()) - send_code() - -/datum/nanite_program/sensor/proc/make_rule(datum/nanite_program/target) - return - -/datum/nanite_program/sensor/repeat - name = "Signal Repeater" - desc = "When triggered, sends another signal to the nanites, optionally with a delay." - can_trigger = TRUE - trigger_cost = 0 - trigger_cooldown = 10 - var/spent = FALSE - -/datum/nanite_program/sensor/repeat/register_extra_settings() - . = ..() - extra_settings[NES_DELAY] = new /datum/nanite_extra_setting/number(0, 0, 3600, "s") - -/datum/nanite_program/sensor/repeat/on_trigger(comm_message) - var/datum/nanite_extra_setting/ES = extra_settings[NES_DELAY] - addtimer(CALLBACK(src, PROC_REF(send_code)), ES.get_value() * 10) - -/datum/nanite_program/sensor/relay_repeat - name = "Relay Signal Repeater" - desc = "When triggered, sends another signal to a relay channel, optionally with a delay." - can_trigger = TRUE - trigger_cost = 0 - trigger_cooldown = 10 - var/spent = FALSE - -/datum/nanite_program/sensor/relay_repeat/register_extra_settings() - . = ..() - extra_settings[NES_RELAY_CHANNEL] = new /datum/nanite_extra_setting/number(1, 1, 9999) - extra_settings[NES_DELAY] = new /datum/nanite_extra_setting/number(0, 0, 3600, "s") - -/datum/nanite_program/sensor/relay_repeat/on_trigger(comm_message) - var/datum/nanite_extra_setting/ES = extra_settings[NES_DELAY] - addtimer(CALLBACK(src, PROC_REF(send_code)), ES.get_value() * 10) - -/datum/nanite_program/sensor/relay_repeat/send_code() - var/datum/nanite_extra_setting/relay = extra_settings[NES_RELAY_CHANNEL] - if(activated && relay.get_value()) - for(var/X in SSnanites.nanite_relays) - var/datum/nanite_program/relay/N = X - var/datum/nanite_extra_setting/code = extra_settings[NES_SENT_CODE] - N.relay_signal(code.get_value(), relay.get_value(), "a [name] program") - -/datum/nanite_program/sensor/health - name = "Health Sensor" - desc = "The nanites receive a signal when the host's health is above/below a target percentage." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/health/register_extra_settings() - . = ..() - extra_settings[NES_HEALTH_PERCENT] = new /datum/nanite_extra_setting/number(50, -99, 100, "%") - extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below") - -/datum/nanite_program/sensor/health/check_event() - var/health_percent = host_mob.health / host_mob.maxHealth * 100 - var/datum/nanite_extra_setting/percent = extra_settings[NES_HEALTH_PERCENT] - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/detected = FALSE - if(direction.get_value()) - if(health_percent >= percent.get_value()) - detected = TRUE - else - if(health_percent < percent.get_value()) - detected = TRUE - - if(detected) - if(!spent) - spent = TRUE - return TRUE - return FALSE - else - spent = FALSE - return FALSE - -/datum/nanite_program/sensor/health/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/health/rule = new(target) - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/datum/nanite_extra_setting/percent = extra_settings[NES_HEALTH_PERCENT] - rule.above = direction.get_value() - rule.threshold = percent.get_value() - return rule - -/datum/nanite_program/sensor/crit - name = "Critical Health Sensor" - desc = "The nanites receive a signal when the host first reaches critical health." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/crit/check_event() - if(HAS_TRAIT(host_mob, TRAIT_CRITICAL_CONDITION)) - if(spent) - return FALSE - spent = TRUE - return TRUE - spent = FALSE - return FALSE - - -/datum/nanite_program/sensor/crit/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/crit/rule = new(target) - return rule - -/datum/nanite_program/sensor/death - name = "Death Sensor" - desc = "The nanites receive a signal when they detect the host is dead." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/death/on_death() - send_code() - -/datum/nanite_program/sensor/death/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/death/rule = new(target) - return rule - -/datum/nanite_program/sensor/nanite_volume - name = "Nanite Volume Sensor" - desc = "The nanites receive a signal when the nanite supply is above/below a certain percentage." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/nanite_volume/register_extra_settings() - . = ..() - extra_settings[NES_NANITE_PERCENT] = new /datum/nanite_extra_setting/number(50, -99, 100, "%") - extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below") - -/datum/nanite_program/sensor/nanite_volume/check_event() - var/nanite_percent = (nanites.nanite_volume - nanites.safety_threshold)/(nanites.max_nanites - nanites.safety_threshold)*100 - var/datum/nanite_extra_setting/percent = extra_settings[NES_NANITE_PERCENT] - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/detected = FALSE - if(direction.get_value()) - if(nanite_percent >= percent.get_value()) - detected = TRUE - else - if(nanite_percent < percent.get_value()) - detected = TRUE - - if(detected) - if(!spent) - spent = TRUE - return TRUE - return FALSE - else - spent = FALSE - return FALSE - -/datum/nanite_program/sensor/nanite_volume/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/nanites/rule = new(target) - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/datum/nanite_extra_setting/percent = extra_settings[NES_NANITE_PERCENT] - rule.above = direction.get_value() - rule.threshold = percent.get_value() - return rule - -/datum/nanite_program/sensor/damage - name = "Damage Sensor" - desc = "The nanites receive a signal when a host's specific damage type is above/below a target value." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/damage/register_extra_settings() - . = ..() - extra_settings[NES_DAMAGE_TYPE] = new /datum/nanite_extra_setting/type(BRUTE, list(BRUTE, BURN, TOX, OXY)) - extra_settings[NES_DAMAGE] = new /datum/nanite_extra_setting/number(50, 0, 500) - extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below") - -/datum/nanite_program/sensor/damage/check_event() - var/reached_threshold = FALSE - var/datum/nanite_extra_setting/type = extra_settings[NES_DAMAGE_TYPE] - var/datum/nanite_extra_setting/damage = extra_settings[NES_DAMAGE] - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/check_above = direction.get_value() - var/damage_amt = 0 - switch(type.get_value()) - if(BRUTE) - damage_amt = host_mob.getBruteLoss() - if(BURN) - damage_amt = host_mob.getFireLoss() - if(TOX) - damage_amt = host_mob.getToxLoss() - if(OXY) - damage_amt = host_mob.getOxyLoss() - - if(check_above) - if(damage_amt >= damage.get_value()) - reached_threshold = TRUE - else - if(damage_amt < damage.get_value()) - reached_threshold = TRUE - - if(reached_threshold) - if(!spent) - spent = TRUE - return TRUE - return FALSE - else - spent = FALSE - return FALSE - -/datum/nanite_program/sensor/damage/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/damage/rule = new(target) - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/datum/nanite_extra_setting/damage_type = extra_settings[NES_DAMAGE_TYPE] - var/datum/nanite_extra_setting/damage = extra_settings[NES_DAMAGE] - rule.above = direction.get_value() - rule.threshold = damage.get_value() - rule.damage_type = damage_type.get_value() - return rule - -/datum/nanite_program/sensor/voice - name = "Voice Sensor" - desc = "The nanites receive a signal when they detect a specific, preprogrammed word or phrase being said." - -/datum/nanite_program/sensor/voice/register_extra_settings() - . = ..() - extra_settings[NES_SENTENCE] = new /datum/nanite_extra_setting/text("") - extra_settings[NES_INCLUSIVE_MODE] = new /datum/nanite_extra_setting/boolean(TRUE, "Inclusive", "Exclusive") - -/datum/nanite_program/sensor/voice/on_mob_add() - . = ..() - RegisterSignal(host_mob, COMSIG_MOVABLE_HEAR, PROC_REF(on_hear)) - -/datum/nanite_program/sensor/voice/on_mob_remove() - UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR) - -/datum/nanite_program/sensor/voice/proc/on_hear(datum/source, list/hearing_args) - SIGNAL_HANDLER - var/datum/nanite_extra_setting/sentence = extra_settings[NES_SENTENCE] - var/datum/nanite_extra_setting/inclusive = extra_settings[NES_INCLUSIVE_MODE] - if(!sentence.get_value()) - return - if(inclusive.get_value()) - if(findtext(hearing_args[HEARING_RAW_MESSAGE], sentence.get_value())) - send_code() - else - if(lowertext(hearing_args[HEARING_RAW_MESSAGE]) == lowertext(sentence.get_value())) - send_code() - -/datum/nanite_program/sensor/species - name = "Species Sensor" - desc = "When triggered, the nanites scan the host to determine their species and receive a signal depending on the conditions set in the settings." - can_trigger = TRUE - trigger_cost = 0 - trigger_cooldown = 5 - - var/list/static/allowed_species = list( - "Human" = /datum/species/human, - "Felinid" = /datum/species/human/felinid, - "Lizard" = /datum/species/lizard, - "Moth" = /datum/species/moth, - "Ethereal" = /datum/species/ethereal, - "Pod" = /datum/species/pod, - "Fly" = /datum/species/fly, - "Jelly" = /datum/species/jelly, - ) - -/datum/nanite_program/sensor/species/register_extra_settings() - . = ..() - var/list/species_types = list() - for(var/name in allowed_species) - species_types += name - species_types += "Other" - extra_settings[NES_RACE] = new /datum/nanite_extra_setting/type("Human", species_types) - extra_settings[NES_MODE] = new /datum/nanite_extra_setting/boolean(TRUE, "Is", "Is Not") - -/datum/nanite_program/sensor/species/on_trigger(comm_message) - var/datum/nanite_extra_setting/species_type = extra_settings[NES_RACE] - var/species = allowed_species[species_type.get_value()] - var/species_match = FALSE - - if(species) - if(is_species(host_mob, species)) - species_match = TRUE - else //this is the check for the "Other" option - species_match = TRUE - for(var/name in allowed_species) - var/species_other = allowed_species[name] - if(is_species(host_mob, species_other)) - species_match = FALSE - break - - var/datum/nanite_extra_setting/mode = extra_settings[NES_MODE] - if(mode.get_value()) - if(species_match) - send_code() - else - if(!species_match) - send_code() diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programs/suppression.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programs/suppression.dm deleted file mode 100644 index f0c21fc651fc6..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programs/suppression.dm +++ /dev/null @@ -1,270 +0,0 @@ -//Programs that are generally useful for population control and non-harmful suppression. - -/datum/nanite_program/sleepy - name = "Sleep Induction" - desc = "The nanites induce rapid narcolepsy when triggered." - can_trigger = TRUE - trigger_cost = 15 - trigger_cooldown = 1200 - rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - -/datum/nanite_program/sleepy/on_trigger(comm_message) - to_chat(host_mob, span_warning("You start to feel very sleepy...")) - host_mob.adjust_drowsiness(1 SECONDS) - addtimer(CALLBACK(host_mob, TYPE_PROC_REF(/mob/living, Sleeping), 200), rand(60,200)) - -/datum/nanite_program/paralyzing - name = "Paralysis" - desc = "The nanites force muscle contraction, effectively paralyzing the host." - use_rate = 3 - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/paralyzing/active_effect() - host_mob.Stun(40) - -/datum/nanite_program/paralyzing/enable_passive_effect() - . = ..() - to_chat(host_mob, span_warning("Your muscles seize! You can't move!")) - -/datum/nanite_program/paralyzing/disable_passive_effect() - . = ..() - to_chat(host_mob, span_notice("Your muscles relax, and you can move again.")) - -/datum/nanite_program/shocking - name = "Electric Shock" - desc = "The nanites shock the host when triggered. Destroys a large amount of nanites!" - can_trigger = TRUE - trigger_cost = 10 - trigger_cooldown = 300 - program_flags = NANITE_SHOCK_IMMUNE - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/shocking/on_trigger(comm_message) - host_mob.electrocute_act(rand(5,10), "shock nanites", 1, SHOCK_NOGLOVES) - -/datum/nanite_program/stun - name = "Neural Shock" - desc = "The nanites pulse the host's nerves when triggered, inapacitating them for a short period." - can_trigger = TRUE - trigger_cost = 4 - trigger_cooldown = 300 - rogue_types = list(/datum/nanite_program/shocking, /datum/nanite_program/nerve_decay) - -/datum/nanite_program/stun/on_trigger(comm_message) - playsound(host_mob, "sparks", 75, TRUE, -1, SHORT_RANGE_SOUND_EXTRARANGE) - host_mob.Paralyze(80) - -/datum/nanite_program/pacifying - name = "Pacification" - desc = "The nanites suppress the aggression center of the brain, preventing the host from causing direct harm to others." - use_rate = 1 - rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - -/datum/nanite_program/pacifying/enable_passive_effect() - . = ..() - ADD_TRAIT(host_mob, TRAIT_PACIFISM, NANITES_TRAIT) - -/datum/nanite_program/pacifying/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_PACIFISM, NANITES_TRAIT) - -/datum/nanite_program/blinding - name = "Blindness" - desc = "The nanites suppress the host's ocular nerves, blinding them while they're active." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/blinding/enable_passive_effect() - . = ..() - host_mob.become_blind(NANITES_TRAIT) - -/datum/nanite_program/blinding/disable_passive_effect() - . = ..() - host_mob.cure_blind(NANITES_TRAIT) - -/datum/nanite_program/mute - name = "Mute" - desc = "The nanites suppress the host's speech, making them mute while they're active." - use_rate = 0.75 - rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) - -/datum/nanite_program/mute/enable_passive_effect() - . = ..() - ADD_TRAIT(host_mob, TRAIT_MUTE, NANITES_TRAIT) - -/datum/nanite_program/mute/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_MUTE, NANITES_TRAIT) - -/datum/nanite_program/fake_death - name = "Death Simulation" - desc = "The nanites induce a death-like coma into the host, able to fool most medical scans." - use_rate = 3.5 - rogue_types = list(/datum/nanite_program/nerve_decay, /datum/nanite_program/necrotic, /datum/nanite_program/brain_decay) - -/datum/nanite_program/fake_death/enable_passive_effect() - . = ..() - host_mob.emote("deathgasp") - host_mob.fakedeath("nanites") - -/datum/nanite_program/fake_death/disable_passive_effect() - . = ..() - host_mob.cure_fakedeath("nanites") - -//Can receive transmissions from a nanite communication remote for customized messages -/datum/nanite_program/comm - can_trigger = TRUE - var/comm_message = "" - -/datum/nanite_program/comm/register_extra_settings() - extra_settings[NES_COMM_CODE] = new /datum/nanite_extra_setting/number(0, 0, 9999) - -/datum/nanite_program/comm/proc/receive_comm_signal(signal_comm_code, comm_message, comm_source) - var/datum/nanite_extra_setting/comm_code = extra_settings[NES_COMM_CODE] - if(!activated || !comm_code.get_value()) - return - if(signal_comm_code == comm_code.get_value()) - host_mob.investigate_log("'s [name] nanite program was messaged by [comm_source] with comm code [signal_comm_code] and message '[comm_message]'.", INVESTIGATE_NANITES) - trigger(FALSE, comm_message) - -/datum/nanite_program/comm/speech - name = "Forced Speech" - desc = "The nanites force the host to say a pre-programmed sentence when triggered." - unique = FALSE - trigger_cost = 3 - trigger_cooldown = 20 - rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - var/static/list/blacklist = list( - "*surrender", - "*collapse", - "*faint", - ) - -/datum/nanite_program/comm/speech/register_extra_settings() - . = ..() - extra_settings[NES_SENTENCE] = new /datum/nanite_extra_setting/text("") - -/datum/nanite_program/comm/speech/on_trigger(comm_message) - var/sent_message = comm_message - if(!comm_message) - var/datum/nanite_extra_setting/sentence = extra_settings[NES_SENTENCE] - sent_message = sentence.get_value() - if(sent_message in blacklist) - return - if(host_mob.stat == DEAD) - return - to_chat(host_mob, span_warning("You feel compelled to speak...")) - host_mob.say(sent_message, forced = "nanite speech") - -/datum/nanite_program/comm/voice - name = "Skull Echo" - desc = "The nanites echo a synthesized message inside the host's skull." - unique = FALSE - trigger_cost = 1 - trigger_cooldown = 20 - rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - -/datum/nanite_program/comm/voice/register_extra_settings() - . = ..() - extra_settings[NES_MESSAGE] = new /datum/nanite_extra_setting/text("") - -/datum/nanite_program/comm/voice/on_trigger(comm_message) - var/sent_message = comm_message - if(!comm_message) - var/datum/nanite_extra_setting/message_setting = extra_settings[NES_MESSAGE] - sent_message = message_setting.get_value() - if(host_mob.stat == DEAD) - return - to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[span_robot("[html_encode(sent_message)]")]\"") - -/datum/nanite_program/comm/hallucination - name = "Hallucination" - desc = "The nanites make the host hallucinate something when triggered." - trigger_cost = 4 - trigger_cooldown = 80 - unique = FALSE - rogue_types = list(/datum/nanite_program/brain_misfire) - -/datum/nanite_program/comm/hallucination/register_extra_settings() - . = ..() - var/list/options = list( - "Random" - ) - extra_settings[NES_HALLUCINATION_TYPE] = new /datum/nanite_extra_setting/type("Message", options) - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/text("") - -/datum/nanite_program/comm/hallucination/on_trigger(comm_message) - var/datum/nanite_extra_setting/hal_setting = extra_settings[NES_HALLUCINATION_TYPE] - var/hal_type = hal_setting.get_value() - var/datum/nanite_extra_setting/hal_detail_setting = extra_settings[NES_HALLUCINATION_DETAIL] - var/hal_details = hal_detail_setting.get_value() - if(comm_message && (hal_type != "Message")) //Triggered via comm remote, but not set to a message hallucination - return - var/sent_message = comm_message //Comm remotes can send custom hallucination messages for the chat hallucination - if(!sent_message) - sent_message = hal_details - - if(!iscarbon(host_mob)) - return - var/mob/living/carbon/C = host_mob - if(hal_details == "random") - hal_details = null - if(hal_type == "Random") - C.adjust_hallucinations(1.5 SECONDS) - -/datum/nanite_program/comm/hallucination/set_extra_setting(setting, value) - . = ..() - if(setting == NES_HALLUCINATION_TYPE) - switch(value) - if("Message") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/text("") - if("Battle") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","laser","disabler","esword","gun","stunprod","harmbaton","bomb")) - if("Sound") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","airlock","airlock pry","console","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack")) - if("Weird Sound") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","phone","hallelujah","highlander","laughter","hyperspace","game over","creepy","tesla")) - if("Station Message") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","ratvar","shuttle dock","blob alert","malf ai","meteors","supermatter")) - if("Health") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","critical","dead","healthy")) - if("Alert") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","gravity","fire","locked","hacked","temphot","tempcold","pressure")) - else - extra_settings.Remove(NES_HALLUCINATION_DETAIL) - -/datum/nanite_program/good_mood - name = "Happiness Enhancer" - desc = "The nanites synthesize serotonin inside the host's brain, creating an artificial sense of happiness." - use_rate = 0.1 - rogue_types = list(/datum/nanite_program/brain_decay) - -/datum/nanite_program/good_mood/register_extra_settings() - . = ..() - extra_settings[NES_MOOD_MESSAGE] = new /datum/nanite_extra_setting/text("HAPPINESS ENHANCEMENT") - -/datum/nanite_program/good_mood/enable_passive_effect() - . = ..() - host_mob.add_mood_event("nanite_happy", /datum/mood_event/nanite_happiness, get_extra_setting_value(NES_MOOD_MESSAGE)) - -/datum/nanite_program/good_mood/disable_passive_effect() - . = ..() - host_mob.clear_mood_event("nanite_happy") - -/datum/nanite_program/bad_mood - name = "Happiness Suppressor" - desc = "The nanites suppress the production of serotonin inside the host's brain, creating an artificial state of depression." - use_rate = 0.1 - rogue_types = list(/datum/nanite_program/brain_decay) - -/datum/nanite_program/bad_mood/register_extra_settings() - . = ..() - extra_settings[NES_MOOD_MESSAGE] = new /datum/nanite_extra_setting/text("HAPPINESS SUPPRESSION") - -/datum/nanite_program/bad_mood/enable_passive_effect() - . = ..() - host_mob.add_mood_event("nanite_sadness", /datum/mood_event/nanite_sadness, get_extra_setting_value(NES_MOOD_MESSAGE)) - -/datum/nanite_program/bad_mood/disable_passive_effect() - . = ..() - host_mob.clear_mood_event("nanite_sadness") diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programs/utility.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programs/utility.dm deleted file mode 100644 index f24f6f5687b51..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programs/utility.dm +++ /dev/null @@ -1,311 +0,0 @@ -//Programs that interact with other programs or nanites directly, or have other special purposes. -/datum/nanite_program/viral - name = "Viral Replica" - desc = "The nanites constantly send encrypted signals attempting to forcefully copy their own programming into other nanite clusters, also overriding or disabling their cloud sync." - use_rate = 0.5 - rogue_types = list(/datum/nanite_program/toxic) - var/pulse_cooldown = 0 - -/datum/nanite_program/viral/register_extra_settings() - extra_settings[NES_PROGRAM_OVERWRITE] = new /datum/nanite_extra_setting/type("Add To", list("Overwrite", "Add To", "Ignore")) - extra_settings[NES_CLOUD_OVERWRITE] = new /datum/nanite_extra_setting/number(0, 0, 100) - -/datum/nanite_program/viral/active_effect() - if(world.time < pulse_cooldown) - return - var/datum/nanite_extra_setting/program = extra_settings[NES_PROGRAM_OVERWRITE] - var/datum/nanite_extra_setting/cloud = extra_settings[NES_CLOUD_OVERWRITE] - for(var/mob/M in orange(host_mob, 5)) - if(SEND_SIGNAL(M, COMSIG_NANITE_IS_STEALTHY)) - continue - switch(program.get_value()) - if("Overwrite") - SEND_SIGNAL(M, COMSIG_NANITE_SYNC, nanites, TRUE) - if("Add To") - SEND_SIGNAL(M, COMSIG_NANITE_SYNC, nanites, FALSE) - SEND_SIGNAL(M, COMSIG_NANITE_SET_CLOUD, cloud.get_value()) - pulse_cooldown = world.time + 75 - -/datum/nanite_program/monitoring - name = "Monitoring" - desc = "The nanites monitor the host's vitals and location, sending them to the suit sensor network." - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/monitoring/enable_passive_effect() - . = ..() - ADD_TRAIT(host_mob, TRAIT_NANITE_MONITORING, NANITES_TRAIT) //Shows up in diagnostic and medical HUDs as a small blinking icon - if(ishuman(host_mob)) - GLOB.nanite_sensors_list |= host_mob - host_mob.hud_set_nanite_indicator() - -/datum/nanite_program/monitoring/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_NANITE_MONITORING, "nanites") - if(ishuman(host_mob)) - GLOB.nanite_sensors_list -= host_mob - - host_mob.hud_set_nanite_indicator() - -/datum/nanite_program/self_scan - name = "Host Scan" - desc = "The nanites display a detailed readout of a body scan to the host." - unique = FALSE - can_trigger = TRUE - trigger_cost = 3 - trigger_cooldown = 50 - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/self_scan/register_extra_settings() - extra_settings[NES_SCAN_TYPE] = new /datum/nanite_extra_setting/type("Medical", list("Medical", "Chemical", "Wound", "Nanite")) - -/datum/nanite_program/self_scan/on_trigger(comm_message) - if(host_mob.stat == DEAD) - return - var/datum/nanite_extra_setting/NS = extra_settings[NES_SCAN_TYPE] - switch(NS.get_value()) - if("Medical") - healthscan(host_mob, host_mob) - if("Chemical") - chemscan(host_mob, host_mob) - if("Wound") - woundscan(host_mob, host_mob) - if("Nanite") - SEND_SIGNAL(host_mob, COMSIG_NANITE_SCAN, host_mob, TRUE) - -/datum/nanite_program/stealth - name = "Stealth" - desc = "The nanites mask their activity from superficial scans, becoming undetectable by HUDs and non-specialized scanners." - rogue_types = list(/datum/nanite_program/toxic) - use_rate = 0.2 - -/datum/nanite_program/stealth/enable_passive_effect() - . = ..() - nanites.stealth = TRUE - -/datum/nanite_program/stealth/disable_passive_effect() - . = ..() - nanites.stealth = FALSE - -/datum/nanite_program/nanite_debugging - name = "Nanite Debugging" - desc = "Enables various high-cost diagnostics in the nanites, making them able to communicate their program list to portable scanners. \ - Doing so uses some power, slightly decreasing their replication speed." - rogue_types = list(/datum/nanite_program/toxic) - use_rate = 0.1 - -/datum/nanite_program/nanite_debugging/enable_passive_effect() - . = ..() - nanites.diagnostics = TRUE - -/datum/nanite_program/nanite_debugging/disable_passive_effect() - . = ..() - nanites.diagnostics = FALSE - -/datum/nanite_program/relay - name = "Relay" - desc = "The nanites receive and relay long-range nanite signals." - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/relay/register_extra_settings() - extra_settings[NES_RELAY_CHANNEL] = new /datum/nanite_extra_setting/number(1, 1, 9999) - -/datum/nanite_program/relay/enable_passive_effect() - . = ..() - SSnanites.nanite_relays |= src - -/datum/nanite_program/relay/disable_passive_effect() - . = ..() - SSnanites.nanite_relays -= src - -/datum/nanite_program/relay/proc/relay_signal(code, relay_code, source) - if(!activated) - return - if(!host_mob) - return - var/datum/nanite_extra_setting/NS = extra_settings[NES_RELAY_CHANNEL] - if(relay_code != NS.get_value()) - return - SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, code, source) - -/datum/nanite_program/relay/proc/relay_comm_signal(comm_code, relay_code, comm_message) - if(!activated) - return - if(!host_mob) - return - var/datum/nanite_extra_setting/NS = extra_settings[NES_RELAY_CHANNEL] - if(relay_code != NS.get_value()) - return - SEND_SIGNAL(host_mob, COMSIG_NANITE_COMM_SIGNAL, comm_code, comm_message) - -/datum/nanite_program/metabolic_synthesis - name = "Metabolic Synthesis" - desc = "The nanites use the metabolic cycle of the host to speed up their replication rate, using their extra nutrition as fuel." - use_rate = -0.5 //generates nanites - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/metabolic_synthesis/check_conditions() - if(!iscarbon(host_mob)) - return FALSE - var/mob/living/carbon/C = host_mob - if(C.nutrition <= NUTRITION_LEVEL_WELL_FED) - return FALSE - return ..() - -/datum/nanite_program/metabolic_synthesis/active_effect() - host_mob.adjust_nutrition(-0.5) - -/datum/nanite_program/access - name = "Subdermal ID" - desc = "The nanites store the host's ID access rights in a subdermal magnetic strip. Updates when triggered, copying the host's current access." - can_trigger = TRUE - trigger_cost = 3 - trigger_cooldown = 30 - rogue_types = list(/datum/nanite_program/skin_decay) - var/access = list() - -//Syncs the nanites with the cumulative current mob's access level. Can potentially wipe existing access. -/datum/nanite_program/access/on_trigger(comm_message) - var/list/potential_items = list() - - potential_items += host_mob.get_active_held_item() - potential_items += host_mob.get_inactive_held_item() - potential_items += host_mob.pulling - - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - potential_items += H.wear_id - else if(isanimal(host_mob)) - var/mob/living/simple_animal/A = host_mob - potential_items += A.access_card - - var/list/new_access = list() - for(var/obj/item/I in potential_items) - new_access += I.GetAccess() - - access = new_access - -/datum/nanite_program/spreading - name = "Infective Exo-Locomotion" - desc = "The nanites gain the ability to survive for brief periods outside of the human body, as well as the ability to start new colonies without an integration process; \ - resulting in an extremely infective strain of nanites." - use_rate = 1.50 - rogue_types = list(/datum/nanite_program/aggressive_replication, /datum/nanite_program/necrotic) - var/spread_cooldown = 0 - -/datum/nanite_program/spreading/active_effect() - if(world.time < spread_cooldown) - return - spread_cooldown = world.time + 50 - var/list/mob/living/target_hosts = list() - for(var/mob/living/L in oview(5, host_mob)) - if(!prob(25)) - continue - if(!(L.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) - continue - target_hosts += L - if(!target_hosts.len) - return - var/mob/living/infectee = pick(target_hosts) - if(prob(100 - (infectee.getarmor(null, BIO)))) - //this will potentially take over existing nanites! - infectee.AddComponent(/datum/component/nanites, 10) - SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites) - SEND_SIGNAL(infectee, COMSIG_NANITE_SET_CLOUD, nanites.cloud_id) - infectee.investigate_log("was infected by spreading nanites with cloud ID [nanites.cloud_id] by [key_name(host_mob)] at [AREACOORD(infectee)].", INVESTIGATE_NANITES) - -/datum/nanite_program/nanite_sting - name = "Nanite Sting" - desc = "When triggered, projects a nearly invisible spike of nanites that attempts to infect a nearby non-host with a copy of the host's nanites cluster." - can_trigger = TRUE - trigger_cost = 5 - trigger_cooldown = 100 - rogue_types = list(/datum/nanite_program/glitch, /datum/nanite_program/toxic) - -/datum/nanite_program/nanite_sting/on_trigger(comm_message) - var/list/mob/living/target_hosts = list() - for(var/mob/living/L in oview(1, host_mob)) - if(!(L.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD)) || SEND_SIGNAL(L, COMSIG_HAS_NANITES) || !L.Adjacent(host_mob)) - continue - target_hosts += L - if(!target_hosts.len) - consume_nanites(-5) - return - var/mob/living/infectee = pick(target_hosts) - if(prob(100 - (infectee.getarmor(null, BIO)))) - //unlike with Infective Exo-Locomotion, this can't take over existing nanites, because Nanite Sting only targets non-hosts. - infectee.AddComponent(/datum/component/nanites, 5) - SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites) - SEND_SIGNAL(infectee, COMSIG_NANITE_SET_CLOUD, nanites.cloud_id) - infectee.investigate_log("was infected by a nanite cluster with cloud ID [nanites.cloud_id] by [key_name(host_mob)] at [AREACOORD(infectee)].", INVESTIGATE_NANITES) - to_chat(infectee, span_warning("You feel a tiny prick.")) - -/datum/nanite_program/mitosis - name = "Mitosis" - desc = "The nanites gain the ability to self-replicate, using bluespace to power the process. Becomes more effective the more nanites are already in the host; \ - For every 50 nanite volume in the host, the production rate is increased by 0.5. The replication has also a chance to corrupt the nanite programming \ - due to copy faults - constant cloud sync is highly recommended." - use_rate = 0 - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/mitosis/active_effect() - var/rep_rate = round(nanites.nanite_volume / 50, 1) //0.5 per 50 nanite volume - rep_rate *= 0.5 - nanites.adjust_nanites(null, rep_rate) - if(prob(rep_rate)) - var/datum/nanite_program/fault = pick(nanites.programs) - if(fault == src) - return - fault.software_error() - host_mob.investigate_log("[fault] nanite program received a software error due to Mitosis program.", INVESTIGATE_NANITES) - -/datum/nanite_program/dermal_button - name = "Dermal Button" - desc = "Displays a button on the host's skin, which can be used to send a signal to the nanites." - unique = FALSE - var/datum/action/innate/nanite_button/button - -/datum/nanite_program/dermal_button/register_extra_settings() - extra_settings[NES_SENT_CODE] = new /datum/nanite_extra_setting/number(1, 1, 9999) - extra_settings[NES_BUTTON_NAME] = new /datum/nanite_extra_setting/text("Button") - extra_settings[NES_ICON] = new /datum/nanite_extra_setting/type("power", list("blank","one","two","three","four","five","plus","minus","exclamation","question","cross","info","heart","skull","brain","brain_damage","injection","blood","shield","reaction","network","power","radioactive","electricity","magnetism","scan","repair","id","wireless","say","sleep","bomb")) - -/datum/nanite_program/dermal_button/enable_passive_effect() - . = ..() - var/datum/nanite_extra_setting/bn_name = extra_settings[NES_BUTTON_NAME] - var/datum/nanite_extra_setting/bn_icon = extra_settings[NES_ICON] - if(!button) - button = new(src, bn_name.get_value(), bn_icon.get_value()) - button.target = host_mob - button.Grant(host_mob) - -/datum/nanite_program/dermal_button/disable_passive_effect() - . = ..() - if(button) - button.Remove(host_mob) - -/datum/nanite_program/dermal_button/on_mob_remove() - . = ..() - QDEL_NULL(button) - -/datum/nanite_program/dermal_button/proc/press() - if(activated) - host_mob.visible_message(span_notice("[host_mob] presses a button on [host_mob.p_their()] forearm."), - span_notice("You press the nanite button on your forearm."), null, 2) - var/datum/nanite_extra_setting/sent_code = extra_settings[NES_SENT_CODE] - SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, sent_code.get_value(), "a [name] program") - -/datum/action/innate/nanite_button - name = "Button" - button_icon = 'icons/mob/actions/actions_items.dmi' - check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS - button_icon_state = "nanite_power" - var/datum/nanite_program/dermal_button/program - -/datum/action/innate/nanite_button/New(datum/nanite_program/dermal_button/_program, _name, _icon) - ..() - program = _program - name = _name - button_icon_state = "nanite_[_icon]" - -/datum/action/innate/nanite_button/Activate() - program.press() diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_programs/weapon.dm b/massmeta/code/datums/nanits/nanites_research/nanite_programs/weapon.dm deleted file mode 100644 index 2d25fbb256d34..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_programs/weapon.dm +++ /dev/null @@ -1,217 +0,0 @@ -//Programs specifically engineered to cause harm to either the user or its surroundings (as opposed to ones that only do it due to broken programming) -//Very dangerous! - -/datum/nanite_program/flesh_eating - name = "Cellular Breakdown" - desc = "The nanites destroy cellular structures in the host's body, causing brute damage." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/flesh_eating/active_effect() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - C.take_bodypart_damage(1, 0, 0) - else - host_mob.adjustBruteLoss(1, TRUE) - if(prob(3)) - to_chat(host_mob, span_warning("You feel a stab of pain from somewhere inside you.")) - -/datum/nanite_program/poison - name = "Poisoning" - desc = "The nanites deliver poisonous chemicals to the host's internal organs, causing toxin damage and vomiting." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/poison/active_effect() - host_mob.adjustToxLoss(1) - if(prob(2)) - to_chat(host_mob, span_warning("You feel nauseous.")) - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - C.vomit(20) - -/datum/nanite_program/memory_leak - name = "Memory Leak" - desc = "This program invades the memory space used by other programs, causing frequent corruptions and errors." - use_rate = 0 - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/memory_leak/active_effect() - if(prob(6)) - var/datum/nanite_program/target = pick(nanites.programs) - if(target == src) - return - target.software_error() - host_mob.investigate_log("[target] nanite program received a software error due to Memory Leak program.", INVESTIGATE_NANITES) - -/datum/nanite_program/aggressive_replication - name = "Aggressive Replication" - desc = "Nanites will consume organic matter to improve their replication rate, damaging the host. The efficiency increases with the volume of nanites, requiring 200 to break even, \ - and scaling linearly for a net positive of 0.1 production rate per 20 nanite volume beyond that." - use_rate = 1 - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/aggressive_replication/active_effect() - var/extra_regen = round(nanites.nanite_volume / 200, 0.1) - nanites.adjust_nanites(null, extra_regen) - host_mob.adjustBruteLoss(extra_regen / 2, TRUE) - -/datum/nanite_program/meltdown - name = "Meltdown" - desc = "Causes an internal meltdown inside the nanites, causing internal burns inside the host as well as rapidly destroying the nanite population.\ - Sets the nanites' safety threshold to 0 when activated." - use_rate = 10 - rogue_types = list(/datum/nanite_program/glitch) - -/datum/nanite_program/meltdown/active_effect() - host_mob.adjustFireLoss(3.5) - -/datum/nanite_program/meltdown/enable_passive_effect() - . = ..() - to_chat(host_mob, span_userdanger("Your blood is burning!")) - nanites.safety_threshold = 0 - -/datum/nanite_program/meltdown/disable_passive_effect() - . = ..() - to_chat(host_mob, span_warning("Your blood cools down, and the pain gradually fades.")) - -/datum/nanite_program/explosive - name = "Chain Detonation" - desc = "Detonates all the nanites inside the host in a chain reaction when triggered." - can_trigger = TRUE - trigger_cost = 25 //plus every idle nanite left afterwards - trigger_cooldown = 100 //Just to avoid double-triggering - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/explosive/on_trigger(comm_message) - host_mob.visible_message(span_warning("[host_mob] starts emitting a high-pitched buzzing, and [host_mob.p_their()] skin begins to glow..."),\ - span_userdanger("You start emitting a high-pitched buzzing, and your skin begins to glow...")) - addtimer(CALLBACK(src, PROC_REF(boom)), clamp((nanites.nanite_volume * 0.35), 25, 150)) - -/datum/nanite_program/explosive/proc/boom() - dyn_explosion(host_mob, nanites.nanite_volume / 50) - qdel(nanites) - -//TODO make it defuse if triggered again - -/datum/nanite_program/heart_stop - name = "Heart-Stopper" - desc = "Stops the host's heart when triggered; restarts it if triggered again." - can_trigger = TRUE - trigger_cost = 12 - trigger_cooldown = 10 - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/heart_stop/on_trigger(comm_message) - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/obj/item/organ/internal/heart/heart = C.get_organ_slot(ORGAN_SLOT_HEART) - if(heart) - if(heart.beating) - heart.Stop() - else - heart.Restart() - -/datum/nanite_program/emp - name = "Electromagnetic Resonance" - desc = "The nanites cause an electromagnetic pulse around the host when triggered. Will corrupt other nanite programs!" - can_trigger = TRUE - trigger_cost = 10 - trigger_cooldown = 50 - program_flags = NANITE_EMP_IMMUNE - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/emp/on_trigger(comm_message) - empulse(host_mob, 1, 2) - -/datum/nanite_program/pyro - name = "Sub-Dermal Combustion" - desc = "The nanites cause buildup of flammable fluids under the host's skin, then ignites them." - use_rate = 4 - rogue_types = list(/datum/nanite_program/skin_decay, /datum/nanite_program/cryo) - -/datum/nanite_program/pyro/check_conditions() - if(host_mob.fire_stacks >= 10 && host_mob.on_fire) - return FALSE - return ..() - -/datum/nanite_program/pyro/active_effect() - host_mob.adjust_fire_stacks(1) - -/datum/nanite_program/cryo - name = "Cryogenic Treatment" - desc = "The nanites rapidly sink heat through the host's skin, lowering their temperature." - use_rate = 1 - rogue_types = list(/datum/nanite_program/skin_decay, /datum/nanite_program/pyro) - -/datum/nanite_program/cryo/check_conditions() - if(host_mob.bodytemperature <= 70) - return FALSE - return ..() - -/datum/nanite_program/cryo/active_effect() - host_mob.adjust_bodytemperature(-rand(15,25), 50) - -/datum/nanite_program/comm/mind_control - name = "Mind Control" - desc = "The nanites imprint an absolute directive onto the host's brain for one minute when triggered." - trigger_cost = 30 - trigger_cooldown = 1800 - rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) - var/directive - -/datum/nanite_program/comm/mind_control/register_extra_settings() - . = ..() - extra_settings[NES_DIRECTIVE] = new /datum/nanite_extra_setting/text("...") - -/datum/nanite_program/comm/mind_control/on_trigger(comm_message) - if(host_mob.stat == DEAD) - return - var/sent_directive = comm_message - if(!comm_message) - var/datum/nanite_extra_setting/ES = extra_settings[NES_DIRECTIVE] - sent_directive = ES.get_value() - directive = brainwash(host_mob, sent_directive, nanites.cloud_id ? "nanites in cloud [nanites.cloud_id]" : "nanites") - log_game("A mind control nanite program brainwashed [key_name(host_mob)] with the objective '[sent_directive]'.") - host_mob.log_message("has been brainwashed with the objective '[sent_directive]' triggered by a mind control nanite program.", LOG_ATTACK) - addtimer(CALLBACK(src, PROC_REF(end_brainwashing)), 5 MINUTES) - -/datum/nanite_program/comm/mind_control/proc/end_brainwashing() - unbrainwash(host_mob, directive) - log_game("[key_name(host_mob)] is no longer brainwashed by nanites.") - -/datum/nanite_program/comm/mind_control/disable_passive_effect() - . = ..() - end_brainwashing() - -/// Removes objectives from someone's brainwash. -/proc/unbrainwash(mob/living/victim, list/directives) - var/datum/antagonist/brainwashed/brainwash = victim?.mind?.has_antag_datum(/datum/antagonist/brainwashed) - if(!brainwash) - return FALSE - if(directives) - if(!isnull(directives) && !islist(directives)) - directives = list(directives) - var/list/removed_objectives = list() - for(var/D in directives) - var/datum/objective/directive - if(istype(D, /datum/weakref)) - var/datum/weakref/directive_weakref = D - directive = directive_weakref.resolve() - else if(istype(D, /datum/objective)) - directive = D - if(!directive || !istype(directive)) - continue - brainwash.objectives -= directive - removed_objectives += directive - log_admin("[key_name(victim)] had the following brainwashing objective[length(removed_objectives) > 1 ? "s" : ""] removed: [english_list(removed_objectives)].") - if(LAZYLEN(brainwash.objectives)) - to_chat(victim, span_userdanger("[length(removed_objectives) > 1 ? "Some" : "One"] of your Directives fade away! You only have to obey the remaining Directives now.")) - victim.mind.announce_objectives() - else - victim.mind.remove_antag_datum(/datum/antagonist/brainwashed) - QDEL_LIST(removed_objectives) - else - log_admin("[key_name(victim)] had all of their brainwashing objectives removed: [english_list(brainwash.objectives)].") - QDEL_LIST(brainwash.objectives) - victim.mind.remove_antag_datum(/datum/antagonist/brainwashed) diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_remote.dm b/massmeta/code/datums/nanits/nanites_research/nanite_remote.dm deleted file mode 100644 index 5ac8f8414c88b..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_remote.dm +++ /dev/null @@ -1,233 +0,0 @@ -#define REMOTE_MODE_OFF "Off" -#define REMOTE_MODE_SELF "Local" -#define REMOTE_MODE_TARGET "Targeted" -#define REMOTE_MODE_AOE "Area" -#define REMOTE_MODE_RELAY "Relay" - -/obj/item/nanite_remote - name = "nanite remote control" - desc = "A device that can remotely control active nanites through wireless signals." - w_class = WEIGHT_CLASS_SMALL - req_access = list(ACCESS_ROBOTICS) - icon = 'massmeta/icons/obj/machines/nanites.dmi' - icon_state = "nanite_remote" - item_flags = NOBLUDGEON - var/locked = FALSE //Can be locked, so it can be given to users with a set code and mode - var/mode = REMOTE_MODE_OFF - var/list/saved_settings = list() - var/last_id = 0 - var/code = 0 - var/relay_code = 0 - var/current_program_name = "Program" - -/obj/item/nanite_remote/examine(mob/user) - . = ..() - if(locked) - . += span_notice("Alt-click to unlock.") - -/obj/item/nanite_remote/AltClick(mob/user) - . = ..() - if(locked) - if(allowed(user)) - to_chat(user, span_notice("You unlock [src].")) - locked = FALSE - update_appearance() - else - to_chat(user, span_warning("Access denied.")) - -/obj/item/nanite_remote/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - to_chat(user, span_warning("You override [src]'s ID lock.")) - obj_flags |= EMAGGED - if(locked) - locked = FALSE - update_appearance() - -/obj/item/nanite_remote/update_overlays() - . = ..() - if(obj_flags & EMAGGED) - . += "nanite_remote_emagged" - if(locked) - . += "nanite_remote_locked" - -/obj/item/nanite_remote/afterattack(atom/target, mob/user, etc) - switch(mode) - if(REMOTE_MODE_OFF) - return - if(REMOTE_MODE_SELF) - to_chat(user, span_notice("You activate [src], signaling the nanites in your bloodstream.")) - signal_mob(user, code, key_name(user)) - if(REMOTE_MODE_TARGET) - if(isliving(target) && (get_dist(target, get_turf(src)) <= 7)) - to_chat(user, span_notice("You activate [src], signaling the nanites inside [target].")) - signal_mob(target, code, key_name(user)) - if(REMOTE_MODE_AOE) - to_chat(user, span_notice("You activate [src], signaling the nanites inside every host around you.")) - for(var/mob/living/L in view(user, 7)) - signal_mob(L, code, key_name(user)) - if(REMOTE_MODE_RELAY) - to_chat(user, span_notice("You activate [src], signaling all connected relay nanites.")) - signal_relay(code, relay_code, key_name(user)) - -/obj/item/nanite_remote/proc/signal_mob(mob/living/M, code, source) - SEND_SIGNAL(M, COMSIG_NANITE_SIGNAL, code, source) - -/obj/item/nanite_remote/proc/signal_relay(code, relay_code, source) - for(var/X in SSnanites.nanite_relays) - var/datum/nanite_program/relay/N = X - N.relay_signal(code, relay_code, source) - -/obj/item/nanite_remote/ui_state(mob/user) - return GLOB.hands_state - -/obj/item/nanite_remote/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteRemote", name) - ui.open() - -/obj/item/nanite_remote/ui_data() - var/list/data = list() - data["code"] = code - data["relay_code"] = relay_code - data["mode"] = mode - data["locked"] = locked - data["saved_settings"] = saved_settings - data["program_name"] = current_program_name - return data - -/obj/item/nanite_remote/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("set_code") - if(locked) - return - var/new_code = text2num(params["code"]) - if(!isnull(new_code)) - new_code = clamp(round(new_code, 1),0,9999) - code = new_code - . = TRUE - if("set_relay_code") - if(locked) - return - var/new_code = text2num(params["code"]) - if(!isnull(new_code)) - new_code = clamp(round(new_code, 1),0,9999) - relay_code = new_code - . = TRUE - if("update_name") - current_program_name = params["name"] - . = TRUE - if("save") - if(locked) - return - var/new_save = list() - new_save["id"] = last_id + 1 - last_id++ - new_save["name"] = current_program_name - new_save["code"] = code - new_save["mode"] = mode - new_save["relay_code"] = relay_code - - saved_settings += list(new_save) - . = TRUE - if("load") - var/code_id = params["save_id"] - var/list/setting - for(var/list/X in saved_settings) - if(X["id"] == text2num(code_id)) - setting = X - break - if(setting) - code = setting["code"] - mode = setting["mode"] - relay_code = setting["relay_code"] - . = TRUE - if("remove_save") - if(locked) - return - var/code_id = params["save_id"] - for(var/list/setting in saved_settings) - if(setting["id"] == text2num(code_id)) - saved_settings -= list(setting) - break - . = TRUE - if("select_mode") - if(locked) - return - mode = params["mode"] - . = TRUE - if("lock") - if(!(obj_flags & EMAGGED)) - locked = TRUE - update_appearance() - . = TRUE - - -/obj/item/nanite_remote/comm - name = "nanite communication remote" - desc = "A device that can send text messages to specific programs." - var/comm_message = "" - -/obj/item/nanite_remote/comm/afterattack(atom/target, mob/user, etc) - switch(mode) - if(REMOTE_MODE_OFF) - return - if(REMOTE_MODE_SELF) - to_chat(user, span_notice("You activate [src], signaling the nanites in your bloodstream.")) - signal_mob(user, code, key_name(user)) - if(REMOTE_MODE_TARGET) - if(isliving(target) && (get_dist(target, get_turf(src)) <= 7)) - to_chat(user, span_notice("You activate [src], signaling the nanites inside [target].")) - signal_mob(target, code, key_name(user)) - if(REMOTE_MODE_AOE) - to_chat(user, span_notice("You activate [src], signaling the nanites inside every host around you.")) - for(var/mob/living/L in view(user, 7)) - signal_mob(L, code, key_name(user)) - if(REMOTE_MODE_RELAY) - to_chat(user, span_notice("You activate [src], signaling all connected relay nanites.")) - signal_relay(code, relay_code, key_name(user)) - -/obj/item/nanite_remote/comm/signal_mob(mob/living/M, code, source) - SEND_SIGNAL(M, COMSIG_NANITE_COMM_SIGNAL, code, comm_message, source) - -/obj/item/nanite_remote/comm/signal_relay(code, relay_code, source) - for(var/X in SSnanites.nanite_relays) - var/datum/nanite_program/relay/N = X - N.relay_comm_signal(code, relay_code, comm_message) - -/obj/item/nanite_remote/comm/ui_data() - var/list/data = list() - data["comms"] = TRUE - data["code"] = code - data["relay_code"] = relay_code - data["message"] = comm_message - data["mode"] = mode - data["locked"] = locked - data["saved_settings"] = saved_settings - data["program_name"] = current_program_name - - return data - -/obj/item/nanite_remote/comm/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("set_message") - if(locked) - return - var/new_message = html_encode(params["value"]) - if(!new_message) - return - comm_message = new_message - . = TRUE - -#undef REMOTE_MODE_OFF -#undef REMOTE_MODE_SELF -#undef REMOTE_MODE_TARGET -#undef REMOTE_MODE_AOE -#undef REMOTE_MODE_RELAY diff --git a/massmeta/code/datums/nanits/nanites_research/nanite_scaner.dm b/massmeta/code/datums/nanits/nanites_research/nanite_scaner.dm deleted file mode 100644 index e7aea20818494..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/nanite_scaner.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/item/nanite_scanner - name = "nanite scanner" - icon = 'massmeta/icons/obj/machines/nanites.dmi' - icon_state = "nanite_scanner" - worn_icon_state = "electronic" - desc = "A hand-held body scanner able to detect nanites and their programming." - item_flags = NOBLUDGEON - slot_flags = ITEM_SLOT_BELT - throwforce = 3 - w_class = WEIGHT_CLASS_TINY - throw_speed = 3 - throw_range = 7 - custom_materials = list(/datum/material/iron=200) - -/obj/item/nanite_scanner/attack(mob/living/M, mob/living/carbon/human/user) - user.visible_message(span_notice("[user] analyzes [M]'s nanites."), \ - span_notice("You analyze [M]'s nanites.")) - - add_fingerprint(user) - - var/response = SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, TRUE) - if(!response) - to_chat(user, span_info("No nanites detected in the subject.")) diff --git a/massmeta/code/datums/nanits/nanites_research/program_disk.dm b/massmeta/code/datums/nanits/nanites_research/program_disk.dm deleted file mode 100644 index 02f6d7cc280bc..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/program_disk.dm +++ /dev/null @@ -1,133 +0,0 @@ -//Names are intentionally all the same - track your nanites, or use a hand labeler -//This also means that you can give flesh melting nanites to your victims if you feel like it - -/obj/item/disk/nanite_program - name = "nanite program disk" - desc = "A disk capable of storing nanite programs. Can be customized using a Nanite Programming Console." - var/program_type - var/datum/nanite_program/program - -/obj/item/disk/nanite_program/Initialize() - . = ..() - if(program_type) - program = new program_type - -/obj/item/disk/nanite_program/aggressive_replication - program_type = /datum/nanite_program/aggressive_replication - -/obj/item/disk/nanite_program/metabolic_synthesis - program_type = /datum/nanite_program/metabolic_synthesis - -/obj/item/disk/nanite_program/viral - program_type = /datum/nanite_program/viral - -/obj/item/disk/nanite_program/meltdown - program_type = /datum/nanite_program/meltdown - -/obj/item/disk/nanite_program/monitoring - program_type = /datum/nanite_program/monitoring - -/obj/item/disk/nanite_program/relay - program_type = /datum/nanite_program/relay - -/obj/item/disk/nanite_program/emp - program_type = /datum/nanite_program/emp - -/obj/item/disk/nanite_program/spreading - program_type = /datum/nanite_program/spreading - -/obj/item/disk/nanite_program/regenerative - program_type = /datum/nanite_program/regenerative - -/obj/item/disk/nanite_program/regenerative_advanced - program_type = /datum/nanite_program/regenerative_advanced - -/obj/item/disk/nanite_program/temperature - program_type = /datum/nanite_program/temperature - -/obj/item/disk/nanite_program/purging - program_type = /datum/nanite_program/purging - -/obj/item/disk/nanite_program/purging_advanced - program_type = /datum/nanite_program/purging_advanced - -/obj/item/disk/nanite_program/brain_heal - program_type = /datum/nanite_program/brain_heal - -/obj/item/disk/nanite_program/brain_heal_advanced - program_type = /datum/nanite_program/brain_heal_advanced - -/obj/item/disk/nanite_program/blood_restoring - program_type = /datum/nanite_program/blood_restoring - -/obj/item/disk/nanite_program/repairing - program_type = /datum/nanite_program/repairing - -/obj/item/disk/nanite_program/nervous - program_type = /datum/nanite_program/nervous - -/obj/item/disk/nanite_program/hardening - program_type = /datum/nanite_program/hardening - -/obj/item/disk/nanite_program/coagulating - program_type = /datum/nanite_program/coagulating - -/obj/item/disk/nanite_program/necrotic - program_type = /datum/nanite_program/necrotic - -/obj/item/disk/nanite_program/brain_decay - program_type = /datum/nanite_program/brain_decay - -/obj/item/disk/nanite_program/pyro - program_type = /datum/nanite_program/pyro - -/obj/item/disk/nanite_program/cryo - program_type = /datum/nanite_program/cryo - -/obj/item/disk/nanite_program/toxic - program_type = /datum/nanite_program/toxic - -/obj/item/disk/nanite_program/suffocating - program_type = /datum/nanite_program/suffocating - -/obj/item/disk/nanite_program/heart_stop - program_type = /datum/nanite_program/heart_stop - -/obj/item/disk/nanite_program/explosive - program_type = /datum/nanite_program/explosive - -/obj/item/disk/nanite_program/shock - program_type = /datum/nanite_program/shocking - -/obj/item/disk/nanite_program/sleepy - program_type = /datum/nanite_program/sleepy - -/obj/item/disk/nanite_program/paralyzing - program_type = /datum/nanite_program/paralyzing - -/obj/item/disk/nanite_program/fake_death - program_type = /datum/nanite_program/fake_death - -/obj/item/disk/nanite_program/pacifying - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/glitch - program_type = /datum/nanite_program/glitch - -/obj/item/disk/nanite_program/brain_misfire - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/skin_decay - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/nerve_decay - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/refractive - program_type = /datum/nanite_program/refractive - -/obj/item/disk/nanite_program/conductive - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/stun - program_type = /datum/nanite_program/stun diff --git a/massmeta/code/datums/nanits/nanites_research/public_chamber.dm b/massmeta/code/datums/nanits/nanites_research/public_chamber.dm deleted file mode 100644 index 6ed1e7be49cbe..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/public_chamber.dm +++ /dev/null @@ -1,206 +0,0 @@ -/obj/machinery/public_nanite_chamber - name = "public nanite chamber" - desc = "A device that can rapidly implant cloud-synced nanites without an external operator." - circuit = /obj/item/circuitboard/machine/public_nanite_chamber - icon = 'massmeta/icons/obj/machines/nanites.dmi' - icon_state = "nanite_chamber" - base_icon_state = "nanite_chamber" - layer = ABOVE_WINDOW_LAYER - use_power = IDLE_POWER_USE - anchored = TRUE - density = TRUE - obj_flags = BLOCKS_CONSTRUCTION // Becomes undense when the door is open - idle_power_usage = 50 - active_power_usage = 300 - - var/cloud_id = 1 - var/locked = FALSE - var/breakout_time = 1200 - var/busy = FALSE - var/busy_icon_state - var/message_cooldown = 0 - -/obj/machinery/public_nanite_chamber/Initialize() - . = ..() - occupant_typecache = GLOB.typecache_living - -/obj/machinery/public_nanite_chamber/RefreshParts() - . = ..() - var/obj/item/circuitboard/machine/public_nanite_chamber/board = circuit - if(board) - cloud_id = board.cloud_id - -/obj/machinery/public_nanite_chamber/proc/set_busy(status, working_icon) - busy = status - busy_icon_state = working_icon - update_appearance() - -/obj/machinery/public_nanite_chamber/proc/inject_nanites(mob/living/attacker) - if(machine_stat & (NOPOWER|BROKEN)) - return - if((machine_stat & MAINT) || panel_open) - return - if(!occupant || busy) - return - - var/locked_state = locked - locked = TRUE - - //TODO OMINOUS MACHINE SOUNDS - set_busy(TRUE, "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_active"),20) - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_falling"),60) - addtimer(CALLBACK(src, PROC_REF(complete_injection), locked_state, attacker),80) - -/obj/machinery/public_nanite_chamber/proc/complete_injection(locked_state, mob/living/attacker) - //TODO MACHINE DING - locked = locked_state - set_busy(FALSE) - if(!occupant) - return - if(attacker) - occupant.investigate_log("was injected with nanites with cloud ID [cloud_id] by [key_name(attacker)] using [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - log_combat(attacker, occupant, "injected", null, "with nanites via [src]") - occupant.AddComponent(/datum/component/nanites, 75, cloud_id) - -/obj/machinery/public_nanite_chamber/proc/change_cloud(mob/living/attacker) - if(machine_stat & (NOPOWER|BROKEN)) - return - if((machine_stat & MAINT) || panel_open) - return - if(!occupant || busy) - return - - var/locked_state = locked - locked = TRUE - - set_busy(TRUE, "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_active"),20) - addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_falling"),40) - addtimer(CALLBACK(src, PROC_REF(complete_cloud_change), locked_state, attacker),60) - -/obj/machinery/public_nanite_chamber/proc/complete_cloud_change(locked_state, mob/living/attacker) - locked = locked_state - set_busy(FALSE) - if(!occupant) - return - if(attacker) - occupant.investigate_log("had their nanite cloud ID changed into [cloud_id] by [key_name(attacker)] using [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - SEND_SIGNAL(occupant, COMSIG_NANITE_SET_CLOUD, cloud_id) - -/obj/machinery/public_nanite_chamber/update_icon_state() - //running and someone in there - if(occupant) - icon_state = busy ? busy_icon_state : "[base_icon_state]_occupied" - return ..() - //running - icon_state = "[base_icon_state][state_open ? "_open" : null]" - return ..() - -/obj/machinery/public_nanite_chamber/update_overlays() - . = ..() - if((machine_stat & MAINT) || panel_open) - . += "maint" - return - if(machine_stat & (NOPOWER|BROKEN)) - return - - if(busy || locked) - . += "red" - if(locked) - . += "bolted" - return - . += "green" - -/obj/machinery/public_nanite_chamber/proc/toggle_open(mob/user) - if(panel_open) - to_chat(user, span_notice("Close the maintenance panel first.")) - return - - if(state_open) - close_machine(null, user) - return - - else if(locked) - to_chat(user, span_notice("The bolts are locked down, securing the door shut.")) - return - - open_machine() - -/obj/machinery/public_nanite_chamber/container_resist_act(mob/living/user) - if(!locked) - open_machine() - return - if(busy) - return - user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT - user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \ - span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \ - span_hear("You hear a metallic creaking from [src].")) - if(do_after(user,(breakout_time), target = src)) - if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked || busy) - return - locked = FALSE - user.visible_message(span_warning("[user] successfully broke out of [src]!"), \ - span_notice("You successfully break out of [src]!")) - open_machine() - -/obj/machinery/public_nanite_chamber/close_machine(mob/living/carbon/user, density_to_set) - if(!state_open) - return FALSE - - ..() - - . = TRUE - addtimer(CALLBACK(src, PROC_REF(try_inject_nanites), user), 30) //If someone is shoved in give them a chance to get out before the injection starts - -/obj/machinery/public_nanite_chamber/proc/try_inject_nanites(mob/living/attacker) - if(occupant) - var/mob/living/L = occupant - if(SEND_SIGNAL(L, COMSIG_HAS_NANITES)) - var/datum/component/nanites/nanites = L.GetComponent(/datum/component/nanites) - if(nanites && nanites.cloud_id != cloud_id) - change_cloud(attacker) - return - if(L.mob_biotypes & (MOB_ORGANIC | MOB_UNDEAD)) - inject_nanites(attacker) - -/obj/machinery/public_nanite_chamber/open_machine(drop, density_to_set) - if(state_open) - return FALSE - - ..() - - return TRUE - -/obj/machinery/public_nanite_chamber/relaymove(mob/living/user, direction) - if(user.stat || locked) - if(message_cooldown <= world.time) - message_cooldown = world.time + 50 - to_chat(user, span_warning("[src]'s door won't budge!")) - return - open_machine() - -/obj/machinery/public_nanite_chamber/attackby(obj/item/I, mob/user, params) - if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I))//sent icon_state is irrelevant... - update_appearance()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed - return - - if(default_pry_open(I)) - return - - if(default_deconstruction_crowbar(I)) - return - - return ..() - -/obj/machinery/public_nanite_chamber/interact(mob/user) - toggle_open(user) - -/obj/machinery/public_nanite_chamber/MouseDrop_T(mob/target, mob/user) - if(!Adjacent(target) || !user.Adjacent(target) || !iscarbon(target)) - return - if(close_machine(target, user)) - log_combat(user, target, "inserted", null, "into [src].") - add_fingerprint(user) diff --git a/massmeta/code/datums/nanits/nanites_research/rules.dm b/massmeta/code/datums/nanits/nanites_research/rules.dm deleted file mode 100644 index 79723ca5b0377..0000000000000 --- a/massmeta/code/datums/nanits/nanites_research/rules.dm +++ /dev/null @@ -1,148 +0,0 @@ -/datum/nanite_rule - var/name = "Generic Condition" - var/desc = "When triggered, the program is active" - var/datum/nanite_program/program - -/datum/nanite_rule/New(datum/nanite_program/new_program) - program = new_program - if(LAZYLEN(new_program.rules) <= 5) //Avoid infinite stacking rules - new_program.rules += src - else - qdel(src) - -/datum/nanite_rule/proc/remove() - program.rules -= src - program = null - qdel(src) - -/datum/nanite_rule/proc/check_rule() - return TRUE - -/datum/nanite_rule/proc/display() - return name - -/datum/nanite_rule/proc/copy_to(datum/nanite_program/new_program) - new type(new_program) - -/datum/nanite_rule/health - name = "Health" - desc = "Checks the host's health status." - - var/threshold = 50 - var/above = TRUE - -/datum/nanite_rule/health/check_rule() - var/health_percent = program.host_mob.health / program.host_mob.maxHealth * 100 - if(above) - if(health_percent >= threshold) - return TRUE - else - if(health_percent < threshold) - return TRUE - return FALSE - -/datum/nanite_rule/health/display() - return "[name] [above ? ">" : "<"] [threshold]%" - -/datum/nanite_rule/health/copy_to(datum/nanite_program/new_program) - var/datum/nanite_rule/health/rule = new(new_program) - rule.above = above - rule.threshold = threshold - -//TODO allow inversion -/datum/nanite_rule/crit - name = "Crit" - desc = "Checks if the host is in critical condition." - -/datum/nanite_rule/crit/check_rule() - return HAS_TRAIT(program.host_mob, TRAIT_CRITICAL_CONDITION) - - -/datum/nanite_rule/death - name = "Death" - desc = "Checks if the host is dead." - -/datum/nanite_rule/death/check_rule() - if(program.host_mob.stat == DEAD || HAS_TRAIT(program.host_mob, TRAIT_FAKEDEATH)) - return TRUE - return FALSE - -/datum/nanite_rule/cloud_sync - name = "Cloud Sync" - desc = "Checks if the nanites have cloud sync enabled or disabled." - var/check_type = "Enabled" - -/datum/nanite_rule/cloud_sync/check_rule() - if(check_type == "Enabled") - return program.nanites.cloud_active - else - return !program.nanites.cloud_active - -/datum/nanite_rule/cloud_sync/copy_to(datum/nanite_program/new_program) - var/datum/nanite_rule/cloud_sync/rule = new(new_program) - rule.check_type = check_type - -/datum/nanite_rule/cloud_sync/display() - return "[name]:[check_type]" - -/datum/nanite_rule/nanites - name = "Nanite Volume" - desc = "Checks the host's nanite volume." - - var/threshold = 50 - var/above = TRUE - -/datum/nanite_rule/nanites/check_rule() - var/nanite_percent = (program.nanites.nanite_volume - program.nanites.safety_threshold)/(program.nanites.max_nanites - program.nanites.safety_threshold)*100 - if(above) - if(nanite_percent >= threshold) - return TRUE - else - if(nanite_percent < threshold) - return TRUE - return FALSE - -/datum/nanite_rule/nanites/copy_to(datum/nanite_program/new_program) - var/datum/nanite_rule/nanites/rule = new(new_program) - rule.above = above - rule.threshold = threshold - -/datum/nanite_rule/nanites/display() - return "[name] [above ? ">" : "<"] [threshold]%" - -/datum/nanite_rule/damage - name = "Damage" - desc = "Checks the host's damage." - - var/threshold = 50 - var/above = TRUE - var/damage_type = BRUTE - -/datum/nanite_rule/damage/check_rule() - var/damage_amt = 0 - switch(damage_type) - if(BRUTE) - damage_amt = program.host_mob.getBruteLoss() - if(BURN) - damage_amt = program.host_mob.getFireLoss() - if(TOX) - damage_amt = program.host_mob.getToxLoss() - if(OXY) - damage_amt = program.host_mob.getOxyLoss() - - if(above) - if(damage_amt >= threshold) - return TRUE - else - if(damage_amt < threshold) - return TRUE - return FALSE - -/datum/nanite_rule/damage/copy_to(datum/nanite_program/new_program) - var/datum/nanite_rule/damage/rule = new(new_program) - rule.above = above - rule.threshold = threshold - rule.damage_type = damage_type - -/datum/nanite_rule/damage/display() - return "[damage_type] [above ? ">" : "<"] [threshold]" diff --git a/massmeta/code/datums/nanits/nanites_techweb.dm b/massmeta/code/datums/nanits/nanites_techweb.dm deleted file mode 100644 index 4fbda43372f3e..0000000000000 --- a/massmeta/code/datums/nanits/nanites_techweb.dm +++ /dev/null @@ -1,180 +0,0 @@ -/datum/techweb_node/nanite_base - id = "nanite_base" - display_name = "Basic Nanite Programming" - description = "The basics of nanite construction and programming." - prereq_ids = list("datatheory") - design_ids = list( - "access_nanites", - "debugging_nanites", - "monitoring_nanites", - "nanite_chamber", - "nanite_chamber_control", - "nanite_cloud_control", - "nanite_comm_remote", - "nanite_disk", - "nanite_program_hub", - "nanite_programmer", - "nanite_remote", - "nanite_scanner", - "public_nanite_chamber", - "relay_nanites", - "relay_repeater_nanites", - "repairing_nanites", - "repeater_nanites", - "sensor_nanite_volume", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) - -/datum/techweb_node/nanite_smart - id = "nanite_smart" - display_name = "Smart Nanite Programming" - description = "Nanite programs that require nanites to perform complex actions, act independently, roam or seek targets." - prereq_ids = list("nanite_base","robotics") - design_ids = list( - "memleak_nanites", - "metabolic_nanites", - "purging_nanites", - "sensor_voice_nanites", - "stealth_nanites", - "voice_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500, TECHWEB_POINT_TYPE_NANITES = 500) - -/datum/techweb_node/nanite_mesh - id = "nanite_mesh" - display_name = "Mesh Nanite Programming" - description = "Nanite programs that require static structures and membranes." - prereq_ids = list("nanite_base","engineering") - design_ids = list( - "conductive_nanites", - "cryo_nanites", - "dermal_button_nanites", - "emp_nanites", - "hardening_nanites", - "refractive_nanites", - "shock_nanites", - "temperature_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500, TECHWEB_POINT_TYPE_NANITES = 500) - -/datum/techweb_node/nanite_bio - id = "nanite_bio" - display_name = "Biological Nanite Programming" - description = "Nanite programs that require complex biological interaction." - prereq_ids = list("nanite_base","biotech") - design_ids = list( - "bloodheal_nanites", - "coagulating_nanites", - "flesheating_nanites", - "poison_nanites", - "regenerative_nanites", - "sensor_crit_nanites", - "sensor_damage_nanites", - "sensor_death_nanites", - "sensor_health_nanites", - "sensor_species_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500, TECHWEB_POINT_TYPE_NANITES = 500) - -/datum/techweb_node/nanite_neural - id = "nanite_neural" - display_name = "Neural Nanite Programming" - description = "Nanite programs affecting nerves and brain matter." - prereq_ids = list("nanite_bio") - design_ids = list( - "bad_mood_nanites", - "brainheal_nanites", - "good_mood_nanites", - "nervous_nanites", - "paralyzing_nanites", - "selfscan_nanites", - "stun_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 1000) - -/datum/techweb_node/nanite_synaptic - id = "nanite_synaptic" - display_name = "Synaptic Nanite Programming" - description = "Nanite programs affecting mind and thoughts." - prereq_ids = list("nanite_neural","neural_programming") - design_ids = list( - "blinding_nanites", - "hallucination_nanites", - "mindshield_nanites", - "mute_nanites", - "pacifying_nanites", - "sleep_nanites", - "speech_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 1000) - -/datum/techweb_node/nanite_harmonic - id = "nanite_harmonic" - display_name = "Harmonic Nanite Programming" - description = "Nanite programs that require seamless integration between nanites and biology. Passively increases nanite regeneration rate for all clouds upon researching." - prereq_ids = list("nanite_bio","nanite_smart","nanite_mesh") - design_ids = list( - "aggressive_nanites", - "brainheal_plus_nanites", - "defib_nanites", - "fakedeath_nanites", - "purging_plus_nanites", - "regenerative_plus_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000, TECHWEB_POINT_TYPE_NANITES = 3000) - -/datum/techweb_node/nanite_combat - id = "nanite_military" - display_name = "Military Nanite Programming" - description = "Nanite programs that perform military-grade functions." - prereq_ids = list("nanite_harmonic", "syndicate_basic") - design_ids = list( - "explosive_nanites", - "meltdown_nanites", - "nanite_sting_nanites", - "pyro_nanites", - "viral_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500, TECHWEB_POINT_TYPE_NANITES = 2500) - -/datum/techweb_node/nanite_hazard - id = "nanite_hazard" - display_name = "Hazard Nanite Programs" - description = "Extremely advanced Nanite programs with the potential of being extremely dangerous." - prereq_ids = list("nanite_harmonic", "alientech") - design_ids = list( - "mindcontrol_nanites", - "mitosis_nanites", - "spreading_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000, TECHWEB_POINT_TYPE_NANITES = 4000) - -/datum/techweb_node/nanite_replication_protocols - id = "nanite_replication_protocols" - display_name = "Nanite Replication Protocols" - description = "Protocols that overwrite the default nanite replication routine to achieve more efficiency in certain circumstances." - prereq_ids = list("nanite_smart") - design_ids = list( - "factory_nanites", - "kickstart_nanites", - "offline_nanites", - "pyramid_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 2500) - hidden = TRUE - experimental = TRUE - -/datum/techweb_node/nanite_storage_protocols - id = "nanite_storage_protocols" - display_name = "Nanite Storage Protocols" - description = "Protocols that overwrite the default nanite storage routine to achieve more efficiency or greater capacity." - prereq_ids = list("nanite_smart") - design_ids = list( - "free_range_nanites", - "hive_nanites", - "unsafe_storage_nanites", - "zip_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 2500) - hidden = TRUE - experimental = TRUE diff --git a/massmeta/icons/mob/huds/hud.dmi b/massmeta/icons/mob/huds/hud.dmi deleted file mode 100644 index c9f4f507c70a6519ca5b9b9e51e17d6a7bb7d85f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 407 zcmV;I0cie-P)x0001rNkls&(i?I^LvA;?;bp^o&@PmHK)*UV@HyaHJ!!D@yZ^WkBI0=+Faw0+ z?gatqtU&?n46F#~9?`v|Q9x``8?kC?LqLFj4=%-DE-ovK1N8s^002ovPDHLkV1kA` Bq!<7I diff --git a/massmeta/icons/obj/machines/nanites.dmi b/massmeta/icons/obj/machines/nanites.dmi deleted file mode 100644 index e0dd4871d500c735c07acc4e859d7f5e0d3a56bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22441 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%0Dy%KZHrH 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 ZTECr05hTi`14r { - return ( - - - - - - ); -}; - -export const NaniteChamberControlContent = (props, context) => { - const { act, data } = useBackend(context); - const { - status_msg, - locked, - occupant_name, - has_nanites, - nanite_volume, - regen_rate, - safety_threshold, - cloud_id, - scan_level, - } = data; - - if (status_msg) { - return {status_msg}; - } - - const mob_programs = data.mob_programs || []; - - return ( -
act('toggle_lock')} - /> - } - > - {!has_nanites ? ( - <> - - No Nanites Detected - -
- ); -}; diff --git a/tgui/packages/tgui/interfaces/NaniteCloudControl.jsx b/tgui/packages/tgui/interfaces/NaniteCloudControl.jsx deleted file mode 100644 index dc6ee160de8ee..0000000000000 --- a/tgui/packages/tgui/interfaces/NaniteCloudControl.jsx +++ /dev/null @@ -1,328 +0,0 @@ -import { useBackend } from '../backend'; -import { - Box, - Button, - Collapsible, - Grid, - LabeledList, - NoticeBox, - NumberInput, - Section, -} from '../components'; -import { Window } from '../layouts'; - -export const NaniteDiskBox = (props, context) => { - const { data } = useBackend(context); - const { has_disk, has_program, disk } = data; - if (!has_disk) { - return No disk inserted; - } - if (!has_program) { - return Inserted disk has no program; - } - return ; -}; - -export const NaniteInfoBox = (props, context) => { - const { program } = props; - const { - name, - desc, - activated, - use_rate, - can_trigger, - trigger_cost, - trigger_cooldown, - activation_code, - deactivation_code, - kill_code, - trigger_code, - timer_restart, - timer_shutdown, - timer_trigger, - timer_trigger_delay, - } = program; - const extra_settings = program.extra_settings || []; - return ( -
- {activated ? 'Activated' : 'Deactivated'} - - } - > - - {desc} - - - {use_rate} - {!!can_trigger && ( - <> - - {trigger_cost} - - - {trigger_cooldown} - - - )} - - - - - -
- - - {activation_code} - - - {deactivation_code} - - {kill_code} - {!!can_trigger && ( - - {trigger_code} - - )} - -
-
- -
- - - {timer_restart} s - - - {timer_shutdown} s - - {!!can_trigger && ( - <> - - {timer_trigger} s - - - {timer_trigger_delay} s - - - )} - -
-
-
-
- - {extra_settings.map((setting) => { - const naniteTypesDisplayMap = { - number: ( - <> - {setting.value} - {setting.unit} - - ), - text: setting.value, - type: setting.value, - boolean: setting.value ? setting.true_text : setting.false_text, - }; - return ( - - {naniteTypesDisplayMap[setting.type]} - - ); - })} - -
-
- ); -}; - -export const NaniteCloudBackupList = (props, context) => { - const { act, data } = useBackend(context); - const cloud_backups = data.cloud_backups || []; - return cloud_backups.map((backup) => ( -