Files
Bubberstation/code/modules/modular_computers/file_system/programs/frontier.dm
SkyratBot 73bdd7341a [MIRROR] TGUI Destructive Analyzer [MDB IGNORE] (#25005)
* TGUI Destructive Analyzer (#79572)

## About The Pull Request

I made this to help me move more towards my goals [laid out
here](https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA) which currently doesn't
have much interest.

This makes the Destructive Analyzer use a little neat TGUI menu instead
of its old HTML one. I also touch a lot of science stuff and a little
experimentor stuff, so let me explain a bit:
Old iterations of Science had different items that you can use to boost
nodes through deconstruction. This has been removed, and its only
feature is the auto-unlocking of nodes (that is; making them visible to
the R&D console). I thought that instead of keeping this deprecated code
around, I would rework it a little to make it clear what we actually use
it for (unhiding nodes).
All vars and procs that mentioned this have been renamed or reworked to
make more sense now.

Experimentor stuff shares a lot with the destructive analyzer, so I had
to mess with that a bit to keep its decayed corpse of deprecated code,
functional.

I also added context tips to the destructive analyzer, and added the
ability to AltClick to remove the inserted item. Removing items now also
plays a little sound because it was kinda lame.
Also, balloon alerts.

## Why It's Good For The Game

Moves a shitty machine to TGUI so it is slightly less shitty, now it's
more direct and compact with more player-feedback.
Helps me with a personal project and yea

### Video demonstration

I show off connecting the machine to R&D Servers, but I haven't changed
the behavior of that and the roundstart analyzers are connected to
servers by default.

https://github.com/tgstation/tgstation/assets/53777086/65295600-4fae-42d1-9bae-eccefe337a2b

## Changelog

🆑
refactor: Destructive Analyzers now have a TGUI menu.
/🆑

* TGUI Destructive Analyzer

* Modular

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
2023-11-14 09:19:08 -05:00

236 lines
9.8 KiB
Plaintext

/datum/computer_file/program/scipaper_program
filename = "ntfrontier"
filedesc = "NT Frontier"
category = PROGRAM_CATEGORY_SCI
extended_desc = "Scientific paper publication and navigation software."
requires_ntnet = TRUE
size = 12
program_icon_state = "research"
tgui_id = "NtosScipaper"
program_icon = "paper-plane"
download_access = list(ACCESS_ORDNANCE)
var/datum/techweb/linked_techweb
/// Unpublished, temporary paper datum.
var/datum/scientific_paper/paper_to_be
/// Here to reduce load. Corresponds to the tab in the UI.
var/current_tab = 1
/// The file under consideration.
var/datum/computer_file/data/ordnance/selected_file
/datum/computer_file/program/scipaper_program/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing)
. = ..()
paper_to_be = new
if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb)
CONNECT_TO_RND_SERVER_ROUNDSTART(linked_techweb, computer)
/datum/computer_file/program/scipaper_program/application_attackby(obj/item/attacking_item, mob/living/user)
if(!istype(attacking_item, /obj/item/multitool))
return FALSE
var/obj/item/multitool/attacking_tool = attacking_item
if(!QDELETED(attacking_tool.buffer) && istype(attacking_tool.buffer, /datum/techweb))
linked_techweb = attacking_tool.buffer
return TRUE
/datum/computer_file/program/scipaper_program/proc/recheck_file_presence()
if(selected_file in computer.stored_files)
return FALSE
UnregisterSignal(selected_file, COMSIG_COMPUTER_FILE_DELETE)
selected_file = null
paper_to_be.set_experiment()
/datum/computer_file/program/scipaper_program/ui_static_data(mob/user)
var/list/data = list()
var/list/parsed_experiments = list()
for (var/datum/experiment/ordnance/experiment in SSresearch.ordnance_experiments)
var/list/singular_experiment = list()
singular_experiment["path"] = experiment.type
singular_experiment["name"] = experiment.name
singular_experiment["description"] = experiment.description
singular_experiment["target"] = experiment.target_amount
if(istype(experiment, /datum/experiment/ordnance/explosive))
singular_experiment["suffix"] = "tiles"
singular_experiment["prefix"] = "Range"
else if(istype(experiment, /datum/experiment/ordnance/gaseous))
singular_experiment["suffix"] = "moles"
singular_experiment["prefix"] = "Gas"
parsed_experiments += list(singular_experiment)
var/list/parsed_partners = list()
for (var/datum/scientific_partner/partner in SSresearch.scientific_partners)
var/list/singular_partner = list()
singular_partner["name"] = partner.name
singular_partner["flufftext"] = partner.flufftext
singular_partner["multipliers"] = partner.multipliers
singular_partner["path"] = partner.type
singular_partner["boostedNodes"] = list()
singular_partner["acceptedExperiments"] = list()
for (var/node_id in partner.boostable_nodes)
var/datum/techweb_node/node = SSresearch.techweb_node_by_id(node_id)
singular_partner["boostedNodes"] += list(list("name" = node.display_name, "discount" = partner.boostable_nodes[node_id], "id" = node_id))
for (var/datum/experiment/ordnance/ordnance_experiment as anything in partner.accepted_experiments)
singular_partner["acceptedExperiments"] += initial(ordnance_experiment.name)
parsed_partners += list(singular_partner)
data["experimentInformation"] = parsed_experiments
data["partnersInformation"] = parsed_partners
data["coopIndex"] = SCIPAPER_COOPERATION_INDEX
data["fundingIndex"] = SCIPAPER_FUNDING_INDEX
return data
/datum/computer_file/program/scipaper_program/ui_data()
// Program Headers:
var/list/data = list()
data["currentTab"] = current_tab
data["has_techweb"] = !!linked_techweb
switch(current_tab)
// First page. Form submission.
if(1)
data["fileList"] = list()
data["expList"] = list()
data["allowedTiers"] = list()
data["allowedPartners"] = list()
// Both the file and experiment list are assoc lists. ID as value, display name as keys.
for(var/datum/computer_file/data/ordnance/ordnance_file in computer.stored_files)
data["fileList"] += list(ordnance_file.filename = ordnance_file.uid)
if(selected_file)
for (var/possible_experiment in selected_file.possible_experiments)
var/datum/experiment/ordnance/experiment = possible_experiment
data["expList"] += list(initial(experiment.name) = experiment)
data["allowedTiers"] = paper_to_be.calculate_tier()
for (var/partner in SSresearch.scientific_partners)
var/datum/scientific_partner/scientific_partner = partner
if(paper_to_be.experiment_path in scientific_partner.accepted_experiments)
data["allowedPartners"] += list(scientific_partner.name = scientific_partner.type)
data += paper_to_be.return_gist()
data["selectedFile"] = selected_file?.filename
// Renamed both of these to be more topical.
data["selectedExperiment"] = data["experimentName"]
data -= "experimentName"
data["selectedPartner"] = data["partner"]
data -= "partner"
// Second page. View previous
if(2)
data["publishedPapers"] = list()
if(!linked_techweb)
return data
for (var/experiment_types in linked_techweb.published_papers)
for (var/datum/scientific_paper/paper in linked_techweb.published_papers[experiment_types])
data["publishedPapers"] += list(paper.return_gist())
if(4)
data["purchaseableBoosts"] = list()
data["relations"] = list()
data["visibleNodes"] = list()
if(!linked_techweb)
return data
var/list/visible_nodes = list()
visible_nodes += linked_techweb.get_available_nodes()
visible_nodes += linked_techweb.get_researched_nodes()
for (var/id in visible_nodes)
if(visible_nodes[id])
data["visibleNodes"] += id
for (var/datum/scientific_partner/partner as anything in SSresearch.scientific_partners)
var/relations = linked_techweb.scientific_cooperation[partner.type]
switch (round(relations / SCIENTIFIC_COOPERATION_PURCHASE_MULTIPLIER)) // We use points to determine these
if(-INFINITY to 0)
data["relations"][partner.type] = "Nonexistant"
if(1 to 2499)
data["relations"][partner.type] = "Negligible"
if(2500 to 4999)
data["relations"][partner.type] = "Limited"
if(5000 to 9999)
data["relations"][partner.type] = "Cordial"
if(10000 to 19999)
data["relations"][partner.type] = "Partners"
if(20000 to INFINITY)
data["relations"][partner.type] = "Devoted"
else
data["relations"][partner.type] = "Undefined"
data["purchaseableBoosts"][partner.type] = list()
for(var/node_id in linked_techweb.get_available_nodes())
// Not from our partner
if(!(node_id in partner.boostable_nodes))
continue
if(!partner.allowed_to_boost(linked_techweb, node_id))
continue
data["purchaseableBoosts"][partner.type] += node_id
return data
/datum/computer_file/program/scipaper_program/ui_act(action, params, datum/tgui/ui, datum/ui_state/state)
switch(action)
if("et_alia")
paper_to_be.et_alia = !paper_to_be.et_alia
return TRUE
// Handle the publication
if("publish")
publish()
return TRUE
// For every change in the input, we correspond it with the paper_data list and update it.
if("rewrite")
if(length(params))
for (var/changed_entry in params)
if (changed_entry == "title")
paper_to_be.title = sanitize(params[changed_entry])
if (changed_entry == "author")
paper_to_be.author = sanitize(params[changed_entry])
if (changed_entry == "abstract")
paper_to_be.abstract = sanitize(params[changed_entry])
return TRUE
if("change_tab")
current_tab = params["new_tab"]
return TRUE
if("select_file") // Selecting new file will necessitate a change in paper type. This will be done on select_experiment and not here.
if(selected_file)
UnregisterSignal(selected_file, COMSIG_COMPUTER_FILE_DELETE)
paper_to_be.set_experiment() // Clears the paper info.
for(var/datum/computer_file/data/ordnance/ordnance_data in computer.stored_files)
if(ordnance_data.uid == params["selected_uid"])
selected_file = ordnance_data
RegisterSignal(selected_file, COMSIG_COMPUTER_FILE_DELETE, PROC_REF(recheck_file_presence))
return TRUE
if("select_experiment")
var/ex_path = text2path(params["selected_expath"])
var/variable = selected_file.possible_experiments[text2path(params["selected_expath"])]
var/data = null
if(ispath(ex_path, /datum/experiment/ordnance/explosive))
paper_to_be = paper_to_be.clone_into(/datum/scientific_paper/explosive)
if(ispath(ex_path, /datum/experiment/ordnance/gaseous))
paper_to_be = paper_to_be.clone_into(/datum/scientific_paper/gaseous)
data = selected_file.return_data()
paper_to_be.set_experiment(ex_path, variable, data)
return TRUE
if("select_tier")
paper_to_be.set_tier(params["selected_tier"])
return TRUE
if("select_partner")
paper_to_be.set_partner(text2path(params["selected_partner"]), linked_techweb)
return TRUE
if("purchase_boost")
var/datum/scientific_partner/partner = locate(text2path(params["boost_seller"])) in SSresearch.scientific_partners
var/datum/techweb_node/node = SSresearch.techweb_node_by_id(params["purchased_boost"])
if(partner && node)
if(partner.purchase_boost(linked_techweb, node))
computer.say("Purchase succesful.")
playsound(computer, 'sound/machines/ping.ogg', 25)
return TRUE
playsound(computer, 'sound/machines/terminal_error.ogg', 25)
return TRUE
/// Publication and adding points.
/datum/computer_file/program/scipaper_program/proc/publish()
if(linked_techweb.add_scientific_paper(paper_to_be))
computer.say("\"[paper_to_be.title]\" has been published!")
paper_to_be = new
UnregisterSignal(selected_file, COMSIG_COMPUTER_FILE_DELETE)
selected_file = null
SStgui.update_uis(src)
playsound(computer, 'sound/machines/ping.ogg', 25)
return TRUE
playsound(computer, 'sound/machines/terminal_error.ogg', 25)
return FALSE