Files
Bubberstation/code/modules/modular_computers/file_system/programs/frontier.dm
SkyratBot 69ea3c81ad [MIRROR] Mafia can be played on your PDA [MDB IGNORE] (#24485)
* Mafia can be played on your PDA (#78576)

## About The Pull Request

Mafia is now friggin playable from the PDA, I also changed other stuff
too

- You can't use abilities on dead people if you're not supposed to (cant
kill the same person over and over)
- Changelings cant kill other Changelings
- Changelings can now only talk to eachother at night, rather than using
:j
- Everyone starts spawned in the center of the map, since people playing
on PDA can't move their characters. This is so everyone can hear PDA
users in person, as I don't want the chat log to be mandatory.

To do this, all messages you are meant to be able to see, is now logged
for you to see in your Mafia panel. This essentially means that people
playing through the PDA get a downgraded version of it, but I don't know
how much larger I want this UI to be.

Playing Mafia through the PDA will not tell you of other players ahead
of time when signing up (as it shows ckeys + pdas), but they can see the
names in-game. Unfortunately this means we'll have to remove your
customization coming with you, to prevent using it to tell who is dead
in round.

Things I am missing
- Program overlays on PDA/Laptop/Computer
- Icon for the app's header while a game is active

I'm not a spriter and can't make either of these

This is the new UI

![image](https://github.com/tgstation/tgstation/assets/53777086/7cf503d9-b2e2-4127-874a-acad6425d649)

I also fixed alert calls for PDAs and stuff

![image](https://github.com/tgstation/tgstation/assets/53777086/e09b2e5e-b9e7-43ae-9273-c168e9c8e642)

and removed the X at the top on computers since they had no battery

![image](https://github.com/tgstation/tgstation/assets/53777086/d3dd8307-805c-4aba-be5e-4c24a0bdcb91)

Looks a little better now hopefully 👍

## Why It's Good For The Game

- The current Arcade app sucks, and is a solo game. This is much more
entertaining and you can talk to others in it, which is swag as fuck.
- There's a larger potential playerbase for the Minigame making it more
likely to be played.
- Sets groundwork for a better version of
https://github.com/tgstation/tgstation/pull/75879
- Adds more suspense and teamwork in the minigame.

## Changelog

🆑 JohnFulpWillard, sprites by CoiledLamb
add: You can now play Mafia on your PDA.
balance: Mafia changelings can now only talk to eachother during the
night.
fix: Mafia abilities can't be repeatedly used on people.
/🆑

* Mafia can be played on your PDA

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2023-10-21 14:25:33 -04:00

236 lines
9.7 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"
transfer_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.boosted_nodes)
var/datum/techweb_node/node = SSresearch.techweb_node_by_id(node_id)
singular_partner["boostedNodes"] += list(list("name" = node.display_name, "discount" = partner.boosted_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.boosted_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