Files
9d65988951 Updates the gas miner whitelist variables to include the Port Tarkon atmospherics area. (#4643)
Most folks seem to like to geek out in Tarkon and do things on their own
pace, so why not let people experiment with the things that you can
achieve with gas mining beacons? Tarkon is a particularly good place for
this, and you have slimmer chances of imposing a bad day upon someone
else but yourself if you somehow manage to screw things up. Yes, Tarkon
already have pre-existing gas miners in each respective gas tank, but
there's a lot of things you can do with some more in enclosed areas.

Basically, this PR merely adds the Port Tarkon atmospherics area to the
whitelist of gas miners.

---------

Co-authored-by: Shadow-Quill <44811257+Shadow-Quill@users.noreply.github.com>
2025-09-13 12:10:50 -04:00

154 lines
4.7 KiB
Plaintext

/obj/item/summon_beacon
name = "summoner beacon"
desc = "Summons a thing. Probably shouldn't use this one, though."
icon = 'icons/obj/devices/remote.dmi'
icon_state = "generic_delivery"
inhand_icon_state = "generic_delivery"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
/// How many uses the beacon has left
var/uses = 1
/// A list of allowed areas that the atom can be spawned in
var/list/allowed_areas = list(
/area,
)
/// A list of possible atoms available to spawn
var/list/selectable_atoms = list(
/obj/item/summon_beacon,
)
/// The currently selected atom, if any
var/atom/selected_atom = null
/// Descriptor of what area it should work in
var/area_string = "any"
/// If the supply pod should stay or not
var/supply_pod_stay = FALSE
/obj/item/summon_beacon/examine()
. = ..()
. += span_warning("Caution: Only works in [area_string].")
. += span_notice("Currently selected: [selected_atom ? initial(selected_atom.name) : "None"].")
/obj/item/summon_beacon/attack_self(mob/user)
if(!can_use_beacon(user))
return
if(length(selectable_atoms) == 1)
selected_atom = selectable_atoms[1]
return
show_options(user)
/obj/item/summon_beacon/proc/can_use_beacon(mob/living/user)
if(user.can_perform_action(src, FORBID_TELEKINESIS_REACH))
return TRUE
else
playsound(src, 'sound/machines/buzz/buzz-sigh.ogg', 40, TRUE)
return FALSE
/obj/item/summon_beacon/proc/generate_display_names()
var/list/atom_list = list()
for(var/atom/iterated_atom as anything in selectable_atoms)
atom_list[initial(iterated_atom.name)] = iterated_atom
return atom_list
/obj/item/summon_beacon/proc/show_options(mob/user)
var/list/radial_build = get_available_options()
if(!radial_build)
return
selected_atom = show_radial_menu(user, src, radial_build, radius = 40, tooltips = TRUE)
/obj/item/summon_beacon/proc/get_available_options()
var/list/options = list()
for(var/iterating_choice in selectable_atoms)
var/obj/our_object = iterating_choice
var/datum/radial_menu_choice/option = new
option.image = image(icon = initial(our_object.icon), icon_state = initial(our_object.icon_state))
option.info = span_boldnotice("[initial(our_object.desc)]")
options[our_object] = option
sort_list(options)
return options
/obj/item/summon_beacon/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!selected_atom)
balloon_alert(user, "no choice selected!")
return NONE
var/turf/target_turf = get_turf(interacting_with)
var/area/target_area = get_area(interacting_with)
if(!target_turf || !target_area || !is_type_in_list(target_area, allowed_areas))
balloon_alert(user, "can't call here!")
return NONE
var/confirmed = tgui_alert(user, "Are you sure you want to call [initial(selected_atom.name)] here?", "Confirmation", list("Yes", "No"))
if(confirmed != "Yes")
return ITEM_INTERACT_BLOCKING
if(!uses)
return ITEM_INTERACT_BLOCKING
uses -= 1
balloon_alert(user, "[uses] use[uses == 1 ? "" : "s"] left!")
podspawn(list(
"target" = target_turf,
"path" = supply_pod_stay ? /obj/structure/closet/supplypod/podspawn/no_return : /obj/structure/closet/supplypod/podspawn,
"style" = /datum/pod_style/centcom,
"spawn" = selected_atom,
))
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
if(istype(human_user.ears, /obj/item/radio/headset))
to_chat(user, span_notice("You hear something crackle in your ears for a moment before a voice speaks. \
\"Please stand by for a message from Central Command. Message as follows: \
[span_bold("Request received. Pod inbound, please stand back from the landing site.")] \
Message ends.\""))
if(!uses)
qdel(src)
return ITEM_INTERACT_SUCCESS
// Misc stuff here
/obj/structure/closet/supplypod/podspawn/no_return
bluespace = FALSE
/obj/item/storage/box/gas_miner_beacons
name = "box of gas miner delivery beacons"
desc = "Contains two beacons for delivery of atmospheric gas miners."
/obj/item/storage/box/gas_miner_beacons/PopulateContents()
new /obj/item/summon_beacon/gas_miner(src)
new /obj/item/summon_beacon/gas_miner(src)
// Actual beacons start here
/obj/item/summon_beacon/gas_miner
name = "gas miner beacon"
desc = "Once a gas miner type is selected, delivers a gas miner to the target location."
allowed_areas = list(
/area/station/engineering/atmos,
/area/station/engineering/atmospherics_engine,
/area/ruin/space/has_grav/port_tarkon/atmos,
)
selectable_atoms = list(
/obj/machinery/atmospherics/miner/carbon_dioxide,
/obj/machinery/atmospherics/miner/n2o,
/obj/machinery/atmospherics/miner/nitrogen,
/obj/machinery/atmospherics/miner/oxygen,
/obj/machinery/atmospherics/miner/plasma,
)
area_string = "atmospherics"