Files
Bubberstation/code/modules/bitrunning/server/util.dm
tmyqlfpir c7e11d7161 Various Interdyne/Dauntless map and spawn ruin tweaks (#1526)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

This PR adds an additional check for the space edition of Dauntless to
the hack used to stop the bitrunner server from blurting out the cool
down across supply radio comms.

It also tweaks a few things with Dauntless/Interdyne, such as giving
them rad storm immunity and experi-scanners in the R&D labs.

Interdyne is now successfully placed on the lower Z levels thanks to the
`ZTRAIT_ICE_RUINS_UNDERGROUND` flag.

## Why It's Good For The Game

This is fixing an existing bug.

## Proof Of Testing

I have tested this on my server and confirm it works as described as the
PR.

## Changelog

🆑
fix: Dauntless space ruin bitrunner server no longer announces cool down
over NT supply comms
fix: Dauntless and Interdyne are now immune to rad storms
add: Added Syndie borg access cards to Interdyne
qol: Replaced the polarized windows in the Interdyne sauna area with
blast door shutters
add: Added experi-scanners to Interdyne/Dauntless R&D
fix: Interdyne never spawns on top Z level
qol: Interdyne dorm rooms now have crowbars in closets
qol: Interdyne deck officer does not leave empty sleeper on ghost role
spawn
/🆑
2024-06-03 12:37:53 +02:00

126 lines
4.2 KiB
Plaintext

#define MAX_DISTANCE 4 // How far crates can spawn from the server
/// Resets the cooldown state and updates icons
/obj/machinery/quantum_server/proc/cool_off()
is_ready = TRUE
update_appearance()
//BUBBER ADDITION BEGIN - This is a HORRIBLE HACK to stop the radio from blurting out on cargo channel for dauntless prisoners
//If the dauntless map is removed, remove this hack!
var/area/curr = get_area(src)
if(istype(curr, /area/ruin/space/has_grav/bubbers/dauntless) || istype(curr, /area/ruin/space/has_grav/bubbers/dauntless_space))
balloon_alert_to_viewers("cooldown has completed")
return
//BUBBER ADDITION END
radio.talk_into(src, "Thermal systems within operational parameters. Proceeding to domain configuration.", RADIO_CHANNEL_SUPPLY)
/// If there are hosted minds, attempts to get a list of their current virtual bodies w/ vitals
/obj/machinery/quantum_server/proc/get_avatar_data()
var/list/hosted_avatars = list()
for(var/datum/weakref/avatar_ref in avatar_connection_refs)
var/datum/component/avatar_connection/connection = avatar_ref.resolve()
if(isnull(connection))
avatar_connection_refs.Remove(connection)
continue
var/mob/living/creature = connection.parent
var/mob/living/pilot = connection.old_body_ref?.resolve()
hosted_avatars += list(list(
"health" = creature.health,
"name" = creature.name,
"pilot" = pilot,
"brute" = creature.getBruteLoss(),
"burn" = creature.getFireLoss(),
"tox" = creature.getToxLoss(),
"oxy" = creature.getOxyLoss(),
))
return hosted_avatars
/// Locates any turfs with forges on them, returns a random one
/obj/machinery/quantum_server/proc/get_random_nearby_forge()
var/list/nearby_forges = list()
for(var/obj/machinery/byteforge/forge in oview(MAX_DISTANCE, src))
nearby_forges += forge
return pick(nearby_forges)
/// Gets a random available domain given the current points.
/obj/machinery/quantum_server/proc/get_random_domain_id()
if(points < 1)
return
var/list/random_domains = list()
for(var/datum/lazy_template/virtual_domain/available as anything in subtypesof(/datum/lazy_template/virtual_domain))
var/init_cost = initial(available.cost)
if(!initial(available.test_only) && \
init_cost <= points && \
init_cost > BITRUNNER_COST_NONE && \
init_cost < BITRUNNER_COST_EXTREME \
)
random_domains.Add(available)
shuffle_inplace(random_domains)
var/datum/lazy_template/virtual_domain/selected = pick(random_domains)
domain_randomized = TRUE
return initial(selected.key)
/// Removes all blacklisted items from a mob and returns them to base state
/obj/machinery/quantum_server/proc/reset_equipment(mob/living/carbon/human/person)
for(var/obj/item in person.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE))
qdel(item)
var/datum/antagonist/bitrunning_glitch/antag_datum = locate() in person.mind?.antag_datums
if(isnull(antag_datum?.preview_outfit))
return
person.equipOutfit(antag_datum.preview_outfit)
antag_datum.fix_agent_id()
/// Severs any connected users
/obj/machinery/quantum_server/proc/sever_connections()
if(isnull(generated_domain) || !length(avatar_connection_refs))
return
SEND_SIGNAL(src, COMSIG_BITRUNNER_QSRV_SEVER)
/// Do some magic teleport sparks
/obj/machinery/quantum_server/proc/spark_at_location(obj/cache)
playsound(cache, 'sound/magic/blink.ogg', 50, vary = TRUE)
var/datum/effect_system/spark_spread/quantum/sparks = new()
sparks.set_up(5, location = get_turf(cache))
sparks.start()
/// Returns a turf if it's not dense, else will find a neighbor.
/obj/machinery/quantum_server/proc/validate_turf(turf/chosen_turf)
if(!chosen_turf.is_blocked_turf())
return chosen_turf
for(var/turf/tile in get_adjacent_open_turfs(chosen_turf))
if(!tile.is_blocked_turf())
return chosen_turf
#undef MAX_DISTANCE
/// Toggles broadcast on and off
/obj/machinery/quantum_server/proc/toggle_broadcast()
if(!COOLDOWN_FINISHED(src, broadcast_toggle_cd))
return FALSE
broadcasting = !broadcasting
if(generated_domain)
// The cooldown only really matter is we're flipping TVs
COOLDOWN_START(src, broadcast_toggle_cd, 5 SECONDS)
// And we only flip TVs when there's a domain, because otherwise there's no cams to watch
set_network_broadcast_status(BITRUNNER_CAMERA_NET, broadcasting)
return TRUE