mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 05:00:55 +01:00
+37






![tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>](/assets/img/avatar_default.png)


Alexis
GitHub
tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>
ArcaneMusic
MrMelbert
Rhials
rageguy505
LemonInTheDark
John Willard
Aliceee2ch
Time-Green
Tsar-Salat
SmArtKar
Maxipat
SyncIt21
deltanedas
SimplyLogan
loganuk
Leland Kemble
FalloutFalcon
Roxy
Lucy
siliconOpossum
Isratosh
TheRyeGuyWhoWillNowDie
Neocloudy
Alexander V.
ElGitificador
Twaticus
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bloop
Cameron Lennox
Tim
Iamgoofball
Layzu666
Arturlang
_0Steven
mrmanlikesbt
Ben10Omintrix
John F. Kennedy
Cursor
Josh
Josh Powell
Yobrocharlie
Hardly3D
shayoki
LT3
21b4095dfd
Upstream 04/17/2026 fixes https://github.com/Bubberstation/Bubberstation/issues/5549 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com> Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com> Co-authored-by: rageguy505 <54517726+rageguy505@users.noreply.github.com> Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Co-authored-by: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com> Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> Co-authored-by: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Co-authored-by: Maxipat <108554989+Maxipat112@users.noreply.github.com> Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: SimplyLogan <47579821+loganuk@users.noreply.github.com> Co-authored-by: loganuk <fakeemail123@aol.com> Co-authored-by: Leland Kemble <70413276+lelandkemble@users.noreply.github.com> Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com> Co-authored-by: Lucy <lucy@absolucy.moe> Co-authored-by: siliconOpossum <138069572+siliconOpossum@users.noreply.github.com> Co-authored-by: Isratosh <Isratosh@hotmail.com> Co-authored-by: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com> Co-authored-by: Neocloudy <88008002+Neocloudy@users.noreply.github.com> Co-authored-by: Alexander V. <volas@ya.ru> Co-authored-by: ElGitificador <168473461+ElGitificador@users.noreply.github.com> Co-authored-by: Twaticus <46540570+Twaticus@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Cameron Lennox <killer65311@gmail.com> Co-authored-by: Tim <timothymtorres@gmail.com> Co-authored-by: Iamgoofball <iamgoofball@gmail.com> Co-authored-by: Layzu666 <121319428+Layzu666@users.noreply.github.com> Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com> Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com> Co-authored-by: mrmanlikesbt <99309552+mrmanlikesbt@users.noreply.github.com> Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Co-authored-by: John F. Kennedy <54908920+MacaroniCritter@users.noreply.github.com> Co-authored-by: Cursor <102828457+theselfish@users.noreply.github.com> Co-authored-by: Josh <josh.adam.powell@gmail.com> Co-authored-by: Josh Powell <josh.powell@softwire.com> Co-authored-by: Yobrocharlie <Charliemiller5617@gmail.com> Co-authored-by: Hardly3D <66234359+Hardly3D@users.noreply.github.com> Co-authored-by: shayoki <96078776+shayoki@users.noreply.github.com> Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
200 lines
8.7 KiB
Plaintext
200 lines
8.7 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.order_flags) & ORDER_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/storage_override
|
|
if(initial(supply_pack.order_flags) & ORDER_GOODY) // We offer goody items inside of briefcases, but regular crates still default to their standard crates.
|
|
storage_override = /obj/item/storage/briefcase/empty
|
|
var/obj/container = supply_pack.generate(null, crate_override = storage_override)
|
|
|
|
if(container && istype(container, /obj/structure/closet/crate)) //empty supply packs are a thing! get memed on.
|
|
var/obj/structure/closet/crate/crate = container
|
|
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, container)
|
|
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/satellite/chamber,
|
|
/area/station/ai/upload/chamber,
|
|
/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")
|
|
return 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,
|
|
"Lone Op" = UPLINK_LONE_OP,
|
|
"Spy" = UPLINK_SPY
|
|
)
|
|
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.set_style(/datum/pod_style/syndicate)
|
|
return S
|