mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-29 02:51:41 +00:00
* Roundstart Xeno egg deliveries create a Captive Xenomorph team, gives regular xenos a fluff objective so their popup isn't blank. (#73852) ## About The Pull Request Xenomorphs who are a product of the roundstart xenobio egg delivery will now spawn as "Captive Xenomorphs", who receive an objective to break containment. Here's how it works: When a delivery egg is generated that area will be marked as the "captivity area". Xenomorphs born within this area now have their own team, and have their own section in the roundend report that will greentext them based on if they were able to survive and escape captivity. Xenomorphs born outside of this area will spawn as normal Xenomorphs, with no escape objective or special fanfare. To further encourage people from actually taking the role and potentially resigning themselves to an hour in Xenobio CBT prison, the first of the hive gets their own header on the roundend report. (When I say "team" here, I mean they receive a different antag team datum. They're still able to collaborate and cooperate with other Xenomorphs, they just have a different title and extra objective in addition to the bonus roundend report limelight.)   (This also adds a basic "survive and advance the hive" objective for all xenomorphs, since their objective popup was otherwise completely blank). Since the captivity area is entirely dependent on the location of the egg itself, admins can plop one of these down anywhere, and mappers don't have to put the egg mapping helper specifically in Xenobio. For clarification -- To be qualified for the Captive Xenomorph team, **a delivery egg must be spawned**, and the xeno you inhabit must be born in the same area the egg was spawned. If the queen breaks captivity and starts nesting elsewhere on the station, their children will be born as normal Xenomorphs, not Captive Xenomorphs. ## Why It's Good For The Game Adds a bit of distinction, and gives bragging rights, to anyone bold enough to take a roundstart xeno roll and escape with it. The Xeno egg delivery is already rare enough, I think it deserves a bit more fanfare (especially considering the dramatic impact it sometimes has on the direction of a round). ## Changelog 🆑 add: Xenomorphs born in the room the roundstart delivery egg was spawned in will be part of a special "captive xenomorph" team, tasked with escaping and tracked in the roundend report. fix: Regular Xenomorphs no longer receive a blank objectives popup on spawn. /🆑 * Roundstart Xeno egg deliveries create a Captive Xenomorph team, gives regular xenos a fluff objective so their popup isn't blank. --------- Co-authored-by: Rhials <Datguy33456@gmail.com>
93 lines
4.0 KiB
Plaintext
93 lines
4.0 KiB
Plaintext
#define COMMUNICATION_COOLDOWN (30 SECONDS)
|
|
#define COMMUNICATION_COOLDOWN_AI (30 SECONDS)
|
|
#define COMMUNICATION_COOLDOWN_MEETING (5 MINUTES)
|
|
|
|
SUBSYSTEM_DEF(communications)
|
|
name = "Communications"
|
|
flags = SS_NO_INIT | SS_NO_FIRE
|
|
|
|
COOLDOWN_DECLARE(silicon_message_cooldown)
|
|
COOLDOWN_DECLARE(nonsilicon_message_cooldown)
|
|
COOLDOWN_DECLARE(emergency_meeting_cooldown)
|
|
|
|
/// Are we trying to send a cross-station message that contains soft-filtered words? If so, flip to TRUE to extend the time admins have to cancel the message.
|
|
var/soft_filtering = FALSE
|
|
|
|
/// A list of footnote datums, to be added to the bottom of the roundstart command report.
|
|
var/list/command_report_footnotes = list()
|
|
/// A counter of conditions that are blocking the command report from printing. Counter incremements up for every blocking condition, and de-incrememnts when it is complete.
|
|
var/block_command_report = 0
|
|
/// Has a special xenomorph egg been delivered?
|
|
var/xenomorph_egg_delivered = FALSE
|
|
/// The location where the special xenomorph egg was planted
|
|
var/area/captivity_area
|
|
|
|
/datum/controller/subsystem/communications/proc/can_announce(mob/living/user, is_silicon)
|
|
if(is_silicon && COOLDOWN_FINISHED(src, silicon_message_cooldown))
|
|
return TRUE
|
|
else if(!is_silicon && COOLDOWN_FINISHED(src, nonsilicon_message_cooldown))
|
|
return TRUE
|
|
else
|
|
return FALSE
|
|
|
|
/datum/controller/subsystem/communications/proc/make_announcement(mob/living/user, is_silicon, input, syndicate, list/players)
|
|
if(!can_announce(user, is_silicon))
|
|
return FALSE
|
|
if(is_silicon)
|
|
minor_announce(html_decode(input),"[user.name] Announces:", players = players)
|
|
COOLDOWN_START(src, silicon_message_cooldown, COMMUNICATION_COOLDOWN_AI)
|
|
else
|
|
priority_announce(html_decode(user.treat_message(input)), null, ANNOUNCER_CAPTAIN, "[syndicate? "Syndicate " : ""]Captain", has_important_message = TRUE, players = players)//SKYRAT EDIT CHANGE
|
|
COOLDOWN_START(src, nonsilicon_message_cooldown, COMMUNICATION_COOLDOWN)
|
|
user.log_talk(input, LOG_SAY, tag="priority announcement")
|
|
message_admins("[ADMIN_LOOKUPFLW(user)] has made a priority announcement.")
|
|
|
|
/**
|
|
* Check if a mob can call an emergency meeting
|
|
*
|
|
* Should only really happen during april fools.
|
|
* Checks to see that it's been at least 5 minutes since the last emergency meeting call.
|
|
* Arguments:
|
|
* * user - Mob who called the meeting
|
|
*/
|
|
/datum/controller/subsystem/communications/proc/can_make_emergency_meeting(mob/living/user)
|
|
if(!check_holidays(APRIL_FOOLS))
|
|
return FALSE
|
|
else if(COOLDOWN_FINISHED(src, emergency_meeting_cooldown))
|
|
return TRUE
|
|
else
|
|
return FALSE
|
|
|
|
/**
|
|
* Call an emergency meeting
|
|
*
|
|
* Communications subsystem wrapper for the call_emergency_meeting world proc.
|
|
* Checks to make sure the proc can be called, and handles
|
|
* relevant logging and timing. See that proc definition for more detail.
|
|
* Arguments:
|
|
* * user - Mob who called the meeting
|
|
*/
|
|
/datum/controller/subsystem/communications/proc/emergency_meeting(mob/living/user)
|
|
if(!can_make_emergency_meeting(user))
|
|
return FALSE
|
|
call_emergency_meeting(user, get_area(user))
|
|
COOLDOWN_START(src, emergency_meeting_cooldown, COMMUNICATION_COOLDOWN_MEETING)
|
|
message_admins("[ADMIN_LOOKUPFLW(user)] has called an emergency meeting.")
|
|
|
|
/datum/controller/subsystem/communications/proc/send_message(datum/comm_message/sending,print = TRUE,unique = FALSE)
|
|
for(var/obj/machinery/computer/communications/C in GLOB.shuttle_caller_list)
|
|
if(!(C.machine_stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
|
|
if(unique)
|
|
C.add_message(sending)
|
|
else //We copy the message for each console, answers and deletions won't be shared
|
|
var/datum/comm_message/M = new(sending.title,sending.content,sending.possible_answers.Copy())
|
|
C.add_message(M)
|
|
if(print)
|
|
var/obj/item/paper/printed_paper = new /obj/item/paper(C.loc)
|
|
printed_paper.name = "paper - '[sending.title]'"
|
|
printed_paper.add_raw_text(sending.content)
|
|
printed_paper.update_appearance()
|
|
|
|
#undef COMMUNICATION_COOLDOWN
|
|
#undef COMMUNICATION_COOLDOWN_AI
|