diff --git a/code/__DEFINES/dcs/mob_signals.dm b/code/__DEFINES/dcs/mob_signals.dm index c3eb668e7fa..434a414279c 100644 --- a/code/__DEFINES/dcs/mob_signals.dm +++ b/code/__DEFINES/dcs/mob_signals.dm @@ -136,6 +136,8 @@ #define COMPONENT_NO_ATTACH (1<<0) ///from base of mob/living/health_update() #define COMSIG_LIVING_HEALTH_UPDATE "living_health_update" +/// Sent during exfiltration to handle guardians +#define COMSIG_SUMMONER_EXTRACTED "summoner_extracted" ///sent from borg recharge stations: (amount, repairs) #define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" ///sent when a mob enters a borg charger diff --git a/code/datums/outfits/outfit_ghostbar.dm b/code/datums/outfits/outfit_ghostbar.dm index 617564cb2e3..804f6ed71da 100644 --- a/code/datums/outfits/outfit_ghostbar.dm +++ b/code/datums/outfits/outfit_ghostbar.dm @@ -51,6 +51,12 @@ /obj/item/ammo_box/magazine/toy/pistol = 2 ) +/datum/outfit/admin/ghostbar_antag/syndicate/plasmaman + name = "Syndicate Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman + uniform = /obj/item/clothing/under/plasmaman + /datum/outfit/admin/ghostbar_antag/vampire name = "Vampire" @@ -65,6 +71,12 @@ /obj/item/reagent_containers/iv_bag/blood/o_plus = 3 ) +/datum/outfit/admin/ghostbar_antag/vampire/plasmaman + name = "Vampire Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman + uniform = /obj/item/clothing/under/plasmaman + /datum/outfit/admin/ghostbar_antag/changeling name = "Changeling" @@ -79,6 +91,12 @@ /obj/item/toy/foamblade = 1 ) +/datum/outfit/admin/ghostbar_antag/changeling/plasmaman + name = "Changeling Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman + uniform = /obj/item/clothing/under/plasmaman + /datum/outfit/admin/ghostbar_antag/mindflayer name = "Mindflayer" @@ -92,3 +110,9 @@ /obj/item/storage/box/engineer = 1, /obj/item/toy/plushie/ipcplushie = 1 ) + +/datum/outfit/admin/ghostbar_antag/mindflayer/plasmaman + name = "Mindflayer Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman + uniform = /obj/item/clothing/under/plasmaman diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index adf830b6a06..339838f25e3 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -55,6 +55,7 @@ summoner = host host.grant_guardian_actions(src) RegisterSignal(summoner, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(update_health_hud)) + RegisterSignal(summoner, COMSIG_SUMMONER_EXTRACTED, PROC_REF(handle_extraction)) /mob/living/simple_animal/hostile/guardian/can_buckle() return FALSE @@ -192,6 +193,13 @@ /mob/living/simple_animal/hostile/guardian/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE //Works better in zero G, and not useless in space +/mob/living/simple_animal/hostile/guardian/proc/handle_extraction() + if(summoner) + summoner.remove_guardian_actions() + UnregisterSignal(summoner, COMSIG_LIVING_HEALTH_UPDATE) + ghostize() + qdel(src) + //Manifest, Recall, Communicate /mob/living/simple_animal/hostile/guardian/proc/Manifest() diff --git a/code/modules/antagonists/_common/antag_exfiltration.dm b/code/modules/antagonists/_common/antag_exfiltration.dm index 42722e05b3b..f7dd682786c 100644 --- a/code/modules/antagonists/_common/antag_exfiltration.dm +++ b/code/modules/antagonists/_common/antag_exfiltration.dm @@ -591,11 +591,17 @@ for(var/datum/martial_art/MA in extractor.mind.known_martial_arts) MA.remove(extractor) + // Kill guardians + SEND_SIGNAL(extractor, COMSIG_SUMMONER_EXTRACTED) + // Equip outfits and remove spells var/datum/mind/extractor_mind = extractor.mind for(var/datum/antagonist/antag in extractor_mind.antag_datums) antag.exfiltrate(extractor, radio) - + if(isvox(extractor)) + extractor.dna.species.after_equip_job(null, extractor) // Nitrogen tanks + if(isplasmaman(extractor)) + extractor.dna.species.after_equip_job(null, extractor) // Plasma tanks // Apply traits ADD_TRAIT(extractor, TRAIT_PACIFISM, GHOST_ROLE) ADD_TRAIT(extractor, TRAIT_RESPAWNABLE, GHOST_ROLE) diff --git a/code/modules/antagonists/changeling/datum_changeling.dm b/code/modules/antagonists/changeling/datum_changeling.dm index 1ee3e39a9dd..9e0485f98cf 100644 --- a/code/modules/antagonists/changeling/datum_changeling.dm +++ b/code/modules/antagonists/changeling/datum_changeling.dm @@ -191,7 +191,10 @@ RESTRICT_TYPE(/datum/antagonist/changeling) remove_changeling_powers(FALSE) var/datum/action/changeling/power = new /datum/action/changeling/transform power.Grant(extractor) - extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/changeling) + if(isplasmaman(extractor)) + extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/changeling/plasmaman) + else + extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/changeling) radio.autosay("--ZZZT!- Welcome home, [extractor.real_name]. -ZZT!-", "Changeling Hive", "Security") SSblackbox.record_feedback("tally", "successful_extraction", 1, "Changeling") diff --git a/code/modules/antagonists/mind_flayer/flayer_datum.dm b/code/modules/antagonists/mind_flayer/flayer_datum.dm index bb15ef379fa..06365713c6f 100644 --- a/code/modules/antagonists/mind_flayer/flayer_datum.dm +++ b/code/modules/antagonists/mind_flayer/flayer_datum.dm @@ -64,7 +64,10 @@ /datum/antagonist/mindflayer/exfiltrate(mob/living/carbon/human/extractor, obj/item/radio/radio) remove_all_abilities() remove_all_passives() - extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/mindflayer) + if(isplasmaman(extractor)) // Normally, only IPCs can be flayers. This is in case they somehow end up mindswapped to a plasmaman. + extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/mindflayer/plasmaman) + else + extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/mindflayer) radio.autosay("--ZZZT!- Excellent job, [extractor.real_name]. Proceed to -^%&!-ZZT!-", "Master Flayer", "Security") SSblackbox.record_feedback("tally", "successful_extraction", 1, "Mindflayer") diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 1275444cc19..8e5971811a3 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -118,7 +118,10 @@ RESTRICT_TYPE(/datum/antagonist/traitor) forge_human_objectives() /datum/antagonist/traitor/exfiltrate(mob/living/carbon/human/extractor, obj/item/radio/radio) - extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/syndicate) + if(isplasmaman(extractor)) + extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/syndicate/plasmaman) + else + extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/syndicate) // Remove mindslaves var/list/mindslaves = SSticker.mode.implanted for(var/datum/mind/possible_slave in mindslaves) diff --git a/code/modules/antagonists/vampire/vamp_datum.dm b/code/modules/antagonists/vampire/vamp_datum.dm index e82586da3b3..535f1f0fb3a 100644 --- a/code/modules/antagonists/vampire/vamp_datum.dm +++ b/code/modules/antagonists/vampire/vamp_datum.dm @@ -110,7 +110,10 @@ RESTRICT_TYPE(/datum/antagonist/vampire) if(slave.master == extractor.mind) possible_thrall.remove_antag_datum(/datum/antagonist/mindslave/thrall) - extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/vampire) + if(isplasmaman(extractor)) + extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/vampire/plasmaman) + else + extractor.equipOutfit(/datum/outfit/admin/ghostbar_antag/vampire) radio.autosay("--ZZZT!- Wonderfully done, [extractor.real_name]. Welcome to -^%&!-ZZT!-", "Ancient Vampire", "Security") SSblackbox.record_feedback("tally", "successful_extraction", 1, "Vampire")