mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-05 06:21:57 +00:00
## About The Pull Request [Design doc](https://hackmd.io/@shadowh4nd/r1P7atPjn) Adds a new supply role centered on short dungeon-esque runs with a focus on unifying the job with the fun part. Some virtual domains are combat related, some are silly, some focus on "objectives". Avatar health is linked to your physical presence and retries are limited. <details> <summary>Photos, WIP</summary> Net pod stasis  Server loaded  Server cooldown  the quantum console UI  Cyber police antag page  A safehouse  Domain info page, every domain gets this (and sometimes help text)  Me getting steamrolled in one of the missions  Ghost roles getting notified that server is kicking them out  Players enjoying the new combat missions  Players exploring some of the virtual maps  (Not part of the PR, but)  New bitrunner vendor  </details> ## Why It's Good For The Game Content, firstly, and moreso being supply department content. The framework that this implements is a great (preauthorized) replacement for two systems which are collecting dust: BEPIS and the gateway. They integrate into this system and it's a direct upgrade. This adds a way for the players on station to generate materials (if that remains). The nice part about it is that I can throw balance and believability to the wind, as unlike its unrelated predecessor VR or away missions, bitrunning entirely washes its hands of the map and mobs each reboot. It offers a very expandable map framework to add content and it's all fairly well documented. I'd like to add a feature that represents the idea that jobs don't have to be mundane and "external" jobs can stay tied to the main gameplay loop. ## Changelog jlsnow301, kinneb, mmmiracles, ical92, spockye 🆑 add: Adds Bitrunning to supply department- a semi-offstation role that rewards teamwork. add: Adds new machines to complement the job- net pod, quantum server, quantum consoles, and the nexacache vendor. add: Adds several new maps which can be loaded and unloaded at will. add: Some flair for the new bitrunning vendor. add: Adds a new antagonist for the virtual domain only. Short lived ghost role that fights bitrunners. del: Removes the BEPIS machine, moves its tech into the Bitrunning vendor. /🆑 <!-- Both 🆑's are required for the changelog to work! You can put your name to the right of the first 🆑 if you want to overwrite your GitHub username as author ingame. --> <!-- You can use multiple of the same prefix (they're only used for the icon ingame) and delete the unneeded ones. Despite some of the tags, changelogs should generally represent how a player might be affected by the changes rather than a summary of the PR's contents. --> --------- Co-authored-by: MMMiracles <lolaccount1@hotmail.com> Co-authored-by: Ical <wolfsgamingtips@gmail.com> Co-authored-by: spockye <79304582+spockye@users.noreply.github.com> Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com> Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
100 lines
3.5 KiB
Plaintext
100 lines
3.5 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()
|
|
/// 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()
|
|
/// Whether or not this node should show on the wiki
|
|
var/show_on_wiki = TRUE
|
|
|
|
/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. Discount from boosts are capped when costs fall below 250.
|
|
var/list/boostlist = host.boosted_nodes[id]
|
|
for(var/booster in boostlist)
|
|
if(actual_costs[booster])
|
|
var/delta = max(0, actual_costs[booster] - 250)
|
|
actual_costs[booster] -= min(boostlist[booster], delta)
|
|
|
|
return actual_costs
|
|
|
|
/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()
|
|
SHOULD_CALL_PARENT(FALSE)
|