Files
Bubberstation/code/modules/research/techweb/all_nodes.dm
ArcaneMusic 002051a3d5 ArcMining Pr Beta: Version 1.2 (#78524)
This one's not like the last one, so much so that I'm not even going to
outsource the PR description to a robot this time!
Basically, **You should read the PR body before assuming that everything
is the same as last time. It's not.**

## Video Summary
Click the link below to see a video summary of the main features of this
pull request.
https://youtu.be/Aho2omR0mjY?feature=shared

## About The Pull Request
This pull request serves as a large rework of minerals produced by
mining, and by extension mining itself. I'll try and list each change
and it's associated nuance here.

### Ore Vents
The biggest addition to the game with ArcMining is **Ore Vents**. Ore
vents spawn as a ruin on the map, placing a randomized ore vent onto map
generation. Ore vents spawn in 3 different sizes, **Small, Medium, and
Large**. These vents will pick from a pool of materials they can
generate, and will hang out across the map. A player can use a mining
scanner to discover an ore vent, granting a small quantity of **mining
points** to begin with. Once scanned, ore vents will show what minerals
that ore vent will generate after they're fully tapped.

Scanning the vent again will trigger the extraction process. A small
drone will fly down, called the NODE drone, and buckle onto the vent.
Your job during wave defense is to protect the drone and to defeat waves
of randomly spawning mobs (dependent on if you're on lavaland or on
icebox). The quantity, duration, and time between waves is scaled to the
size of the vent you're protecting. Starting by scanning and protecting
lower tier vents earlier in the shift is a safer bet than doing a large
vent in the first few minutes. The drone has 500 health, and can take a
good few hits, but leaving it alone will cause it to meet an unfortunate
end quite quickly.

Cooperation can be your best asset, as mining with allies can greatly
help with wave defense, and mineral points are granted to anyone who
helps with defending the ore vent equally (So 500 * size tier,
regardless of how much help you receive). Once complete, the ore vent
will have a mining machine constructed on top of it, and will start to
dredge up **Boulders** from the earth automatically. More on boulders
later.

Ore vents can be located based on your mining scanner, and will provide
an appropriate audio cue based on if the ore vent has been discovered or
not, and once processed will no longer alert you to it's presence.

**Each station comes with a free vent that produces exclusively iron and
glass, free of charge.** This is to help with shifts where the station
may not have shaft miners to produce minerals, and to provide the
station with a baseline amount of minerals where none may exist
otherwise.

### Mineral Generation
Mineral generation has been completely reworked. Previously, Mineral
Generation had a flat 13% spawn rate in-game. Once minerals spawned,
they would also have a chance to propagate their minerals to nearby
tiles, resulting in a rather massive pool of minerals that could spawn
throughout lavaland on the whole.

This tweaks that, by making minerals in walls spawn based on their
proximity to ore vents on maps that use cave generation. Both the
probability, and quantity of ores spawning in walls is scaled based on
distance, with ore vents looking like large caches of ores found in
walls. This makes following ores found in walls and checking their
quantity of minerals spawned a good indicator of how close you are to a
nearby vent in-round.

This means you can collect some points form both discovering ore vents
first, as well as collecting their surrounding ores, turn those in for
mining points, and then trading them in for gear upgrades to more
effectively take on ore vents. As a result of tweaking the balance of
this, the total amount of ores spawned in walls overall has been
decreased. However, by making more of the process time based, we still
result in a mostly balanced finished product.

### Boulder Processing
On station, there are now three new machines. These are the BRM, the
Refinery, and the Smelter.

- The BRM acts as a teleporter. Instead of needing to carry boulders
back to the station, you can activate the BRM, and it will automatically
pick boulders to teleport back to itself. You can use this to teleport
boulders dredged up from lavaland onto the station for processing. **The
BRM will only lock on to boulders that are resting on an ore vent.**
Moving boulders back by hand will mean you'll have to haul it back by
hand.
- The refinery processes the non-metallic materials out of boulders.
This process sends the materials straight to the ORM, and collects
mining points from the ores smelted in the machine. Swiping with an ID
card lets you withdraw those points for your own personal account, but
remember that these points are for your whole team to share from. The
**Mining points obtained from this process is only 75% of the amount an
equivalent amount of ores would provide.**
- The smelter works nearly identically, however the smelter produces
metallic materials out of boulders instead.
- Once a boulder has had all of it's materials extracted, it's broken
down and deleted from the line. Otherwise, the boulder is spat out for
the next machine to process it (either the refinery or smelter).
- Once there's no minerals left in a boulder of any type, the refinery
or smelter will break the boulder down.
- Boulders **do not stack onto tiles with each other**, so they'll block
each other when pulled or when moving on a conveyor belt.

Boulders can also be processed by hand. Using a mining tool on a boulder
with right click will allow you to break down a boulder into it's
composite ores, but limits you to a maximum of 10 ore per boulder, where
the full amount can be extracted using the proper processing machines.
Also, processing by hand does deal small amounts of stamina damage over
time, do breaking a full large boulder can be particularly taxing.

Additional Boulder Processing Machines can be built, with the BRM board
being obtained from the Protolathe, while the Smelter and Refinery
boards being obtainable from the Autolathe instead. A _boulder
processing beacon_ can also be obtained from the mining points vendor as
a reward to assist with boulder processing. Boulder processing beacons
can be used to spawn in a new BRM, refinery, and smelter on the tile the
user is standing on, however **you'll still need to link them to the
ORM**!

All three machines can be upgraded with Stock Parts, allowing for **more
boulders to be processed at a time**. It does not, however, increase the
amount of minerals received from boulders, or points earned.

### Mining Borg Tweaks
Mining borgs have been given some minor adjustments to compensate for
the changes to mining. Their mineral scanner, which now has an active
component to gameplay, is now a module as opposed to built into the mob.
This module allows for the same ability to discover and start waves of
monsters to fight.

Mining modules will find that their PKA now has a total of 90% mod
capacity as compared to the 80% they had before, to allow for more
robust defense of ore vents.

In addition, all borgs and AIs can interact with the BRM for boulder
collection.

### Mining Mech Tweaks
Mining Mechs have had their utility tweaked as a result of these changes
as well. Mineral scanners to be used on mining mechs now have a larger
radius by comparison to their handheld cousins. Similarly, it now has an
active scanning button, which will actively discovery nearby ore vents.
To begin wave defense, you will need to hop out and scan a second time
however, so that you can properly accept the risks of drawing a horde of
bloodthirsty wildlife towards you and your companions.

Mechs can also manually process boulders, similar to mining tools using
their drill.

### Golem Tweaks
Golems, being more gentle and less aggressive than humans, while being
made out of LITERAL ROCKS, have a greater need to secure access to ores
and minerals to eat. As such, they have adapted to be able to do two new
things:

- Golems may now right click ore vents to be able to manually haul a
boulder out of the vent. This costs a hefty amount of stamina, but it
allows for golems to avoid combat during regular gameplay.
- Golems may now left click a boulder with an open hand in order to
manually process a boulder like a pickaxe. While not faster, it is
consistent and prevents golems from starving if they have access to a
vent, but no ores, somehow.

### Gulag Tweaks
The labor camp, being a camp for rehabilitation and ~~excessive manual
labor~~ has been tweaked. Boulders now replace the random minerals
located on their island, and to acquire their prizes inside, much be
excavated and then broken out of the rock. Now YOU TOO can excavate
minerals and become a true mineral hero by working your way to freedom.

### Mining Point Changes
As a result of fewer mining points being available across the map due to
the new ore spawning mechanics, and the shift in how and when ores will
be coming in, almost every progress based mining point cost has been
reduced by around 10-20%. Many numbers are still subject to change at
present, but the idea is that core progress unlocks should be made a bit
more available earlier in the round before players can start to solo or
duo larger or more difficult ore vents, after which they'll be rolling
in ores.

### Rarities
Every once in awhile, an unusual boulder will get hauled up from the
mineral rich depths of lavaland. These **Artifact boulders** can
occasionally produce rare items, but for now they've mostly just been
pulling up **Strange objects** for science. Nanotrasen Natural Sciences
department will reward you extra points to be collected by boulder
processing machines for successfully extracting one. In the future, this
opens up a passive reward space that mining can reward to the station,
like providing cytology DNA samples, ancient seeds, or other artifacts.

### Misc notes

- Boulders can be stored in all varieties of ore boxes (ground, mech)
should you choose, however as mentioned it's best to leave them where
they spawn and teleport them to the station for convenience.
- Maps that are not subject to cave generation will find that they are
largely untouched in terms of mineral balance.
- Future or existing ruins can now be tweaked to have a mineral balance
cost, as the ore vent ruin does. This will allow us to spawn in more
interesting ruins for pre-made combat challenges.
- There are unique ore vents that spawn across the map, that will summon
a boss mob relevant to that map. If the boss mob is defeated, that vent
will spawn large boulders pulling from every possible ore type that can
spawn. Not for the faint of heart!
- Similarly, the number of ore vents and mineral budget is now
adjustable in the cave generation procs, so maps may spawn with more or
less ore vents as desired for balance.
- Artifact boulders opens up a LOT of room for possible future content
like archaeology, xenoarch, artisci, and other design spaces!
- Megafauna STILL SPAWN ON THE MAP. They just happen to spawn in
addition to boss ore vents.
- **I'll add more to this as I get asked questions and remember things,
this is a huge PR and I'm confident I've missed at least something**

## Why It's Good For The Game

I outlined a lot of this in #78040, so I'll try and keep this relatively
snappy this time, while noting that I've made some concessions to make
the whole system a lot more playable while not trying to break out
design decisions that are at the end of the day, better for the game and
the overall resource balance in round.

Minerals are a very poorly balanced system, and have been since their
inception many years ago. We heavily rely on mineral balance in round,
and yet we've really only balanced it by introducing so much supply that
there's no equivalent exchange for materials that doesn't just heavily
flood the exchanged material. For example, items printed from materials
that are otherwise considered "rare" on master exist in such quantities
and they'll never practically run out in our allotted 90 minute time
slot design. This PR adjusts how ores spawn to a point where we can
minimize the amount of ores that need to exist on the map for mining to
be able to progress, while still providing enough resources for the
station that it covers the needs of the station adequately.

Miners will need to be more strategic about what resources they've
collected, and be able to make decisions about which vents are worth the
risk of attempting to fight, how to prepare for a wave defense, and when
to head back up for upgrades, while finally giving them at least some
kind of incentive to work together and use different equipment.
Resonators make cleaning up the caves around vent easy, sandbags set up
easy defenses for your vent, mechs can serve as a wider range radar
while mining, all while still providing a new gameplay loop to mining.

By limiting the amount of ores that can enter the round from the
massive, massive amounts that were coming into the round beforehand (see
#78346 ), we can make ore processing more meaningful by adding more
gameplay to the processing of minerals. I have some plans for that,
however this PR already got bloated really REALLY badly due to scope
creep and the number of intersecting systems that rammed into each other
to make this PR possible. So that'll be next. Plus, as I've mentioned,
we open up places for ore processing to find fossils, relics, and other
things that can implemented down the line.

Overall, I don't expect this PR to save or kill ore balance, but we gain
a LOT more control over it through the use of our mining defines
attached to this PR, and at the end of the day, that's a great place to
start off of.

## Changelog

🆑
add: Added ore vents. Scanning them with mining scanners shows what
minerals they contain. Scan again to fight off a horde of beasts as your
drone assistant excavates the vent, so the ore vent will produce mineral
boulders!
bal: Ores that spawn in walls now spawn based on their proximity to ore
vents, with their chance to spawn and their minerals contained scaling
from low to high.
add: Added the BRM, Refinery, and Smelter. These pieces of equipment are
used to process ore boulders into minerals for the station. Stock Part
upgrades allow more boulders to be processed at one time. They collect
mining points as well, to be redeemed with an ID card swipe.
add: Boulders are teleported to the station via the BRM if left
untouched. Boulders can also be cracked open for a reduced amount of ore
using pickaxes or golems hands.
add: All stations come equipt with a pre-excavated ore vent, which
produces a basic supply of iron and glass only. Scan other vents for
your critical resources!
add: Look there's a shit ton of changes on mining, for more detail check
out the Pull Request: https://github.com/tgstation/tgstation/pull/78524.
sound: New sounds and noises for your high octane factorio-like
gameplay!
image: All new boulder sprites for the new minerals and rocks added to
the mining gameplay loop, as well as mining machines!
image: Overlays appear over vents when scanned to let you know their
contents at a glance when actively scanned with any mining scanners.
/🆑

---------

Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-01-21 11:32:05 -05:00

2419 lines
66 KiB
Plaintext

//Current rate: 135000 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_capacitor",
"basic_cell",
"basic_matter_bin",
"basic_micro_laser",
"basic_scanning",
"blast",
"bounced_radio",
"bowl",
"bucket",
"c-reader",
"c38_rubber",
"camera_assembly",
"camera_film",
"camera",
"capbox",
"chisel",
"circuit_imprinter_offstation",
"circuit_imprinter",
"circuit",
"circuitgreen",
"circuitred",
"coffee_cartridge",
"coffeemaker",
"coffeepot",
"condenser",
"conveyor_belt",
"conveyor_switch",
"custom_vendor_refill",
"destructive_analyzer",
"destructive_scanner",
"desttagger",
"doppler_array",
"drinking_glass",
"earmuffs",
"electropack",
"experi_scanner",
"experimentor",
"extinguisher",
"fax",
"fish_case",
"fishing_rod",
"fishing_portal_generator",
"flashlight",
"fluid_ducts",
"foam_dart",
"fork",
"gas_filter",
"handcuffs_s",
"handlabel",
"health_sensor",
"holodisk",
"igniter",
"infrared_emitter",
"intercom_frame",
"kitchen_knife",
"laptop",
"light_bulb",
"light_replacer",
"light_tube",
"mechfab",
"micro_servo",
"miniature_power_cell",
"newscaster_frame",
"oven_tray",
"packagewrap",
"pet_carrier",
"plasmaglass",
"plasmaman_gas_filter",
"plasmareinforcedglass",
"plasteel",
"plastic_fork",
"plastic_knife",
"plastic_spoon",
"plastitanium",
"plastitaniumglass",
"plate",
"prox_sensor",
"radio_headset",
"rdconsole",
"rdserver",
"rdservercontrol",
"recorder",
"rglass",
"roll",
"sec_38",
"sec_beanbag_slug",
"sec_dart",
"sec_Islug",
"sec_rshot",
"sec_pen",
"servingtray",
"shaker",
"shot_glass",
"signaler",
"slime_scanner",
"solar_panel",
"solar_tracker",
"space_heater",
"spoon",
"status_display_frame",
"sticky_tape",
"syrup_bottle",
"tape",
"tech_disk",
"timer",
"titaniumglass",
"toner_large",
"toner",
"tongs",
"toy_armblade",
"toy_balloon",
"toygun",
"trapdoor_electronics",
"turbine_part_compressor",
"turbine_part_rotor",
"turbine_part_stator",
"turret_control",
"universal_scanner",
"voice_analyzer",
"watering_can",
)
experiments_to_unlock = list(
/datum/experiment/autopsy/nonhuman,
/datum/experiment/scanning/random/material/medium/one,
/datum/experiment/scanning/random/material/medium/three,
/datum/experiment/scanning/random/material/hard/one,
/datum/experiment/scanning/random/material/hard/two,
/datum/experiment/scanning/people/novel_organs,
)
/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(
"borg_chest",
"borg_head",
"borg_l_arm",
"borg_l_leg",
"borg_r_arm",
"borg_r_leg",
"borg_suit",
"borg_upgrade_rename",
"borg_upgrade_restart",
"borgupload",
"cyborgrecharger",
"robocontrol",
"sflash",
)
/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(
"mech_recharger",
"mecha_tracking",
"mechacontrol",
"mechapower",
"ripley_chassis",
"ripley_left_arm",
"ripley_left_leg",
"ripley_main",
"ripley_peri",
"ripley_right_arm",
"ripley_right_leg",
"ripley_torso",
"ripleyupgrade",
"mech_hydraulic_clamp",
"mech_radio",
"mech_air_tank",
"mech_thrusters",
)
/datum/techweb_node/mod_basic
id = "mod"
starting_node = TRUE
display_name = "Basic Modular Suits"
description = "Specialized back mounted power suits with various different modules."
design_ids = list(
"mod_boots",
"mod_chestplate",
"mod_gauntlets",
"mod_helmet",
"mod_paint_kit",
"mod_shell",
"mod_plating_standard",
"mod_storage",
"mod_welding",
"mod_mouthhole",
"mod_flashlight",
"mod_longfall",
"mod_thermal_regulator",
"mod_plasma",
"mod_sign_radio",
)
/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_extinguisher",
"mech_mscanner",
)
/datum/techweb_node/basic_tools
id = "basic_tools"
starting_node = TRUE
display_name = "Basic Tools"
description = "Basic mechanical, electronic, surgical and botanical tools."
design_ids = list(
"airlock_painter",
"analyzer",
"boxcutter",
"cable_coil",
"cable_coil",
"crowbar",
"cultivator",
"decal_painter",
"hatchet",
"mop",
"multitool",
"normtrash",
"pipe_painter",
"plant_analyzer",
"plunger",
"pushbroom",
"rwd",
"razor",
"screwdriver",
"secateurs",
"shovel",
"spade",
"spraycan",
"tile_sprayer",
"tscanner",
"welding_helmet",
"welding_tool",
"wirebrush",
"wirecutters",
"wrench",
"pickaxe",
)
/datum/techweb_node/basic_medical
id = "basic_medical"
starting_node = TRUE
display_name = "Basic Medical Equipment"
description = "Basic medical tools and equipment."
design_ids = list(
"beaker",
"biopsy_tool",
"blood_filter",
"bonesetter",
"cautery",
"circular_saw",
"cybernetic_ears",
"cybernetic_eyes",
"cybernetic_eyes_moth",
"cybernetic_heart",
"cybernetic_liver",
"cybernetic_lungs",
"cybernetic_stomach",
"defibmountdefault",
"dropper",
"hemostat",
"large_beaker",
"medicalbed",
"mmi_m",
"operating",
"petri_dish",
"pillbottle",
"plumbing_rcd",
"plumbing_rcd_service",
"plumbing_rcd_sci",
"portable_chem_mixer",
"penlight",
"retractor",
"scalpel",
"stethoscope",
"surgical_drapes",
"surgical_tape",
"surgicaldrill",
"swab",
"syringe",
"xlarge_beaker",
)
/datum/techweb_node/basic_circuitry
id = "basic_circuitry"
starting_node = TRUE
display_name = "Basic Integrated Circuits"
description = "Research on how to fully exploit the power of integrated circuits"
design_ids = list(
"circuit_multitool",
"comp_access_checker",
"comp_arctan2",
"comp_arithmetic",
"comp_assoc_list_pick",
"comp_assoc_list_remove",
"comp_assoc_list_set",
"comp_binary_convert",
"comp_clock",
"comp_comparison",
"comp_concat",
"comp_concat_list",
"comp_decimal_convert",
"comp_delay",
"comp_direction",
"comp_element_find",
"comp_filter_list",
"comp_foreach",
"comp_format",
"comp_format_assoc",
"comp_get_column",
"comp_gps",
"comp_health",
"comp_hear",
"comp_id_access_reader",
"comp_id_getter",
"comp_id_info_reader",
"comp_index",
"comp_index_assoc",
"comp_index_table",
"comp_laserpointer",
"comp_length",
"comp_light",
"comp_list_add",
"comp_list_assoc_literal",
"comp_list_clear",
"comp_list_literal",
"comp_list_pick",
"comp_list_remove",
"comp_logic",
"comp_matscanner",
"comp_mmi",
"comp_module",
"comp_multiplexer",
"comp_not",
"comp_ntnet_receive",
"comp_ntnet_send",
"comp_pinpointer",
"comp_pressuresensor",
"comp_radio",
"comp_random",
"comp_reagents",
"comp_router",
"comp_select_query",
"comp_self",
"comp_set_variable_trigger",
"comp_soundemitter",
"comp_species",
"comp_speech",
"comp_speech",
"comp_split",
"comp_string_contains",
"comp_tempsensor",
"comp_textcase",
"comp_timepiece",
"comp_tonumber",
"comp_tostring",
"comp_trigonometry",
"comp_typecast",
"comp_typecheck",
"comp_view_sensor",
"compact_remote_shell",
"component_printer",
"integrated_circuit",
"module_duplicator",
"usb_cable"
)
/////////////////////////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(
"beer_dispenser",
"blood_pack",
"chem_dispenser",
"chem_heater",
"chem_mass_spec",
"chem_master",
"chem_pack",
"defibmount",
"defibrillator",
"genescanner",
"healthanalyzer",
"med_spray_bottle",
"medical_kiosk",
"medigel",
"medipen_refiller",
"pandemic",
"penlight_paramedic",
"soda_dispenser",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
required_experiments = list(/datum/experiment/autopsy/human)
/datum/techweb_node/adv_biotech
id = "adv_biotech"
display_name = "Advanced Biotechnology"
description = "Advanced Biotechnology"
prereq_ids = list("biotech")
design_ids = list(
"autopsyscanner",
"crewpinpointer",
"defibrillator_compact",
"harvester",
"healthanalyzer_advanced",
"holobarrier_med",
"limbgrower",
"meta_beaker",
"ph_meter",
"piercesyringe",
"plasmarefiller",
"smoke_machine",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
required_experiments = list(/datum/experiment/autopsy/nonhuman)
discount_experiments = list(/datum/experiment/scanning/random/material/meat = 4000)
/datum/techweb_node/xenoorgan_biotech
id = "xenoorgan_bio"
display_name = "Xeno-organ Biology"
description = "Plasmaman, Ethereals, Lizardpeople... What makes our non-human crewmembers tick?"
prereq_ids = list("adv_biotech")
design_ids = list(
"limbdesign_ethereal",
"limbdesign_felinid",
"limbdesign_lizard",
"limbdesign_plasmaman",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 6500)
discount_experiments = list(
/datum/experiment/scanning/random/cytology/easy = 1000,
/datum/experiment/scanning/points/slime/hard = 5000,
/datum/experiment/autopsy/xenomorph = 5000,
)
/datum/techweb_node/morphological_theory
id = "morphological_theory"
display_name = "Anomalous Morphology"
description = "Use poorly understood energies to change your body."
prereq_ids = list("adv_biotech", "anomaly_research")
design_ids = list("polymorph_belt")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
discount_experiments = list(
/datum/experiment/scanning/people/novel_organs = 5000,
)
/datum/techweb_node/bio_process
id = "bio_process"
display_name = "Biological Processing"
description = "From slimes to kitchens."
prereq_ids = list("biotech")
design_ids = list(
"deepfryer",
"dish_drive",
"fat_sucker",
"gibber",
"griddle",
"microwave",
"microwave_engineering",
"monkey_recycler",
"oven",
"processor",
"range", // should be in a further node, probably
"reagentgrinder",
"smartfridge",
"stove",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
discount_experiments = list(/datum/experiment/scanning/random/cytology = 3000) //Big discount to reinforce doing it.
/////////////////////////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/oldstation_surgery
id = "oldstation_surgery"
display_name = "Experimental Dissection"
description = "Grants access to experimental dissections, which allows generation of research points."
design_ids = list(
"surgery_oldstation_dissection",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500)
hidden = TRUE
show_on_wiki = FALSE
/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_heal_brute_upgrade_femto",
"surgery_heal_burn_upgrade_femto",
"surgery_heal_combo",
"surgery_lobotomy",
"surgery_wing_reconstruction",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
/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_cortex_folding",
"surgery_cortex_imprint",
"surgery_heal_combo_upgrade",
"surgery_ligament_hook",
"surgery_ligament_reinforcement",
"surgery_muscled_veins",
"surgery_nerve_ground",
"surgery_nerve_splice",
"surgery_pacify",
"surgery_vein_thread",
"surgery_viral_bond",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
discount_experiments = list(/datum/experiment/scanning/random/plants/traits = 4500)
/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_heal_combo_upgrade_femto",
"surgery_zombie",
)
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")
design_ids = list(
"bounty_pad",
"bounty_pad_control",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/////////////////////////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(
"adv_capacitor",
"adv_matter_bin",
"adv_scanning",
"airalarm_electronics",
"airlock_board",
"anomaly_refinery",
"apc_control",
"atmos_control",
"atmos_thermal",
"atmosalerts",
"autolathe",
"cell_charger",
"crystallizer",
"electrolyzer",
"emergency_oxygen_engi",
"emergency_oxygen",
"emitter",
"mass_driver",
"firealarm_electronics",
"firelock_board",
"generic_tank",
"grounding_rod",
"high_cell",
"high_micro_laser",
"mesons",
"nano_servo",
"oxygen_tank",
"pacman",
"plasma_tank",
"plasmaman_tank_belt",
"pneumatic_seal",
"power_control",
"powermonitor",
"recharger",
"recycler",
"rped",
"scanner_gate",
"solarcontrol",
"stack_console",
"stack_machine",
"suit_storage_unit",
"tank_compressor",
"tesla_coil",
"thermomachine",
"w-recycler",
"welding_goggles",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 12500)
discount_experiments = list(/datum/experiment/scanning/random/material/easy = 7500)
experiments_to_unlock = list(/datum/experiment/scanning/points/machinery_pinpoint_scan/tier2_microlaser)
/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(
"HFR_core",
"HFR_corner",
"HFR_fuel_input",
"HFR_interface",
"HFR_moderator_input",
"HFR_waste_output",
"engine_goggles",
"forcefield_projector",
"magboots",
"rcd_loaded",
"rcd_ammo",
"rpd_loaded",
"rtd_loaded",
"sheetifier",
"weldingmask",
"bolter_wrench",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 15000)
discount_experiments = list(
/datum/experiment/scanning/random/material/medium/one = 4000,
/datum/experiment/ordnance/gaseous/bz = 10000,
)
/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(
"anomaly_neutralizer",
"reactive_armour",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/high_efficiency
id = "high_efficiency"
display_name = "High Efficiency Parts"
description = "Finely-tooled manufacturing techniques allowing for picometer-perfect precision levels."
prereq_ids = list("engineering", "datatheory")
design_ids = list(
"pico_servo",
"super_matter_bin",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier2_lathes = 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(
"hyper_cell",
"power_turbine_console",
"smes",
"super_capacitor",
"super_cell",
"turbine_compressor",
"turbine_rotor",
"turbine_stator",
"modular_shield_generator",
"modular_shield_node",
"modular_shield_relay",
"modular_shield_charger",
"modular_shield_well",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
discount_experiments = list(/datum/experiment/scanning/points/machinery_pinpoint_scan/tier2_capacitors = 2500)
/////////////////////////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")
design_ids = list(
"beacon",
"bluespace_crystal",
"telesci_gps",
"xenobioconsole",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/bluespace_travel
id = "bluespace_travel"
display_name = "Bluespace Travel"
description = "Application of Bluespace for static teleportation technology."
prereq_ids = list("practical_bluespace")
design_ids = list(
"bluespace_pod",
"launchpad",
"launchpad_console",
"quantumpad",
"tele_hub",
"tele_station",
"teleconsole",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_bluespacemachines = 4000)
/datum/techweb_node/micro_bluespace
id = "micro_bluespace"
display_name = "Miniaturized Bluespace Research"
description = "Extreme reduction in space required for bluespace engines, leading to portable bluespace technology."
prereq_ids = list("bluespace_travel", "practical_bluespace", "high_efficiency")
design_ids = list(
"bluespace_matter_bin",
"bluespacebodybag",
"medicalbed_emergency",
"femto_servo",
"quantum_keycard",
"swapper",
"triphasic_scanning",
"wormholeprojector",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_variety = 5000)
/* /datum/experiment/exploration_scan/random/condition) this should have a point cost but im not even sure the experiment works properly lmao*/
/datum/techweb_node/advanced_bluespace
id = "bluespace_storage"
display_name = "Advanced Bluespace Storage"
description = "With the use of bluespace we can create even more advanced storage devices than we could have ever done"
prereq_ids = list("micro_bluespace", "janitor")
design_ids = list(
"bag_holding",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
/datum/techweb_node/practical_bluespace
id = "practical_bluespace"
display_name = "Applied Bluespace Research"
description = "Using bluespace to make things faster and better."
prereq_ids = list("bluespace_basic", "engineering")
design_ids = list(
"bluespacebeaker",
"bluespacesyringe",
"bluespace_coffeepot",
"bs_rped",
"minerbag_holding",
"ore_silo",
"phasic_scanning",
"plumbing_receiver",
"roastingstick",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
discount_experiments = list(/datum/experiment/scanning/points/machinery_pinpoint_scan/tier2_scanmodules = 3500)
/datum/techweb_node/bluespace_power
id = "bluespace_power"
display_name = "Bluespace Power Technology"
description = "Even more powerful.. power!"
prereq_ids = list("adv_power", "practical_bluespace")
design_ids = list(
"bluespace_cell",
"quadratic_capacitor",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
discount_experiments = list(/datum/experiment/scanning/points/machinery_pinpoint_scan/tier3_cells = 3000)
/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_travel", "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 = 2500)
/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 = 2500)
/////////////////////////integrated circuits tech/////////////////////////
/datum/techweb_node/adv_shells
id = "adv_shells"
display_name = "Advanced Shell Research"
description = "Grants access to more complicated shell designs."
prereq_ids = list("basic_circuitry", "engineering")
design_ids = list(
"assembly_shell",
"bot_shell",
"comp_equip_action",
"controller_shell",
"dispenser_shell",
"door_shell",
"gun_shell",
"keyboard_shell",
"module_shell",
"money_bot_shell",
"scanner_gate_shell",
"scanner_shell",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/bci_shells
id = "bci_shells"
display_name = "Brain-Computer Interfaces"
description = "Grants access to biocompatable shell designs and components."
prereq_ids = list("adv_shells")
design_ids = list(
"bci_implanter",
"bci_shell",
"comp_bar_overlay",
"comp_counter_overlay",
"comp_install_detector",
"comp_object_overlay",
"comp_reagent_injector",
"comp_target_intercept",
"comp_thought_listener",
"comp_vox",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500)
/datum/techweb_node/movable_shells_tech
id = "movable_shells"
display_name = "Movable Shell Research"
description = "Grants access to movable shells."
prereq_ids = list("adv_shells", "robotics")
design_ids = list(
"comp_pathfind",
"comp_pull",
"drone_shell",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
/datum/techweb_node/server_shell_tech
id = "server_shell"
display_name = "Server Technology Research"
description = "Grants access to a server shell that has a very high capacity for components."
prereq_ids = list("adv_shells", "computer_data_disks")
design_ids = list(
"server_shell",
)
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",
"mecha_camera",
"botnavbeacon",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/adv_robotics
id = "adv_robotics"
display_name = "Advanced Robotics Research"
description = "Advanced synthetic neural networks and synaptic pathways allows for extraordinary leaps in cybernetic intelligence and interfacing."
prereq_ids = list("robotics")
design_ids = list(
"advanced_l_arm",
"advanced_r_arm",
"advanced_l_leg",
"advanced_r_leg",
"mmi_posi",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/adv_bots
id = "adv_bots"
display_name = "Advanced Bots Research"
description = "Grants access to a special launchpad designed for bots."
prereq_ids = list("robotics")
design_ids = list(
"botpad",
"botpad_remote",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/exodrone_tech
id = "exodrone"
display_name = "Exploration Drone Research"
description = "Technology for exploring far away locations."
prereq_ids = list("robotics")
design_ids = list(
"exodrone_console",
"exodrone_launcher",
"exoscanner",
"exoscanner_console",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/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")
design_ids = list(
"skill_station",
)
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("adv_robotics")
design_ids = list(
"borg_upgrade_advancedmop",
"borg_upgrade_broomer",
"borg_upgrade_expand",
"borg_upgrade_prt",
"borg_upgrade_selfrepair",
"borg_upgrade_thrusters",
"borg_upgrade_trashofholding",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
/datum/techweb_node/cyborg_upg_util/New()
. = ..()
if(!CONFIG_GET(flag/disable_secborg))
design_ids += "borg_upgrade_disablercooler"
/datum/techweb_node/cyborg_upg_serv
id = "cyborg_upg_serv"
display_name = "Cyborg Upgrades: Service"
description = "Service upgrades for cyborgs."
prereq_ids = list("adv_robotics")
design_ids = list(
"borg_upgrade_rolling_table",
"borg_upgrade_condiment_synthesizer",
"borg_upgrade_silicon_knife",
"borg_upgrade_service_apparatus",
"borg_upgrade_drink_apparatus",
"borg_upgrade_service_cookbook",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
/datum/techweb_node/cyborg_upg_engiminer
id = "cyborg_upg_engiminer"
display_name = "Cyborg Upgrades: Engineering & Mining"
description = "Engineering and Mining upgrades for cyborgs."
prereq_ids = list("adv_engi", "basic_mining")
design_ids = list(
"borg_upgrade_circuitapp",
"borg_upgrade_diamonddrill",
"borg_upgrade_holding",
"borg_upgrade_lavaproof",
"borg_upgrade_rped",
"borg_upgrade_hypermod",
"borg_upgrade_inducer",
)
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")
design_ids = list(
"borg_upgrade_beakerapp",
"borg_upgrade_defibrillator",
"borg_upgrade_expandedsynthesiser",
"borg_upgrade_piercinghypospray",
"borg_upgrade_pinpointer",
"borg_upgrade_surgicalprocessor",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
/datum/techweb_node/ai_basic
id = "ai_basic"
display_name = "Artificial Intelligence"
description = "AI unit research."
prereq_ids = list("adv_robotics")
design_ids = list(
"aicore",
"borg_ai_control",
"intellicard",
"mecha_tracking_ai_control",
"aifixer",
"aiupload",
"reset_module",
"asimov_module",
"default_module",
"nutimov_module",
"paladin_module",
"robocop_module",
"corporate_module",
"drone_module",
"oxygen_module",
"safeguard_module",
"protectstation_module",
"quarantine_module",
"freeform_module",
"remove_module",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/ai_adv
id = "ai_adv"
display_name = "Advanced Artificial Intelligence"
description = "State of the art lawsets to be used for AI research."
prereq_ids = list("ai_basic")
design_ids = list(
"asimovpp_module",
"paladin_devotion_module",
"dungeon_master_module",
"painter_module",
"ten_commandments_module",
"hippocratic_module",
"maintain_module",
"liveandletlive_module",
"reporter_module",
"hulkamania_module",
"peacekeeper_module",
"overlord_module",
"tyrant_module",
"antimov_module",
"balance_module",
"thermurderdynamic_module",
"damaged_module",
"freeformcore_module",
"onehuman_module",
"purge_module",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
//Any kind of point adjustment needs to happen before SSresearch sets up the whole node tree, it gets cached
/datum/techweb_node/ai/New()
. = ..()
if(HAS_TRAIT(SSstation, STATION_TRAIT_UNIQUE_AI))
research_costs[TECHWEB_POINT_TYPE_GENERIC] *= 3
/////////////////////////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",
"holosignrestaurant",
"holosignbar",
"inducer",
"inducerengi",
"tray_goggles",
"holopad",
"vendatray",
)
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)
discount_experiments = list(/datum/experiment/scanning/points/machinery_pinpoint_scan/tier2_microlaser = 1500)
/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 = 15000)
discount_experiments = list(
/datum/experiment/scanning/points/machinery_pinpoint_scan/tier3_microlaser = 4000,
/datum/experiment/ordnance/gaseous/noblium = 10000,
)
/////////////////////////Clown tech/////////////////////////
/datum/techweb_node/clown
id = "clown"
display_name = "Clown Technology"
description = "Honk?!"
prereq_ids = list("base")
design_ids = list(
"air_horn",
"borg_transform_clown",
"honk_chassis",
"honk_head",
"honk_left_arm",
"honk_left_leg",
"honk_right_arm",
"honk_right_leg",
"honk_torso",
"honker_main",
"honker_peri",
"honker_targ",
"implant_trombone",
"mech_banana_mortar",
"mech_honker",
"mech_mousetrap_mortar",
"mech_punching_face",
"clown_firing_pin",
)
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",
"comconsole",
"bankmachine",
"crewconsole",
"idcard",
"libraryconsole",
"mining",
"rdcamera",
"seccamera",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
/datum/techweb_node/data_disks
id = "computer_data_disks"
display_name = "Computer Data Disks"
description = "Data disks used for storing modular computer stuff."
prereq_ids = list("comptech")
design_ids = list(
"portadrive_advanced",
"portadrive_basic",
"portadrive_super",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
/datum/techweb_node/computer_board_gaming
id = "computer_board_gaming"
display_name = "Arcade Games"
description = "For the slackers on the station."
prereq_ids = list("comptech")
design_ids = list(
"arcade_battle",
"arcade_orion",
"slotmachine",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3250)
discount_experiments = list(/datum/experiment/physical/arcade_winner = 3000)
/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(
"account_console",
"automated_announcement",
"med_data",
"prisonmanage",
"secdata",
"vendor",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
/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 = 2500)
design_ids = list(
"comm_monitor",
"comm_server",
"gigabeacon",
"message_monitor",
"ntnet_relay",
"s_amplifier",
"s_analyzer",
"s_ansible",
"s_broadcaster",
"s_bus",
"s_crystal",
"s_filter",
"s_hub",
"s_messaging",
"s_processor",
"s_receiver",
"s_relay",
"s_server",
"s_transmitter",
"s_treatment",
)
/datum/techweb_node/tram
id = "tram"
display_name = "Tram Technology"
description = "Technology for linear induction transportation systems."
prereq_ids = list("telecomms")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
design_ids = list(
"tram_controller",
"tram_display",
"crossing_signal",
"guideway_sensor",
)
/datum/techweb_node/integrated_hud
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(
"diagnostic_hud",
"health_hud",
"scigoggles",
"security_hud",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
/datum/techweb_node/nvg_tech
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(
"diagnostic_hud_night",
"health_hud_night",
"night_visision_goggles",
"nvgmesons",
"nv_scigoggles",
"security_hud_night",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
////////////////////////Medical////////////////////////
/datum/techweb_node/genetics
id = "genetics"
display_name = "Genetic Engineering"
description = "We have the technology to change him."
prereq_ids = list("biotech")
design_ids = list(
"dna_disk",
"dnainfuser",
"dnascanner",
"scan_console",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/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(
"cryo_grenade",
"cryotube",
"splitbeaker",
"stasis",
)
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")
design_ids = list(
"c38_trac",
"implant_chem",
"implant_tracking",
"implantcase",
"implanter",
"locator",
)
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("biotech")
design_ids = list(
"cybernetic_ears_u",
"cybernetic_eyes_improved",
"cybernetic_eyes_improved_moth",
"cybernetic_heart_tier2",
"cybernetic_liver_tier2",
"cybernetic_lungs_tier2",
"cybernetic_stomach_tier2",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
/datum/techweb_node/cyber_organs/New()
..()
if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION))
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500)
/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("adv_biotech", "cyber_organs")
design_ids = list(
"cybernetic_ears_whisper",
"cybernetic_ears_xray",
"ci-gloweyes",
"ci-welding",
"ci-gloweyes-moth",
"ci-welding-moth",
"cybernetic_heart_tier3",
"cybernetic_liver_tier3",
"cybernetic_lungs_tier3",
"cybernetic_stomach_tier3",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
/datum/techweb_node/cyber_organs_upgraded/New()
..()
if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION))
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
/datum/techweb_node/cyber_implants
id = "cyber_implants"
display_name = "Cybernetic Implants"
description = "Electronic implants that improve humans."
prereq_ids = list("adv_biotech", "datatheory")
design_ids = list(
"ci-breather",
"ci-diaghud",
"ci-medhud",
"ci-nutriment",
"ci-sechud",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/cyber_implants/New()
..()
if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION))
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
/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-nutrimentplus",
"ci-reviver",
"ci-surgery",
"ci-toolset",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/adv_cyber_implants/New()
..()
if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION))
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
/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-antidrop",
"ci-antistun",
"ci-thermals",
"ci-thrusters",
"ci-xray",
"ci-thermals-moth",
"ci-xray-moth",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/combat_cyber_implants/New()
..()
if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION))
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
////////////////////////Tools////////////////////////
/datum/techweb_node/basic_mining
id = "basic_mining"
display_name = "Mining Technology"
description = "Better than Efficiency V."
prereq_ids = list("engineering", "basic_plasma")
design_ids = list(
"borg_upgrade_cooldownmod",
"borg_upgrade_damagemod",
"borg_upgrade_rangemod",
"cargoexpress",
"cooldownmod",
"damagemod",
"drill",
"mecha_kineticgun",
"mining_equipment_vendor",
"ore_redemption",
"plasmacutter",
"rangemod",
"superresonator",
"triggermod",
"mining_scanner",
"brm",
"b_smelter",
"b_refinery",
)//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_power", "adv_plasma")
design_ids = list(
"drill_diamond",
"hypermod",
"jackhammer",
"plasmacutter_adv",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
discount_experiments = list(/datum/experiment/scanning/random/material/hard/one = 5000)
/datum/techweb_node/janitor
id = "janitor"
display_name = "Advanced Sanitation Technology"
description = "Clean things better, faster, stronger, and harder!"
prereq_ids = list("adv_engi")
design_ids = list(
"advmop",
"beartrap",
"blutrash",
"buffer",
"vacuum",
"holobarrier_jani",
"light_replacer_blue",
"paint_remover",
"spraybottle",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
discount_experiments = list(/datum/experiment/scanning/random/janitor_trash = 3000) //75% discount for scanning some trash, seems fair right?
/datum/techweb_node/botany
id = "botany"
display_name = "Botanical Engineering"
description = "Botanical tools"
prereq_ids = list("biotech")
design_ids = list(
"biogenerator",
"flora_gun",
"gene_shears",
"hydro_tray",
"portaseeder",
"seed_extractor",
"adv_watering_can",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
required_experiments = list(/datum/experiment/scanning/random/plants/wild)
discount_experiments = list(/datum/experiment/scanning/random/plants/traits = 3000)
/datum/techweb_node/fishing
id = "fishing"
display_name = "Fishing Technology"
description = "Cutting edge fishing advancements."
prereq_ids = list("base")
design_ids = list(
"fishing_rod_tech",
"stabilized_hook",
"fish_analyzer",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000)
required_experiments = list(/datum/experiment/scanning/fish)
/datum/techweb_node/exp_tools
id = "exp_tools"
display_name = "Experimental Tools"
description = "Highly advanced tools."
prereq_ids = list("adv_engi")
design_ids = list(
"exwelder",
"handdrill",
"jawsoflife",
"laserscalpel",
"mechanicalpinches",
"rangedanalyzer",
"searingtool",
"adv_fire_extinguisher",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
discount_experiments = list(/datum/experiment/scanning/random/material/hard/one = 5000)
/datum/techweb_node/sec_basic
id = "sec_basic"
display_name = "Basic Security Equipment"
description = "Standard equipment used by security."
prereq_ids = list("base")
design_ids = list(
"bola_energy",
"evidencebag",
"pepperspray",
"seclite",
"zipties",
"inspector",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
/datum/techweb_node/rcd_upgrade
id = "rcd_upgrade"
display_name = "Rapid Device Upgrade Designs"
description = "Unlocks new designs that improve rapid devices."
prereq_ids = list("adv_engi")
design_ids = list(
"rcd_upgrade_anti_interrupt",
"rcd_upgrade_cooling",
"rcd_upgrade_frames",
"rcd_upgrade_furnishing",
"rcd_upgrade_simple_circuits",
"rpd_upgrade_unwrench",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/adv_rcd_upgrade
id = "adv_rcd_upgrade"
display_name = "Advanced RCD Designs Upgrade"
description = "Unlocks new RCD designs."
design_ids = list(
"rcd_upgrade_silo_link",
)
prereq_ids = list(
"bluespace_travel",
"rcd_upgrade",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
discount_experiments = list(/datum/experiment/scanning/random/material/hard/two = 5000)
/////////////////////////weaponry tech/////////////////////////
/datum/techweb_node/weaponry
id = "weaponry"
display_name = "Weapon Development Technology"
description = "Our researchers have found new ways to weaponize just about everything now."
prereq_ids = list("engineering")
design_ids = list(
"pin_testing",
"tele_shield",
"lasershell",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 20000)
discount_experiments = list(/datum/experiment/ordnance/explosive/pressurebomb = 10000)
/datum/techweb_node/adv_weaponry
id = "adv_weaponry"
display_name = "Advanced Weapon Development Technology"
description = "Our weapons are breaking the rules of reality by now."
prereq_ids = list("adv_engi", "weaponry")
design_ids = list(
"pin_loyalty",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
/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(
"ioncarbine",
"stunrevolver",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/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/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 = 2500)
/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(
"adv_grenade",
"large_grenade",
"pyro_grenade",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/exotic_ammo
id = "exotic_ammo"
display_name = "Exotic Ammunition"
description = "They won't know what hit em."
prereq_ids = list("weaponry")
design_ids = list(
"c38_hotshot",
"c38_iceblox",
"techshotshell",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/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", "bluespace_travel")
design_ids = list(
"gravitygun",
"mech_gravcatapult",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
//MODsuit tech
/datum/techweb_node/mod_advanced
id = "mod_advanced"
display_name = "Advanced Modular Suits"
description = "More advanced modules, to improve modular suits."
prereq_ids = list("robotics")
design_ids = list(
"mod_visor_diaghud",
"mod_gps",
"mod_reagent_scanner",
"mod_clamp",
"mod_drill",
"mod_orebag",
"modlink_scryer",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/mod_engineering
id = "mod_engineering"
display_name = "Engineering Modular Suits"
description = "Engineering suits, for powered engineers."
prereq_ids = list("mod_advanced", "engineering")
design_ids = list(
"mod_plating_engineering",
"mod_visor_meson",
"mod_t_ray",
"mod_magboot",
"mod_tether",
"mod_constructor",
"mod_mister_atmos",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/mod_advanced_engineering
id = "mod_advanced_engineering"
display_name = "Advanced Engineering Modular Suits"
description = "Advanced Engineering suits, for advanced powered engineers."
prereq_ids = list("mod_engineering", "adv_engi")
design_ids = list(
"mod_plating_atmospheric",
"mod_jetpack",
"mod_rad_protection",
"mod_emp_shield",
"mod_storage_expanded",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
/datum/techweb_node/mod_advanced_engineering/New()
if(HAS_TRAIT(SSstation, STATION_TRAIT_RADIOACTIVE_NEBULA)) //we'll really need the rad protection modsuit module
starting_node = TRUE
return ..()
/datum/techweb_node/mod_medical
id = "mod_medical"
display_name = "Medical Modular Suits"
description = "Medical suits for quick rescue purposes."
prereq_ids = list("mod_advanced", "biotech")
design_ids = list(
"mod_plating_medical",
"mod_visor_medhud",
"mod_health_analyzer",
"mod_quick_carry",
"mod_injector",
"mod_organ_thrower",
"mod_dna_lock",
"mod_patienttransport",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/mod_advanced_medical
id = "mod_advanced_medical"
display_name = "Advanced Medical Modular Suits"
description = "Advanced medical suits for quicker rescue purposes."
prereq_ids = list("mod_medical", "adv_biotech")
design_ids = list(
"mod_defib",
"mod_threadripper",
"mod_surgicalprocessor",
"mod_statusreadout",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
/datum/techweb_node/mod_security
id = "mod_security"
display_name = "Security Modular Suits"
description = "Security suits for space crime handling."
prereq_ids = list("mod_advanced", "sec_basic")
design_ids = list(
"mod_plating_security",
"mod_visor_sechud",
"mod_stealth",
"mod_mag_harness",
"mod_pathfinder",
"mod_holster",
"mod_sonar",
"mod_projectile_dampener",
"mod_criminalcapture",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/mod_entertainment
id = "mod_entertainment"
display_name = "Entertainment Modular Suits"
description = "Powered suits for protection against low-humor environments."
prereq_ids = list("mod_advanced", "clown")
design_ids = list(
"mod_plating_cosmohonk",
"mod_bikehorn",
"mod_microwave_beam",
"mod_waddle",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/mod_anomaly
id = "mod_anomaly"
display_name = "Anomalock Modular Suits"
description = "Modules for modular suits that require anomaly cores to function."
prereq_ids = list("mod_advanced", "anomaly_research")
design_ids = list(
"mod_antigrav",
"mod_teleporter",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/mod_anomaly_engi
id = "mod_anomaly_engi"
display_name = "Engineering Anomalock Modular Suits"
description = "Advanced modules for modular suits, using anomaly cores to become even better engineers."
prereq_ids = list("mod_advanced_engineering", "mod_anomaly")
design_ids = list(
"mod_kinesis",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
////////////////////////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 = 7500)
discount_experiments = list(/datum/experiment/scanning/random/material/medium/three = 5000)
/datum/techweb_node/odysseus
id = "mecha_odysseus"
display_name = "EXOSUIT: Odysseus"
description = "Odysseus exosuit designs"
prereq_ids = list("base")
design_ids = list(
"odysseus_chassis",
"odysseus_head",
"odysseus_left_arm",
"odysseus_left_leg",
"odysseus_main",
"odysseus_peri",
"odysseus_right_arm",
"odysseus_right_leg",
"odysseus_torso",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/clarke
id = "mecha_clarke"
display_name = "EXOSUIT: Clarke"
description = "Clarke exosuit designs"
prereq_ids = list("engineering")
design_ids = list(
"clarke_chassis",
"clarke_head",
"clarke_left_arm",
"clarke_main",
"clarke_peri",
"clarke_right_arm",
"clarke_torso",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/paddy
id = "mech_paddy"
display_name = "EXOSUIT: APLU \"Paddy\""
description = "Paddy exosuit designs"
prereq_ids = list("adv_mecha", "adv_mecha_armor")
design_ids = list(
"paddyupgrade",
"mech_hydraulic_claw"
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_mechbay = 5000)
/datum/techweb_node/gygax
id = "mech_gygax"
display_name = "EXOSUIT: Gygax"
description = "Gygax exosuit designs"
prereq_ids = list("adv_mecha", "adv_mecha_armor")
design_ids = list(
"gygax_armor",
"gygax_chassis",
"gygax_head",
"gygax_left_arm",
"gygax_left_leg",
"gygax_main",
"gygax_peri",
"gygax_right_arm",
"gygax_right_leg",
"gygax_targ",
"gygax_torso",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_mechbay = 5000)
/datum/techweb_node/durand
id = "mech_durand"
display_name = "EXOSUIT: Durand"
description = "Durand exosuit designs"
prereq_ids = list("adv_mecha", "adv_mecha_armor")
design_ids = list(
"durand_armor",
"durand_chassis",
"durand_head",
"durand_left_arm",
"durand_left_leg",
"durand_main",
"durand_peri",
"durand_right_arm",
"durand_right_leg",
"durand_targ",
"durand_torso",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_mechbay = 3500)
/datum/techweb_node/phazon
id = "mecha_phazon"
display_name = "EXOSUIT: Phazon"
description = "Phazon exosuit designs"
prereq_ids = list("adv_mecha", "adv_mecha_armor" , "micro_bluespace")
design_ids = list(
"phazon_armor",
"phazon_chassis",
"phazon_head",
"phazon_left_arm",
"phazon_left_leg",
"phazon_main",
"phazon_peri",
"phazon_right_arm",
"phazon_right_leg",
"phazon_targ",
"phazon_torso",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_mechbay = 2500)
/datum/techweb_node/savannah_ivanov
id = "mecha_savannah_ivanov"
display_name = "EXOSUIT: Savannah-Ivanov"
description = "Savannah-Ivanov exosuit designs"
prereq_ids = list("adv_mecha", "weaponry", "exp_tools")
design_ids = list(
"savannah_ivanov_armor",
"savannah_ivanov_chassis",
"savannah_ivanov_head",
"savannah_ivanov_left_arm",
"savannah_ivanov_left_leg",
"savannah_ivanov_main",
"savannah_ivanov_peri",
"savannah_ivanov_right_arm",
"savannah_ivanov_right_leg",
"savannah_ivanov_targ",
"savannah_ivanov_torso",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_mechbay = 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_medi_beam",
"mech_sleeper",
"mech_syringe_gun",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
/datum/techweb_node/mech_armor
id = "adv_mecha_armor"
display_name = "Exosuit Heavy Armor Research"
description = "Recreating heavy armor with new rapid fabrication techniques."
prereq_ids = list("adv_mecha", "bluespace_power")
design_ids = list(
"mech_ccw_armor",
"mech_proj_armor",
)
required_experiments = list(/datum/experiment/scanning/random/mecha_damage_scan)
discount_experiments = list(/datum/experiment/scanning/random/mecha_equipped_scan = 5000)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
/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("adv_mecha")
design_ids = list(
"mech_scattershot",
"mech_scattershot_ammo",
)
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("exotic_ammo")
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_disabler
id = "mech_disabler"
display_name = "Exosuit Weapon (CH-DS \"Peacemaker\" Mounted Disabler)"
description = "A basic piece of mech weaponry"
prereq_ids = list("adv_mecha")
design_ids = list(
"mech_disabler",
)
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("micro_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("bluespace_travel")
design_ids = list(
"mech_wormhole_gen",
)
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("adv_mecha")
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)
////////////////////////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")
required_items_to_unlock = list(
/obj/item/stack/sheet/mineral/abductor,
/obj/item/abductor,
/obj/item/cautery/alien,
/obj/item/circuitboard/machine/abductor,
/obj/item/circular_saw/alien,
/obj/item/crowbar/abductor,
/obj/item/gun/energy/alien,
/obj/item/gun/energy/shrink_ray,
/obj/item/hemostat/alien,
/obj/item/melee/baton/abductor,
/obj/item/multitool/abductor,
/obj/item/retractor/alien,
/obj/item/scalpel/alien,
/obj/item/screwdriver/abductor,
/obj/item/surgicaldrill/alien,
/obj/item/weldingtool/abductor,
/obj/item/wirecutters/abductor,
/obj/item/wrench/abductor,
)
design_ids = list(
"alienalloy",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
hidden = TRUE
/datum/techweb_node/alientech/on_station_research()
SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_ALIENTECH] = TRUE
/datum/techweb_node/alien_bio
id = "alien_bio"
display_name = "Alien Biological Tools"
description = "Advanced biological tools."
prereq_ids = list("alientech", "adv_biotech")
design_ids = list(
"alien_cautery",
"alien_drill",
"alien_hemostat",
"alien_retractor",
"alien_saw",
"alien_scalpel",
)
required_items_to_unlock = list(
/obj/item/abductor,
/obj/item/cautery/alien,
/obj/item/circuitboard/machine/abductor,
/obj/item/circular_saw/alien,
/obj/item/crowbar/abductor,
/obj/item/gun/energy/alien,
/obj/item/gun/energy/shrink_ray,
/obj/item/hemostat/alien,
/obj/item/melee/baton/abductor,
/obj/item/multitool/abductor,
/obj/item/retractor/alien,
/obj/item/scalpel/alien,
/obj/item/screwdriver/abductor,
/obj/item/surgicaldrill/alien,
/obj/item/weldingtool/abductor,
/obj/item/wirecutters/abductor,
/obj/item/wrench/abductor,
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 12500)
discount_experiments = list(/datum/experiment/scanning/points/slime/hard = 10000)
hidden = TRUE
/datum/techweb_node/alien_engi
id = "alien_engi"
display_name = "Alien Engineering"
description = "Alien engineering tools"
prereq_ids = list("alientech", "adv_engi")
design_ids = list(
"alien_crowbar",
"alien_multitool",
"alien_screwdriver",
"alien_welder",
"alien_wirecutters",
"alien_wrench",
)
required_items_to_unlock = list(
/obj/item/abductor,
/obj/item/circuitboard/machine/abductor,
/obj/item/crowbar/abductor,
/obj/item/gun/energy/shrink_ray,
/obj/item/melee/baton/abductor,
/obj/item/multitool/abductor,
/obj/item/screwdriver/abductor,
/obj/item/weldingtool/abductor,
/obj/item/wirecutters/abductor,
/obj/item/wrench/abductor,
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
/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(
"advanced_camera",
"ai_cam_upgrade",
"borg_syndicate_module",
"donksoft_refill",
"donksofttoyvendor",
"largecrossbow",
"mag_autorifle",
"mag_autorifle_ap",
"mag_autorifle_ic",
"rapidsyringe",
"suppressor",
"super_pointy_tape",
)
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.
. = ..()
if(!SSearly_assets.initialized)
RegisterSignal(SSearly_assets, COMSIG_SUBSYSTEM_POST_INITIALIZE, PROC_REF(register_uplink_items))
else
register_uplink_items()
/**
* This needs some clarification: The uplink_items_by_type list is populated on datum/asset/json/uplink/generate.
* SStraitor doesn't actually initialize. I'm bamboozled.
*/
/datum/techweb_node/syndicate_basic/proc/register_uplink_items()
SIGNAL_HANDLER
UnregisterSignal(SSearly_assets, COMSIG_SUBSYSTEM_POST_INITIALIZE)
required_items_to_unlock = list()
for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type)
var/datum/uplink_item/item = SStraitor.uplink_items_by_type[item_path]
if(!item.item || !item.illegal_tech)
continue
required_items_to_unlock |= item.item //allows deconning to unlock.
////////////////////////B.E.P.I.S. Locked Techs////////////////////////
/datum/techweb_node/light_apps
id = "light_apps"
display_name = "Illumination Applications"
description = "Applications of lighting and vision technology not originally thought to be commercially viable."
prereq_ids = list("base")
design_ids = list(
"bright_helmet",
"rld_mini",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/extreme_office
id = "extreme_office"
display_name = "Advanced Office Applications"
description = "Some of our smartest lab guys got together on a Friday and improved our office efficiency by 350%. Here's how."
prereq_ids = list("base")
design_ids = list(
"mauna_mug",
"rolling_table",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/spec_eng
id = "spec_eng"
display_name = "Specialized Engineering"
description = "Conventional wisdom has deemed these engineering products 'technically' safe, but far too dangerous to traditionally condone."
prereq_ids = list("base")
design_ids = list(
"eng_gloves",
"lava_rods",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/aus_security
id = "aus_security"
display_name = "Australicus Security Protocols"
description = "It is said that security in the Australicus sector is tight, so we took some pointers from their equipment. Thankfully, our sector lacks any signs of these, 'dropbears'."
prereq_ids = list("base")
design_ids = list(
"pin_explorer",
"stun_boomerang",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/interrogation
id = "interrogation"
display_name = "Enhanced Interrogation Technology"
description = "By cross-referencing several declassified documents from past dictatorial regimes, we were able to develop an incredibly effective interrogation device. \
Ethical concerns about loss of free will do not apply to criminals, according to galactic law."
prereq_ids = list("base")
design_ids = list(
"hypnochair",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/sticky_advanced
id = "sticky_advanced"
display_name = "Advanced Sticky Technology"
description = "Taking a good joke too far? Nonsense!"
design_ids = list(
"pointy_tape",
"super_sticky_tape",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/tackle_advanced
id = "tackle_advanced"
display_name = "Advanced Grapple Technology"
description = "Nanotrasen would like to remind its researching staff that it is never acceptable to \"glomp\" your coworkers, and further \"scientific trials\" on the subject \
will no longer be accepted in its academic journals."
design_ids = list(
"tackle_dolphin",
"tackle_rocket",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE
/datum/techweb_node/mod_experimental
id = "mod_experimental"
display_name = "Experimental Modular Suits"
description = "Applications of experimentality when creating MODsuits have created these..."
prereq_ids = list("base")
design_ids = list(
"mod_disposal",
"mod_joint_torsion",
"mod_recycler",
"mod_shooting",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
hidden = TRUE
experimental = TRUE