mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-19 11:08:35 +01:00
## About The Pull Request Three changes to ghost orbit popups. Let's check them one-by-one. First off -- The obsession awakening and blob host midrounds now have a ghost popup when summoned via Dynamic. They already have them when summoned by a random event roll, so this is mostly just bringing the two different spawn methods in line with each other. None of the other midround dynamic picks (autotraitor, revs, etc) have had this added, because they're less focused on spectacle and require more mystery to function properly. Second -- The electrified railings on the tram no longer notify ghosts every time someone gets shocked. Electrocute_act is called on anything that passes by it, and the popup would be thrown regardless of whether or not they've "fallen in the path of an oncoming tram" or not. Making it check if the electrocute_act actually successfully stunned a player, and that they're about to be hit, would probably require an unwieldy rewrite to the behavior that I'd rather not resort to. I brought this helper call into this world, and now I'm taking it out. Lastly -- The supply pod random event can now be properly jumped to. Originally, it would track the landing indicator, which would delete almost immediately and leave an un-orbitable popup on your screen. Now you jump to the landing zone, regardless of when you click the toast popup. This is really long PR body for such tiny changes please don't think this is anything more than it actually is. ## Why It's Good For The Game Minor improvements to some ghost orbit popups, because Observers are players too! ## Changelog 🆑 qol: Dynamic midrounds "Obsession Awakening" and "Blob Host" now have ghost orbit popups, so you can see them happening in real time. qol: There is no longer a ghost orbit popup for players being shocked by an electrified tram rail. qol: The Stray Cargo orbit popup no longer has a half-second window to orbit before it becomes useless. /🆑
188 lines
8.3 KiB
Plaintext
188 lines
8.3 KiB
Plaintext
///Spawns a cargo pod containing a random cargo supply pack on a random area of the station
|
|
/datum/round_event_control/stray_cargo
|
|
name = "Stray Cargo Pod"
|
|
typepath = /datum/round_event/stray_cargo
|
|
weight = 20
|
|
max_occurrences = 4
|
|
earliest_start = 10 MINUTES
|
|
category = EVENT_CATEGORY_BUREAUCRATIC
|
|
description = "A pod containing a random supply crate lands on the station."
|
|
admin_setup = list(/datum/event_admin_setup/set_location/stray_cargo, /datum/event_admin_setup/listed_options/stray_cargo)
|
|
|
|
/datum/event_admin_setup/set_location/stray_cargo
|
|
input_text = "Aim pod at turf we're on?"
|
|
|
|
/datum/event_admin_setup/set_location/stray_cargo/apply_to_event(datum/round_event/stray_cargo/event)
|
|
event.admin_override_turf = chosen_turf
|
|
|
|
/datum/event_admin_setup/listed_options/stray_cargo
|
|
input_text = "Choose a cargo crate to drop."
|
|
normal_run_option = "Random Crate"
|
|
|
|
/datum/event_admin_setup/listed_options/stray_cargo/get_list()
|
|
return sort_list(subtypesof(/datum/supply_pack), /proc/cmp_typepaths_asc)
|
|
|
|
/datum/event_admin_setup/listed_options/stray_cargo/apply_to_event(datum/round_event/stray_cargo/event)
|
|
event.admin_override_contents = chosen
|
|
var/log_message = "[key_name_admin(usr)] has aimed a stray cargo pod at [event.admin_override_turf ? AREACOORD(event.admin_override_turf) : "a random location"]. The pod contents are [chosen ? chosen : "random"]."
|
|
message_admins(log_message)
|
|
log_admin(log_message)
|
|
|
|
///Spawns a cargo pod containing a random cargo supply pack on a random area of the station
|
|
/datum/round_event/stray_cargo
|
|
var/area/impact_area ///Randomly picked area
|
|
announce_chance = 75
|
|
var/list/possible_pack_types = list() ///List of possible supply packs dropped in the pod, if empty picks from the cargo list
|
|
var/static/list/stray_spawnable_supply_packs = list() ///List of default spawnable supply packs, filtered from the cargo list
|
|
///Admin setable override that is used instead of selecting a random location
|
|
var/atom/admin_override_turf
|
|
///Admin setable override to spawn a specific cargo pack type
|
|
var/admin_override_contents
|
|
|
|
/datum/round_event/stray_cargo/announce(fake)
|
|
if(fake)
|
|
impact_area = find_event_area()
|
|
priority_announce("Stray cargo pod detected on long-range scanners. Expected location of impact: [impact_area.name].", "Collision Alert")
|
|
|
|
/**
|
|
* Tries to find a valid area, throws an error if none are found
|
|
* Also randomizes the start timer
|
|
*/
|
|
/datum/round_event/stray_cargo/setup()
|
|
start_when = rand(20, 40)
|
|
if(admin_override_turf)
|
|
impact_area = get_area(admin_override_turf)
|
|
else
|
|
impact_area = find_event_area()
|
|
if(!impact_area)
|
|
CRASH("No valid areas for cargo pod found.")
|
|
var/list/turf_test = get_area_turfs(impact_area)
|
|
if(!turf_test.len)
|
|
CRASH("Stray Cargo Pod : No valid turfs found for [impact_area] - [impact_area.type]")
|
|
|
|
if(!stray_spawnable_supply_packs.len)
|
|
stray_spawnable_supply_packs = SSshuttle.supply_packs.Copy()
|
|
for(var/pack in stray_spawnable_supply_packs)
|
|
var/datum/supply_pack/pack_type = pack
|
|
if(initial(pack_type.special))
|
|
stray_spawnable_supply_packs -= pack
|
|
|
|
///Spawns a random supply pack, puts it in a pod, and spawns it on a random tile of the selected area
|
|
/datum/round_event/stray_cargo/start()
|
|
var/list/turf/valid_turfs = get_area_turfs(impact_area)
|
|
//Only target non-dense turfs to prevent wall-embedded pods
|
|
for(var/i in valid_turfs)
|
|
var/turf/T = i
|
|
if(T.density)
|
|
valid_turfs -= T
|
|
var/turf/landing_zone
|
|
if(admin_override_turf)
|
|
landing_zone = admin_override_turf
|
|
else
|
|
landing_zone = pick(valid_turfs)
|
|
var/pack_type
|
|
if(admin_override_contents)
|
|
pack_type = admin_override_contents
|
|
else
|
|
if(possible_pack_types.len)
|
|
pack_type = pick(possible_pack_types)
|
|
else
|
|
pack_type = pick(stray_spawnable_supply_packs)
|
|
var/datum/supply_pack/supply_pack
|
|
if(ispath(pack_type, /datum/supply_pack))
|
|
supply_pack = new pack_type
|
|
else // treat this as a supply pack id and resolving it with SSshuttle
|
|
if(admin_override_contents)
|
|
supply_pack = admin_override_contents //Syndicate crates create a new datum while being customized which will result in this being triggered. Outside of this situation this should never trigger
|
|
else
|
|
supply_pack = SSshuttle.supply_packs[pack_type]
|
|
var/obj/structure/closet/crate/crate = supply_pack.generate(null)
|
|
if(crate) //empty supply packs are a thing! get memed on.
|
|
crate.locked = FALSE //Unlock secure crates
|
|
crate.update_appearance()
|
|
var/obj/structure/closet/supplypod/pod = make_pod()
|
|
var/obj/effect/pod_landingzone/landing_marker = new(landing_zone, pod, crate)
|
|
var/static/mutable_appearance/target_appearance = mutable_appearance('icons/obj/supplypods_32x32.dmi', "LZ")
|
|
notify_ghosts("[control.name] has summoned a supply crate!", source = get_turf(landing_marker), header = "Cargo Inbound", alert_overlay = target_appearance)
|
|
|
|
///Handles the creation of the pod, in case it needs to be modified beforehand
|
|
/datum/round_event/stray_cargo/proc/make_pod()
|
|
var/obj/structure/closet/supplypod/S = new
|
|
return S
|
|
|
|
///Picks an area that wouldn't risk critical damage if hit by a pod explosion
|
|
/datum/round_event/stray_cargo/proc/find_event_area()
|
|
var/static/list/allowed_areas
|
|
if(!allowed_areas)
|
|
///Places that shouldn't explode
|
|
var/static/list/safe_area_types = typecacheof(list(
|
|
/area/station/ai_monitored/turret_protected/ai,
|
|
/area/station/ai_monitored/turret_protected/ai_upload,
|
|
/area/station/engineering,
|
|
/area/shuttle,
|
|
))
|
|
|
|
///Subtypes from the above that actually should explode.
|
|
var/static/list/unsafe_area_subtypes = typecacheof(list(/area/station/engineering/break_room))
|
|
allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes
|
|
var/list/possible_areas = typecache_filter_list(GLOB.areas, allowed_areas)
|
|
if (length(possible_areas))
|
|
return pick(possible_areas)
|
|
|
|
///A rare variant that drops a crate containing syndicate uplink items
|
|
/datum/round_event_control/stray_cargo/syndicate
|
|
name = "Stray Syndicate Cargo Pod"
|
|
typepath = /datum/round_event/stray_cargo/syndicate
|
|
weight = 6
|
|
max_occurrences = 1
|
|
earliest_start = 30 MINUTES
|
|
description = "A pod containing syndicate gear lands on the station."
|
|
min_wizard_trigger_potency = 3
|
|
max_wizard_trigger_potency = 6
|
|
admin_setup = list(/datum/event_admin_setup/set_location/stray_cargo, /datum/event_admin_setup/syndicate_cargo_pod)
|
|
|
|
/datum/event_admin_setup/syndicate_cargo_pod
|
|
///Admin setable override to spawn a specific cargo pack type
|
|
var/pack_type_override
|
|
|
|
/datum/event_admin_setup/syndicate_cargo_pod/prompt_admins()
|
|
var/admin_selected_pack = tgui_alert(usr,"Customize Pod contents?", "Pod Contents", list("Yes", "No", "Cancel"))
|
|
switch(admin_selected_pack)
|
|
if("Yes")
|
|
override_contents()
|
|
if("No")
|
|
pack_type_override = null
|
|
else
|
|
return ADMIN_CANCEL_EVENT
|
|
|
|
///This proc prompts admins to set a TC value and uplink type for the crate, those values are then passed to a new syndicate pack's setup_contents() to generate the contents before spawning it.
|
|
/datum/event_admin_setup/syndicate_cargo_pod/proc/override_contents()
|
|
var/datum/supply_pack/misc/syndicate/custom_value/syndicate_pack = new
|
|
var/pack_telecrystals = tgui_input_number(usr, "Please input crate's value in telecrystals.", "Set Telecrystals.", 30)
|
|
if(isnull(pack_telecrystals))
|
|
return ADMIN_CANCEL_EVENT
|
|
var/list/possible_uplinks = list("Traitor" = UPLINK_TRAITORS, "Nuke Op" = UPLINK_NUKE_OPS, "Clown Op" = UPLINK_CLOWN_OPS)
|
|
var/uplink_type = tgui_input_list(usr, "Choose uplink to draw items from.", "Choose uplink type.", possible_uplinks)
|
|
var/selection
|
|
if(!isnull(uplink_type))
|
|
selection = possible_uplinks[uplink_type]
|
|
else
|
|
return ADMIN_CANCEL_EVENT
|
|
syndicate_pack.setup_contents(pack_telecrystals, selection)
|
|
pack_type_override = syndicate_pack
|
|
|
|
/datum/event_admin_setup/syndicate_cargo_pod/apply_to_event(datum/round_event/stray_cargo/syndicate/event)
|
|
event.admin_override_contents = pack_type_override
|
|
var/log_message = "[key_name_admin(usr)] has aimed a stray syndicate cargo pod at [event.admin_override_turf ? AREACOORD(event.admin_override_turf) : "a random location"]. The pod contents are [pack_type_override ? pack_type_override : "random"]."
|
|
message_admins(log_message)
|
|
log_admin(log_message)
|
|
|
|
/datum/round_event/stray_cargo/syndicate
|
|
possible_pack_types = list(/datum/supply_pack/misc/syndicate)
|
|
|
|
///Apply the syndicate pod skin
|
|
/datum/round_event/stray_cargo/syndicate/make_pod()
|
|
var/obj/structure/closet/supplypod/S = new
|
|
S.setStyle(STYLE_SYNDICATE)
|
|
return S
|