mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-12 09:54:03 +00:00
## About The Pull Request If you research a node you can still buy it from NT Frontier, and when you do it refunds the research points you spent. It's like how experi-scanners work. Also cytology gives you an 80 point discount instead of a 120 point discount. This doesn't change anything because it only costs 80 points and NT Frontier boosts can't make costs go negative. ## Why It's Good For The Game Right now it's most efficient to delay research until ordnance gets finished and then grab all the free stuff, and any head of staff researching stuff for their own deparment or robo that wants to make cool mechs can fuck things up. That's not great, because it's unrealistic to expect everyone to be coordinated and delaying research never gets tried in practice. Also, doing ordnance after the round has been going on for a while is way less effective because all of the nodes you would've discounted were already researched. ## Changelog 🆑 balance: NT Frontier can purchase and refund researched techweb nodes. /🆑 --------- Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
130 lines
4.7 KiB
Plaintext
130 lines
4.7 KiB
Plaintext
/**
|
|
* # Techweb Node
|
|
*
|
|
* A datum representing a researchable node in the techweb.
|
|
*
|
|
* Techweb nodes are GLOBAL, there should only be one instance of them in the game. Persistant
|
|
* changes should never be made to them in-game. USE SSRESEARCH PROCS TO OBTAIN REFERENCES.
|
|
* DO NOT REFERENCE OUTSIDE OF SSRESEARCH OR YOU WILL FUCK UP GC.
|
|
*/
|
|
/datum/techweb_node
|
|
/// Internal ID of the node
|
|
var/id
|
|
/// The name of the node as it is shown on UIs
|
|
var/display_name = "Errored Node"
|
|
/// A description of the node to show on UIs
|
|
var/description = "Why are you seeing this?"
|
|
/// Whether it starts off hidden
|
|
var/hidden = FALSE
|
|
/// If the tech can be randomly generated by BEPIS tech as a reward. Meant to be fully given in tech disks, not researched
|
|
var/experimental = FALSE
|
|
/// Whether it's available without any research
|
|
var/starting_node = FALSE
|
|
var/list/prereq_ids = list()
|
|
var/list/design_ids = list()
|
|
/// CALCULATED FROM OTHER NODE'S PREREQUISITIES. Associated list id = TRUE
|
|
var/list/unlock_ids = list()
|
|
/// List of items you need to deconstruct to unlock this node.
|
|
var/list/required_items_to_unlock = list()
|
|
/// Boosting this will autounlock this node
|
|
var/autounlock_by_boost = TRUE
|
|
/// The points cost to research the node, type = amount
|
|
var/list/research_costs = list()
|
|
/// The category of the node
|
|
var/category = "Misc"
|
|
/// The list of experiments required to research the node
|
|
var/list/required_experiments = list()
|
|
/// If completed, these experiments give a specific point amount discount to the node.
|
|
var/list/discount_experiments = list()
|
|
/// When this node is completed, allows these experiments to be performed.
|
|
var/list/experiments_to_unlock = list()
|
|
/// Whether or not this node should show on the wiki
|
|
var/show_on_wiki = TRUE
|
|
/// Hidden Mech nodes unlocked when mech fabricator emaged.
|
|
var/illegal_mech_node = FALSE
|
|
/**
|
|
* If set, the researched node will be announced on these channels by an announcement system
|
|
* with 'announce_research_node' set to TRUE when researched by the station.
|
|
* Not every node has to be announced if you want, some are best kept a little "subtler", like Illegal Weapons.
|
|
*/
|
|
var/list/announce_channels
|
|
|
|
/datum/techweb_node/error_node
|
|
id = "ERROR"
|
|
display_name = "ERROR"
|
|
description = "This usually means something in the database has corrupted. If it doesn't go away automatically, inform Central Command for their techs to fix it ASAP(tm)"
|
|
show_on_wiki = FALSE
|
|
|
|
/datum/techweb_node/proc/Initialize()
|
|
//Make lists associative for lookup
|
|
for(var/id in prereq_ids)
|
|
prereq_ids[id] = TRUE
|
|
for(var/id in design_ids)
|
|
design_ids[id] = TRUE
|
|
for(var/id in unlock_ids)
|
|
unlock_ids[id] = TRUE
|
|
|
|
/datum/techweb_node/Destroy()
|
|
SSresearch.techweb_nodes -= id
|
|
return ..()
|
|
|
|
/datum/techweb_node/proc/on_design_deletion(datum/design/D)
|
|
prune_design_id(D.id)
|
|
|
|
/datum/techweb_node/proc/on_node_deletion(datum/techweb_node/TN)
|
|
prune_node_id(TN.id)
|
|
|
|
/datum/techweb_node/proc/prune_design_id(design_id)
|
|
design_ids -= design_id
|
|
|
|
/datum/techweb_node/proc/prune_node_id(node_id)
|
|
prereq_ids -= node_id
|
|
unlock_ids -= node_id
|
|
|
|
/datum/techweb_node/proc/get_price(datum/techweb/host)
|
|
if(!host)
|
|
return research_costs
|
|
|
|
var/list/actual_costs = research_costs.Copy()
|
|
|
|
for(var/cost_type in actual_costs)
|
|
for(var/experiment_type in discount_experiments)
|
|
if(host.completed_experiments[experiment_type]) //do we have this discount_experiment unlocked?
|
|
actual_costs[cost_type] -= discount_experiments[experiment_type]
|
|
|
|
if(host.boosted_nodes[id]) // Boosts should be subservient to experiments.
|
|
var/list/boostlist = host.boosted_nodes[id]
|
|
for(var/booster in boostlist)
|
|
if(actual_costs[booster])
|
|
actual_costs[booster] = max(actual_costs[booster] - boostlist[booster], 0)
|
|
|
|
return actual_costs
|
|
|
|
/datum/techweb_node/proc/is_free(datum/techweb/host)
|
|
var/list/costs = get_price(host)
|
|
var/total_points = 0
|
|
|
|
for(var/point_type in costs)
|
|
total_points += costs[point_type]
|
|
|
|
if(total_points == 0)
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/datum/techweb_node/proc/price_display(datum/techweb/TN)
|
|
return techweb_point_display_generic(get_price(TN))
|
|
|
|
///Proc called when the Station (Science techweb specific) researches a node.
|
|
/datum/techweb_node/proc/on_station_research(atom/research_source)
|
|
SHOULD_CALL_PARENT(TRUE)
|
|
var/channels_to_use = announce_channels
|
|
if(istype(research_source, /obj/machinery/computer/rdconsole))
|
|
var/obj/machinery/computer/rdconsole/console = research_source
|
|
var/obj/item/circuitboard/computer/rdconsole/board = console.circuit
|
|
if(board.silence_announcements)
|
|
return
|
|
if(board.obj_flags & EMAGGED)
|
|
channels_to_use = list(RADIO_CHANNEL_COMMON)
|
|
if(length(channels_to_use) && !starting_node)
|
|
aas_config_announce(/datum/aas_config_entry/researched_node, list("NODE" = display_name), null, channels_to_use)
|