Exfiltration - Early Antag Escape (#29554)

* Ghost bar antag addition

* Adds extraction flares and extraction procs

* Ghostbarification, antag-specific extractions

* Objectives reroll if target extracts

* Comment format

* Adds blackboxing. Prevents extraction if you're an objective target.

* Fixed objective freezing, removes mindslaves on exfiltration

* Vampire Portal Sprites

* Better sprite for portal

* Flayer telepad, assorted visual adjustments

* Makes flayer and vampire portals truly one time use. Flayer ability icon

* Fixed indents, vampire ability icon

* Changeling flare

* Removed some debug adjustments

* Map fixes

* Makes the exfil restriction a var on the datum

* More map fixes

* Centcomm my beloathed

* More map fixes

* Checks delay before objectives

* Objective freezing list fix

* Review fixes

* Moves a lot of exfil item granting logic to antag datum.

* Changed objective exfil block from var to proc

* Centcommmm

* Adds true return. Thanks Contra.

Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Efficiency

Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Moved jaunter subtypes

* Forgot to move the admin one

* Capitalization

Co-authored-by: AmityBlamity <142629851+AmityBlamity@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

* Reworked area selection

* Black box, admin log, proper clearing of martial arts and bio chips

* Exfiltration now properly checks completion of alive and free escape objective

* Adds announcement to security comms when exfil item is used

* Linters

* Map adjustments

* Fixes syndiebar library computer access

* Merge conflict resolution

* Updates action buttons

* New Linters

* Update centcomm.dmm

---------

Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
Co-authored-by: AmityBlamity <142629851+AmityBlamity@users.noreply.github.com>
This commit is contained in:
PollardTheDragon
2025-09-09 01:28:09 +00:00
committed by GitHub
co-authored by Contrabang AmityBlamity
parent 7a0918b330
commit fca03efeb0
18 changed files with 4291 additions and 2297 deletions
+45 -2
View File
@@ -72,6 +72,9 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
/datum/objective/proc/found_target()
return target
/datum/objective/proc/is_valid_exfiltration()
return TRUE
/**
* This is for objectives that need to register signals, so place them in here.
*/
@@ -215,6 +218,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
explanation_text = "Free Objective"
/datum/objective/assassinate/check_completion()
if(..())
return TRUE
if(target?.current)
if(target.current.stat == DEAD)
return TRUE
@@ -271,6 +276,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
return TARGET_INVALID_NOTHEAD
/datum/objective/mutiny/check_completion()
if(..())
return TRUE
if(target?.current)
if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client)
return TRUE
@@ -334,6 +341,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
/datum/objective/debrain/check_completion()
if(!target) // If it's a free objective.
return TRUE
if(..())
return TRUE
if(!target.current || !isbrain(target.current))
return FALSE
for(var/datum/mind/M in get_owners())
@@ -358,6 +367,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
/datum/objective/protect/check_completion()
if(!target) //If it's a free objective.
return TRUE
if(..())
return TRUE
if(target.current)
if(target.current.stat == DEAD)
return FALSE
@@ -395,6 +406,9 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
return FALSE
return SSshuttle.emergency.is_hijacked()
/datum/objective/hijack/is_valid_exfiltration()
return FALSE
/datum/objective/hijackclone
name = "Hijack (with clones)"
explanation_text = "Hijack the shuttle by ensuring only you (or your copies) escape."
@@ -453,7 +467,9 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
explanation_text = "Escape on the shuttle or an escape pod alive and free."
needs_target = FALSE
/datum/objective/escape/check_completion()
/datum/objective/escape/check_completion(exfilling = FALSE)
if(..())
return TRUE
var/list/owners = get_owners()
for(var/datum/mind/M in owners)
// These are mandatory conditions, they should come before the freebie conditions below.
@@ -464,6 +480,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
return TRUE
if(SSticker.mode.station_was_nuked) // If they escaped the blast somehow, let them win.
return TRUE
if(exfilling)
return TRUE
if(SSshuttle.emergency.mode < SHUTTLE_ENDGAME)
return FALSE
@@ -536,7 +554,9 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
// This objective should only be given to a single owner since only 1 person can have the ID card of the target.
// We're fine to use `owner` instead of `get_owners()`.
/datum/objective/escape/escape_with_identity/check_completion()
/datum/objective/escape/escape_with_identity/check_completion(exfilling = FALSE)
if(..())
return TRUE
if(!target_real_name)
return TRUE
if(!ishuman(owner.current))
@@ -554,6 +574,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
needs_target = FALSE
/datum/objective/survive/check_completion()
if(..())
return TRUE
for(var/datum/mind/M in get_owners())
if(QDELETED(M.current) || M.current.stat == DEAD || is_special_dead(M.current, check_silicon = FALSE))
return FALSE
@@ -576,6 +598,11 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
/datum/objective/steal/found_target()
return steal_target
/datum/objective/steal/is_valid_exfiltration()
if(istype(steal_target, /datum/theft_objective/nukedisc) || istype(steal_target, /datum/theft_objective/plutonium_core))
return FALSE
return TRUE
/datum/objective/steal/proc/get_location()
return steal_target.location_override || "an unknown area"
@@ -651,6 +678,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
/datum/objective/steal/check_completion()
if(!steal_target)
return TRUE // Free Objective
if(..())
return TRUE
for(var/datum/mind/M in get_owners())
if(!M.current)
@@ -733,6 +762,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
explanation_text = "Acquire [target_amount] compatible genomes. The 'Extract DNA Sting' can be used to stealthily get genomes without killing somebody."
/datum/objective/absorb/check_completion()
if(..())
return TRUE
for(var/datum/mind/M in get_owners())
var/datum/antagonist/changeling/cling = M?.has_antag_datum(/datum/antagonist/changeling)
if(cling?.absorbed_dna && (cling.absorbed_count >= target_amount))
@@ -758,6 +789,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
explanation_text = "Free Objective"
/datum/objective/destroy/check_completion()
if(..())
return TRUE
if(target?.current)
if(target.current.stat == DEAD || is_away_level(target.current.z) || !target.current.ckey)
return TRUE
@@ -778,6 +811,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
wanted_items = typecacheof(wanted_items)
/datum/objective/steal_five_of_type/check_completion()
if(..())
return TRUE
var/stolen_count = 0
var/list/owners = get_owners()
var/list/all_items = list()
@@ -805,6 +840,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
..()
/datum/objective/steal_five_of_type/summon_magic/check_completion()
if(..())
return TRUE
var/stolen_count = 0
var/list/owners = get_owners()
var/list/all_items = list()
@@ -843,6 +880,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
explanation_text = "Accumulate at least [target_amount] total units of blood."
/datum/objective/blood/check_completion()
if(..())
return TRUE
for(var/datum/mind/M in get_owners())
var/datum/antagonist/vampire/V = M.has_antag_datum(/datum/antagonist/vampire)
if(V.bloodtotal >= target_amount)
@@ -870,6 +909,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
explanation_text = "Accumulate at least [target_amount] worth of swarms."
/datum/objective/swarms/check_completion()
if(..())
return TRUE
for(var/datum/mind/M in get_owners())
var/datum/antagonist/mindflayer/flayer = M.has_antag_datum(/datum/antagonist/mindflayer)
return flayer?.total_swarms_gathered >= target_amount
@@ -930,6 +971,8 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
needs_target = FALSE
/datum/objective/potentially_backstabbed/check_completion()
if(..())
return TRUE
for(var/datum/mind/M in get_owners())
var/datum/antagonist/traitor/T = M.has_antag_datum(/datum/antagonist/traitor)
for(var/datum/objective/our_objective in T.get_antag_objectives(FALSE))
+7
View File
@@ -198,6 +198,13 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/newplayer_start) //Without this you sp
spawner_list = GLOB.syndieprisonwarp
return ..()
/obj/effect/landmark/spawner/antag_extract_warp
name = "antagextractwarp"
/obj/effect/landmark/spawner/antag_extract_warp/Initialize(mapload)
spawner_list = GLOB.antagextractwarp
return ..()
/obj/effect/landmark/spawner/prisonwarp
name = "prisonwarp"