diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
index 8ae3ff1f62..d028ac106f 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
@@ -5,10 +5,6 @@
"ab" = (
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"ac" = (
-/obj/effect/mob_spawn/human/engineer/rig,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
"ad" = (
/obj/machinery/power/floodlight,
/obj/structure/cable{
@@ -176,10 +172,9 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"aI" = (
-/obj/item/pda/engineering{
- note = "To-do: Check on singularity status. Get a pint at eat. Nag the research manager for RCDs."
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
+/obj/effect/turf_decal/stripes/line,
+/obj/item/clothing/suit/space/hardsuit/engine,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"aJ" = (
/obj/effect/decal/cleanable/dirt,
@@ -346,20 +341,10 @@
/obj/effect/decal/cleanable/blood/splatter,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
-"be" = (
-/obj/item/card/id{
- access = list(200,204,11,12,10);
- assignment = "Senior Station Engineer";
- desc = "A card used to provide ID and determine access across the station. There's blood dripping from the corner. Ew.";
- name = "George 'Plastic' Miller's ID Card (Senior Station Engineer)";
- registered_name = "George 'Plastic' Miller"
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
"bf" = (
-/obj/effect/gibspawner/generic,
/obj/effect/decal/cleanable/blood,
/obj/effect/decal/cleanable/blood/gibs/core,
+/obj/item/clothing/suit/space/hardsuit/engine,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
"bg" = (
@@ -544,10 +529,6 @@
/obj/item/shard/plasma,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"bz" = (
-/obj/item/clothing/suit/space/hardsuit/engine,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
"bA" = (
/obj/item/flashlight/flare,
/turf/open/floor/plating/asteroid/snow/icemoon,
@@ -1013,13 +994,6 @@
},
/turf/open/floor/plating/icemoon,
/area/icemoon/surface/outdoors)
-"cU" = (
-/obj/effect/mob_spawn/human/engineer/rig,
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/open/floor/plating/icemoon,
-/area/icemoon/surface/outdoors)
"cV" = (
/obj/effect/turf_decal/trimline/neutral/filled/line,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
@@ -1032,12 +1006,7 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"cX" = (
-/obj/machinery/rnd/production/circuit_imprinter,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
"cY" = (
-/obj/machinery/rnd/production/protolathe/department/engineering,
/obj/machinery/light/small/broken,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
@@ -1437,9 +1406,9 @@ aa
aa
aa
aa
-aI
aa
-be
+aa
+aa
aa
aa
aa
@@ -1452,7 +1421,7 @@ ak
aa
"}
(9,1,1) = {"
-ac
+ab
ab
al
ap
@@ -1461,7 +1430,7 @@ aa
aa
aa
bf
-bz
+aa
aa
aa
af
@@ -1507,7 +1476,7 @@ bA
aa
aa
af
-cA
+aI
DM
dc
al
@@ -1529,7 +1498,7 @@ aa
ab
ab
cF
-cU
+gA
al
al
aO
@@ -1698,7 +1667,7 @@ cf
cr
cB
cI
-cX
+ab
aB
aa
aa
diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm
index d920cc03c5..93b221c446 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_hotsprings.dmm
@@ -1,6 +1,6 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
-/turf/open/floor/plating/asteroid/snow/icemoon,
+/turf/closed/indestructible/riveted/uranium,
/area/icemoon/surface/outdoors)
"b" = (
/turf/closed/mineral/random/snow/no_caves,
@@ -12,7 +12,17 @@
/obj/item/paper/crumpled{
info = "When one falls into this hot spring, they shall forever be turned into..."
},
-/turf/open/floor/plating/asteroid/snow/icemoon,
+/turf/open/floor/plating/beach/sand,
+/area/icemoon/surface/outdoors)
+"I" = (
+/turf/closed/indestructible/fakeglass,
+/area/icemoon/surface/outdoors)
+"L" = (
+/obj/structure/fluff/beach_umbrella,
+/turf/open/floor/plating/beach/sand,
+/area/icemoon/surface/outdoors)
+"U" = (
+/turf/open/floor/plating/beach/sand,
/area/icemoon/surface/outdoors)
(1,1,1) = {"
@@ -34,7 +44,7 @@ b
b
a
a
-a
+I
a
a
b
@@ -45,11 +55,11 @@ b
b
b
a
-a
-a
-a
-a
-a
+U
+U
+U
+U
+U
a
b
b
@@ -57,65 +67,65 @@ b
(4,1,1) = {"
b
a
-a
-a
+U
+L
c
c
c
-a
-a
+U
+U
a
b
"}
(5,1,1) = {"
b
a
-a
+U
c
c
c
c
c
-a
+U
a
b
"}
(6,1,1) = {"
b
-a
-a
+I
+U
c
c
c
c
c
-a
-a
+U
+I
b
"}
(7,1,1) = {"
b
a
-a
+U
c
c
c
c
c
-a
+U
a
b
"}
(8,1,1) = {"
b
a
-a
-a
+U
+L
c
c
c
-a
-a
+U
+U
a
b
"}
@@ -123,11 +133,11 @@ b
b
b
a
-a
-a
+U
+U
d
-a
-a
+U
+U
a
b
b
@@ -138,7 +148,7 @@ b
b
a
a
-a
+I
a
a
b
diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm
index 5e68de864f..704ac63a7d 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm
@@ -20,12 +20,6 @@
},
/turf/open/floor/mineral/diamond,
/area/icemoon/surface/outdoors)
-"f" = (
-/obj/structure/sign/poster/contraband/lusty_xenomorph,
-/obj/structure/falsewall/abductor,
-/obj/structure/fans/tiny,
-/turf/open/floor/mineral/diamond,
-/area/icemoon/surface/outdoors)
(1,1,1) = {"
a
@@ -101,7 +95,7 @@ d
e
d
c
-f
+b
a
a
"}
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index f9c3b0d427..2b19b557b2 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -298,6 +298,8 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0))
#define ARCHIVE_TEMPERATURE(gas) gas.temperature_archived = gas.temperature
+#define ARCHIVE(gas) gas.temperature_archived = gas.temperature; gas.gas_archive = gas.gases.Copy();
+
GLOBAL_LIST_INIT(pipe_paint_colors, list(
"amethyst" = rgb(130,43,255), //supplymain
"blue" = rgb(0,0,255),
diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm
index e9d8f278f4..f44215d9ac 100644
--- a/code/datums/elements/flavor_text.dm
+++ b/code/datums/elements/flavor_text.dm
@@ -5,12 +5,16 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
id_arg_index = 3
var/flavor_name = "Flavor Text"
var/list/texts_by_atom = list()
- var/addendum = "This can also be used for OOC notes and preferences!"
+ var/addendum = ""
var/always_show = FALSE
var/max_len = MAX_FLAVOR_LEN
var/can_edit = TRUE
+ /// For preference/DNA saving/loading. Null to prevent. Prefs are only loaded from obviously if it exists in preferences.features.
+ var/save_key
+ /// Do not attempt to render a preview on examine. If this is on, it will display as \[flavor_name\]
+ var/examine_no_preview = FALSE
-/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE)
+/datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE)
. = ..()
if(. == ELEMENT_INCOMPATIBLE || !isatom(target)) //no reason why this shouldn't work on atoms too.
@@ -25,6 +29,8 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
addendum = _addendum
always_show = _always_show
can_edit = _edit
+ save_key = _save_key
+ examine_no_preview = _examine_no_preview
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/show_flavor)
@@ -33,9 +39,12 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
LAZYOR(GLOB.mobs_with_editable_flavor_text[M], src)
M.verbs |= /mob/proc/manage_flavor_tests
+ if(save_key && ishuman(target))
+ RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text)
+
/datum/element/flavor_text/Detach(atom/A)
. = ..()
- UnregisterSignal(A, COMSIG_PARENT_EXAMINE)
+ UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_HUMAN_PREFS_COPIED_TO))
texts_by_atom -= A
if(can_edit && ismob(A))
var/mob/M = A
@@ -58,6 +67,9 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
var/text = texts_by_atom[target]
if(!text)
return
+ if(examine_no_preview)
+ examine_list += "\[[flavor_name]\]"
+ return
var/msg = replacetext(text, "\n", " ")
if(length_char(msg) <= 40)
examine_list += "[msg]"
@@ -112,13 +124,17 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
return TRUE
return FALSE
+/datum/element/flavor_text/proc/update_prefs_flavor_text(mob/living/carbon/human/H, datum/preferences/P, icon_updates = TRUE, roundstart_checks = TRUE)
+ if(P.features.Find(save_key))
+ texts_by_atom[H] = P.features[save_key]
+
//subtypes with additional hooks for DNA and preferences.
/datum/element/flavor_text/carbon
//list of antagonists etcetera that should have nothing to do with people's snowflakes.
var/static/list/i_dont_even_know_who_you_are = typecacheof(list(/datum/antagonist/abductor, /datum/antagonist/ert,
/datum/antagonist/nukeop, /datum/antagonist/wizard))
-/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE)
+/datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key = "flavor_text", _examine_no_preview = FALSE)
if(!iscarbon(target))
return ELEMENT_INCOMPATIBLE
. = ..()
@@ -127,7 +143,6 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
RegisterSignal(target, COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, .proc/update_dna_flavor_text)
RegisterSignal(target, COMSIG_MOB_ANTAG_ON_GAIN, .proc/on_antag_gain)
if(ishuman(target))
- RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text)
RegisterSignal(target, COMSIG_HUMAN_HARDSET_DNA, .proc/update_dna_flavor_text)
RegisterSignal(target, COMSIG_HUMAN_ON_RANDOMIZE, .proc/unset_flavor)
@@ -136,15 +151,12 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
UnregisterSignal(C, list(COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, COMSIG_MOB_ANTAG_ON_GAIN, COMSIG_HUMAN_PREFS_COPIED_TO, COMSIG_HUMAN_HARDSET_DNA, COMSIG_HUMAN_ON_RANDOMIZE))
/datum/element/flavor_text/carbon/proc/update_dna_flavor_text(mob/living/carbon/C)
- texts_by_atom[C] = C.dna.features["flavor_text"]
-
-/datum/element/flavor_text/carbon/proc/update_prefs_flavor_text(mob/living/carbon/human/H, datum/preferences/P, icon_updates = TRUE, roundstart_checks = TRUE)
- texts_by_atom[H] = P.features["flavor_text"]
+ texts_by_atom[C] = C.dna.features[save_key]
/datum/element/flavor_text/carbon/set_flavor(mob/living/carbon/user)
. = ..()
if(. && user.dna)
- user.dna.features["flavor_text"] = texts_by_atom[user]
+ user.dna.features[save_key] = texts_by_atom[user]
/datum/element/flavor_text/carbon/proc/unset_flavor(mob/living/carbon/user)
texts_by_atom[user] = ""
@@ -153,4 +165,4 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code
if(is_type_in_typecache(antag, i_dont_even_know_who_you_are))
texts_by_atom[user] = ""
if(user.dna)
- user.dna.features["flavor_text"] = ""
\ No newline at end of file
+ user.dna.features[save_key] = ""
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index f07b1d8792..f189a91353 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -72,7 +72,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
/datum/material/uranium/on_applied(atom/source, amount, material_flags)
. = ..()
- source.AddComponent(/datum/component/radioactive, amount / 20, source, 0) //half-life of 0 because we keep on going.
+ source.AddComponent(/datum/component/radioactive, amount / 60, source, 0) //half-life of 0 because we keep on going.
/datum/material/uranium/on_removed(atom/source, material_flags)
. = ..()
diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm
index d9f231b318..b63a126c5d 100644
--- a/code/game/objects/empulse.dm
+++ b/code/game/objects/empulse.dm
@@ -7,7 +7,7 @@
if(log)
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
- log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
+ log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
if(heavy_range >= 1)
new /obj/effect/temp_visual/emp/pulse(epicenter)
@@ -29,4 +29,4 @@
T.emp_act(EMP_LIGHT)
else if(distance <= light_range)
T.emp_act(EMP_LIGHT)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm
index 2f3bb23261..e68918c764 100644
--- a/code/game/objects/structures/icemoon/cave_entrance.dm
+++ b/code/game/objects/structures/icemoon/cave_entrance.dm
@@ -176,3 +176,4 @@ GLOBAL_LIST_INIT(ore_probability, list(/obj/item/stack/ore/uranium = 50,
new /obj/item/book/granter/spell/sacredflame(loc)
if(28)
new /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom(loc)
+ qdel(src)
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index 17ca178cd9..c3b388fc29 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -152,8 +152,8 @@
pod_moving = 0
if(!QDELETED(pod))
var/datum/gas_mixture/floor_mixture = loc.return_air()
- ARCHIVE_TEMPERATURE(floor_mixture)
- ARCHIVE_TEMPERATURE(pod.air_contents)
+ ARCHIVE(floor_mixture)
+ ARCHIVE(pod.air_contents)
pod.air_contents.share(floor_mixture, 1) //mix the pod's gas mixture with the tile it's on
air_update_turf()
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index e4a3c5810c..1fbeee7523 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -203,8 +203,7 @@
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/wolf = 50, /obj/structure/spawner/ice_moon = 3, \
/mob/living/simple_animal/hostile/asteroid/polarbear = 30, /obj/structure/spawner/ice_moon/polarbear = 3, \
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10)
-
- flora_spawn_list = list(/obj/structure/flora/tree/pine = 2, /obj/structure/flora/grass/both = 12)
+ flora_spawn_list = list(/obj/structure/flora/tree/pine = 2, /obj/structure/flora/grass/both = 12, /obj/structure/flora/rock/icy = 6, /obj/structure/flora/rock/pile/icy = 6)
data_having_type = /turf/open/floor/plating/asteroid/airless/cave/snow/has_data
turf_type = /turf/open/floor/plating/asteroid/snow/icemoon
choose_turf_type = list(/turf/open/floor/plating/asteroid/snow/icemoon = 19, /turf/open/floor/plating/ice/icemoon = 1)
diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm
index 44eafc5fc6..c9b2690784 100644
--- a/code/modules/arousal/arousal.dm
+++ b/code/modules/arousal/arousal.dm
@@ -63,7 +63,7 @@
if(!target || !R)
return
var/turfing = isturf(target)
- G.generate_fluid()
+ G.generate_fluid(R)
if(spill && R.total_volume >= 5)
R.reaction(turfing ? target : target.loc, TOUCH, 1, 0)
if(!turfing)
diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm
index 731c69a457..fb254a2dcc 100644
--- a/code/modules/arousal/genitals.dm
+++ b/code/modules/arousal/genitals.dm
@@ -159,10 +159,10 @@
if(fluid_id && CHECK_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION))
time_since_last_orgasm++
-/obj/item/organ/genital/proc/generate_fluid()
+/obj/item/organ/genital/proc/generate_fluid(datum/reagents/R)
var/amount = clamp(fluid_rate * time_since_last_orgasm * fluid_mult,0,fluid_max_volume)
- reagents.clear_reagents()
- reagents.add_reagent(fluid_id,amount)
+ R.clear_reagents()
+ R.add_reagent(fluid_id,amount)
return TRUE
/obj/item/organ/genital/proc/update_link()
diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index 632542f605..081f0b1d28 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -89,7 +89,7 @@
temperature_archived = temperature
/turf/open/archive()
- ARCHIVE_TEMPERATURE(air)
+ ARCHIVE(air)
archived_cycle = SSair.times_fired
temperature_archived = temperature
@@ -215,7 +215,7 @@
if (planet_atmos) //share our air with the "atmosphere" "above" the turf
var/datum/gas_mixture/G = new
G.copy_from_turf(src)
- ARCHIVE_TEMPERATURE(G)
+ ARCHIVE(G)
if(our_air.compare(G))
if(!our_excited_group)
var/datum/excited_group/EG = new
diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
index 5ff8586c34..93927f4420 100644
--- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm
@@ -17,6 +17,7 @@ GLOBAL_LIST_INIT(meta_gas_ids, meta_gas_id_list())
GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
/datum/gas_mixture
var/list/gases = list()
+ var/list/gas_archive = list()
var/temperature = 0 //kelvins
var/tmp/temperature_archived = 0
var/volume = CELL_VOLUME //liters
@@ -31,13 +32,25 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
//PV = nRT
-/datum/gas_mixture/proc/heat_capacity() //joules per kelvin
+/datum/gas_mixture/proc/heat_capacity()
+
+/datum/gas_mixture/proc/archived_heat_capacity()
+
+/datum/gas_mixture/heat_capacity() //joules per kelvin
var/list/cached_gases = gases
var/list/cached_gasheats = GLOB.meta_gas_specific_heats
. = 0
for(var/id in cached_gases)
. += cached_gases[id] * cached_gasheats[id]
+/datum/gas_mixture/archived_heat_capacity()
+ // lots of copypasta but heat_capacity is the single proc called the most in a regular round, bar none, so performance loss adds up
+ var/list/cached_gases = gas_archive
+ var/list/cached_gasheats = GLOB.meta_gas_specific_heats
+ . = 0
+ for(var/id in cached_gases)
+ . += cached_gases[id] * cached_gasheats[id]
+
/datum/gas_mixture/turf/heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
var/list/cached_gases = gases
var/list/cached_gasheats = GLOB.meta_gas_specific_heats
@@ -46,6 +59,14 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
if(!.)
. += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
+/datum/gas_mixture/turf/archived_heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM
+ var/list/cached_gases = gas_archive
+ var/list/cached_gasheats = GLOB.meta_gas_specific_heats
+ for(var/id in cached_gases)
+ . += cached_gases[id] * cached_gasheats[id]
+ if(!.)
+ . += HEAT_CAPACITY_VACUUM //we want vacuums in turfs to have the same heat capacity as space
+
/datum/gas_mixture/proc/total_moles()
var/cached_gases = gases
TOTAL_MOLES(cached_gases, .)
@@ -67,6 +88,10 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
/datum/gas_mixture/proc/thermal_energy() //joules
return THERMAL_ENERGY(src) //see code/__DEFINES/atmospherics.dm; use the define in performance critical areas
+/datum/gas_mixture/proc/archive()
+ //Update archived versions of variables
+ //Returns: 1 in all cases
+
/datum/gas_mixture/proc/merge(datum/gas_mixture/giver)
//Merges all air from giver into self. Deletes giver.
//Returns: 1 if we are mutable, 0 otherwise
@@ -111,6 +136,10 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
//Performs various reactions such as combustion or fusion (LOL)
//Returns: 1 if any reaction took place; 0 otherwise
+/datum/gas_mixture/archive()
+ temperature_archived = temperature
+ gas_archive = gases.Copy()
+ return 1
/datum/gas_mixture/merge(datum/gas_mixture/giver)
if(!giver)
@@ -245,7 +274,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
//GAS TRANSFER
for(var/id in cached_gases | sharer_gases) // transfer gases
- delta = QUANTIZE(cached_gases[id] - sharer_gases[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures
+ delta = QUANTIZE(gas_archive[id] - sharer.gas_archive[id])/(atmos_adjacent_turfs+1) //the amount of gas that gets moved between the mixtures
if(delta && abs_temperature_delta > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
gas_heat_capacity = delta * cached_gasheats[id]
@@ -293,8 +322,8 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list())
sharer_temperature = sharer.temperature_archived
var/temperature_delta = temperature_archived - sharer_temperature
if(abs(temperature_delta) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)
- var/self_heat_capacity = heat_capacity()
- sharer_heat_capacity = sharer_heat_capacity || sharer.heat_capacity()
+ var/self_heat_capacity = archived_heat_capacity()
+ sharer_heat_capacity = sharer_heat_capacity || sharer.archived_heat_capacity()
if((sharer_heat_capacity > MINIMUM_HEAT_CAPACITY) && (self_heat_capacity > MINIMUM_HEAT_CAPACITY))
var/heat = conduction_coefficient*temperature_delta* \
diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm
index a3548a5eb6..51bb2b728f 100644
--- a/code/modules/cargo/packs/science.dm
+++ b/code/modules/cargo/packs/science.dm
@@ -10,24 +10,13 @@
group = "Science"
crate_type = /obj/structure/closet/crate/science
-/* For later
-/datum/supply_pack/science/monkey
+/datum/supply_pack/science/ape //Ape out!
name = "Ape Cube Crate"
desc = "Pss what a new test subject with supper strangth, speed, and love for bananas all at the same time? Say no more... Contains a single ape cube. Dont add water!"
contraband = TRUE
cost = 2500
- contains = list (/obj/item/reagent_containers/food/snacks/monkeycube/ape)
+ contains = list (/obj/item/reagent_containers/food/snacks/cube/ape)
crate_name = "ape cube crate"
-*/
-
-/datum/supply_pack/science/aliens
- name = "Advanced Alien Alloy Crate Crate"
- desc = "Hello brothers from the stars!!! Our fellow brethren have made contact at long last and gave us gifts man! They really did build the prymi- Connection Error- Bro we’ll send you a sheet of advanced alien alloy."
- cost = 15000
- DropPodOnly = TRUE
- contraband = TRUE
- contains = list(/obj/item/stack/sheet/mineral/abductor)
- crate_name = "alien bro alloy crate"
/datum/supply_pack/science/beakers
name = "Chemistry Beakers Crate"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 87ba03a2cb..1883e007c1 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -153,6 +153,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"ipc_screen" = "Sunburst",
"ipc_antenna" = "None",
"flavor_text" = "",
+ "ooc_notes" = "",
"meat_type" = "Mammalian",
"body_model" = MALE,
"body_size" = RESIZE_DEFAULT_SIZE
@@ -348,6 +349,16 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[features["flavor_text"]]"
else
dat += "[TextPreview(features["flavor_text"])]...
"
+ dat += "
OOC notes
"
+ dat += "Set OOC notes
"
+ var/ooc_notes_len = length(features["ooc_notes"])
+ if(ooc_notes_len <= 40)
+ if(!ooc_notes_len)
+ dat += "\[...\]"
+ else
+ dat += "[features["ooc_notes"]]"
+ else
+ dat += "[TextPreview(features["ooc_notes"])]...
"
dat += "Body
"
dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
"
if(gender != NEUTER && pref_species.sexes)
@@ -1510,6 +1521,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!isnull(msg))
features["flavor_text"] = html_decode(msg)
+ if("ooc_notes")
+ var/msg = stripped_multiline_input(usr, "Set always-visible OOC notes related to content preferences. THIS IS NOT FOR CHARACTE DESCRIPTIONS!!", "OOC notes", features["ooc_notes"], MAX_FLAVOR_LEN, TRUE)
+ if(!isnull(msg))
+ features["ooc_notes"] = html_decode(msg)
+
if("hair")
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null
if(new_hair)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 6872def704..3fa36cc254 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 30
+#define SAVEFILE_VERSION_MAX 31
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -535,6 +535,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else //We have no old flavortext, default to new
S["feature_flavor_text"] >> features["flavor_text"]
+ S["feature_ooc_notes"] >> features["ooc_notes"]
+
S["vore_flags"] >> vore_flags
S["vore_taste"] >> vore_taste
S["belly_prefs"] >> belly_prefs
@@ -643,6 +645,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
+ features["ooc_notes"] = copytext(features["ooc_notes"], 1, MAX_FLAVOR_LEN)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
//Validate job prefs
@@ -746,6 +749,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_has_womb"], features["has_womb"])
+ WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"])
+
//Custom names
for(var/custom_name_id in GLOB.preferences_custom_names)
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 3d744effb0..25ef367b48 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -273,7 +273,7 @@
//LightToggle
-/obj/item/clothing/head/helment/ComponentInitialize()
+/obj/item/clothing/head/helmet/ComponentInitialize()
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index b03871876f..46477097d0 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -180,6 +180,10 @@
name = "mining boots"
desc = "Steel-toed mining boots for mining in hazardous environments. Very good at keeping toes uncrushed."
icon_state = "explorer"
+ cold_protection = FEET|LEGS
+ min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
+ heat_protection = FEET|LEGS
+ max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
/obj/item/clothing/shoes/cult
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index bc0aaf23f8..2e72c154d9 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -41,7 +41,7 @@
/obj/item/clothing/head/helmet/space/hardsuit/dropped(mob/user)
..()
- if(suit)
+ if(suit && !ismob(loc)) //equipped() will handle mob cases, so it doesn't disengage twice.
suit.RemoveHelmet()
soundloop.stop(user)
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index a612bfaa54..4e6be19488 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -395,6 +395,12 @@
tastes = list("milk" = 1, "beef" = 1)
dried_being = /mob/living/simple_animal/cow
+/obj/item/reagent_containers/food/snacks/cube/ape
+ name = "ape cube"
+ desc = "Don't add water."
+ tastes = list("the jungle" = 1, "bananas" = 1, "jimmies" = 1)
+ dried_being = /mob/living/simple_animal/hostile/gorilla
+
/obj/item/reagent_containers/food/snacks/cube/egg
//Well eggs normally are able to hatch into small birds, this one does not.
//Also in order to have a normal egg hatch you need a hen to lay the egg that is able to hatch, meaning this one is for on-demand hen needs.
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 30eed6c8f0..a45275e0c8 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -24,7 +24,9 @@
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
+ cold_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
+ heat_protection = HEAD
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
resistance_flags = FIRE_PROOF
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm
index e38d9b7341..110ac69201 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm
@@ -133,6 +133,7 @@
/datum/sprite_accessory/antenna
icon = 'modular_citadel/icons/mob/ipc_antennas.dmi'
color_src = MUTCOLORS2
+ relevant_layers = list(BODY_ADJ_LAYER)
recommended_species = list("ipc")
/datum/sprite_accessory/antenna/none
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 2623574a73..ea91a90ee9 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -38,8 +38,9 @@
. = ..()
if(!CONFIG_GET(flag/disable_human_mood))
AddComponent(/datum/component/mood)
- AddElement(/datum/element/flavor_text/carbon)
+ AddElement(/datum/element/flavor_text/carbon, _name = "Flavor Text", _save_key = "flavor_text")
AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!")
+ AddElement(/datum/element/flavor_text, _name = "OOC Notes", _addendum = "Put information on ERP/vore/lewd-related preferences here. THIS SHOULD NOT CONTAIN REGULAR FLAVORTEXT!!", _always_show = TRUE, _save_key = "ooc_notes", _examine_no_preview = TRUE)
/mob/living/carbon/human/Destroy()
QDEL_NULL(physiology)
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
index 5d80b91087..78b0a365c5 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_electronics.dm
@@ -82,3 +82,11 @@
materials = list(/datum/material/iron = 100, /datum/material/glass = 100)
build_path = /obj/item/assembly/control/electrochromatic
category = list("initial", "Electronics")
+
+/datum/design/electrochromatic_kit
+ name = "Electrochromatic Upgrade Kit"
+ id = "electrochromatic_kit"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 2010, /datum/material/glass = 5)
+ build_path = /obj/item/electronics/electrochromatic_kit
+ category = list("initial", "Electronics")
diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm
index fff3f42b9f..33147aa717 100644
--- a/code/modules/research/techweb/_techweb_node.dm
+++ b/code/modules/research/techweb/_techweb_node.dm
@@ -91,4 +91,17 @@
actual_costs[i] -= L[i]
return actual_costs
else
- return research_costs
\ No newline at end of file
+ return research_costs
+
+//Base Nodes, everything starts from here.
+
+/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", "desttagger", "handlabel", "packagewrap",
+ "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
+ "space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal",
+ "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
deleted file mode 100644
index 12e4557121..0000000000
--- a/code/modules/research/techweb/all_nodes.dm
+++ /dev/null
@@ -1,1052 +0,0 @@
-
-//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", "desttagger", "handlabel", "packagewrap",
- "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
- "space_heater", "beaker", "large_beaker", "bucket", "xlarge_beaker", "sec_shellclip", "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", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray","genescanner")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter", "containmentbodybag")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/////////////////////////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)
-
-/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)
-
-/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)
-
-/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)
-
-/////////////////////////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)
-
-/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)
-
-/////////////////////////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", "autolathe_secure", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod",
- "apc_control", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine", "rcd_ammo")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 6000)
-
-/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" , "rcd_loaded", "rpd", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", "rcd_upgrade_simple_circuits", "rcd_ammo_large")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
-
-/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)
-
-/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)
-
-/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)
-
-/*
-/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")
-
-/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")
-*/
-
-/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", "arcade_minesweeper", "slotmachine", "autoylathe")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
-
-/////////////////////////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)
-
-/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)
-
-/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)
-
-/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)
-
-/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", "duffelbag_holding")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
-
-/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)
-
-/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)
-
-/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)
-
-/////////////////////////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)
-
-/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)
-
-/////////////////////////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)
-
-/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", "borg_upgrade_advcutter")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
-
-/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)
-
-/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)
-
-/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_lavaproof", "borg_upgrade_thrusters", "borg_upgrade_selfrepair", "borg_upgrade_expand", "borg_upgrade_rped")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
-
-/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)
-
-/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)
-
-/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)
-
-/////////////////////////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", "holosignfirelock", "inducer", "tray_goggles", "holopad")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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)
-
-/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)
-
-/////////////////////////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)
-
-////////////////////////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)
-
-/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
- 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)
-
-/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)
- 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)
-
-/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)
-
-////////////////////////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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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", "ci-service")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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)
-
-/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", "ci-shield")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-////////////////////////Tools////////////////////////
-/datum/techweb_node/basic_tools
- id = "basic_tools"
- display_name = "Basic Tools"
- description = "Basic mechanical, electronic, surgical and botanical tools."
- prereq_ids = list("base")
- design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom", "normtrash")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500)
-
-/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)
-
-/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", "plasteel_pick", "titanium_pick")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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", "spraybottle", "beartrap", "ci-janitor", "paint_remover")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1750) // No longer has its bag
-
-/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)
-
-/datum/techweb_node/exp_tools
- id = "exp_tools"
- display_name = "Experimental Tools"
- description = "Highly advanced construction tools."
- design_ids = list("exwelder", "jawsoflife", "handdrill", "holosigncombifan")
- prereq_ids = list("adv_engi")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
-
-/datum/techweb_node/sec_basic
- id = "sec_basic"
- display_name = "Basic Security Equipment"
- description = "Standard equipment used by security."
- design_ids = list("seclite", "pepperspray", "bola_energy", "zipties", "evidencebag")
- prereq_ids = list("base")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 750)
-
-/////////////////////////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", "pin_away")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
-
-/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", "laser_shield", "bullet_shield")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
-
-/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)
-
-/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)
-
-/datum/techweb_node/magnetic_weapons
- id = "magnetic_weapons"
- display_name = "Magnetic Weapons"
- description = "Weapons using magnetic technology"
- prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
- design_ids = list("magrifle", "magpistol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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)
-
-/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)
-
-/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
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-////////////////////////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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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", "mech_scattershot_ammo")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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)
-
-/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", "mech_carbine_ammo")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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", "mech_grenade_launcher_ammo")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/datum/techweb_node/mech_missile_rack
- id = "mech_missile_rack"
- display_name = "Exosuit Weapon (BRM-6 Missile Rack)"
- description = "An advanced piece of mech weaponry"
- prereq_ids = list("explosive_weapons")
- design_ids = list("mech_missile_rack", "mech_missile_rack_ammo")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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", "clusterbang_launcher_ammo")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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)
-
-/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)
-
-/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)
-
-/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", "mech_lmg_ammo")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
-
-/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)
-
-/////////////////////////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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/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)
-
-/datum/techweb_node/nanite_replication_protocols
- id = "nanite_replication_protocols"
- display_name = "Nanite Replication Protocols"
- description = "Advanced behaviours that allow nanites to exploit certain circumstances to replicate faster."
- prereq_ids = list("nanite_smart")
- design_ids = list("kickstart_nanites","factory_nanites","tinker_nanites","offline_nanites","synergy_nanites")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
-
-////////////////////////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)
- 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)
-
-/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)
-
-/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", "donksoft_refill", "syndiesleeper")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
- 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","sl357ap","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.
-
-//Helpers for debugging/balancing the techweb in its entirety!
-
-/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()
diff --git a/code/modules/research/techweb/nodes/alien_nodes.dm b/code/modules/research/techweb/nodes/alien_nodes.dm
new file mode 100644
index 0000000000..567a5dbded
--- /dev/null
+++ b/code/modules/research/techweb/nodes/alien_nodes.dm
@@ -0,0 +1,36 @@
+
+////////////////////////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)
+ 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)
+
+/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)
diff --git a/code/modules/research/techweb/nodes/biotech_nodes.dm b/code/modules/research/techweb/nodes/biotech_nodes.dm
new file mode 100644
index 0000000000..8f7d978a99
--- /dev/null
+++ b/code/modules/research/techweb/nodes/biotech_nodes.dm
@@ -0,0 +1,25 @@
+
+/////////////////////////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", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray","genescanner")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter", "containmentbodybag")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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)
diff --git a/code/modules/research/techweb/nodes/bluespace_nodes.dm b/code/modules/research/techweb/nodes/bluespace_nodes.dm
new file mode 100644
index 0000000000..85142cd9b8
--- /dev/null
+++ b/code/modules/research/techweb/nodes/bluespace_nodes.dm
@@ -0,0 +1,65 @@
+
+/////////////////////////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)
+
+/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)
+
+/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)
+
+/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)
+
+/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", "duffelbag_holding")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
+
+/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)
+
+/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)
+
+/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)
diff --git a/code/modules/research/techweb/nodes/computer_hud_nodes.dm b/code/modules/research/techweb/nodes/computer_hud_nodes.dm
new file mode 100644
index 0000000000..2835edc52b
--- /dev/null
+++ b/code/modules/research/techweb/nodes/computer_hud_nodes.dm
@@ -0,0 +1,60 @@
+
+////////////////////////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)
+
+/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
+ 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)
+
+/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)
+ 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)
+
+/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)
+
+/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", "arcade_minesweeper", "slotmachine", "autoylathe")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
diff --git a/code/modules/research/techweb/nodes/engineering_nodes.dm b/code/modules/research/techweb/nodes/engineering_nodes.dm
new file mode 100644
index 0000000000..2ab5458028
--- /dev/null
+++ b/code/modules/research/techweb/nodes/engineering_nodes.dm
@@ -0,0 +1,59 @@
+
+/////////////////////////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", "autolathe_secure", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod",
+ "apc_control", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine", "rcd_ammo")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 6000)
+
+/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" , "rcd_loaded", "rpd", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", "rcd_upgrade_simple_circuits", "rcd_ammo_large")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
+
+/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)
+
+/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)
+
+/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)
+
+/*
+/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")
+
+/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")
+*/
diff --git a/code/modules/research/techweb/nodes/export_nodes.dm b/code/modules/research/techweb/nodes/export_nodes.dm
new file mode 100644
index 0000000000..cbdedef113
--- /dev/null
+++ b/code/modules/research/techweb/nodes/export_nodes.dm
@@ -0,0 +1,21 @@
+/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")
+
+/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)
diff --git a/code/modules/research/techweb/nodes/mecha_nodes.dm b/code/modules/research/techweb/nodes/mecha_nodes.dm
new file mode 100644
index 0000000000..4d1b703cae
--- /dev/null
+++ b/code/modules/research/techweb/nodes/mecha_nodes.dm
@@ -0,0 +1,205 @@
+
+////////////////////////mech technology////////////////////////
+
+/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/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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", "mech_scattershot_ammo")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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)
+
+/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", "mech_carbine_ammo")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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", "mech_grenade_launcher_ammo")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/datum/techweb_node/mech_missile_rack
+ id = "mech_missile_rack"
+ display_name = "Exosuit Weapon (BRM-6 Missile Rack)"
+ description = "An advanced piece of mech weaponry"
+ prereq_ids = list("explosive_weapons")
+ design_ids = list("mech_missile_rack", "mech_missile_rack_ammo")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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", "clusterbang_launcher_ammo")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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)
+
+/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)
+
+/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)
+
+/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", "mech_lmg_ammo")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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)
diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm
new file mode 100644
index 0000000000..71dd7c943c
--- /dev/null
+++ b/code/modules/research/techweb/nodes/medical_nodes.dm
@@ -0,0 +1,132 @@
+
+////////////////////////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)
+
+/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)
+
+/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)
+
+//////////////////////Cybernetics/////////////////////
+
+/datum/techweb_node/surplus_limbs
+ id = "surplus_limbs"
+ display_name = "Basic Prosthetics"
+ description = "Basic fragile prosthetics 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/advance_limbs
+ id = "advance_limbs"
+ display_name = "Upgraded Prosthetics"
+ description = "Reinforced prosthetics for the impaired."
+ prereq_ids = list("adv_biotech", "surplus_limbs")
+ design_ids = list("adv_l_arm", "adv_r_arm", "adv_r_leg", "adv_l_leg")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1250)
+
+/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)
+
+/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)
+
+/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)
+
+/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", "ci-service")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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)
+
+/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", "ci-shield")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/////////////////////////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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
diff --git a/code/modules/research/techweb/nodes/misc_nodes.dm b/code/modules/research/techweb/nodes/misc_nodes.dm
new file mode 100644
index 0000000000..d34afca90a
--- /dev/null
+++ b/code/modules/research/techweb/nodes/misc_nodes.dm
@@ -0,0 +1,68 @@
+
+/////////////////////////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)
+
+/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)
+
+/////////////////////////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)
+
+/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)
+
+/////////////////////////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", "holosignfirelock", "inducer", "tray_goggles", "holopad")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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)
+
+/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)
+
+/////////////////////////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)
diff --git a/code/modules/research/techweb/nodes/nanites_nodes.dm b/code/modules/research/techweb/nodes/nanites_nodes.dm
new file mode 100644
index 0000000000..5fc707d77a
--- /dev/null
+++ b/code/modules/research/techweb/nodes/nanites_nodes.dm
@@ -0,0 +1,84 @@
+
+/////////////////////////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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/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)
+
+/datum/techweb_node/nanite_replication_protocols
+ id = "nanite_replication_protocols"
+ display_name = "Nanite Replication Protocols"
+ description = "Advanced behaviours that allow nanites to exploit certain circumstances to replicate faster."
+ prereq_ids = list("nanite_smart")
+ design_ids = list("kickstart_nanites","factory_nanites","tinker_nanites","offline_nanites","synergy_nanites")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
diff --git a/code/modules/research/techweb/nodes/robotics_nodes.dm b/code/modules/research/techweb/nodes/robotics_nodes.dm
new file mode 100644
index 0000000000..6248cd99aa
--- /dev/null
+++ b/code/modules/research/techweb/nodes/robotics_nodes.dm
@@ -0,0 +1,81 @@
+
+/////////////////////////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)
+
+/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/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", "borg_upgrade_advcutter")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+
+/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)
+
+/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)
+
+/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_lavaproof", "borg_upgrade_thrusters", "borg_upgrade_selfrepair", "borg_upgrade_expand", "borg_upgrade_rped")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
+
+/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)
+
+/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)
+
+/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)
diff --git a/code/modules/research/techweb/nodes/syndicate_nodes.dm b/code/modules/research/techweb/nodes/syndicate_nodes.dm
new file mode 100644
index 0000000000..193ed8653b
--- /dev/null
+++ b/code/modules/research/techweb/nodes/syndicate_nodes.dm
@@ -0,0 +1,50 @@
+
+/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", "donksoft_refill", "syndiesleeper")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
+ 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","sl357ap","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.
+
+//Helpers for debugging/balancing the techweb in its entirety!
+
+/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()
diff --git a/code/modules/research/techweb/nodes/tools_nodes.dm b/code/modules/research/techweb/nodes/tools_nodes.dm
new file mode 100644
index 0000000000..5d8d40f10d
--- /dev/null
+++ b/code/modules/research/techweb/nodes/tools_nodes.dm
@@ -0,0 +1,57 @@
+
+////////////////////////Tools////////////////////////
+/datum/techweb_node/basic_tools
+ id = "basic_tools"
+ display_name = "Basic Tools"
+ description = "Basic mechanical, electronic, surgical and botanical tools."
+ prereq_ids = list("base")
+ design_ids = list("screwdriver", "wrench", "wirecutters", "crowbar", "multitool", "welding_tool", "tscanner", "analyzer", "cable_coil", "pipe_painter", "airlock_painter", "scalpel", "circular_saw", "surgicaldrill", "retractor", "cautery", "hemostat", "cultivator", "plant_analyzer", "shovel", "spade", "hatchet", "mop", "broom", "normtrash")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500)
+
+/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)
+
+/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", "plasteel_pick", "titanium_pick")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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", "spraybottle", "beartrap", "ci-janitor", "paint_remover")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1750) // No longer has its bag
+
+/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)
+
+/datum/techweb_node/exp_tools
+ id = "exp_tools"
+ display_name = "Experimental Tools"
+ description = "Highly advanced construction tools."
+ design_ids = list("exwelder", "jawsoflife", "handdrill", "holosigncombifan")
+ prereq_ids = list("adv_engi")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
+
+/datum/techweb_node/sec_basic
+ id = "sec_basic"
+ display_name = "Basic Security Equipment"
+ description = "Standard equipment used by security."
+ design_ids = list("seclite", "pepperspray", "bola_energy", "zipties", "evidencebag")
+ prereq_ids = list("base")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 750)
diff --git a/code/modules/research/techweb/nodes/weaponry_nodes.dm b/code/modules/research/techweb/nodes/weaponry_nodes.dm
new file mode 100644
index 0000000000..064f88077a
--- /dev/null
+++ b/code/modules/research/techweb/nodes/weaponry_nodes.dm
@@ -0,0 +1,97 @@
+
+/////////////////////////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", "pin_away")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
+
+/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", "laser_shield", "bullet_shield")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
+
+/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)
+
+/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)
+
+/datum/techweb_node/magnetic_weapons
+ id = "magnetic_weapons"
+ display_name = "Magnetic Weapons"
+ description = "Weapons using magnetic technology"
+ prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
+ design_ids = list("magrifle", "magpistol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/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)
+
+/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)
+
+/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
+
+/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)
+
+/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)
+
+/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)
+
+/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)
diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm
index 1912ca6476..8fbe841828 100644
--- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm
+++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm
@@ -158,7 +158,7 @@ Stabilized extracts:
/obj/item/slimecross/stabilized/rainbow/attackby(obj/item/O, mob/user)
var/obj/item/slimecross/regenerative/regen = O
- if(istype(O) && !regencore)
+ if(istype(regen) && !regencore)
to_chat(user, "You place the [O] in the [src], prepping the extract for automatic application!")
regencore = regen
regen.forceMove(src)
diff --git a/tgstation.dme b/tgstation.dme
index 26b51403ca..1660856d2f 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3020,7 +3020,20 @@
#include "code\modules\research\techweb\__techweb_helpers.dm"
#include "code\modules\research\techweb\_techweb.dm"
#include "code\modules\research\techweb\_techweb_node.dm"
-#include "code\modules\research\techweb\all_nodes.dm"
+#include "code\modules\research\techweb\nodes\alien_nodes.dm"
+#include "code\modules\research\techweb\nodes\biotech_nodes.dm"
+#include "code\modules\research\techweb\nodes\bluespace_nodes.dm"
+#include "code\modules\research\techweb\nodes\computer_hud_nodes.dm"
+#include "code\modules\research\techweb\nodes\engineering_nodes.dm"
+#include "code\modules\research\techweb\nodes\export_nodes.dm"
+#include "code\modules\research\techweb\nodes\mecha_nodes.dm"
+#include "code\modules\research\techweb\nodes\medical_nodes.dm"
+#include "code\modules\research\techweb\nodes\misc_nodes.dm"
+#include "code\modules\research\techweb\nodes\nanites_nodes.dm"
+#include "code\modules\research\techweb\nodes\robotics_nodes.dm"
+#include "code\modules\research\techweb\nodes\syndicate_nodes.dm"
+#include "code\modules\research\techweb\nodes\tools_nodes.dm"
+#include "code\modules\research\techweb\nodes\weaponry_nodes.dm"
#include "code\modules\research\xenobiology\xenobio_camera.dm"
#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm"