diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index 2f270e6861..f104c10fb0 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -292,6 +292,7 @@
//Nanites
#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found
+#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth
#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list
#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount
#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount
diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm
index 9a18609060..e1c96121c7 100644
--- a/code/datums/components/nanites.dm
+++ b/code/datums/components/nanites.dm
@@ -1,315 +1,320 @@
-/datum/component/nanites
- dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
-
- var/mob/living/host_mob
- var/nanite_volume = 50 //amount of nanites in the system, used as fuel for nanite programs
- var/max_nanites = 250 //maximum amount of nanites in the system
- var/regen_rate = 0.5 //nanites generated per second
- var/safety_threshold = 25 //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/next_sync = 0
- var/list/datum/nanite_program/programs = list()
- var/max_programs = NANITE_PROGRAM_LIMIT
-
- var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans
- var/diagnostics = TRUE //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(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes)) //Shouldn't happen, but this avoids HUD runtimes in case a silicon gets them somehow.
- return COMPONENT_INCOMPATIBLE
-
- host_mob.hud_set_nanite_indicator()
- START_PROCESSING(SSnanites, src)
-
- if(cloud_id)
- cloud_sync()
-
-/datum/component/nanites/RegisterWithParent()
- . = ..()
- RegisterSignal(parent, COMSIG_HAS_NANITES, .proc/confirm_nanites)
- RegisterSignal(parent, COMSIG_NANITE_UI_DATA, .proc/nanite_ui_data)
- RegisterSignal(parent, COMSIG_NANITE_GET_PROGRAMS, .proc/get_programs)
- RegisterSignal(parent, COMSIG_NANITE_SET_VOLUME, .proc/set_volume)
- RegisterSignal(parent, COMSIG_NANITE_ADJUST_VOLUME, .proc/adjust_nanites)
- RegisterSignal(parent, COMSIG_NANITE_SET_MAX_VOLUME, .proc/set_max_volume)
- RegisterSignal(parent, COMSIG_NANITE_SET_CLOUD, .proc/set_cloud)
- RegisterSignal(parent, COMSIG_NANITE_SET_SAFETY, .proc/set_safety)
- RegisterSignal(parent, COMSIG_NANITE_SET_REGEN, .proc/set_regen)
- RegisterSignal(parent, COMSIG_NANITE_ADD_PROGRAM, .proc/add_program)
- RegisterSignal(parent, COMSIG_NANITE_SCAN, .proc/nanite_scan)
- RegisterSignal(parent, COMSIG_NANITE_SYNC, .proc/sync)
- RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp)
-
- if(isliving(parent))
- RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/on_death)
- RegisterSignal(parent, COMSIG_MOB_ALLOWED, .proc/check_access)
- RegisterSignal(parent, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_shock)
- RegisterSignal(parent, COMSIG_LIVING_MINOR_SHOCK, .proc/on_minor_shock)
- RegisterSignal(parent, COMSIG_SPECIES_GAIN, .proc/check_viable_biotype)
- RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal)
- RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, .proc/receive_comm_signal)
-
-/datum/component/nanites/UnregisterFromParent()
- . = ..()
- UnregisterSignal(parent, list(COMSIG_HAS_NANITES,
- 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_SAFETY,
- COMSIG_NANITE_SET_REGEN,
- COMSIG_NANITE_ADD_PROGRAM,
- COMSIG_NANITE_SCAN,
- COMSIG_NANITE_SYNC,
- COMSIG_ATOM_EMP_ACT,
- COMSIG_MOB_DEATH,
- COMSIG_MOB_ALLOWED,
- 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)
- set_nanite_bar(TRUE)
- QDEL_LIST(programs)
- if(host_mob)
- host_mob.hud_set_nanite_indicator()
- host_mob = null
- return ..()
-
-/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, list/arguments)
- if(new_nanites)
- adjust_nanites(null, new_nanites.nanite_volume)
- else
- adjust_nanites(null, arguments[1]) //just add to the nanite volume
-
-/datum/component/nanites/process()
- adjust_nanites(null, regen_rate)
- for(var/X in programs)
- var/datum/nanite_program/NP = X
- NP.on_process()
- set_nanite_bar()
- if(cloud_id && world.time > next_sync)
- cloud_sync()
- next_sync = world.time + NANITE_SYNC_DELAY
-
-//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)
- 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())
-
-/datum/component/nanites/proc/cloud_sync()
- if(!cloud_id)
- return
- 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)
-
-/datum/component/nanites/proc/add_program(datum/source, datum/nanite_program/new_program, datum/nanite_program/source_program)
- 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)
-
-/datum/component/nanites/proc/adjust_nanites(datum/source, amount)
- nanite_volume = CLAMP(nanite_volume + amount, 0, max_nanites)
- if(nanite_volume <= 0) //oops we ran out
- qdel(src)
-
-/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)
- adjust_nanites(null, -(nanite_volume * 0.3 + 50)) //Lose 30% variable and 50 flat nanite volume.
- 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)
- adjust_nanites(null, -(nanite_volume * (shock_damage * 0.005) + shock_damage)) //0.5% of shock damage (@ 50 damage it'd drain 25%) + shock damage flat 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)
- adjust_nanites(null, -25)
- for(var/X in programs)
- var/datum/nanite_program/NP = X
- NP.on_minor_shock()
-
-/datum/component/nanites/proc/on_death(datum/source, gibbed)
- 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")
- 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")
- for(var/X in programs)
- if(istype(X, /datum/nanite_program/triggered/comm))
- var/datum/nanite_program/triggered/comm/NP = X
- NP.receive_comm_signal(comm_code, comm_message, comm_source)
-
-/datum/component/nanites/proc/check_viable_biotype()
- if(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes))
- qdel(src) //bodytype no longer sustains nanites
-
-/datum/component/nanites/proc/check_access(datum/source, obj/O)
- for(var/datum/nanite_program/triggered/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)
- nanite_volume = CLAMP(amount, 0, max_nanites)
-
-/datum/component/nanites/proc/set_max_volume(datum/source, amount)
- max_nanites = max(1, max_nanites)
-
-/datum/component/nanites/proc/set_cloud(datum/source, amount)
- cloud_id = CLAMP(amount, 0, 100)
-
-/datum/component/nanites/proc/set_safety(datum/source, amount)
- safety_threshold = CLAMP(amount, 0, max_nanites)
-
-/datum/component/nanites/proc/set_regen(datum/source, amount)
- regen_rate = amount
-
-/datum/component/nanites/proc/confirm_nanites()
- return TRUE //yup i exist
-
-/datum/component/nanites/proc/get_data(list/nanite_data)
- nanite_data["nanite_volume"] = nanite_volume
- nanite_data["max_nanites"] = max_nanites
- nanite_data["cloud_id"] = cloud_id
- nanite_data["regen_rate"] = regen_rate
- nanite_data["safety_threshold"] = safety_threshold
- nanite_data["stealth"] = stealth
-
-/datum/component/nanites/proc/get_programs(datum/source, list/nanite_programs)
- nanite_programs |= programs
-
-/datum/component/nanites/proc/nanite_scan(datum/source, mob/user, full_scan)
- if(!full_scan)
- if(!stealth)
- to_chat(user, "Nanites Detected")
- to_chat(user, "Saturation: [nanite_volume]/[max_nanites]")
- return TRUE
- else
- to_chat(user, "NANITES DETECTED")
- to_chat(user, "================")
- to_chat(user, "Saturation: [nanite_volume]/[max_nanites]")
- to_chat(user, "Safety Threshold: [safety_threshold]")
- to_chat(user, "Cloud ID: [cloud_id ? cloud_id : "Disabled"]")
- to_chat(user, "================")
- to_chat(user, "Program List:")
- if(!diagnostics)
- to_chat(user, "Diagnostics Disabled")
- else
- for(var/X in programs)
- var/datum/nanite_program/NP = X
- to_chat(user, "[NP.name] | [NP.activated ? "Active" : "Inactive"]")
- return TRUE
-
-/datum/component/nanites/proc/nanite_ui_data(datum/source, list/data, scan_level)
- data["has_nanites"] = TRUE
- data["nanite_volume"] = nanite_volume
- data["regen_rate"] = regen_rate
- data["safety_threshold"] = safety_threshold
- data["cloud_id"] = cloud_id
- 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["activation_delay"] = P.activation_delay
- mob_program["timer"] = P.timer
- mob_program["timer_type"] = P.get_timer_type_text()
- var/list/extra_settings = list()
- for(var/Y in P.extra_settings)
- var/list/setting = list()
- setting["name"] = Y
- setting["value"] = P.get_extra_setting(Y)
- extra_settings += list(setting)
- mob_program["extra_settings"] = extra_settings
- if(LAZYLEN(extra_settings))
- mob_program["has_extra_settings"] = TRUE
-
- 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
- id++
- mob_programs += list(mob_program)
- data["mob_programs"] = mob_programs
+/datum/component/nanites
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+
+ var/mob/living/host_mob
+ var/nanite_volume = 50 //amount of nanites in the system, used as fuel for nanite programs
+ var/max_nanites = 250 //maximum amount of nanites in the system
+ var/regen_rate = 0.5 //nanites generated per second
+ var/safety_threshold = 25 //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/next_sync = 0
+ var/list/datum/nanite_program/programs = list()
+ var/max_programs = NANITE_PROGRAM_LIMIT
+
+ var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans
+ var/diagnostics = TRUE //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(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes)) //Shouldn't happen, but this avoids HUD runtimes in case a silicon gets them somehow.
+ return COMPONENT_INCOMPATIBLE
+
+ host_mob.hud_set_nanite_indicator()
+ START_PROCESSING(SSnanites, src)
+
+ if(cloud_id)
+ cloud_sync()
+
+/datum/component/nanites/RegisterWithParent()
+ . = ..()
+ RegisterSignal(parent, COMSIG_HAS_NANITES, .proc/confirm_nanites)
+ RegisterSignal(parent, COMSIG_NANITE_IS_STEALTHY, .proc/check_stealth)
+ RegisterSignal(parent, COMSIG_NANITE_UI_DATA, .proc/nanite_ui_data)
+ RegisterSignal(parent, COMSIG_NANITE_GET_PROGRAMS, .proc/get_programs)
+ RegisterSignal(parent, COMSIG_NANITE_SET_VOLUME, .proc/set_volume)
+ RegisterSignal(parent, COMSIG_NANITE_ADJUST_VOLUME, .proc/adjust_nanites)
+ RegisterSignal(parent, COMSIG_NANITE_SET_MAX_VOLUME, .proc/set_max_volume)
+ RegisterSignal(parent, COMSIG_NANITE_SET_CLOUD, .proc/set_cloud)
+ RegisterSignal(parent, COMSIG_NANITE_SET_SAFETY, .proc/set_safety)
+ RegisterSignal(parent, COMSIG_NANITE_SET_REGEN, .proc/set_regen)
+ RegisterSignal(parent, COMSIG_NANITE_ADD_PROGRAM, .proc/add_program)
+ RegisterSignal(parent, COMSIG_NANITE_SCAN, .proc/nanite_scan)
+ RegisterSignal(parent, COMSIG_NANITE_SYNC, .proc/sync)
+ RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp)
+
+ if(isliving(parent))
+ RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/on_death)
+ RegisterSignal(parent, COMSIG_MOB_ALLOWED, .proc/check_access)
+ RegisterSignal(parent, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_shock)
+ RegisterSignal(parent, COMSIG_LIVING_MINOR_SHOCK, .proc/on_minor_shock)
+ RegisterSignal(parent, COMSIG_SPECIES_GAIN, .proc/check_viable_biotype)
+ RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal)
+ RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, .proc/receive_comm_signal)
+
+/datum/component/nanites/UnregisterFromParent()
+ . = ..()
+ UnregisterSignal(parent, list(COMSIG_HAS_NANITES,
+ COMSIG_NANITE_IS_STEALTHY,
+ 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_SAFETY,
+ COMSIG_NANITE_SET_REGEN,
+ COMSIG_NANITE_ADD_PROGRAM,
+ COMSIG_NANITE_SCAN,
+ COMSIG_NANITE_SYNC,
+ COMSIG_ATOM_EMP_ACT,
+ COMSIG_MOB_DEATH,
+ COMSIG_MOB_ALLOWED,
+ 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)
+ set_nanite_bar(TRUE)
+ QDEL_LIST(programs)
+ if(host_mob)
+ host_mob.hud_set_nanite_indicator()
+ host_mob = null
+ return ..()
+
+/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, list/arguments)
+ if(new_nanites)
+ adjust_nanites(null, new_nanites.nanite_volume)
+ else
+ adjust_nanites(null, arguments[1]) //just add to the nanite volume
+
+/datum/component/nanites/process()
+ adjust_nanites(null, regen_rate)
+ for(var/X in programs)
+ var/datum/nanite_program/NP = X
+ NP.on_process()
+ set_nanite_bar()
+ if(cloud_id && world.time > next_sync)
+ cloud_sync()
+ next_sync = world.time + NANITE_SYNC_DELAY
+
+//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)
+ 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())
+
+/datum/component/nanites/proc/cloud_sync()
+ if(!cloud_id)
+ return
+ 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)
+
+/datum/component/nanites/proc/add_program(datum/source, datum/nanite_program/new_program, datum/nanite_program/source_program)
+ 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)
+
+/datum/component/nanites/proc/adjust_nanites(datum/source, amount)
+ nanite_volume = CLAMP(nanite_volume + amount, 0, max_nanites)
+ if(nanite_volume <= 0) //oops we ran out
+ qdel(src)
+
+/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)
+ adjust_nanites(null, -(nanite_volume * 0.3 + 50)) //Lose 30% variable and 50 flat nanite volume.
+ 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)
+ adjust_nanites(null, -(nanite_volume * (shock_damage * 0.005) + shock_damage)) //0.5% of shock damage (@ 50 damage it'd drain 25%) + shock damage flat 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)
+ adjust_nanites(null, -25)
+ for(var/X in programs)
+ var/datum/nanite_program/NP = X
+ NP.on_minor_shock()
+
+/datum/component/nanites/proc/check_stealth(datum/source)
+ return stealth
+
+/datum/component/nanites/proc/on_death(datum/source, gibbed)
+ 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")
+ 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")
+ for(var/X in programs)
+ if(istype(X, /datum/nanite_program/triggered/comm))
+ var/datum/nanite_program/triggered/comm/NP = X
+ NP.receive_comm_signal(comm_code, comm_message, comm_source)
+
+/datum/component/nanites/proc/check_viable_biotype()
+ if(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes))
+ qdel(src) //bodytype no longer sustains nanites
+
+/datum/component/nanites/proc/check_access(datum/source, obj/O)
+ for(var/datum/nanite_program/triggered/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)
+ nanite_volume = CLAMP(amount, 0, max_nanites)
+
+/datum/component/nanites/proc/set_max_volume(datum/source, amount)
+ max_nanites = max(1, max_nanites)
+
+/datum/component/nanites/proc/set_cloud(datum/source, amount)
+ cloud_id = CLAMP(amount, 0, 100)
+
+/datum/component/nanites/proc/set_safety(datum/source, amount)
+ safety_threshold = CLAMP(amount, 0, max_nanites)
+
+/datum/component/nanites/proc/set_regen(datum/source, amount)
+ regen_rate = amount
+
+/datum/component/nanites/proc/confirm_nanites()
+ return TRUE //yup i exist
+
+/datum/component/nanites/proc/get_data(list/nanite_data)
+ nanite_data["nanite_volume"] = nanite_volume
+ nanite_data["max_nanites"] = max_nanites
+ nanite_data["cloud_id"] = cloud_id
+ nanite_data["regen_rate"] = regen_rate
+ nanite_data["safety_threshold"] = safety_threshold
+ nanite_data["stealth"] = stealth
+
+/datum/component/nanites/proc/get_programs(datum/source, list/nanite_programs)
+ nanite_programs |= programs
+
+/datum/component/nanites/proc/nanite_scan(datum/source, mob/user, full_scan)
+ if(!full_scan)
+ if(!stealth)
+ to_chat(user, "Nanites Detected")
+ to_chat(user, "Saturation: [nanite_volume]/[max_nanites]")
+ return TRUE
+ else
+ to_chat(user, "NANITES DETECTED")
+ to_chat(user, "================")
+ to_chat(user, "Saturation: [nanite_volume]/[max_nanites]")
+ to_chat(user, "Safety Threshold: [safety_threshold]")
+ to_chat(user, "Cloud ID: [cloud_id ? cloud_id : "Disabled"]")
+ to_chat(user, "================")
+ to_chat(user, "Program List:")
+ if(!diagnostics)
+ to_chat(user, "Diagnostics Disabled")
+ else
+ for(var/X in programs)
+ var/datum/nanite_program/NP = X
+ to_chat(user, "[NP.name] | [NP.activated ? "Active" : "Inactive"]")
+ return TRUE
+
+/datum/component/nanites/proc/nanite_ui_data(datum/source, list/data, scan_level)
+ data["has_nanites"] = TRUE
+ data["nanite_volume"] = nanite_volume
+ data["regen_rate"] = regen_rate
+ data["safety_threshold"] = safety_threshold
+ data["cloud_id"] = cloud_id
+ 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["activation_delay"] = P.activation_delay
+ mob_program["timer"] = P.timer
+ mob_program["timer_type"] = P.get_timer_type_text()
+ var/list/extra_settings = list()
+ for(var/Y in P.extra_settings)
+ var/list/setting = list()
+ setting["name"] = Y
+ setting["value"] = P.get_extra_setting(Y)
+ extra_settings += list(setting)
+ mob_program["extra_settings"] = extra_settings
+ if(LAZYLEN(extra_settings))
+ mob_program["has_extra_settings"] = TRUE
+
+ 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
+ id++
+ mob_programs += list(mob_program)
+ data["mob_programs"] = mob_programs
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index a6e4c8ed4f..0b9b02af75 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -239,7 +239,14 @@
mood_change = -3
timeout = 1000
+/datum/mood_event/nanite_sadness
+ description = "+++++++HAPPINESS SUPPRESSION+++++++\n"
+ mood_change = -7
/datum/mood_event/daylight_2
description = "I have been scorched by the unforgiving rays of the sun.\n"
mood_change = -6
timeout = 1200
+
+/datum/mood_event/nanite_sadness/add_effects(message)
+ description = "+++++++[message]+++++++\n"
+
diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm
index 94fd08535f..d0740b841b 100644
--- a/code/datums/mood_events/generic_positive_events.dm
+++ b/code/datums/mood_events/generic_positive_events.dm
@@ -139,6 +139,16 @@
mood_change = 2
timeout = 15 MINUTES
+/datum/mood_event/nanite_happiness
+ description = "+++++++HAPPINESS ENHANCEMENT+++++++\n"
+ mood_change = 7
+
+/datum/mood_event/nanite_happiness/add_effects(message)
+ description = "+++++++[message]+++++++\n"
+
+/datum/mood_event/area
+ description = "" //Fill this out in the area
+ mood_change = 0
//Power gamer stuff below
/datum/mood_event/drankblood
description = "I have fed greedly from that which nourishes me.\n"
diff --git a/code/modules/research/designs/nanite_designs.dm b/code/modules/research/designs/nanite_designs.dm
index 85e34e5234..13668ba570 100644
--- a/code/modules/research/designs/nanite_designs.dm
+++ b/code/modules/research/designs/nanite_designs.dm
@@ -380,7 +380,7 @@
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/mind_control
+ program_type = /datum/nanite_program/triggered/comm/mind_control
category = list("Weaponized Nanites")
////////////////////SUPPRESSION NANITES//////////////////////////////////////
@@ -462,6 +462,20 @@
program_type = /datum/nanite_program/triggered/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
diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm
index e2e1661ab7..3965b7b276 100644
--- a/code/modules/research/nanites/nanite_programs/healing.dm
+++ b/code/modules/research/nanites/nanite_programs/healing.dm
@@ -3,7 +3,7 @@
/datum/nanite_program/regenerative
name = "Accelerated Regeneration"
desc = "The nanites boost the host's natural regeneration, increasing their healing speed. Does not consume nanites if the host is unharmed."
- use_rate = 2.5
+ use_rate = 0.5
rogue_types = list(/datum/nanite_program/necrotic)
/datum/nanite_program/regenerative/check_conditions()
@@ -23,11 +23,11 @@
if(!parts.len)
return
for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(1/parts.len, 1/parts.len))
+ if(L.heal_damage(0.5/parts.len, 0.5/parts.len, null, BODYPART_ORGANIC))
host_mob.update_damage_overlays()
else
- host_mob.adjustBruteLoss(-1, TRUE)
- host_mob.adjustFireLoss(-1, TRUE)
+ host_mob.adjustBruteLoss(-0.5, TRUE)
+ host_mob.adjustFireLoss(-0.5, TRUE)
/datum/nanite_program/temperature
name = "Temperature Adjustment"
@@ -112,7 +112,7 @@
/datum/nanite_program/repairing
name = "Mechanical Repair"
desc = "The nanites fix damage in the host's mechanical limbs."
- use_rate = 0.5 //much more efficient than organic healing
+ use_rate = 0.5
rogue_types = list(/datum/nanite_program/necrotic)
/datum/nanite_program/repairing/check_conditions()
@@ -137,13 +137,13 @@
return
var/update = FALSE
for(var/obj/item/bodypart/L in parts)
- if(L.heal_damage(1/parts.len, 1/parts.len, only_robotic = TRUE, only_organic = FALSE))
+ if(L.heal_damage(1.5/parts.len, 1.5/parts.len, null, BODYPART_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)
+ host_mob.adjustBruteLoss(-1.5, TRUE)
+ host_mob.adjustFireLoss(-1.5, TRUE)
/datum/nanite_program/purging_advanced
name = "Selective Blood Purification"
diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm
index 300f54ba11..ad5706f88c 100644
--- a/code/modules/research/nanites/nanite_programs/suppression.dm
+++ b/code/modules/research/nanites/nanite_programs/suppression.dm
@@ -358,4 +358,64 @@
/datum/nanite_program/triggered/comm/hallucination/copy_extra_settings_to(datum/nanite_program/triggered/comm/hallucination/target)
target.hal_type = hal_type
target.hal_details = hal_details
- target.comm_code = comm_code
\ No newline at end of file
+ target.comm_code = comm_code
+
+/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)
+ extra_settings = list("Mood Message")
+ var/message = "HAPPINESS ENHANCEMENT"
+
+/datum/nanite_program/good_mood/set_extra_setting(user, setting)
+ if(setting == "Mood Message")
+ var/new_message = stripped_input(user, "Choose the message visible on the mood effect.", "Message", message, MAX_NAME_LEN)
+ if(!new_message)
+ return
+ message = new_message
+
+/datum/nanite_program/good_mood/get_extra_setting(setting)
+ if(setting == "Mood Message")
+ return message
+
+/datum/nanite_program/good_mood/copy_extra_settings_to(datum/nanite_program/good_mood/target)
+ target.message = message
+
+/datum/nanite_program/good_mood/enable_passive_effect()
+ . = ..()
+ SEND_SIGNAL(host_mob, COMSIG_ADD_MOOD_EVENT, "nanite_happy", /datum/mood_event/nanite_happiness, message)
+
+/datum/nanite_program/good_mood/disable_passive_effect()
+ . = ..()
+ SEND_SIGNAL(host_mob, COMSIG_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)
+ extra_settings = list("Mood Message")
+ var/message = "HAPPINESS SUPPRESSION"
+
+/datum/nanite_program/bad_mood/set_extra_setting(user, setting)
+ if(setting == "Mood Message")
+ var/new_message = stripped_input(user, "Choose the message visible on the mood effect.", "Message", message, MAX_NAME_LEN)
+ if(!new_message)
+ return
+ message = new_message
+
+/datum/nanite_program/bad_mood/get_extra_setting(setting)
+ if(setting == "Mood Message")
+ return message
+
+/datum/nanite_program/bad_mood/copy_extra_settings_to(datum/nanite_program/bad_mood/target)
+ target.message = message
+
+/datum/nanite_program/bad_mood/enable_passive_effect()
+ . = ..()
+ SEND_SIGNAL(host_mob, COMSIG_ADD_MOOD_EVENT, "nanite_sadness", /datum/mood_event/nanite_sadness, message)
+
+/datum/nanite_program/bad_mood/disable_passive_effect()
+ . = ..()
+ SEND_SIGNAL(host_mob, COMSIG_CLEAR_MOOD_EVENT, "nanite_sadness")
diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm
index 3e3ff52f47..46f5de168f 100644
--- a/code/modules/research/nanites/nanite_programs/utility.dm
+++ b/code/modules/research/nanites/nanite_programs/utility.dm
@@ -6,6 +6,7 @@
rogue_types = list(/datum/nanite_program/toxic)
extra_settings = list("Program Overwrite","Cloud Overwrite")
+ var/pulse_cooldown = 0
var/sync_programs = TRUE
var/sync_overwrite = FALSE
var/overwrite_cloud = FALSE
@@ -67,12 +68,16 @@
target.sync_overwrite = sync_overwrite
/datum/nanite_program/viral/active_effect()
+ if(world.time < pulse_cooldown)
+ return
for(var/mob/M in orange(host_mob, 5))
- if(prob(5))
- if(sync_programs)
- SEND_SIGNAL(M, COMSIG_NANITE_SYNC, nanites, sync_overwrite)
- if(overwrite_cloud)
- SEND_SIGNAL(M, COMSIG_NANITE_SET_CLOUD, set_cloud)
+ if(SEND_SIGNAL(M, COMSIG_NANITE_IS_STEALTHY))
+ continue
+ if(sync_programs)
+ SEND_SIGNAL(M, COMSIG_NANITE_SYNC, nanites, sync_overwrite)
+ if(overwrite_cloud)
+ SEND_SIGNAL(M, COMSIG_NANITE_SET_CLOUD, set_cloud)
+ pulse_cooldown = world.time + 75
/datum/nanite_program/monitoring
name = "Monitoring"
@@ -257,26 +262,27 @@
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(prob(10))
- var/list/mob/living/target_hosts = list()
- var/turf/T = get_turf(host_mob)
- for(var/mob/living/L in range(5, host_mob))
- if(!(MOB_ORGANIC in L.mob_biotypes) && !(MOB_UNDEAD in L.mob_biotypes))
- continue
- if(!disease_air_spread_walk(T, get_turf(L)))
- continue
- target_hosts += L
- target_hosts -= host_mob
- if(!target_hosts.len)
- return
- var/mob/living/infectee = pick(target_hosts)
- if(prob(100 - (infectee.get_permeability_protection() * 100)))
- //this will potentially take over existing nanites!
- infectee.AddComponent(/datum/component/nanites, 10)
- SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites)
- infectee.investigate_log("[key_name(infectee)] was infected by spreading nanites by [key_name(host_mob)]", INVESTIGATE_NANITES)
+ if(spread_cooldown < world.time)
+ 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.get_permeability_protection() * 100)))
+ //this will potentially take over existing nanites!
+ infectee.AddComponent(/datum/component/nanites, 10)
+ SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites)
+ infectee.investigate_log("was infected by spreading nanites by [key_name(host_mob)] at [AREACOORD(infectee)].", INVESTIGATE_NANITES)
/datum/nanite_program/mitosis
name = "Mitosis"
diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm
index 4f29398e91..f634b2088c 100644
--- a/code/modules/research/nanites/nanite_programs/weapon.dm
+++ b/code/modules/research/nanites/nanite_programs/weapon.dm
@@ -160,40 +160,55 @@
/datum/nanite_program/cryo/active_effect()
host_mob.adjust_bodytemperature(-rand(15,25), 50)
-/datum/nanite_program/mind_control
+/datum/nanite_program/triggered/comm/mind_control
name = "Mind Control"
- desc = "The nanites imprint an absolute directive onto the host's brain while they're active."
- use_rate = 3
+ 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)
- extra_settings = list("Directive")
- var/cooldown = 0 //avoids spam when nanites are running low
+ extra_settings = list("Directive","Comm Code")
var/directive = "..."
-/datum/nanite_program/mind_control/set_extra_setting(user, setting)
+/datum/nanite_program/triggered/comm/mind_control/set_extra_setting(user, setting)
if(setting == "Directive")
var/new_directive = stripped_input(user, "Choose the directive to imprint with mind control.", "Directive", directive, MAX_MESSAGE_LEN)
if(!new_directive)
return
directive = new_directive
+ if(setting == "Comm Code")
+ var/new_code = input(user, "Set the communication code (1-9999) or set to 0 to disable external signals.", name, null) as null|num
+ if(isnull(new_code))
+ return
+ comm_code = CLAMP(round(new_code, 1), 0, 9999)
-/datum/nanite_program/mind_control/get_extra_setting(setting)
+/datum/nanite_program/triggered/comm/mind_control/get_extra_setting(setting)
if(setting == "Directive")
return directive
+ if(setting == "Comm Code")
+ return comm_code
-/datum/nanite_program/mind_control/copy_extra_settings_to(datum/nanite_program/mind_control/target)
+/datum/nanite_program/triggered/comm/mind_control/copy_extra_settings_to(datum/nanite_program/triggered/comm/mind_control/target)
target.directive = directive
+ target.comm_code = comm_code
-/datum/nanite_program/mind_control/enable_passive_effect()
- if(world.time < cooldown)
+/datum/nanite_program/triggered/comm/mind_control/trigger(comm_message)
+ if(!..())
return
- . = ..()
- brainwash(host_mob, directive)
+ if(host_mob.stat == DEAD)
+ return
+ var/sent_directive = comm_message
+ if(!comm_message)
+ sent_directive = directive
+ brainwash(host_mob, sent_directive)
log_game("A mind control nanite program brainwashed [key_name(host_mob)] with the objective '[directive]'.")
+ addtimer(CALLBACK(src, .proc/end_brainwashing), 600)
-/datum/nanite_program/mind_control/disable_passive_effect()
- . = ..()
+/datum/nanite_program/triggered/comm/mind_control/proc/end_brainwashing()
if(host_mob.mind && host_mob.mind.has_antag_datum(/datum/antagonist/brainwashed))
host_mob.mind.remove_antag_datum(/datum/antagonist/brainwashed)
log_game("[key_name(host_mob)] is no longer brainwashed by nanites.")
- cooldown = world.time + 450
+
+/datum/nanite_program/triggered/comm/mind_control/disable_passive_effect()
+ . = ..()
+ end_brainwashing()
diff --git a/code/modules/research/nanites/program_disks.dm b/code/modules/research/nanites/program_disks.dm
index f780f40932..6444ebc025 100644
--- a/code/modules/research/nanites/program_disks.dm
+++ b/code/modules/research/nanites/program_disks.dm
@@ -142,4 +142,10 @@
program_type = /datum/nanite_program/researchplus
/obj/item/disk/nanite_program/reduced_diagnostics
- program_type = /datum/nanite_program/reduced_diagnostics
\ No newline at end of file
+ program_type = /datum/nanite_program/reduced_diagnostics
+
+/obj/item/disk/nanite_program/good_mood
+ program_type = /datum/nanite_program/good_mood
+
+/obj/item/disk/nanite_program/bad_mood
+ program_type = /datum/nanite_program/bad_mood
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index ee065eb21f..3f351d672f 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -1,1137 +1,1137 @@
-
-//Current rate: 132500 research points in 90 minutes
-
-//Base Nodes
-/datum/techweb_node/base
- id = "base"
- starting_node = TRUE
- display_name = "Basic Research Technology"
- description = "NT default research technologies."
- // Default research tech, prevents bricking
- design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani",
- "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
- "space_heater", "xlarge_beaker", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
- "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
-
-/datum/techweb_node/mmi
- id = "mmi"
- starting_node = TRUE
- display_name = "Man Machine Interface"
- description = "A slightly Frankensteinian device that allows human brains to interface natively with software APIs."
- design_ids = list("mmi")
-
-/datum/techweb_node/cyborg
- id = "cyborg"
- starting_node = TRUE
- display_name = "Cyborg Construction"
- description = "Sapient robots with preloaded tool modules and programmable laws."
- design_ids = list("robocontrol", "sflash", "borg_suit", "borg_head", "borg_chest", "borg_r_arm", "borg_l_arm", "borg_r_leg", "borg_l_leg", "borgupload",
- "cyborgrecharger", "borg_upgrade_restart", "borg_upgrade_rename")
-
-/datum/techweb_node/mech
- id = "mecha"
- starting_node = TRUE
- display_name = "Mechanical Exosuits"
- description = "Mechanized exosuits that are several magnitudes stronger and more powerful than the average human."
- design_ids = list("mecha_tracking", "mechacontrol", "mechapower", "mech_recharger", "ripley_chassis", "firefighter_chassis", "ripley_torso", "ripley_left_arm", "ripley_right_arm", "ripley_left_leg", "ripley_right_leg",
- "ripley_main", "ripley_peri", "mech_hydraulic_clamp")
-
-/datum/techweb_node/mech_tools
- id = "mech_tools"
- starting_node = TRUE
- display_name = "Basic Exosuit Equipment"
- description = "Various tools fit for basic mech units"
- design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer")
-
-/datum/techweb_node/surplus_lims
- id = "surplus_lims"
- display_name = "Basic Prosthetics"
- description = "Basic fragile lims for the impaired."
- starting_node = TRUE
- prereq_ids = list("biotech")
- design_ids = list("basic_l_arm", "basic_r_arm", "basic_r_leg", "basic_l_leg")
-
-/datum/techweb_node/blueprinted_bottles
- id = "blueprinted_bottles"
- display_name = "License Bottling"
- description = "Some Branded bottles to print and export."
- starting_node = TRUE
- design_ids = list("gin", "wine", "whiskey", "vodka", "tequila", "patron", "rum", "kahlua", "vermouth", "goldschlager", "hcider", "cognac", "absinthe", "grappa", "sake", "fernet", "applejack", "champagne", "blazaam", "trappist", "grenadine", "autobottler")
-
-/datum/techweb_node/blueprinted_exports
- id = "blueprinted_exports"
- display_name = "License Exports"
- description = "Some Branded bottles to print and export."
- starting_node = TRUE
- design_ids = list("gin_export", "wine_export", "whiskey_export", "vodka_export", "tequila_export", "patron_export", "rum_export", "kahlua_export", "vermouth_export", "goldschlager_export", "hcider_export", "cognac_export", "absinthe_export", "grappa_export", "sake_export", "fernet_export", "applejack_export", "champagne_export", "blazaam_export", "trappist_export", "grenadine_export")
-
-/////////////////////////Biotech/////////////////////////
-/datum/techweb_node/biotech
- id = "biotech"
- display_name = "Biological Technology"
- description = "What makes us tick." //the MC, silly!
- prereq_ids = list("base")
- design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/adv_biotech
- id = "adv_biotech"
- display_name = "Advanced Biotechnology"
- description = "Advanced Biotechnology"
- prereq_ids = list("biotech")
- design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced","harvester","holobarrier_med","smartdartgun","medicinalsmartdart", "pHmeter")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/bio_process
- id = "bio_process"
- display_name = "Biological Processing"
- description = "From slimes to kitchens."
- prereq_ids = list("biotech")
- design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/bottle_exports
- id = "bottle_exports"
- display_name = "Legal Bottling"
- prereq_ids = list("blueprinted_bottles")
- description = "New bottles for printing and selling."
- design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 250)
-
-/datum/techweb_node/advance_lims
- id = "advance_lims"
- display_name = "Upgraded Prosthetics"
- description = "Reinforced prosthetics for the impaired."
- prereq_ids = list("adv_biotech", "surplus_lims")
- design_ids = list("adv_l_arm", "adv_r_arm", "adv_r_leg", "adv_l_leg")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250)
- export_price = 5000
-
-/datum/techweb_node/advance_surgerytools
- id = "advance_surgerytools"
- display_name = "Advanced Surgery Tools"
- description = "Refined and improved redesigns for the run-of-the-mill medical utensils."
- prereq_ids = list("adv_biotech", "adv_surgery")
- design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/adv_defibrillator_tec
- id = "adv_defibrillator_tec"
- display_name = "Defibrillator Upgrades"
- description = "More ways to bring back the newly dead."
- prereq_ids = list("adv_biotech", "exp_surgery", "adv_engi", "adv_power")
- design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/////////////////////////Advanced Surgery/////////////////////////
-/datum/techweb_node/imp_wt_surgery
- id = "imp_wt_surgery"
- display_name = "Improved Wound-Tending Surgery"
- description = "Who would have known being more gentle with a hemostat decreases patient pain?"
- prereq_ids = list("biotech")
- design_ids = list("surgery_heal_brute_upgrade","surgery_heal_burn_upgrade")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 1000
-
-/datum/techweb_node/adv_surgery
- id = "adv_surgery"
- display_name = "Advanced Surgery"
- description = "When simple medicine doesn't cut it."
- prereq_ids = list("imp_wt_surgery")
- design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto", "surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/exp_surgery
- id = "exp_surgery"
- display_name = "Experimental Surgery"
- description = "When evolution isn't fast enough."
- prereq_ids = list("adv_surgery")
- design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection", "surgery_heal_combo_upgrade")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
-
-/datum/techweb_node/alien_surgery
- id = "alien_surgery"
- display_name = "Alien Surgery"
- description = "Abductors did nothing wrong."
- prereq_ids = list("exp_surgery", "alientech")
- design_ids = list("surgery_brainwashing","surgery_zombie", "surgery_ext_dissection", "surgery_heal_combo_upgrade_femto")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
- export_price = 5000
-
-/////////////////////////data theory tech/////////////////////////
-/datum/techweb_node/datatheory //Computer science
- id = "datatheory"
- display_name = "Data Theory"
- description = "Big Data, in space!"
- prereq_ids = list("base")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
-
-/datum/techweb_node/adv_datatheory
- id = "adv_datatheory"
- display_name = "Advanced Data Theory"
- description = "Better insight into programming and data."
- prereq_ids = list("datatheory")
- design_ids = list("icprinter", "icupgadv", "icupgclo")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
-
-/////////////////////////engineering tech/////////////////////////
-/datum/techweb_node/engineering
- id = "engineering"
- display_name = "Industrial Engineering"
- description = "A refresher course on modern engineering technology."
- prereq_ids = list("base")
- design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin",
- "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod",
- "apc_control", "cell_charger", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 6000)
- export_price = 5000
-
-/datum/techweb_node/adv_engi
- id = "adv_engi"
- display_name = "Advanced Engineering"
- description = "Pushing the boundaries of physics, one chainsaw-fist at a time."
- prereq_ids = list("engineering", "emp_basic")
- design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
- export_price = 5000
-
-/datum/techweb_node/anomaly
- id = "anomaly_research"
- display_name = "Anomaly Research"
- description = "Unlock the potential of the mysterious anomalies that appear on station."
- prereq_ids = list("adv_engi", "practical_bluespace")
- design_ids = list("reactive_armour", "anomaly_neutralizer")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
- export_price = 5000
-
-/datum/techweb_node/high_efficiency
- id = "high_efficiency"
- display_name = "High Efficiency Parts"
- description = "Finely-tooled manufacturing techniques allowing for picometer-perfect precision levels."
- prereq_ids = list("engineering", "datatheory")
- design_ids = list("pico_mani", "super_matter_bin")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
-
-/datum/techweb_node/adv_power
- id = "adv_power"
- display_name = "Advanced Power Manipulation"
- description = "How to get more zap."
- prereq_ids = list("engineering")
- design_ids = list("smes", "super_cell", "hyper_cell", "super_capacitor", "superpacman", "mrspacman", "power_turbine", "power_turbine_console", "power_compressor", "circulator", "teg")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
-
-/datum/techweb_node/basic_meteor_defense
- id = "basic_meteor_defense"
- display_name = "Meteor Defense Research"
- description = "Unlock the potential of the mysterious of why CC decided to not build these around the station themselves."
- prereq_ids = list("adv_engi", "high_efficiency")
- design_ids = list("meteor_defence", "meteor_console")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
-
-//datum/techweb_node/adv_meteor_defense
- //id = "adv_meteor_defense"
- //display_name = "Meteor Defense Research"
- //description = "New and improved coding and lock on tech for meteor defence!"
- //prereq_ids = list("basic_meteor_defense", "adv_datatheory", "emp_adv")
- //design_ids = list("meteor_disk")
- //research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- //export_price = 5000
-
-/datum/techweb_node/computer_board_gaming
- id = "computer_board_gaming"
- display_name = "Games and Toys"
- description = "For the slackers on the station."
- prereq_ids = list("comptech")
- design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 5000
-
-/////////////////////////Bluespace tech/////////////////////////
-/datum/techweb_node/bluespace_basic //Bluespace-memery
- id = "bluespace_basic"
- display_name = "Basic Bluespace Theory"
- description = "Basic studies into the mysterious alternate dimension known as bluespace."
- prereq_ids = list("base", "datatheory")
- design_ids = list("beacon", "xenobioconsole", "telesci_gps", "xenobio_monkeys")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/practical_bluespace
- id = "practical_bluespace"
- display_name = "Applied Bluespace Research"
- description = "Using bluespace to make things faster and better."
- prereq_ids = list("bluespace_basic", "engineering")
- design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
-
-/datum/techweb_node/adv_bluespace
- id = "adv_bluespace"
- display_name = "Advanced Bluespace Research"
- description = "Deeper understanding of how the Bluespace dimension works"
- prereq_ids = list("practical_bluespace", "high_efficiency")
- design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal", "xenobio_slimeadv")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
- export_price = 5000
-
-/datum/techweb_node/bluespace_power
- id = "bluespace_power"
- display_name = "Bluespace Power Technology"
- description = "Even more powerful.. power!"
- prereq_ids = list("adv_power", "adv_bluespace")
- design_ids = list("bluespace_cell", "quadratic_capacitor")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/bluespace_holding
- id = "bluespace_holding"
- display_name = "Bluespace Pockets"
- description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality."
- prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma")
- design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding", "bsblood_bag")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
- export_price = 5000
-
-/datum/techweb_node/bluespace_portal
- id = "bluespace_portal"
- display_name = "Bluespace Portals"
- description = "Allows for Bluespace Tech to be used tandem with Wormhole tech."
- prereq_ids = list("adv_weaponry", "adv_bluespace")
- design_ids = list("wormholeprojector")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/bluespace_warping
- id = "bluespace_warping"
- display_name = "Bluespace Travel"
- description = "Application of Bluespace for static teleportation technology."
- prereq_ids = list("adv_power", "adv_bluespace")
- design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/unregulated_bluespace
- id = "unregulated_bluespace"
- display_name = "Unregulated Bluespace Research"
- description = "Bluespace technology using unstable or unbalanced procedures, prone to damaging the fabric of bluespace. Outlawed by galactic conventions."
- prereq_ids = list("bluespace_warping", "syndicate_basic")
- design_ids = list("desynchronizer")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 2500
-
-/////////////////////////plasma tech/////////////////////////
-/datum/techweb_node/basic_plasma
- id = "basic_plasma"
- display_name = "Basic Plasma Research"
- description = "Research into the mysterious and dangerous substance, plasma."
- prereq_ids = list("engineering")
- design_ids = list("mech_generator")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
-
-/datum/techweb_node/adv_plasma
- id = "adv_plasma"
- display_name = "Advanced Plasma Research"
- description = "Research on how to fully exploit the power of plasma."
- prereq_ids = list("basic_plasma")
- design_ids = list("mech_plasma_cutter")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
-
-/////////////////////////robotics tech/////////////////////////
-/datum/techweb_node/robotics
- id = "robotics"
- display_name = "Basic Robotics Research"
- description = "Programmable machines that make our lives lazier."
- prereq_ids = list("base")
- design_ids = list("paicard", "drone_shell")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
-
-/datum/techweb_node/adv_robotics
- id = "adv_robotics"
- display_name = "Advanced Robotics Research"
- description = "It can even do the dishes!"
- prereq_ids = list("robotics")
- design_ids = list("borg_upgrade_diamonddrill", "borg_upgrade_advancedmop")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
-
-/datum/techweb_node/neural_programming
- id = "neural_programming"
- display_name = "Neural Programming"
- description = "Study into networks of processing units that mimic our brains."
- prereq_ids = list("biotech", "datatheory")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/posibrain
- id = "posibrain"
- display_name = "Positronic Brain"
- description = "Applied usage of neural technology allowing for autonomous AI units based on special metallic cubes with conductive and processing circuits."
- prereq_ids = list("neural_programming")
- design_ids = list("mmi_posi")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/cyborg_upg_util
- id = "cyborg_upg_util"
- display_name = "Cyborg Upgrades: Utility"
- description = "Utility upgrades for cyborgs."
- prereq_ids = list("engineering", "robotics")
- design_ids = list("borg_upgrade_holding", "borg_upgrade_lavaproof", "borg_upgrade_thrusters", "borg_upgrade_selfrepair", "borg_upgrade_expand", "borg_upgrade_rped")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
-
-/datum/techweb_node/cyborg_upg_med
- id = "cyborg_upg_med"
- display_name = "Cyborg Upgrades: Medical"
- description = "Medical upgrades for cyborgs."
- prereq_ids = list("adv_biotech", "robotics")
- design_ids = list("borg_upgrade_advhealth", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
-
-/datum/techweb_node/cyborg_upg_combat
- id = "cyborg_upg_combat"
- display_name = "Cyborg Upgrades: Combat"
- description = "Military grade upgrades for cyborgs."
- prereq_ids = list("adv_robotics", "adv_engi" , "weaponry")
- design_ids = list("borg_upgrade_vtec", "borg_upgrade_disablercooler")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
-
-/datum/techweb_node/ai
- id = "ai"
- display_name = "Artificial Intelligence"
- description = "AI unit research."
- prereq_ids = list("robotics", "posibrain")
- design_ids = list("aifixer", "aicore", "safeguard_module", "onehuman_module", "protectstation_module", "quarantine_module", "oxygen_module", "freeform_module",
- "reset_module", "purge_module", "remove_module", "freeformcore_module", "asimov_module", "paladin_module", "tyrant_module", "corporate_module",
- "default_module", "borg_ai_control", "mecha_tracking_ai_control", "aiupload", "intellicard")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/////////////////////////EMP tech/////////////////////////
-/datum/techweb_node/emp_basic //EMP tech for some reason
- id = "emp_basic"
- display_name = "Electromagnetic Theory"
- description = "Study into usage of frequencies in the electromagnetic spectrum."
- prereq_ids = list("base")
- design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos", "inducer", "tray_goggles", "holopad")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/emp_adv
- id = "emp_adv"
- display_name = "Advanced Electromagnetic Theory"
- description = "Determining whether reversing the polarity will actually help in a given situation."
- prereq_ids = list("emp_basic")
- design_ids = list("ultra_micro_laser")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
-
-/datum/techweb_node/emp_super
- id = "emp_super"
- display_name = "Quantum Electromagnetic Technology" //bs
- description = "Even better electromagnetic technology."
- prereq_ids = list("emp_adv")
- design_ids = list("quadultra_micro_laser")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
-
-/////////////////////////Clown tech/////////////////////////
-/datum/techweb_node/clown
- id = "clown"
- display_name = "Clown Technology"
- description = "Honk?!"
- prereq_ids = list("base")
- design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm",
- "honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone", "borg_transform_clown")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-////////////////////////Computer tech////////////////////////
-/datum/techweb_node/comptech
- id = "comptech"
- display_name = "Computer Consoles"
- description = "Computers and how they work."
- prereq_ids = list("datatheory")
- design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "miningshuttle", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
-
-/datum/techweb_node/computer_hardware_basic //Modular computers are shitty and nearly useless so until someone makes them actually useful this can be easy to get.
- id = "computer_hardware_basic"
- display_name = "Computer Hardware"
- description = "How computer hardware are made."
- prereq_ids = list("comptech")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250) //they are really kinda shitty
- export_price = 2000
- design_ids = list("hdd_basic", "hdd_advanced", "hdd_super", "hdd_cluster", "ssd_small", "ssd_micro", "netcard_basic", "netcard_advanced", "netcard_wired",
- "portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced",
- "bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small")
-
-/datum/techweb_node/comp_recordkeeping
- id = "comp_recordkeeping"
- display_name = "Computerized Recordkeeping"
- description = "Organized record databases and how they're used."
- prereq_ids = list("comptech")
- design_ids = list("secdata", "med_data", "prisonmanage", "vendor", "automated_announcement")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250)
- export_price = 2000
-
-/datum/techweb_node/telecomms
- id = "telecomms"
- display_name = "Telecommunications Technology"
- description = "Subspace transmission technology for near-instant communications devices."
- prereq_ids = list("comptech", "bluespace_basic")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- export_price = 5000
- design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server",
- "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "message_monitor")
-
-/datum/techweb_node/integrated_HUDs
- id = "integrated_HUDs"
- display_name = "Integrated HUDs"
- description = "The usefulness of computerized records, projected straight onto your eyepiece!"
- prereq_ids = list("comp_recordkeeping", "emp_basic")
- design_ids = list("health_hud", "security_hud", "diagnostic_hud", "scigoggles", "health_hud_prescription", "security_hud_prescription", "diagnostic_hud_prescription")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- export_price = 5000
-
-/datum/techweb_node/NVGtech
- id = "NVGtech"
- display_name = "Night Vision Technology"
- description = "Allows seeing in the dark without actual light!"
- prereq_ids = list("integrated_HUDs", "adv_engi", "emp_adv")
- design_ids = list("health_hud_night", "security_hud_night", "diagnostic_hud_night", "night_visision_goggles", "nvgmesons", "night_visision_goggles_glasses")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 5000
-
-////////////////////////Medical////////////////////////
-/datum/techweb_node/cloning
- id = "cloning"
- display_name = "Genetic Engineering"
- description = "We have the technology to make him."
- prereq_ids = list("biotech")
- design_ids = list("clonecontrol", "clonepod", "clonescanner", "scan_console", "cloning_disk")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
-
-/datum/techweb_node/cryotech
- id = "cryotech"
- display_name = "Cryostasis Technology"
- description = "Smart freezing of objects to preserve them!"
- prereq_ids = list("adv_engi", "biotech")
- design_ids = list("splitbeaker", "noreactsyringe", "cryotube", "cryo_Grenade")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 4000
-
-/datum/techweb_node/subdermal_implants
- id = "subdermal_implants"
- display_name = "Subdermal Implants"
- description = "Electronic implants buried beneath the skin."
- prereq_ids = list("biotech", "datatheory")
- design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/cyber_organs
- id = "cyber_organs"
- display_name = "Cybernetic Organs"
- description = "We have the technology to rebuild him."
- prereq_ids = list("adv_biotech")
- design_ids = list("cybernetic_ears", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_tongue")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 5000
-
-/datum/techweb_node/cyber_organs_upgraded
- id = "cyber_organs_upgraded"
- display_name = "Upgraded Cybernetic Organs"
- description = "We have the technology to upgrade him."
- prereq_ids = list("cyber_organs")
- design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
- export_price = 5000
-
-/datum/techweb_node/cyber_implants
- id = "cyber_implants"
- display_name = "Cybernetic Implants"
- description = "Electronic implants that improve humans."
- prereq_ids = list("adv_biotech", "adv_datatheory")
- design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/adv_cyber_implants
- id = "adv_cyber_implants"
- display_name = "Advanced Cybernetic Implants"
- description = "Upgraded and more powerful cybernetic implants."
- prereq_ids = list("neural_programming", "cyber_implants","integrated_HUDs")
- design_ids = list("ci-toolset", "ci-surgery", "ci-reviver", "ci-nutrimentplus")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/combat_cyber_implants
- id = "combat_cyber_implants"
- display_name = "Combat Cybernetic Implants"
- description = "Military grade combat implants to improve performance."
- prereq_ids = list("adv_cyber_implants","weaponry","NVGtech","high_efficiency")
- design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-////////////////////////Tools////////////////////////
-/datum/techweb_node/basic_mining
- id = "basic_mining"
- display_name = "Mining Technology"
- description = "Better than Efficiency V."
- prereq_ids = list("engineering", "basic_plasma")
- design_ids = list("drill", "superresonator", "triggermod", "damagemod", "cooldownmod", "rangemod", "ore_redemption", "mining_equipment_vendor", "cargoexpress", "plasmacutter")//e a r l y g a m e)
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/adv_mining
- id = "adv_mining"
- display_name = "Advanced Mining Technology"
- description = "Efficiency Level 127" //dumb mc references
- prereq_ids = list("basic_mining", "adv_engi", "adv_power", "adv_plasma")
- design_ids = list("drill_diamond", "jackhammer", "hypermod", "plasmacutter_adv", "ore_silo")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/janitor
- id = "janitor"
- display_name = "Advanced Sanitation Technology"
- description = "Clean things better, faster, stronger, and harder!"
- prereq_ids = list("adv_engi")
- design_ids = list("advmop", "buffer", "light_replacer")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1750) // No longer has its bag
- export_price = 5000
-
-/datum/techweb_node/botany
- id = "botany"
- display_name = "Botanical Engineering"
- description = "Botanical tools."
- prereq_ids = list("adv_engi", "biotech")
- design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
-
-/datum/techweb_node/exp_tools
- id = "exp_tools"
- display_name = "Experimental Tools"
- description = "Highly advanced construction tools."
- design_ids = list("exwelder", "jawsoflife", "handdrill")
- prereq_ids = list("adv_engi")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
-
-/////////////////////////weaponry tech/////////////////////////
-/datum/techweb_node/weaponry
- id = "weaponry"
- display_name = "Weapon Development Technology"
- description = "Our researchers have found new to weaponize just about everything now."
- prereq_ids = list("engineering")
- design_ids = list("pin_testing", "tele_shield", "lasercarbine")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
- export_price = 5000
-
-/datum/techweb_node/adv_weaponry
- id = "adv_weaponry"
- display_name = "Advanced Weapon Development Technology"
- description = "Our weapons are breaking the rules of reality by now."
- prereq_ids = list("adv_engi", "weaponry")
- design_ids = list("pin_loyalty")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
- export_price = 5000
-
-/datum/techweb_node/electric_weapons
- id = "electronic_weapons"
- display_name = "Electric Weapons"
- description = "Weapons using electric technology"
- prereq_ids = list("weaponry", "adv_power" , "emp_basic")
- design_ids = list("stunrevolver", "stunshell", "ioncarbine")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
- export_price = 5000
-
-/datum/techweb_node/radioactive_weapons
- id = "radioactive_weapons"
- display_name = "Radioactive Weaponry"
- description = "Weapons using radioactive technology."
- prereq_ids = list("adv_engi", "adv_weaponry")
- design_ids = list("nuclear_gun")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/medical_weapons
- id = "medical_weapons"
- display_name = "Medical Weaponry"
- description = "Weapons using medical technology."
- prereq_ids = list("adv_biotech", "adv_weaponry")
- design_ids = list("rapidsyringe", "shotgundartcryostatis")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
-
-/datum/techweb_node/beam_weapons
- id = "beam_weapons"
- display_name = "Beam Weaponry"
- description = "Various basic beam weapons"
- prereq_ids = list("adv_weaponry")
- design_ids = list("temp_gun", "xray_laser")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/adv_beam_weapons
- id = "adv_beam_weapons"
- display_name = "Advanced Beam Weaponry"
- description = "Various advanced beam weapons"
- prereq_ids = list("beam_weapons")
- design_ids = list("beamrifle")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3250) // Sniper
- export_price = 5000
-
-/datum/techweb_node/explosive_weapons
- id = "explosive_weapons"
- display_name = "Explosive & Pyrotechnical Weaponry"
- description = "If the light stuff just won't do it."
- prereq_ids = list("adv_weaponry")
- design_ids = list("large_Grenade", "pyro_Grenade", "adv_Grenade")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
-
-/datum/techweb_node/ballistic_weapons
- id = "ballistic_weapons"
- display_name = "Ballistic Weaponry"
- description = "This isn't research.. This is reverse-engineering!"
- prereq_ids = list("weaponry")
- design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_rubber", "mag_oldsmg_tx")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
-
-/datum/techweb_node/exotic_ammo
- id = "exotic_ammo"
- display_name = "Exotic Ammunition"
- description = "They won't know what hit em."
- prereq_ids = list("weaponry", "ballistic_weapons")
- design_ids = list("techshotshell", "c38_hotshot", "c38_iceblox")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
- export_price = 5000
-
-/datum/techweb_node/gravity_gun
- id = "gravity_gun"
- display_name = "One-point Bluespace-gravitational Manipulator"
- description = "Fancy wording for gravity gun."
- prereq_ids = list("adv_weaponry", "adv_bluespace")
- design_ids = list("gravitygun", "mech_gravcatapult")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-////////////////////////mech technology////////////////////////
-/datum/techweb_node/adv_mecha
- id = "adv_mecha"
- display_name = "Advanced Exosuits"
- description = "For when you just aren't Gundam enough."
- prereq_ids = list("adv_robotics")
- design_ids = list("mech_repair_droid")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/odysseus
- id = "mecha_odysseus"
- display_name = "EXOSUIT: Odysseus"
- description = "Odysseus exosuit designs"
- prereq_ids = list("base")
- design_ids = list("odysseus_chassis", "odysseus_torso", "odysseus_head", "odysseus_left_arm", "odysseus_right_arm" ,"odysseus_left_leg", "odysseus_right_leg",
- "odysseus_main", "odysseus_peri")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/gygax
- id = "mech_gygax"
- display_name = "EXOSUIT: Gygax"
- description = "Gygax exosuit designs"
- prereq_ids = list("adv_mecha", "weaponry")
- design_ids = list("gygax_chassis", "gygax_torso", "gygax_head", "gygax_left_arm", "gygax_right_arm", "gygax_left_leg", "gygax_right_leg", "gygax_main",
- "gygax_peri", "gygax_targ", "gygax_armor")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/durand
- id = "mech_durand"
- display_name = "EXOSUIT: Durand"
- description = "Durand exosuit designs"
- prereq_ids = list("adv_mecha", "adv_weaponry")
- design_ids = list("durand_chassis", "durand_torso", "durand_head", "durand_left_arm", "durand_right_arm", "durand_left_leg", "durand_right_leg", "durand_main",
- "durand_peri", "durand_targ", "durand_armor")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
- export_price = 5000
-
-/datum/techweb_node/phazon
- id = "mecha_phazon"
- display_name = "EXOSUIT: Phazon"
- description = "Phazon exosuit designs"
- prereq_ids = list("adv_mecha", "weaponry" , "adv_bluespace")
- design_ids = list("phazon_chassis", "phazon_torso", "phazon_head", "phazon_left_arm", "phazon_right_arm", "phazon_left_leg", "phazon_right_leg", "phazon_main",
- "phazon_peri", "phazon_targ", "phazon_armor")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
- export_price = 5000
-
-/datum/techweb_node/adv_mecha_tools
- id = "adv_mecha_tools"
- display_name = "Advanced Exosuit Equipment"
- description = "Tools for high level mech suits"
- prereq_ids = list("adv_mecha")
- design_ids = list("mech_rcd")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/med_mech_tools
- id = "med_mech_tools"
- display_name = "Medical Exosuit Equipment"
- description = "Tools for high level mech suits"
- prereq_ids = list("adv_biotech")
- design_ids = list("mech_sleeper", "mech_syringe_gun", "mech_medi_beam")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 5000
-
-/datum/techweb_node/mech_modules
- id = "adv_mecha_modules"
- display_name = "Simple Exosuit Modules"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("adv_mecha", "bluespace_power")
- design_ids = list("mech_energy_relay", "mech_ccw_armor", "mech_proj_armor", "mech_generator_nuclear")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_scattershot
- id = "mecha_tools"
- display_name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("ballistic_weapons")
- design_ids = list("mech_scattershot")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_seedscatter
- id = "mech_seedscatter"
- display_name = "Exosuit Weapon (Melon Seed \"Scattershot\")"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("ballistic_weapons")
- design_ids = list("mech_seedscatter")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_carbine
- id = "mech_carbine"
- display_name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("ballistic_weapons")
- design_ids = list("mech_carbine")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_ion
- id = "mmech_ion"
- display_name = "Exosuit Weapon (MKIV Ion Heavy Cannon)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("electronic_weapons", "emp_adv")
- design_ids = list("mech_ion")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_tesla
- id = "mech_tesla"
- display_name = "Exosuit Weapon (MKI Tesla Cannon)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("electronic_weapons", "adv_power")
- design_ids = list("mech_tesla")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_laser
- id = "mech_laser"
- display_name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)"
- description = "A basic piece of mech weaponry"
- prereq_ids = list("beam_weapons")
- design_ids = list("mech_laser")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_laser_heavy
- id = "mech_laser_heavy"
- display_name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("adv_beam_weapons")
- design_ids = list("mech_laser_heavy")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_grenade_launcher
- id = "mech_grenade_launcher"
- display_name = "Exosuit Weapon (SGL-6 Grenade Launcher)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("explosive_weapons")
- design_ids = list("mech_grenade_launcher")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_missile_rack
- id = "mech_missile_rack"
- display_name = "Exosuit Weapon (SRM-8 Missile Rack)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("explosive_weapons")
- design_ids = list("mech_missile_rack")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/clusterbang_launcher
- id = "clusterbang_launcher"
- display_name = "Exosuit Module (SOB-3 Clusterbang Launcher)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("explosive_weapons")
- design_ids = list("clusterbang_launcher")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_teleporter
- id = "mech_teleporter"
- display_name = "Exosuit Module (Teleporter Module)"
- description = "An advanced piece of mech Equipment"
- prereq_ids = list("adv_bluespace")
- design_ids = list("mech_teleporter")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_wormhole_gen
- id = "mech_wormhole_gen"
- display_name = "Exosuit Module (Localized Wormhole Generator)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("adv_bluespace")
- design_ids = list("mech_wormhole_gen")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_taser
- id = "mech_taser"
- display_name = "Exosuit Weapon (PBT \"Pacifier\" Mounted Taser)"
- description = "A basic piece of mech weaponry"
- prereq_ids = list("electronic_weapons")
- design_ids = list("mech_taser")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_lmg
- id = "mech_lmg"
- display_name = "Exosuit Weapon (\"Ultra AC 2\" LMG)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("ballistic_weapons")
- design_ids = list("mech_lmg")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/mech_diamond_drill
- id = "mech_diamond_drill"
- display_name = "Exosuit Diamond Drill"
- description = "A diamond drill fit for a large exosuit"
- prereq_ids = list("adv_mining")
- design_ids = list("mech_diamond_drill")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/////////////////////////Nanites/////////////////////////
-/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","robotics")
- design_ids = list("nanite_disk","nanite_remote","nanite_comm_remote","nanite_scanner",\
- "nanite_chamber","public_nanite_chamber","nanite_chamber_control","nanite_programmer","nanite_program_hub","nanite_cloud_control",\
- "relay_nanites", "monitoring_nanites", "access_nanites", "repairing_nanites","sensor_nanite_volume", "repeater_nanites", "relay_repeater_nanites","red_diag_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/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","adv_robotics")
- design_ids = list("purging_nanites", "research_nanites", "metabolic_nanites", "stealth_nanites", "memleak_nanites","sensor_voice_nanites", "voice_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
- export_price = 4000
-
-/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("hardening_nanites", "dermal_button_nanites", "refractive_nanites", "cryo_nanites", "conductive_nanites", "shock_nanites", "emp_nanites", "temperature_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/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("regenerative_nanites", "bloodheal_nanites", "coagulating_nanites","poison_nanites","flesheating_nanites",\
- "sensor_crit_nanites","sensor_death_nanites", "sensor_health_nanites", "sensor_damage_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/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("nervous_nanites", "brainheal_nanites", "paralyzing_nanites", "stun_nanites", "selfscan_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/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("mindshield_nanites", "pacifying_nanites", "blinding_nanites", "sleep_nanites", "mute_nanites", "speech_nanites","hallucination_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
- export_price = 5000
-
-/datum/techweb_node/nanite_harmonic
- id = "nanite_harmonic"
- display_name = "Harmonic Nanite Programming"
- description = "Nanite programs that require seamless integration between nanites and biology."
- prereq_ids = list("nanite_bio","nanite_smart","nanite_mesh")
- design_ids = list("fakedeath_nanites","researchplus_nanites","aggressive_nanites","defib_nanites","regenerative_plus_nanites","brainheal_plus_nanites","purging_plus_nanites","adrenaline_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
- export_price = 8000
-
-/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","pyro_nanites","meltdown_nanites","viral_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
- export_price = 12500
-
-/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("spreading_nanites","mindcontrol_nanites","mitosis_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
- export_price = 15000
-
-////////////////////////Alien technology////////////////////////
-/datum/techweb_node/alientech //AYYYYYYYYLMAOO tech
- id = "alientech"
- display_name = "Alien Technology"
- description = "Things used by the greys."
- prereq_ids = list("biotech","engineering")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 20000
- hidden = TRUE
- design_ids = list("alienalloy")
-
-/datum/techweb_node/alientech/New()
- . = ..()
- boost_item_paths = typesof(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien,
- /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/cautery/alien,
- /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor,
- /obj/item/crowbar/abductor, /obj/item/multitool/abductor,
- /obj/item/stock_parts/cell/infinite/abductor, /obj/item/weldingtool/abductor,
- /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor,
- /obj/item/abductor, /obj/item/stack/sheet/mineral/abductor)
-
-/datum/techweb_node/alien_bio
- id = "alien_bio"
- display_name = "Alien Biological Tools"
- description = "Advanced biological tools."
- prereq_ids = list("alientech", "advance_surgerytools")
- design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery", "ayyplantgenes")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 10000
-
-/datum/techweb_node/alien_engi
- id = "alien_engi"
- display_name = "Alien Engineering"
- description = "Alien engineering tools."
- prereq_ids = list("alientech", "exp_tools")
- design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
- export_price = 10000
-
-/datum/techweb_node/syndicate_basic
- id = "syndicate_basic"
- display_name = "Illegal Technology"
- description = "Dangerous research used to create dangerous objects."
- prereq_ids = list("adv_engi", "adv_weaponry", "explosive_weapons")
- design_ids = list("decloner", "borg_syndicate_module", "suppressor", "largecrossbow", "donksofttoyvendor")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
- export_price = 5000
- hidden = TRUE
-
-/datum/techweb_node/syndicate_basic/New() //Crappy way of making syndicate gear decon supported until there's another way.
- . = ..()
- boost_item_paths = list()
- for(var/path in GLOB.uplink_items)
- var/datum/uplink_item/UI = new path
- if(!UI.item || !UI.illegal_tech)
- continue
- boost_item_paths |= UI.item //allows deconning to unlock.
-
-/datum/techweb_node/advanced_illegal_ballistics
- id = "advanced_illegal_ballistics"
- display_name = "Advanced Non-Standard Ballistics"
- description = "Ballistic ammunition for non-standard firearms. Usually the ones you don't have nor want to be involved with."
- design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","pistolm9mm","m45","bolt_clip")
- prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns from traitors, space, or anything in between.
- export_price = 7000
-
-//Helpers for debugging/balancing the techweb in its entirety!
-/proc/total_techweb_exports()
- var/list/datum/techweb_node/processing = list()
- for(var/i in subtypesof(/datum/techweb_node))
- processing += new i
- . = 0
- for(var/i in processing)
- var/datum/techweb_node/TN = i
- . += TN.export_price
-
-/proc/total_techweb_points()
- var/list/datum/techweb_node/processing = list()
- for(var/i in subtypesof(/datum/techweb_node))
- processing += new i
- var/datum/techweb/TW = new
- TW.research_points = list()
- for(var/i in processing)
- var/datum/techweb_node/TN = i
- TW.add_point_list(TN.research_costs)
- return TW.research_points
-
-/proc/total_techweb_points_printout()
- var/list/datum/techweb_node/processing = list()
- for(var/i in subtypesof(/datum/techweb_node))
- processing += new i
- var/datum/techweb/TW = new
- TW.research_points = list()
- for(var/i in processing)
- var/datum/techweb_node/TN = i
- TW.add_point_list(TN.research_costs)
- return TW.printout_points()
+
+//Current rate: 132500 research points in 90 minutes
+
+//Base Nodes
+/datum/techweb_node/base
+ id = "base"
+ starting_node = TRUE
+ display_name = "Basic Research Technology"
+ description = "NT default research technologies."
+ // Default research tech, prevents bricking
+ design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani",
+ "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
+ "space_heater", "xlarge_beaker", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
+ "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
+
+/datum/techweb_node/mmi
+ id = "mmi"
+ starting_node = TRUE
+ display_name = "Man Machine Interface"
+ description = "A slightly Frankensteinian device that allows human brains to interface natively with software APIs."
+ design_ids = list("mmi")
+
+/datum/techweb_node/cyborg
+ id = "cyborg"
+ starting_node = TRUE
+ display_name = "Cyborg Construction"
+ description = "Sapient robots with preloaded tool modules and programmable laws."
+ design_ids = list("robocontrol", "sflash", "borg_suit", "borg_head", "borg_chest", "borg_r_arm", "borg_l_arm", "borg_r_leg", "borg_l_leg", "borgupload",
+ "cyborgrecharger", "borg_upgrade_restart", "borg_upgrade_rename")
+
+/datum/techweb_node/mech
+ id = "mecha"
+ starting_node = TRUE
+ display_name = "Mechanical Exosuits"
+ description = "Mechanized exosuits that are several magnitudes stronger and more powerful than the average human."
+ design_ids = list("mecha_tracking", "mechacontrol", "mechapower", "mech_recharger", "ripley_chassis", "firefighter_chassis", "ripley_torso", "ripley_left_arm", "ripley_right_arm", "ripley_left_leg", "ripley_right_leg",
+ "ripley_main", "ripley_peri", "mech_hydraulic_clamp")
+
+/datum/techweb_node/mech_tools
+ id = "mech_tools"
+ starting_node = TRUE
+ display_name = "Basic Exosuit Equipment"
+ description = "Various tools fit for basic mech units"
+ design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer")
+
+/datum/techweb_node/surplus_lims
+ id = "surplus_lims"
+ display_name = "Basic Prosthetics"
+ description = "Basic fragile lims for the impaired."
+ starting_node = TRUE
+ prereq_ids = list("biotech")
+ design_ids = list("basic_l_arm", "basic_r_arm", "basic_r_leg", "basic_l_leg")
+
+/datum/techweb_node/blueprinted_bottles
+ id = "blueprinted_bottles"
+ display_name = "License Bottling"
+ description = "Some Branded bottles to print and export."
+ starting_node = TRUE
+ design_ids = list("gin", "wine", "whiskey", "vodka", "tequila", "patron", "rum", "kahlua", "vermouth", "goldschlager", "hcider", "cognac", "absinthe", "grappa", "sake", "fernet", "applejack", "champagne", "blazaam", "trappist", "grenadine", "autobottler")
+
+/datum/techweb_node/blueprinted_exports
+ id = "blueprinted_exports"
+ display_name = "License Exports"
+ description = "Some Branded bottles to print and export."
+ starting_node = TRUE
+ design_ids = list("gin_export", "wine_export", "whiskey_export", "vodka_export", "tequila_export", "patron_export", "rum_export", "kahlua_export", "vermouth_export", "goldschlager_export", "hcider_export", "cognac_export", "absinthe_export", "grappa_export", "sake_export", "fernet_export", "applejack_export", "champagne_export", "blazaam_export", "trappist_export", "grenadine_export")
+
+/////////////////////////Biotech/////////////////////////
+/datum/techweb_node/biotech
+ id = "biotech"
+ display_name = "Biological Technology"
+ description = "What makes us tick." //the MC, silly!
+ prereq_ids = list("base")
+ design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/adv_biotech
+ id = "adv_biotech"
+ display_name = "Advanced Biotechnology"
+ description = "Advanced Biotechnology"
+ prereq_ids = list("biotech")
+ design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "defibrillator", "meta_beaker", "healthanalyzer_advanced","harvester","holobarrier_med","smartdartgun","medicinalsmartdart", "pHmeter")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/bio_process
+ id = "bio_process"
+ display_name = "Biological Processing"
+ description = "From slimes to kitchens."
+ prereq_ids = list("biotech")
+ design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/bottle_exports
+ id = "bottle_exports"
+ display_name = "Legal Bottling"
+ prereq_ids = list("blueprinted_bottles")
+ description = "New bottles for printing and selling."
+ design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 250)
+
+/datum/techweb_node/advance_lims
+ id = "advance_lims"
+ display_name = "Upgraded Prosthetics"
+ description = "Reinforced prosthetics for the impaired."
+ prereq_ids = list("adv_biotech", "surplus_lims")
+ design_ids = list("adv_l_arm", "adv_r_arm", "adv_r_leg", "adv_l_leg")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250)
+ export_price = 5000
+
+/datum/techweb_node/advance_surgerytools
+ id = "advance_surgerytools"
+ display_name = "Advanced Surgery Tools"
+ description = "Refined and improved redesigns for the run-of-the-mill medical utensils."
+ prereq_ids = list("adv_biotech", "adv_surgery")
+ design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/adv_defibrillator_tec
+ id = "adv_defibrillator_tec"
+ display_name = "Defibrillator Upgrades"
+ description = "More ways to bring back the newly dead."
+ prereq_ids = list("adv_biotech", "exp_surgery", "adv_engi", "adv_power")
+ design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/////////////////////////Advanced Surgery/////////////////////////
+/datum/techweb_node/imp_wt_surgery
+ id = "imp_wt_surgery"
+ display_name = "Improved Wound-Tending Surgery"
+ description = "Who would have known being more gentle with a hemostat decreases patient pain?"
+ prereq_ids = list("biotech")
+ design_ids = list("surgery_heal_brute_upgrade","surgery_heal_burn_upgrade")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
+ export_price = 1000
+
+/datum/techweb_node/adv_surgery
+ id = "adv_surgery"
+ display_name = "Advanced Surgery"
+ description = "When simple medicine doesn't cut it."
+ prereq_ids = list("imp_wt_surgery")
+ design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto", "surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/exp_surgery
+ id = "exp_surgery"
+ display_name = "Experimental Surgery"
+ description = "When evolution isn't fast enough."
+ prereq_ids = list("adv_surgery")
+ design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection", "surgery_heal_combo_upgrade")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 5000
+
+/datum/techweb_node/alien_surgery
+ id = "alien_surgery"
+ display_name = "Alien Surgery"
+ description = "Abductors did nothing wrong."
+ prereq_ids = list("exp_surgery", "alientech")
+ design_ids = list("surgery_brainwashing","surgery_zombie", "surgery_ext_dissection", "surgery_heal_combo_upgrade_femto")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
+ export_price = 5000
+
+/////////////////////////data theory tech/////////////////////////
+/datum/techweb_node/datatheory //Computer science
+ id = "datatheory"
+ display_name = "Data Theory"
+ description = "Big Data, in space!"
+ prereq_ids = list("base")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 5000
+
+/datum/techweb_node/adv_datatheory
+ id = "adv_datatheory"
+ display_name = "Advanced Data Theory"
+ description = "Better insight into programming and data."
+ prereq_ids = list("datatheory")
+ design_ids = list("icprinter", "icupgadv", "icupgclo")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+ export_price = 5000
+
+/////////////////////////engineering tech/////////////////////////
+/datum/techweb_node/engineering
+ id = "engineering"
+ display_name = "Industrial Engineering"
+ description = "A refresher course on modern engineering technology."
+ prereq_ids = list("base")
+ design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin",
+ "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod",
+ "apc_control", "cell_charger", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 6000)
+ export_price = 5000
+
+/datum/techweb_node/adv_engi
+ id = "adv_engi"
+ display_name = "Advanced Engineering"
+ description = "Pushing the boundaries of physics, one chainsaw-fist at a time."
+ prereq_ids = list("engineering", "emp_basic")
+ design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
+ export_price = 5000
+
+/datum/techweb_node/anomaly
+ id = "anomaly_research"
+ display_name = "Anomaly Research"
+ description = "Unlock the potential of the mysterious anomalies that appear on station."
+ prereq_ids = list("adv_engi", "practical_bluespace")
+ design_ids = list("reactive_armour", "anomaly_neutralizer")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
+ export_price = 5000
+
+/datum/techweb_node/high_efficiency
+ id = "high_efficiency"
+ display_name = "High Efficiency Parts"
+ description = "Finely-tooled manufacturing techniques allowing for picometer-perfect precision levels."
+ prereq_ids = list("engineering", "datatheory")
+ design_ids = list("pico_mani", "super_matter_bin")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 5000
+
+/datum/techweb_node/adv_power
+ id = "adv_power"
+ display_name = "Advanced Power Manipulation"
+ description = "How to get more zap."
+ prereq_ids = list("engineering")
+ design_ids = list("smes", "super_cell", "hyper_cell", "super_capacitor", "superpacman", "mrspacman", "power_turbine", "power_turbine_console", "power_compressor", "circulator", "teg")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+ export_price = 5000
+
+/datum/techweb_node/basic_meteor_defense
+ id = "basic_meteor_defense"
+ display_name = "Meteor Defense Research"
+ description = "Unlock the potential of the mysterious of why CC decided to not build these around the station themselves."
+ prereq_ids = list("adv_engi", "high_efficiency")
+ design_ids = list("meteor_defence", "meteor_console")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 5000
+
+//datum/techweb_node/adv_meteor_defense
+ //id = "adv_meteor_defense"
+ //display_name = "Meteor Defense Research"
+ //description = "New and improved coding and lock on tech for meteor defence!"
+ //prereq_ids = list("basic_meteor_defense", "adv_datatheory", "emp_adv")
+ //design_ids = list("meteor_disk")
+ //research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
+ //export_price = 5000
+
+/datum/techweb_node/computer_board_gaming
+ id = "computer_board_gaming"
+ display_name = "Games and Toys"
+ description = "For the slackers on the station."
+ prereq_ids = list("comptech")
+ design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
+ export_price = 5000
+
+/////////////////////////Bluespace tech/////////////////////////
+/datum/techweb_node/bluespace_basic //Bluespace-memery
+ id = "bluespace_basic"
+ display_name = "Basic Bluespace Theory"
+ description = "Basic studies into the mysterious alternate dimension known as bluespace."
+ prereq_ids = list("base", "datatheory")
+ design_ids = list("beacon", "xenobioconsole", "telesci_gps", "xenobio_monkeys")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/practical_bluespace
+ id = "practical_bluespace"
+ display_name = "Applied Bluespace Research"
+ description = "Using bluespace to make things faster and better."
+ prereq_ids = list("bluespace_basic", "engineering")
+ design_ids = list("bs_rped","biobag_holding","minerbag_holding", "bluespacebeaker", "bluespacesyringe", "phasic_scanning", "bluespacesmartdart", "xenobio_slimebasic")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 5000
+
+/datum/techweb_node/adv_bluespace
+ id = "adv_bluespace"
+ display_name = "Advanced Bluespace Research"
+ description = "Deeper understanding of how the Bluespace dimension works"
+ prereq_ids = list("practical_bluespace", "high_efficiency")
+ design_ids = list("bluespace_matter_bin", "femto_mani", "triphasic_scanning", "bluespace_crystal", "xenobio_slimeadv")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
+ export_price = 5000
+
+/datum/techweb_node/bluespace_power
+ id = "bluespace_power"
+ display_name = "Bluespace Power Technology"
+ description = "Even more powerful.. power!"
+ prereq_ids = list("adv_power", "adv_bluespace")
+ design_ids = list("bluespace_cell", "quadratic_capacitor")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/bluespace_holding
+ id = "bluespace_holding"
+ display_name = "Bluespace Pockets"
+ description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality."
+ prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma")
+ design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding", "bsblood_bag")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
+ export_price = 5000
+
+/datum/techweb_node/bluespace_portal
+ id = "bluespace_portal"
+ display_name = "Bluespace Portals"
+ description = "Allows for Bluespace Tech to be used tandem with Wormhole tech."
+ prereq_ids = list("adv_weaponry", "adv_bluespace")
+ design_ids = list("wormholeprojector")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/bluespace_warping
+ id = "bluespace_warping"
+ display_name = "Bluespace Travel"
+ description = "Application of Bluespace for static teleportation technology."
+ prereq_ids = list("adv_power", "adv_bluespace")
+ design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/unregulated_bluespace
+ id = "unregulated_bluespace"
+ display_name = "Unregulated Bluespace Research"
+ description = "Bluespace technology using unstable or unbalanced procedures, prone to damaging the fabric of bluespace. Outlawed by galactic conventions."
+ prereq_ids = list("bluespace_warping", "syndicate_basic")
+ design_ids = list("desynchronizer")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 2500
+
+/////////////////////////plasma tech/////////////////////////
+/datum/techweb_node/basic_plasma
+ id = "basic_plasma"
+ display_name = "Basic Plasma Research"
+ description = "Research into the mysterious and dangerous substance, plasma."
+ prereq_ids = list("engineering")
+ design_ids = list("mech_generator")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 5000
+
+/datum/techweb_node/adv_plasma
+ id = "adv_plasma"
+ display_name = "Advanced Plasma Research"
+ description = "Research on how to fully exploit the power of plasma."
+ prereq_ids = list("basic_plasma")
+ design_ids = list("mech_plasma_cutter")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+ export_price = 5000
+
+/////////////////////////robotics tech/////////////////////////
+/datum/techweb_node/robotics
+ id = "robotics"
+ display_name = "Basic Robotics Research"
+ description = "Programmable machines that make our lives lazier."
+ prereq_ids = list("base")
+ design_ids = list("paicard", "drone_shell")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 5000
+
+/datum/techweb_node/adv_robotics
+ id = "adv_robotics"
+ display_name = "Advanced Robotics Research"
+ description = "It can even do the dishes!"
+ prereq_ids = list("robotics")
+ design_ids = list("borg_upgrade_diamonddrill", "borg_upgrade_advancedmop")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+ export_price = 5000
+
+/datum/techweb_node/neural_programming
+ id = "neural_programming"
+ display_name = "Neural Programming"
+ description = "Study into networks of processing units that mimic our brains."
+ prereq_ids = list("biotech", "datatheory")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/posibrain
+ id = "posibrain"
+ display_name = "Positronic Brain"
+ description = "Applied usage of neural technology allowing for autonomous AI units based on special metallic cubes with conductive and processing circuits."
+ prereq_ids = list("neural_programming")
+ design_ids = list("mmi_posi")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/cyborg_upg_util
+ id = "cyborg_upg_util"
+ display_name = "Cyborg Upgrades: Utility"
+ description = "Utility upgrades for cyborgs."
+ prereq_ids = list("engineering", "robotics")
+ design_ids = list("borg_upgrade_holding", "borg_upgrade_lavaproof", "borg_upgrade_thrusters", "borg_upgrade_selfrepair", "borg_upgrade_expand", "borg_upgrade_rped")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 5000
+
+/datum/techweb_node/cyborg_upg_med
+ id = "cyborg_upg_med"
+ display_name = "Cyborg Upgrades: Medical"
+ description = "Medical upgrades for cyborgs."
+ prereq_ids = list("adv_biotech", "robotics")
+ design_ids = list("borg_upgrade_advhealth", "borg_upgrade_piercinghypospray", "borg_upgrade_highstrengthsynthesiser", "borg_upgrade_expandedsynthesiser", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 5000
+
+/datum/techweb_node/cyborg_upg_combat
+ id = "cyborg_upg_combat"
+ display_name = "Cyborg Upgrades: Combat"
+ description = "Military grade upgrades for cyborgs."
+ prereq_ids = list("adv_robotics", "adv_engi" , "weaponry")
+ design_ids = list("borg_upgrade_vtec", "borg_upgrade_disablercooler")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 5000
+
+/datum/techweb_node/ai
+ id = "ai"
+ display_name = "Artificial Intelligence"
+ description = "AI unit research."
+ prereq_ids = list("robotics", "posibrain")
+ design_ids = list("aifixer", "aicore", "safeguard_module", "onehuman_module", "protectstation_module", "quarantine_module", "oxygen_module", "freeform_module",
+ "reset_module", "purge_module", "remove_module", "freeformcore_module", "asimov_module", "paladin_module", "tyrant_module", "corporate_module",
+ "default_module", "borg_ai_control", "mecha_tracking_ai_control", "aiupload", "intellicard")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/////////////////////////EMP tech/////////////////////////
+/datum/techweb_node/emp_basic //EMP tech for some reason
+ id = "emp_basic"
+ display_name = "Electromagnetic Theory"
+ description = "Study into usage of frequencies in the electromagnetic spectrum."
+ prereq_ids = list("base")
+ design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos", "inducer", "tray_goggles", "holopad")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/emp_adv
+ id = "emp_adv"
+ display_name = "Advanced Electromagnetic Theory"
+ description = "Determining whether reversing the polarity will actually help in a given situation."
+ prereq_ids = list("emp_basic")
+ design_ids = list("ultra_micro_laser")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+ export_price = 5000
+
+/datum/techweb_node/emp_super
+ id = "emp_super"
+ display_name = "Quantum Electromagnetic Technology" //bs
+ description = "Even better electromagnetic technology."
+ prereq_ids = list("emp_adv")
+ design_ids = list("quadultra_micro_laser")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+ export_price = 5000
+
+/////////////////////////Clown tech/////////////////////////
+/datum/techweb_node/clown
+ id = "clown"
+ display_name = "Clown Technology"
+ description = "Honk?!"
+ prereq_ids = list("base")
+ design_ids = list("air_horn", "honker_main", "honker_peri", "honker_targ", "honk_chassis", "honk_head", "honk_torso", "honk_left_arm", "honk_right_arm",
+ "honk_left_leg", "honk_right_leg", "mech_banana_mortar", "mech_mousetrap_mortar", "mech_honker", "mech_punching_face", "implant_trombone", "borg_transform_clown")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+////////////////////////Computer tech////////////////////////
+/datum/techweb_node/comptech
+ id = "comptech"
+ display_name = "Computer Consoles"
+ description = "Computers and how they work."
+ prereq_ids = list("datatheory")
+ design_ids = list("cargo", "cargorequest", "libraryconsole", "mining", "miningshuttle", "crewconsole", "rdcamera", "comconsole", "idcardconsole", "seccamera")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 5000
+
+/datum/techweb_node/computer_hardware_basic //Modular computers are shitty and nearly useless so until someone makes them actually useful this can be easy to get.
+ id = "computer_hardware_basic"
+ display_name = "Computer Hardware"
+ description = "How computer hardware are made."
+ prereq_ids = list("comptech")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250) //they are really kinda shitty
+ export_price = 2000
+ design_ids = list("hdd_basic", "hdd_advanced", "hdd_super", "hdd_cluster", "ssd_small", "ssd_micro", "netcard_basic", "netcard_advanced", "netcard_wired",
+ "portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced",
+ "bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small")
+
+/datum/techweb_node/comp_recordkeeping
+ id = "comp_recordkeeping"
+ display_name = "Computerized Recordkeeping"
+ description = "Organized record databases and how they're used."
+ prereq_ids = list("comptech")
+ design_ids = list("secdata", "med_data", "prisonmanage", "vendor", "automated_announcement")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250)
+ export_price = 2000
+
+/datum/techweb_node/telecomms
+ id = "telecomms"
+ display_name = "Telecommunications Technology"
+ description = "Subspace transmission technology for near-instant communications devices."
+ prereq_ids = list("comptech", "bluespace_basic")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
+ export_price = 5000
+ design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server",
+ "s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "message_monitor")
+
+/datum/techweb_node/integrated_HUDs
+ id = "integrated_HUDs"
+ display_name = "Integrated HUDs"
+ description = "The usefulness of computerized records, projected straight onto your eyepiece!"
+ prereq_ids = list("comp_recordkeeping", "emp_basic")
+ design_ids = list("health_hud", "security_hud", "diagnostic_hud", "scigoggles", "health_hud_prescription", "security_hud_prescription", "diagnostic_hud_prescription")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
+ export_price = 5000
+
+/datum/techweb_node/NVGtech
+ id = "NVGtech"
+ display_name = "Night Vision Technology"
+ description = "Allows seeing in the dark without actual light!"
+ prereq_ids = list("integrated_HUDs", "adv_engi", "emp_adv")
+ design_ids = list("health_hud_night", "security_hud_night", "diagnostic_hud_night", "night_visision_goggles", "nvgmesons", "night_visision_goggles_glasses")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 5000
+
+////////////////////////Medical////////////////////////
+/datum/techweb_node/cloning
+ id = "cloning"
+ display_name = "Genetic Engineering"
+ description = "We have the technology to make him."
+ prereq_ids = list("biotech")
+ design_ids = list("clonecontrol", "clonepod", "clonescanner", "scan_console", "cloning_disk")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 5000
+
+/datum/techweb_node/cryotech
+ id = "cryotech"
+ display_name = "Cryostasis Technology"
+ description = "Smart freezing of objects to preserve them!"
+ prereq_ids = list("adv_engi", "biotech")
+ design_ids = list("splitbeaker", "noreactsyringe", "cryotube", "cryo_Grenade")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 4000
+
+/datum/techweb_node/subdermal_implants
+ id = "subdermal_implants"
+ display_name = "Subdermal Implants"
+ description = "Electronic implants buried beneath the skin."
+ prereq_ids = list("biotech", "datatheory")
+ design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/cyber_organs
+ id = "cyber_organs"
+ display_name = "Cybernetic Organs"
+ description = "We have the technology to rebuild him."
+ prereq_ids = list("adv_biotech")
+ design_ids = list("cybernetic_ears", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_tongue")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
+ export_price = 5000
+
+/datum/techweb_node/cyber_organs_upgraded
+ id = "cyber_organs_upgraded"
+ display_name = "Upgraded Cybernetic Organs"
+ description = "We have the technology to upgrade him."
+ prereq_ids = list("cyber_organs")
+ design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
+ export_price = 5000
+
+/datum/techweb_node/cyber_implants
+ id = "cyber_implants"
+ display_name = "Cybernetic Implants"
+ description = "Electronic implants that improve humans."
+ prereq_ids = list("adv_biotech", "adv_datatheory")
+ design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/adv_cyber_implants
+ id = "adv_cyber_implants"
+ display_name = "Advanced Cybernetic Implants"
+ description = "Upgraded and more powerful cybernetic implants."
+ prereq_ids = list("neural_programming", "cyber_implants","integrated_HUDs")
+ design_ids = list("ci-toolset", "ci-surgery", "ci-reviver", "ci-nutrimentplus")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/combat_cyber_implants
+ id = "combat_cyber_implants"
+ display_name = "Combat Cybernetic Implants"
+ description = "Military grade combat implants to improve performance."
+ prereq_ids = list("adv_cyber_implants","weaponry","NVGtech","high_efficiency")
+ design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+////////////////////////Tools////////////////////////
+/datum/techweb_node/basic_mining
+ id = "basic_mining"
+ display_name = "Mining Technology"
+ description = "Better than Efficiency V."
+ prereq_ids = list("engineering", "basic_plasma")
+ design_ids = list("drill", "superresonator", "triggermod", "damagemod", "cooldownmod", "rangemod", "ore_redemption", "mining_equipment_vendor", "cargoexpress", "plasmacutter")//e a r l y g a m e)
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/adv_mining
+ id = "adv_mining"
+ display_name = "Advanced Mining Technology"
+ description = "Efficiency Level 127" //dumb mc references
+ prereq_ids = list("basic_mining", "adv_engi", "adv_power", "adv_plasma")
+ design_ids = list("drill_diamond", "jackhammer", "hypermod", "plasmacutter_adv", "ore_silo")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/janitor
+ id = "janitor"
+ display_name = "Advanced Sanitation Technology"
+ description = "Clean things better, faster, stronger, and harder!"
+ prereq_ids = list("adv_engi")
+ design_ids = list("advmop", "buffer", "light_replacer")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1750) // No longer has its bag
+ export_price = 5000
+
+/datum/techweb_node/botany
+ id = "botany"
+ display_name = "Botanical Engineering"
+ description = "Botanical tools."
+ prereq_ids = list("adv_engi", "biotech")
+ design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
+ export_price = 5000
+
+/datum/techweb_node/exp_tools
+ id = "exp_tools"
+ display_name = "Experimental Tools"
+ description = "Highly advanced construction tools."
+ design_ids = list("exwelder", "jawsoflife", "handdrill")
+ prereq_ids = list("adv_engi")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
+ export_price = 5000
+
+/////////////////////////weaponry tech/////////////////////////
+/datum/techweb_node/weaponry
+ id = "weaponry"
+ display_name = "Weapon Development Technology"
+ description = "Our researchers have found new to weaponize just about everything now."
+ prereq_ids = list("engineering")
+ design_ids = list("pin_testing", "tele_shield", "lasercarbine")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
+ export_price = 5000
+
+/datum/techweb_node/adv_weaponry
+ id = "adv_weaponry"
+ display_name = "Advanced Weapon Development Technology"
+ description = "Our weapons are breaking the rules of reality by now."
+ prereq_ids = list("adv_engi", "weaponry")
+ design_ids = list("pin_loyalty")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
+ export_price = 5000
+
+/datum/techweb_node/electric_weapons
+ id = "electronic_weapons"
+ display_name = "Electric Weapons"
+ description = "Weapons using electric technology"
+ prereq_ids = list("weaponry", "adv_power" , "emp_basic")
+ design_ids = list("stunrevolver", "stunshell", "ioncarbine")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
+ export_price = 5000
+
+/datum/techweb_node/radioactive_weapons
+ id = "radioactive_weapons"
+ display_name = "Radioactive Weaponry"
+ description = "Weapons using radioactive technology."
+ prereq_ids = list("adv_engi", "adv_weaponry")
+ design_ids = list("nuclear_gun")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/medical_weapons
+ id = "medical_weapons"
+ display_name = "Medical Weaponry"
+ description = "Weapons using medical technology."
+ prereq_ids = list("adv_biotech", "adv_weaponry")
+ design_ids = list("rapidsyringe", "shotgundartcryostatis")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 5000
+
+/datum/techweb_node/beam_weapons
+ id = "beam_weapons"
+ display_name = "Beam Weaponry"
+ description = "Various basic beam weapons"
+ prereq_ids = list("adv_weaponry")
+ design_ids = list("temp_gun", "xray_laser")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/adv_beam_weapons
+ id = "adv_beam_weapons"
+ display_name = "Advanced Beam Weaponry"
+ description = "Various advanced beam weapons"
+ prereq_ids = list("beam_weapons")
+ design_ids = list("beamrifle")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3250) // Sniper
+ export_price = 5000
+
+/datum/techweb_node/explosive_weapons
+ id = "explosive_weapons"
+ display_name = "Explosive & Pyrotechnical Weaponry"
+ description = "If the light stuff just won't do it."
+ prereq_ids = list("adv_weaponry")
+ design_ids = list("large_Grenade", "pyro_Grenade", "adv_Grenade")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
+ export_price = 5000
+
+/datum/techweb_node/ballistic_weapons
+ id = "ballistic_weapons"
+ display_name = "Ballistic Weaponry"
+ description = "This isn't research.. This is reverse-engineering!"
+ prereq_ids = list("weaponry")
+ design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_rubber", "mag_oldsmg_tx")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
+ export_price = 5000
+
+/datum/techweb_node/exotic_ammo
+ id = "exotic_ammo"
+ display_name = "Exotic Ammunition"
+ description = "They won't know what hit em."
+ prereq_ids = list("weaponry", "ballistic_weapons")
+ design_ids = list("techshotshell", "c38_hotshot", "c38_iceblox")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
+ export_price = 5000
+
+/datum/techweb_node/gravity_gun
+ id = "gravity_gun"
+ display_name = "One-point Bluespace-gravitational Manipulator"
+ description = "Fancy wording for gravity gun."
+ prereq_ids = list("adv_weaponry", "adv_bluespace")
+ design_ids = list("gravitygun", "mech_gravcatapult")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+////////////////////////mech technology////////////////////////
+/datum/techweb_node/adv_mecha
+ id = "adv_mecha"
+ display_name = "Advanced Exosuits"
+ description = "For when you just aren't Gundam enough."
+ prereq_ids = list("adv_robotics")
+ design_ids = list("mech_repair_droid")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/odysseus
+ id = "mecha_odysseus"
+ display_name = "EXOSUIT: Odysseus"
+ description = "Odysseus exosuit designs"
+ prereq_ids = list("base")
+ design_ids = list("odysseus_chassis", "odysseus_torso", "odysseus_head", "odysseus_left_arm", "odysseus_right_arm" ,"odysseus_left_leg", "odysseus_right_leg",
+ "odysseus_main", "odysseus_peri")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/gygax
+ id = "mech_gygax"
+ display_name = "EXOSUIT: Gygax"
+ description = "Gygax exosuit designs"
+ prereq_ids = list("adv_mecha", "weaponry")
+ design_ids = list("gygax_chassis", "gygax_torso", "gygax_head", "gygax_left_arm", "gygax_right_arm", "gygax_left_leg", "gygax_right_leg", "gygax_main",
+ "gygax_peri", "gygax_targ", "gygax_armor")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/durand
+ id = "mech_durand"
+ display_name = "EXOSUIT: Durand"
+ description = "Durand exosuit designs"
+ prereq_ids = list("adv_mecha", "adv_weaponry")
+ design_ids = list("durand_chassis", "durand_torso", "durand_head", "durand_left_arm", "durand_right_arm", "durand_left_leg", "durand_right_leg", "durand_main",
+ "durand_peri", "durand_targ", "durand_armor")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
+ export_price = 5000
+
+/datum/techweb_node/phazon
+ id = "mecha_phazon"
+ display_name = "EXOSUIT: Phazon"
+ description = "Phazon exosuit designs"
+ prereq_ids = list("adv_mecha", "weaponry" , "adv_bluespace")
+ design_ids = list("phazon_chassis", "phazon_torso", "phazon_head", "phazon_left_arm", "phazon_right_arm", "phazon_left_leg", "phazon_right_leg", "phazon_main",
+ "phazon_peri", "phazon_targ", "phazon_armor")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+ export_price = 5000
+
+/datum/techweb_node/adv_mecha_tools
+ id = "adv_mecha_tools"
+ display_name = "Advanced Exosuit Equipment"
+ description = "Tools for high level mech suits"
+ prereq_ids = list("adv_mecha")
+ design_ids = list("mech_rcd")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/med_mech_tools
+ id = "med_mech_tools"
+ display_name = "Medical Exosuit Equipment"
+ description = "Tools for high level mech suits"
+ prereq_ids = list("adv_biotech")
+ design_ids = list("mech_sleeper", "mech_syringe_gun", "mech_medi_beam")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 5000
+
+/datum/techweb_node/mech_modules
+ id = "adv_mecha_modules"
+ display_name = "Simple Exosuit Modules"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("adv_mecha", "bluespace_power")
+ design_ids = list("mech_energy_relay", "mech_ccw_armor", "mech_proj_armor", "mech_generator_nuclear")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_scattershot
+ id = "mecha_tools"
+ display_name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("ballistic_weapons")
+ design_ids = list("mech_scattershot")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_seedscatter
+ id = "mech_seedscatter"
+ display_name = "Exosuit Weapon (Melon Seed \"Scattershot\")"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("ballistic_weapons")
+ design_ids = list("mech_seedscatter")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_carbine
+ id = "mech_carbine"
+ display_name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("ballistic_weapons")
+ design_ids = list("mech_carbine")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_ion
+ id = "mmech_ion"
+ display_name = "Exosuit Weapon (MKIV Ion Heavy Cannon)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("electronic_weapons", "emp_adv")
+ design_ids = list("mech_ion")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_tesla
+ id = "mech_tesla"
+ display_name = "Exosuit Weapon (MKI Tesla Cannon)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("electronic_weapons", "adv_power")
+ design_ids = list("mech_tesla")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_laser
+ id = "mech_laser"
+ display_name = "Exosuit Weapon (CH-PS \"Immolator\" Laser)"
+ description = "A basic piece of mech weaponry"
+ prereq_ids = list("beam_weapons")
+ design_ids = list("mech_laser")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_laser_heavy
+ id = "mech_laser_heavy"
+ display_name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("adv_beam_weapons")
+ design_ids = list("mech_laser_heavy")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_grenade_launcher
+ id = "mech_grenade_launcher"
+ display_name = "Exosuit Weapon (SGL-6 Grenade Launcher)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("explosive_weapons")
+ design_ids = list("mech_grenade_launcher")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_missile_rack
+ id = "mech_missile_rack"
+ display_name = "Exosuit Weapon (SRM-8 Missile Rack)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("explosive_weapons")
+ design_ids = list("mech_missile_rack")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/clusterbang_launcher
+ id = "clusterbang_launcher"
+ display_name = "Exosuit Module (SOB-3 Clusterbang Launcher)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("explosive_weapons")
+ design_ids = list("clusterbang_launcher")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_teleporter
+ id = "mech_teleporter"
+ display_name = "Exosuit Module (Teleporter Module)"
+ description = "An advanced piece of mech Equipment"
+ prereq_ids = list("adv_bluespace")
+ design_ids = list("mech_teleporter")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_wormhole_gen
+ id = "mech_wormhole_gen"
+ display_name = "Exosuit Module (Localized Wormhole Generator)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("adv_bluespace")
+ design_ids = list("mech_wormhole_gen")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_taser
+ id = "mech_taser"
+ display_name = "Exosuit Weapon (PBT \"Pacifier\" Mounted Taser)"
+ description = "A basic piece of mech weaponry"
+ prereq_ids = list("electronic_weapons")
+ design_ids = list("mech_taser")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_lmg
+ id = "mech_lmg"
+ display_name = "Exosuit Weapon (\"Ultra AC 2\" LMG)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("ballistic_weapons")
+ design_ids = list("mech_lmg")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/mech_diamond_drill
+ id = "mech_diamond_drill"
+ display_name = "Exosuit Diamond Drill"
+ description = "A diamond drill fit for a large exosuit"
+ prereq_ids = list("adv_mining")
+ design_ids = list("mech_diamond_drill")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/////////////////////////Nanites/////////////////////////
+/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","robotics")
+ design_ids = list("nanite_disk","nanite_remote","nanite_comm_remote","nanite_scanner",\
+ "nanite_chamber","public_nanite_chamber","nanite_chamber_control","nanite_programmer","nanite_program_hub","nanite_cloud_control",\
+ "relay_nanites", "monitoring_nanites", "access_nanites", "repairing_nanites","sensor_nanite_volume", "repeater_nanites", "relay_repeater_nanites","red_diag_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/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","adv_robotics")
+ design_ids = list("purging_nanites", "research_nanites", "metabolic_nanites", "stealth_nanites", "memleak_nanites","sensor_voice_nanites", "voice_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+ export_price = 4000
+
+/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("hardening_nanites", "dermal_button_nanites", "refractive_nanites", "cryo_nanites", "conductive_nanites", "shock_nanites", "emp_nanites", "temperature_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/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("regenerative_nanites", "bloodheal_nanites", "coagulating_nanites","poison_nanites","flesheating_nanites",\
+ "sensor_crit_nanites","sensor_death_nanites", "sensor_health_nanites", "sensor_damage_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/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("nervous_nanites", "brainheal_nanites", "paralyzing_nanites", "stun_nanites", "selfscan_nanites","good_mood_nanites","bad_mood_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/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("mindshield_nanites", "pacifying_nanites", "blinding_nanites", "sleep_nanites", "mute_nanites", "speech_nanites","hallucination_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+ export_price = 5000
+
+/datum/techweb_node/nanite_harmonic
+ id = "nanite_harmonic"
+ display_name = "Harmonic Nanite Programming"
+ description = "Nanite programs that require seamless integration between nanites and biology."
+ prereq_ids = list("nanite_bio","nanite_smart","nanite_mesh")
+ design_ids = list("fakedeath_nanites","researchplus_nanites","aggressive_nanites","defib_nanites","regenerative_plus_nanites","brainheal_plus_nanites","purging_plus_nanites","adrenaline_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
+ export_price = 8000
+
+/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","pyro_nanites","meltdown_nanites","viral_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
+ export_price = 12500
+
+/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("spreading_nanites","mindcontrol_nanites","mitosis_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
+ export_price = 15000
+
+////////////////////////Alien technology////////////////////////
+/datum/techweb_node/alientech //AYYYYYYYYLMAOO tech
+ id = "alientech"
+ display_name = "Alien Technology"
+ description = "Things used by the greys."
+ prereq_ids = list("biotech","engineering")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 20000
+ hidden = TRUE
+ design_ids = list("alienalloy")
+
+/datum/techweb_node/alientech/New()
+ . = ..()
+ boost_item_paths = typesof(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien,
+ /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/cautery/alien,
+ /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor,
+ /obj/item/crowbar/abductor, /obj/item/multitool/abductor,
+ /obj/item/stock_parts/cell/infinite/abductor, /obj/item/weldingtool/abductor,
+ /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor,
+ /obj/item/abductor, /obj/item/stack/sheet/mineral/abductor)
+
+/datum/techweb_node/alien_bio
+ id = "alien_bio"
+ display_name = "Alien Biological Tools"
+ description = "Advanced biological tools."
+ prereq_ids = list("alientech", "advance_surgerytools")
+ design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery", "ayyplantgenes")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 10000
+
+/datum/techweb_node/alien_engi
+ id = "alien_engi"
+ display_name = "Alien Engineering"
+ description = "Alien engineering tools."
+ prereq_ids = list("alientech", "exp_tools")
+ design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
+ export_price = 10000
+
+/datum/techweb_node/syndicate_basic
+ id = "syndicate_basic"
+ display_name = "Illegal Technology"
+ description = "Dangerous research used to create dangerous objects."
+ prereq_ids = list("adv_engi", "adv_weaponry", "explosive_weapons")
+ design_ids = list("decloner", "borg_syndicate_module", "suppressor", "largecrossbow", "donksofttoyvendor")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
+ export_price = 5000
+ hidden = TRUE
+
+/datum/techweb_node/syndicate_basic/New() //Crappy way of making syndicate gear decon supported until there's another way.
+ . = ..()
+ boost_item_paths = list()
+ for(var/path in GLOB.uplink_items)
+ var/datum/uplink_item/UI = new path
+ if(!UI.item || !UI.illegal_tech)
+ continue
+ boost_item_paths |= UI.item //allows deconning to unlock.
+
+/datum/techweb_node/advanced_illegal_ballistics
+ id = "advanced_illegal_ballistics"
+ display_name = "Advanced Non-Standard Ballistics"
+ description = "Ballistic ammunition for non-standard firearms. Usually the ones you don't have nor want to be involved with."
+ design_ids = list("10mm","10mmap","10mminc","10mmhp","sl357","pistolm9mm","m45","bolt_clip")
+ prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns from traitors, space, or anything in between.
+ export_price = 7000
+
+//Helpers for debugging/balancing the techweb in its entirety!
+/proc/total_techweb_exports()
+ var/list/datum/techweb_node/processing = list()
+ for(var/i in subtypesof(/datum/techweb_node))
+ processing += new i
+ . = 0
+ for(var/i in processing)
+ var/datum/techweb_node/TN = i
+ . += TN.export_price
+
+/proc/total_techweb_points()
+ var/list/datum/techweb_node/processing = list()
+ for(var/i in subtypesof(/datum/techweb_node))
+ processing += new i
+ var/datum/techweb/TW = new
+ TW.research_points = list()
+ for(var/i in processing)
+ var/datum/techweb_node/TN = i
+ TW.add_point_list(TN.research_costs)
+ return TW.research_points
+
+/proc/total_techweb_points_printout()
+ var/list/datum/techweb_node/processing = list()
+ for(var/i in subtypesof(/datum/techweb_node))
+ processing += new i
+ var/datum/techweb/TW = new
+ TW.research_points = list()
+ for(var/i in processing)
+ var/datum/techweb_node/TN = i
+ TW.add_point_list(TN.research_costs)
+ return TW.printout_points()