mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-01 04:21:42 +00:00
About The Pull Request Rewrites the entire preferences menu in tgui. Rewrites the entire backend to be built upon datumized preferences, rather than constant additions to the preferences base datum. Splits game preferences into its own window. Antagonists are now split into their individual rulesets. You can now be a roundstart heretic without signing up for latejoin heretic, as an example. This iteration matches parity, and provides very little new functionality, but adding anything new will be much easier. Fixes #60823 Fixes #28907 Fixes #44887 Fixes #59912 Fixes #58458 Fixes #59181 Major TODOs Quirk icons, from @Fikou (with some slight adjustments from me) Lore text, from @EOBGames (4/6, need moths and then ethereal lore from @AMonkeyThatCodes) Heavy documentation on how one would add new preferences, species, jobs, etc A lot of specialized testing so that people's real data don't get corrupted Changelog cl Mothblocks, Floyd on lots of the design refactor: The preferences menu has been completely rewritten in tgui. refactor: The "Stop Sounds" verb has been moved to OOC. /cl
130 lines
4.6 KiB
Plaintext
130 lines
4.6 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 the BEPIS 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()
|
|
/// Associative list, path = list(point type = point_value)
|
|
var/list/boost_item_paths = 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.area
|
|
var/list/discount_experiments = list()
|
|
/// When we apply a discount to a node we add the experiment for it here to prevent excess discount applications
|
|
var/list/discount_used = list()
|
|
|
|
/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)"
|
|
|
|
/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/serialize_list(list/options)
|
|
. = list()
|
|
VARSET_TO_LIST(., id)
|
|
VARSET_TO_LIST(., display_name)
|
|
VARSET_TO_LIST(., hidden)
|
|
VARSET_TO_LIST(., starting_node)
|
|
VARSET_TO_LIST(., assoc_to_keys(prereq_ids))
|
|
VARSET_TO_LIST(., assoc_to_keys(design_ids))
|
|
VARSET_TO_LIST(., assoc_to_keys(unlock_ids))
|
|
VARSET_TO_LIST(., boost_item_paths)
|
|
VARSET_TO_LIST(., autounlock_by_boost)
|
|
VARSET_TO_LIST(., research_costs)
|
|
VARSET_TO_LIST(., category)
|
|
VARSET_TO_LIST(., required_experiments)
|
|
VARSET_TO_LIST(., discount_used)
|
|
|
|
/datum/techweb_node/deserialize_list(list/input, list/options)
|
|
if(!input["id"])
|
|
return
|
|
VARSET_FROM_LIST(input, id)
|
|
VARSET_FROM_LIST(input, display_name)
|
|
VARSET_FROM_LIST(input, hidden)
|
|
VARSET_FROM_LIST(input, starting_node)
|
|
VARSET_FROM_LIST(input, prereq_ids)
|
|
VARSET_FROM_LIST(input, design_ids)
|
|
VARSET_FROM_LIST(input, unlock_ids)
|
|
VARSET_FROM_LIST(input, boost_item_paths)
|
|
VARSET_FROM_LIST(input, autounlock_by_boost)
|
|
VARSET_FROM_LIST(input, research_costs)
|
|
VARSET_FROM_LIST(input, category)
|
|
VARSET_FROM_LIST(input, required_experiments)
|
|
VARSET_FROM_LIST(input, discount_used)
|
|
Initialize()
|
|
return src
|
|
|
|
/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)
|
|
var/list/actual_costs = research_costs
|
|
if(host.boosted_nodes[id])
|
|
var/list/boostlist = host.boosted_nodes[id]
|
|
for(var/booster in boostlist)
|
|
if(actual_costs[booster])
|
|
actual_costs[booster] -= boostlist[booster]
|
|
for(var/cost_type in actual_costs)
|
|
for(var/experiment_type in discount_experiments)
|
|
if(host.completed_experiments[experiment_type] && !discount_used[experiment_type]) //do we have this discount_experiment unlocked AND it wasn't applied already?
|
|
actual_costs[cost_type] -= discount_experiments[experiment_type]
|
|
discount_used[experiment_type] = experiment_type
|
|
return actual_costs
|
|
else
|
|
return research_costs
|
|
|
|
/datum/techweb_node/proc/price_display(datum/techweb/TN)
|
|
return techweb_point_display_generic(get_price(TN))
|
|
|
|
/datum/techweb_node/proc/on_research() //new proc, not currently in file
|
|
return
|