mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 09:54:52 +00:00
Merge pull request #5330 from Citadel-Station-13/upstream-merge-35156
[MIRROR] Slaughter demon, Morph, ERT / Deathsquad antag datums.
This commit is contained in:
@@ -12,3 +12,18 @@
|
|||||||
#define APPRENTICE_BLUESPACE "bluespace"
|
#define APPRENTICE_BLUESPACE "bluespace"
|
||||||
#define APPRENTICE_ROBELESS "robeless"
|
#define APPRENTICE_ROBELESS "robeless"
|
||||||
#define APPRENTICE_HEALING "healing"
|
#define APPRENTICE_HEALING "healing"
|
||||||
|
|
||||||
|
|
||||||
|
//ERT Types
|
||||||
|
#define ERT_BLUE "Blue"
|
||||||
|
#define ERT_RED "Red"
|
||||||
|
#define ERT_AMBER "Amber"
|
||||||
|
#define ERT_DEATHSQUAD "Deathsquad"
|
||||||
|
|
||||||
|
//ERT subroles
|
||||||
|
#define ERT_SEC "sec"
|
||||||
|
#define ERT_MED "med"
|
||||||
|
#define ERT_ENG "eng"
|
||||||
|
#define ERT_LEADER "leader"
|
||||||
|
#define DEATHSQUAD "ds"
|
||||||
|
#define DEATHSQUAD_LEADER "ds_leader"
|
||||||
@@ -40,6 +40,9 @@
|
|||||||
// Jim (Status) FLW PM TP
|
// Jim (Status) FLW PM TP
|
||||||
/datum/antagonist/proc/antag_listing_entry()
|
/datum/antagonist/proc/antag_listing_entry()
|
||||||
var/list/parts = list()
|
var/list/parts = list()
|
||||||
|
if(show_name_in_check_antagonists)
|
||||||
|
parts += "[antag_listing_name()]([name])"
|
||||||
|
else
|
||||||
parts += antag_listing_name()
|
parts += antag_listing_name()
|
||||||
parts += antag_listing_status()
|
parts += antag_listing_status()
|
||||||
parts += antag_listing_commands()
|
parts += antag_listing_commands()
|
||||||
|
|||||||
@@ -271,77 +271,7 @@
|
|||||||
|
|
||||||
// DEATH SQUADS
|
// DEATH SQUADS
|
||||||
/datum/admins/proc/makeDeathsquad()
|
/datum/admins/proc/makeDeathsquad()
|
||||||
var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.")
|
return makeEmergencyresponseteam(ERT_DEATHSQUAD)
|
||||||
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null)
|
|
||||||
var/squadSpawned = 0
|
|
||||||
|
|
||||||
if(candidates.len >= 2) //Minimum 2 to be considered a squad
|
|
||||||
//Pick the lucky players
|
|
||||||
var/numagents = min(5,candidates.len) //How many commandos to spawn
|
|
||||||
var/list/spawnpoints = GLOB.emergencyresponseteamspawn
|
|
||||||
while(numagents && candidates.len)
|
|
||||||
if (numagents > spawnpoints.len)
|
|
||||||
numagents--
|
|
||||||
continue // This guy's unlucky, not enough spawn points, we skip him.
|
|
||||||
var/spawnloc = spawnpoints[numagents]
|
|
||||||
var/mob/dead/observer/chosen_candidate = pick(candidates)
|
|
||||||
candidates -= chosen_candidate
|
|
||||||
if(!chosen_candidate.key)
|
|
||||||
continue
|
|
||||||
|
|
||||||
//Spawn and equip the commando
|
|
||||||
var/mob/living/carbon/human/Commando = new(spawnloc)
|
|
||||||
chosen_candidate.client.prefs.copy_to(Commando)
|
|
||||||
if(numagents == 1) //If Squad Leader
|
|
||||||
Commando.real_name = "Officer [pick(GLOB.commando_names)]"
|
|
||||||
Commando.equipOutfit(/datum/outfit/death_commando/officer)
|
|
||||||
else
|
|
||||||
Commando.real_name = "Trooper [pick(GLOB.commando_names)]"
|
|
||||||
Commando.equipOutfit(/datum/outfit/death_commando)
|
|
||||||
Commando.dna.update_dna_identity()
|
|
||||||
Commando.key = chosen_candidate.key
|
|
||||||
Commando.mind.assigned_role = "Death Commando"
|
|
||||||
for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
|
|
||||||
spawn(0)
|
|
||||||
door.open()
|
|
||||||
|
|
||||||
//Assign antag status and the mission
|
|
||||||
Commando.mind.special_role = "deathsquad"
|
|
||||||
|
|
||||||
var/datum/objective/missionobj = new
|
|
||||||
missionobj.owner = Commando.mind
|
|
||||||
missionobj.explanation_text = mission
|
|
||||||
missionobj.completed = 1
|
|
||||||
Commando.mind.objectives += missionobj
|
|
||||||
|
|
||||||
Commando.mind.add_antag_datum(/datum/antagonist/auto_custom)
|
|
||||||
|
|
||||||
//Greet the commando
|
|
||||||
to_chat(Commando, "<B><font size=3 color=red>You are the [numagents==1?"Deathsquad Officer":"Death Commando"].</font></B>")
|
|
||||||
var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division."
|
|
||||||
if(numagents == 1) //If Squad Leader
|
|
||||||
missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready."
|
|
||||||
else
|
|
||||||
missiondesc += " Follow orders given to you by your squad leader."
|
|
||||||
missiondesc += "<BR><B>Your Mission</B>: [mission]"
|
|
||||||
to_chat(Commando, missiondesc)
|
|
||||||
|
|
||||||
if(CONFIG_GET(flag/enforce_human_authority))
|
|
||||||
Commando.set_species(/datum/species/human)
|
|
||||||
|
|
||||||
//Logging and cleanup
|
|
||||||
if(numagents == 1)
|
|
||||||
message_admins("The deathsquad has spawned with the mission: [mission].")
|
|
||||||
log_game("[key_name(Commando)] has been selected as a Death Commando")
|
|
||||||
numagents--
|
|
||||||
squadSpawned++
|
|
||||||
|
|
||||||
if (squadSpawned)
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
/datum/admins/proc/makeOfficial()
|
/datum/admins/proc/makeOfficial()
|
||||||
var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.")
|
var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.")
|
||||||
@@ -386,38 +316,70 @@
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
// CENTCOM RESPONSE TEAM
|
// CENTCOM RESPONSE TEAM
|
||||||
/datum/admins/proc/makeEmergencyresponseteam()
|
/datum/admins/proc/makeEmergencyresponseteam(alert_type)
|
||||||
var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: CentCom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad")
|
var/alert
|
||||||
|
if(!alert_type)
|
||||||
|
alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: CentCom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad")
|
||||||
if(!alert)
|
if(!alert)
|
||||||
return
|
return
|
||||||
|
else
|
||||||
|
alert = alert_type
|
||||||
|
|
||||||
|
var/teamsize = 0
|
||||||
|
var/deathsquad = FALSE
|
||||||
|
|
||||||
switch(alert)
|
switch(alert)
|
||||||
if("Delta: Deathsquad")
|
if("Delta: Deathsquad")
|
||||||
return makeDeathsquad()
|
alert = ERT_DEATHSQUAD
|
||||||
|
teamsize = 5
|
||||||
|
deathsquad = TRUE
|
||||||
if("Red: Elite ERT (Armoury Access + Pulse Weapons)")
|
if("Red: Elite ERT (Armoury Access + Pulse Weapons)")
|
||||||
alert = "Red"
|
alert = ERT_RED
|
||||||
if("Amber: Full ERT (Armoury Access)")
|
if("Amber: Full ERT (Armoury Access)")
|
||||||
alert = "Amber"
|
alert = ERT_AMBER
|
||||||
if("Blue: Light ERT (No Armoury Access)")
|
if("Blue: Light ERT (No Armoury Access)")
|
||||||
alert = "Blue"
|
alert = ERT_BLUE
|
||||||
if("Green: CentCom Official")
|
if("Green: CentCom Official")
|
||||||
return makeOfficial()
|
return makeOfficial()
|
||||||
|
else
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!teamsize)
|
||||||
var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num
|
var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num
|
||||||
if(isnull(teamcheck))
|
if(isnull(teamcheck))
|
||||||
return
|
return
|
||||||
var/teamsize = min(7,teamcheck)
|
teamsize = min(7,teamcheck)
|
||||||
var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.") as null|text
|
|
||||||
|
|
||||||
|
var/default_mission = deathsquad ? "Leave no witnesses." : "Assist the station."
|
||||||
|
var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", default_mission) as null|text
|
||||||
if(!mission)
|
if(!mission)
|
||||||
return
|
return
|
||||||
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null)
|
|
||||||
|
var/prompt_name = deathsquad ? "an elite Nanotrasen Strike Team" : "a Code [alert] Nanotrasen Emergency Response Team"
|
||||||
|
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [prompt_name] ?", "deathsquad", null)
|
||||||
var/teamSpawned = 0
|
var/teamSpawned = 0
|
||||||
|
|
||||||
if(candidates.len > 0)
|
if(candidates.len > 0)
|
||||||
//Pick the (un)lucky players
|
//Pick the (un)lucky players
|
||||||
var/numagents = min(teamsize,candidates.len) //How many officers to spawn
|
var/numagents = min(teamsize,candidates.len) //How many officers to spawn
|
||||||
var/redalert //If the ert gets super weapons
|
|
||||||
if (alert == "Red")
|
//Create team
|
||||||
numagents = min(teamsize,candidates.len)
|
var/datum/team/ert/ert_team = new
|
||||||
redalert = 1
|
if(deathsquad)
|
||||||
|
ert_team.name = "Death Squad"
|
||||||
|
|
||||||
|
//Asign team objective
|
||||||
|
var/datum/objective/missionobj = new
|
||||||
|
missionobj.team = ert_team
|
||||||
|
missionobj.explanation_text = mission
|
||||||
|
missionobj.completed = 1
|
||||||
|
ert_team.objectives += missionobj
|
||||||
|
ert_team.mission = missionobj
|
||||||
|
|
||||||
|
//We give these out in order, then back from the start if there's more than 3
|
||||||
|
var/list/role_order = list(ERT_SEC,ERT_MED,ERT_ENG)
|
||||||
|
|
||||||
var/list/spawnpoints = GLOB.emergencyresponseteamspawn
|
var/list/spawnpoints = GLOB.emergencyresponseteamspawn
|
||||||
while(numagents && candidates.len)
|
while(numagents && candidates.len)
|
||||||
if (numagents > spawnpoints.len)
|
if (numagents > spawnpoints.len)
|
||||||
@@ -429,75 +391,38 @@
|
|||||||
if(!chosen_candidate.key)
|
if(!chosen_candidate.key)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
//Spawn and equip the officer
|
//Spawn the body
|
||||||
var/mob/living/carbon/human/ERTOperative = new(spawnloc)
|
var/mob/living/carbon/human/ERTOperative = new(spawnloc)
|
||||||
var/list/lastname = GLOB.last_names
|
|
||||||
chosen_candidate.client.prefs.copy_to(ERTOperative)
|
chosen_candidate.client.prefs.copy_to(ERTOperative)
|
||||||
var/ertname = pick(lastname)
|
|
||||||
switch(numagents)
|
|
||||||
if(1)
|
|
||||||
ERTOperative.real_name = "Commander [ertname]"
|
|
||||||
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/commander/alert : /datum/outfit/ert/commander)
|
|
||||||
if(2)
|
|
||||||
ERTOperative.real_name = "Security Officer [ertname]"
|
|
||||||
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security)
|
|
||||||
if(3)
|
|
||||||
ERTOperative.real_name = "Medical Officer [ertname]"
|
|
||||||
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic)
|
|
||||||
if(4)
|
|
||||||
ERTOperative.real_name = "Engineer [ertname]"
|
|
||||||
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer)
|
|
||||||
if(5)
|
|
||||||
ERTOperative.real_name = "Security Officer [ertname]"
|
|
||||||
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security)
|
|
||||||
if(6)
|
|
||||||
ERTOperative.real_name = "Medical Officer [ertname]"
|
|
||||||
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic)
|
|
||||||
if(7)
|
|
||||||
ERTOperative.real_name = "Engineer [ertname]"
|
|
||||||
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer)
|
|
||||||
ERTOperative.dna.update_dna_identity()
|
|
||||||
ERTOperative.key = chosen_candidate.key
|
ERTOperative.key = chosen_candidate.key
|
||||||
ERTOperative.mind.assigned_role = "ERT"
|
|
||||||
|
|
||||||
//Open the Armory doors
|
|
||||||
if(alert != "Blue")
|
|
||||||
for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
|
|
||||||
spawn(0)
|
|
||||||
door.open()
|
|
||||||
|
|
||||||
//Assign antag status and the mission
|
|
||||||
ERTOperative.mind.special_role = "ERT"
|
|
||||||
|
|
||||||
var/datum/objective/missionobj = new
|
|
||||||
missionobj.owner = ERTOperative.mind
|
|
||||||
missionobj.explanation_text = mission
|
|
||||||
missionobj.completed = 1
|
|
||||||
ERTOperative.mind.objectives += missionobj
|
|
||||||
|
|
||||||
ERTOperative.mind.add_antag_datum(/datum/antagonist/auto_custom)
|
|
||||||
|
|
||||||
//Greet the commando
|
|
||||||
to_chat(ERTOperative, "<B><font size=3 color=red>You are [numagents==1?"the Emergency Response Team Commander":"an Emergency Response Officer"].</font></B>")
|
|
||||||
var/missiondesc = "Your squad is being sent on a Code [alert] mission to [station_name()] by Nanotrasen's Security Division."
|
|
||||||
if(numagents == 1) //If Squad Leader
|
|
||||||
missiondesc += " Lead your squad to ensure the completion of the mission. Avoid civilian casualites when possible. Board the shuttle when your team is ready."
|
|
||||||
else
|
|
||||||
missiondesc += " Follow orders given to you by your commander. Avoid civilian casualites when possible."
|
|
||||||
missiondesc += "<BR><B>Your Mission</B>: [mission]"
|
|
||||||
to_chat(ERTOperative, missiondesc)
|
|
||||||
|
|
||||||
if(CONFIG_GET(flag/enforce_human_authority))
|
if(CONFIG_GET(flag/enforce_human_authority))
|
||||||
ERTOperative.set_species(/datum/species/human)
|
ERTOperative.set_species(/datum/species/human)
|
||||||
|
|
||||||
//Logging and cleanup
|
//Give antag datum
|
||||||
|
var/datum/antagonist/ert/ert_antag = new
|
||||||
|
ert_antag.high_alert = alert == ERT_RED
|
||||||
if(numagents == 1)
|
if(numagents == 1)
|
||||||
message_admins("A Code [alert] emergency response team has spawned with the mission: [mission]")
|
ert_antag.role = deathsquad ? DEATHSQUAD_LEADER : ERT_LEADER
|
||||||
log_game("[key_name(ERTOperative)] has been selected as an Emergency Response Officer")
|
else
|
||||||
|
ert_antag.role = deathsquad ? DEATHSQUAD : role_order[WRAP(numagents,1,role_order.len + 1)]
|
||||||
|
ERTOperative.mind.add_antag_datum(ert_antag,ert_team)
|
||||||
|
|
||||||
|
ERTOperative.mind.assigned_role = ert_antag.name
|
||||||
|
|
||||||
|
//Logging and cleanup
|
||||||
|
log_game("[key_name(ERTOperative)] has been selected as an [ert_antag.name]")
|
||||||
numagents--
|
numagents--
|
||||||
teamSpawned++
|
teamSpawned++
|
||||||
|
|
||||||
if (teamSpawned)
|
if (teamSpawned)
|
||||||
|
message_admins("[prompt_name] has spawned with the mission: [mission]")
|
||||||
|
|
||||||
|
//Open the Armory doors
|
||||||
|
if(alert != ERT_BLUE)
|
||||||
|
for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
|
||||||
|
spawn(0)
|
||||||
|
door.open()
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(antagonists)
|
|||||||
//Antag panel properties
|
//Antag panel properties
|
||||||
var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind
|
var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind
|
||||||
var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED
|
var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED
|
||||||
|
var/show_name_in_check_antagonists = FALSE //Will append antagonist name in admin listings - use for categories that share more than one antag type
|
||||||
|
|
||||||
/datum/antagonist/New()
|
/datum/antagonist/New()
|
||||||
GLOB.antagonists += src
|
GLOB.antagonists += src
|
||||||
@@ -206,6 +207,7 @@ GLOBAL_LIST_EMPTY(antagonists)
|
|||||||
/datum/antagonist/auto_custom
|
/datum/antagonist/auto_custom
|
||||||
show_in_antagpanel = FALSE
|
show_in_antagpanel = FALSE
|
||||||
antagpanel_category = "Other"
|
antagpanel_category = "Other"
|
||||||
|
show_name_in_check_antagonists = TRUE
|
||||||
|
|
||||||
/datum/antagonist/auto_custom/on_gain()
|
/datum/antagonist/auto_custom/on_gain()
|
||||||
..()
|
..()
|
||||||
@@ -219,12 +221,10 @@ GLOBAL_LIST_EMPTY(antagonists)
|
|||||||
already_registered_objectives |= A.objectives
|
already_registered_objectives |= A.objectives
|
||||||
objectives = owner.objectives - already_registered_objectives
|
objectives = owner.objectives - already_registered_objectives
|
||||||
|
|
||||||
/datum/antagonist/auto_custom/antag_listing_name()
|
|
||||||
return ..() + "([name])"
|
|
||||||
|
|
||||||
//This one is created by admin tools for custom objectives
|
//This one is created by admin tools for custom objectives
|
||||||
/datum/antagonist/custom
|
/datum/antagonist/custom
|
||||||
antagpanel_category = "Custom"
|
antagpanel_category = "Custom"
|
||||||
|
show_name_in_check_antagonists = TRUE //They're all different
|
||||||
|
|
||||||
/datum/antagonist/custom/admin_add(datum/mind/new_owner,mob/admin)
|
/datum/antagonist/custom/admin_add(datum/mind/new_owner,mob/admin)
|
||||||
var/custom_name = stripped_input(admin, "Custom antagonist name:", "Custom antag", "Antagonist")
|
var/custom_name = stripped_input(admin, "Custom antagonist name:", "Custom antag", "Antagonist")
|
||||||
@@ -233,6 +233,3 @@ GLOBAL_LIST_EMPTY(antagonists)
|
|||||||
else
|
else
|
||||||
return
|
return
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/datum/antagonist/custom/antag_listing_name()
|
|
||||||
return ..() + "([name])"
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
throw_speed = 1
|
throw_speed = 1
|
||||||
throw_range = 5
|
throw_range = 5
|
||||||
w_class = WEIGHT_CLASS_TINY
|
w_class = WEIGHT_CLASS_TINY
|
||||||
var/used = FALSE
|
var/used = 0
|
||||||
|
|
||||||
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
|
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
|
||||||
return
|
return
|
||||||
@@ -57,13 +57,13 @@
|
|||||||
to_chat(H, "You already used this contract!")
|
to_chat(H, "You already used this contract!")
|
||||||
return
|
return
|
||||||
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
|
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
|
||||||
if(LAZYLEN(candidates))
|
if(candidates.len)
|
||||||
if(used)
|
if(used)
|
||||||
to_chat(H, "You already used this contract!")
|
to_chat(H, "You already used this contract!")
|
||||||
return
|
return
|
||||||
used = TRUE
|
used = 1
|
||||||
var/client/C = pick(candidates)
|
var/mob/dead/observer/theghost = pick(candidates)
|
||||||
spawn_antag(C, get_turf(src), href_list["school"],H.mind)
|
spawn_antag(theghost.client, get_turf(src), href_list["school"],H.mind)
|
||||||
else
|
else
|
||||||
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
|
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
|
||||||
|
|
||||||
@@ -120,12 +120,12 @@
|
|||||||
|
|
||||||
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
|
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
|
||||||
var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE)
|
var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE)
|
||||||
if(LAZYLEN(nuke_candidates))
|
if(nuke_candidates.len)
|
||||||
if(!(check_usability(user)))
|
if(!(check_usability(user)))
|
||||||
return
|
return
|
||||||
used = TRUE
|
used = TRUE
|
||||||
var/client/C = pick(nuke_candidates)
|
var/mob/dead/observer/theghost = pick(nuke_candidates)
|
||||||
spawn_antag(C, get_turf(src), "syndieborg", user.mind)
|
spawn_antag(theghost.client, get_turf(src), "syndieborg", user.mind)
|
||||||
do_sparks(4, TRUE, src)
|
do_sparks(4, TRUE, src)
|
||||||
qdel(src)
|
qdel(src)
|
||||||
else
|
else
|
||||||
@@ -203,8 +203,8 @@
|
|||||||
|
|
||||||
var/shatter_msg = "<span class='notice'>You shatter the bottle, no turning back now!</span>"
|
var/shatter_msg = "<span class='notice'>You shatter the bottle, no turning back now!</span>"
|
||||||
var/veil_msg = "<span class='warning'>You sense a dark presence lurking just beyond the veil...</span>"
|
var/veil_msg = "<span class='warning'>You sense a dark presence lurking just beyond the veil...</span>"
|
||||||
var/objective_verb = "Kill"
|
|
||||||
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
|
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
|
||||||
|
var/antag_type = /datum/antagonist/slaughter
|
||||||
|
|
||||||
|
|
||||||
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
|
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
|
||||||
@@ -213,13 +213,13 @@
|
|||||||
return
|
return
|
||||||
if(used)
|
if(used)
|
||||||
return
|
return
|
||||||
var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src)
|
var/list/demon_candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", null, null, ROLE_ALIEN, 50, src)
|
||||||
if(LAZYLEN(candidates))
|
if(demon_candidates.len)
|
||||||
if(used)
|
if(used)
|
||||||
return
|
return
|
||||||
used = TRUE
|
used = 1
|
||||||
var/client/C = pick(candidates)
|
var/mob/dead/observer/theghost = pick(demon_candidates)
|
||||||
spawn_antag(C, get_turf(src), initial(demon_type.name),user.mind)
|
spawn_antag(theghost.client, get_turf(src), initial(demon_type.name),user.mind)
|
||||||
to_chat(user, shatter_msg)
|
to_chat(user, shatter_msg)
|
||||||
to_chat(user, veil_msg)
|
to_chat(user, veil_msg)
|
||||||
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
|
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
|
||||||
@@ -235,24 +235,10 @@
|
|||||||
S.key = C.key
|
S.key = C.key
|
||||||
S.mind.assigned_role = S.name
|
S.mind.assigned_role = S.name
|
||||||
S.mind.special_role = S.name
|
S.mind.special_role = S.name
|
||||||
var/datum/objective/assassinate/new_objective
|
S.mind.add_antag_datum(antag_type)
|
||||||
if(user)
|
|
||||||
new_objective = new /datum/objective/assassinate
|
|
||||||
new_objective.owner = S.mind
|
|
||||||
new_objective.target = user
|
|
||||||
new_objective.explanation_text = "[objective_verb] [user.name], the one who summoned you."
|
|
||||||
S.mind.objectives += new_objective
|
|
||||||
var/datum/objective/new_objective2 = new /datum/objective
|
|
||||||
new_objective2.owner = S.mind
|
|
||||||
new_objective2.explanation_text = "[objective_verb] everyone[user ? " else while you're at it":""]."
|
|
||||||
S.mind.objectives += new_objective2
|
|
||||||
S.mind.add_antag_datum(/datum/antagonist/auto_custom)
|
|
||||||
to_chat(S, S.playstyle_string)
|
to_chat(S, S.playstyle_string)
|
||||||
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
|
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
|
||||||
Ctrl+Click a blood pool to manifest.</B>")
|
Ctrl+Click a blood pool to manifest.</B>")
|
||||||
if(new_objective)
|
|
||||||
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
|
|
||||||
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
|
|
||||||
|
|
||||||
/obj/item/antag_spawner/slaughter_demon/laughter
|
/obj/item/antag_spawner/slaughter_demon/laughter
|
||||||
name = "vial of tickles"
|
name = "vial of tickles"
|
||||||
@@ -262,5 +248,5 @@
|
|||||||
color = "#FF69B4" // HOT PINK
|
color = "#FF69B4" // HOT PINK
|
||||||
|
|
||||||
veil_msg = "<span class='warning'>You sense an adorable presence lurking just beyond the veil...</span>"
|
veil_msg = "<span class='warning'>You sense an adorable presence lurking just beyond the veil...</span>"
|
||||||
objective_verb = "Hug and Tickle"
|
|
||||||
demon_type = /mob/living/simple_animal/slaughter/laughter
|
demon_type = /mob/living/simple_animal/slaughter/laughter
|
||||||
|
antag_type = /datum/antagonist/slaughter/laughter
|
||||||
|
|||||||
@@ -27,8 +27,25 @@
|
|||||||
/datum/team/proc/roundend_report()
|
/datum/team/proc/roundend_report()
|
||||||
var/list/report = list()
|
var/list/report = list()
|
||||||
|
|
||||||
report += "<b>[name]:</b>"
|
report += "<span class='header'>[name]:</span>"
|
||||||
report += "The [member_name]s were:"
|
report += "The [member_name]s were:"
|
||||||
report += printplayerlist(members)
|
report += printplayerlist(members)
|
||||||
|
|
||||||
return report.Join("<br>")
|
if(objectives.len)
|
||||||
|
report += "<span class='header'>Team had following objectives:</span>"
|
||||||
|
var/win = TRUE
|
||||||
|
var/objective_count = 1
|
||||||
|
for(var/datum/objective/objective in objectives)
|
||||||
|
if(objective.check_completion())
|
||||||
|
report += "<B>Objective #[objective_count]</B>: [objective.explanation_text] <span class='greentext'><B>Success!</span>"
|
||||||
|
else
|
||||||
|
report += "<B>Objective #[objective_count]</B>: [objective.explanation_text] <span class='redtext'>Fail.</span>"
|
||||||
|
win = FALSE
|
||||||
|
objective_count++
|
||||||
|
if(win)
|
||||||
|
report += "<span class='greentext'>The [name] was successful!</span>"
|
||||||
|
else
|
||||||
|
report += "<span class='redtext'>The [name] have failed!</span>"
|
||||||
|
|
||||||
|
|
||||||
|
return "<div class='panel redborder'>[report.Join("<br>")]</div>"
|
||||||
|
|||||||
87
code/modules/antagonists/ert/ert.dm
Normal file
87
code/modules/antagonists/ert/ert.dm
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
//Both ERT and DS are handled by the same datums since they mostly differ in equipment in objective.
|
||||||
|
/datum/team/ert
|
||||||
|
name = "Emergency Response Team"
|
||||||
|
var/datum/objective/mission //main mission
|
||||||
|
|
||||||
|
/datum/antagonist/ert
|
||||||
|
name = "Emergency Response Officer"
|
||||||
|
var/datum/team/ert/ert_team
|
||||||
|
var/role = ERT_SEC
|
||||||
|
var/high_alert = FALSE
|
||||||
|
show_in_antagpanel = FALSE
|
||||||
|
|
||||||
|
/datum/antagonist/ert/on_gain()
|
||||||
|
update_name()
|
||||||
|
forge_objectives()
|
||||||
|
equipERT()
|
||||||
|
. = ..()
|
||||||
|
|
||||||
|
/datum/antagonist/ert/get_team()
|
||||||
|
return ert_team
|
||||||
|
|
||||||
|
/datum/antagonist/ert/proc/update_name()
|
||||||
|
var/new_name
|
||||||
|
switch(role)
|
||||||
|
if(ERT_ENG)
|
||||||
|
new_name = "Engineer [pick(GLOB.last_names)]"
|
||||||
|
if(ERT_MED)
|
||||||
|
new_name = "Medical Officer [pick(GLOB.last_names)]"
|
||||||
|
if(ERT_SEC)
|
||||||
|
new_name = "Security Officer [pick(GLOB.last_names)]"
|
||||||
|
if(ERT_LEADER)
|
||||||
|
new_name = "Commander [pick(GLOB.last_names)]"
|
||||||
|
name = "Emergency Response Commander"
|
||||||
|
if(DEATHSQUAD)
|
||||||
|
new_name = "Trooper [pick(GLOB.commando_names)]"
|
||||||
|
name = "Deathsquad Trooper"
|
||||||
|
if(DEATHSQUAD_LEADER)
|
||||||
|
new_name = "Officer [pick(GLOB.commando_names)]"
|
||||||
|
name = "Deathsquad Officer"
|
||||||
|
owner.current.fully_replace_character_name(owner.current.real_name,new_name)
|
||||||
|
|
||||||
|
/datum/antagonist/ert/create_team(datum/team/ert/new_team)
|
||||||
|
if(istype(new_team))
|
||||||
|
ert_team = new_team
|
||||||
|
|
||||||
|
/datum/antagonist/ert/proc/forge_objectives()
|
||||||
|
if(ert_team)
|
||||||
|
objectives |= ert_team.objectives
|
||||||
|
|
||||||
|
/datum/antagonist/ert/proc/equipERT()
|
||||||
|
var/mob/living/carbon/human/H = owner.current
|
||||||
|
if(!istype(H))
|
||||||
|
return
|
||||||
|
var/outfit
|
||||||
|
switch(role)
|
||||||
|
if(ERT_LEADER)
|
||||||
|
outfit = high_alert ? /datum/outfit/ert/commander/alert : /datum/outfit/ert/commander
|
||||||
|
if(ERT_ENG)
|
||||||
|
outfit = high_alert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer
|
||||||
|
if(ERT_MED)
|
||||||
|
outfit = high_alert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic
|
||||||
|
if(ERT_SEC)
|
||||||
|
outfit = high_alert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security
|
||||||
|
if(DEATHSQUAD)
|
||||||
|
outfit = /datum/outfit/death_commando/officer
|
||||||
|
if(DEATHSQUAD_LEADER)
|
||||||
|
outfit = /datum/outfit/death_commando
|
||||||
|
H.equipOutfit(outfit)
|
||||||
|
|
||||||
|
/datum/antagonist/ert/greet()
|
||||||
|
if(!ert_team)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/leader = role == ERT_LEADER || role == DEATHSQUAD_LEADER
|
||||||
|
|
||||||
|
to_chat(owner, "<B><font size=3 color=red>You are the [name].</font></B>")
|
||||||
|
|
||||||
|
var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division."
|
||||||
|
if(leader) //If Squad Leader
|
||||||
|
missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready."
|
||||||
|
else
|
||||||
|
missiondesc += " Follow orders given to you by your squad leader."
|
||||||
|
if(role != DEATHSQUAD && role != DEATHSQUAD_LEADER)
|
||||||
|
missiondesc += "Avoid civilian casualites when possible."
|
||||||
|
|
||||||
|
missiondesc += "<BR><B>Your Mission</B> : [ert_team.mission.explanation_text]"
|
||||||
|
to_chat(owner,missiondesc)
|
||||||
@@ -126,6 +126,7 @@
|
|||||||
form = null
|
form = null
|
||||||
alpha = initial(alpha)
|
alpha = initial(alpha)
|
||||||
color = initial(color)
|
color = initial(color)
|
||||||
|
maptext = null
|
||||||
|
|
||||||
visible_message("<span class='warning'>[src] suddenly collapses in on itself, dissolving into a pile of green flesh!</span>", \
|
visible_message("<span class='warning'>[src] suddenly collapses in on itself, dissolving into a pile of green flesh!</span>", \
|
||||||
"<span class='notice'>You reform to your normal body.</span>")
|
"<span class='notice'>You reform to your normal body.</span>")
|
||||||
@@ -226,7 +227,7 @@
|
|||||||
player_mind.transfer_to(S)
|
player_mind.transfer_to(S)
|
||||||
player_mind.assigned_role = "Morph"
|
player_mind.assigned_role = "Morph"
|
||||||
player_mind.special_role = "Morph"
|
player_mind.special_role = "Morph"
|
||||||
player_mind.add_antag_datum(/datum/antagonist/auto_custom)
|
player_mind.add_antag_datum(/datum/antagonist/morph)
|
||||||
to_chat(S, S.playstyle_string)
|
to_chat(S, S.playstyle_string)
|
||||||
SEND_SOUND(S, sound('sound/magic/mutate.ogg'))
|
SEND_SOUND(S, sound('sound/magic/mutate.ogg'))
|
||||||
message_admins("[key_name_admin(S)] has been made into a morph by an event.")
|
message_admins("[key_name_admin(S)] has been made into a morph by an event.")
|
||||||
|
|||||||
6
code/modules/antagonists/morph/morph_antag.dm
Normal file
6
code/modules/antagonists/morph/morph_antag.dm
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/datum/antagonist/morph
|
||||||
|
name = "Morph"
|
||||||
|
show_name_in_check_antagonists = TRUE
|
||||||
|
show_in_antagpanel = FALSE
|
||||||
|
|
||||||
|
//It does nothing! (Besides tracking)
|
||||||
@@ -2,11 +2,11 @@
|
|||||||
name = "Ninja"
|
name = "Ninja"
|
||||||
antagpanel_category = "Ninja"
|
antagpanel_category = "Ninja"
|
||||||
job_rank = ROLE_NINJA
|
job_rank = ROLE_NINJA
|
||||||
|
show_name_in_check_antagonists = TRUE
|
||||||
var/helping_station = FALSE
|
var/helping_station = FALSE
|
||||||
var/give_objectives = TRUE
|
var/give_objectives = TRUE
|
||||||
var/give_equipment = TRUE
|
var/give_equipment = TRUE
|
||||||
|
|
||||||
|
|
||||||
/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
|
/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
|
||||||
var/mob/living/M = mob_override || owner.current
|
var/mob/living/M = mob_override || owner.current
|
||||||
update_ninja_icons_added(M)
|
update_ninja_icons_added(M)
|
||||||
@@ -141,9 +141,6 @@
|
|||||||
message_admins("[key_name_admin(admin)] has [adj] ninja'ed [new_owner.current].")
|
message_admins("[key_name_admin(admin)] has [adj] ninja'ed [new_owner.current].")
|
||||||
log_admin("[key_name(admin)] has [adj] ninja'ed [new_owner.current].")
|
log_admin("[key_name(admin)] has [adj] ninja'ed [new_owner.current].")
|
||||||
|
|
||||||
/datum/antagonist/ninja/antag_listing_name()
|
|
||||||
return ..() + "(Ninja)"
|
|
||||||
|
|
||||||
/datum/antagonist/ninja/proc/update_ninja_icons_added(var/mob/living/carbon/human/ninja)
|
/datum/antagonist/ninja/proc/update_ninja_icons_added(var/mob/living/carbon/human/ninja)
|
||||||
var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
|
var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
|
||||||
ninjahud.join_hud(ninja)
|
ninjahud.join_hud(ninja)
|
||||||
|
|||||||
31
code/modules/antagonists/slaughter/slaughter_antag.dm
Normal file
31
code/modules/antagonists/slaughter/slaughter_antag.dm
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/datum/antagonist/slaughter
|
||||||
|
name = "Slaughter demon"
|
||||||
|
show_name_in_check_antagonists = TRUE
|
||||||
|
var/objective_verb = "Kill"
|
||||||
|
var/datum/mind/summoner
|
||||||
|
job_rank = ROLE_ALIEN
|
||||||
|
show_in_antagpanel = FALSE
|
||||||
|
|
||||||
|
/datum/antagonist/slaughter/on_gain()
|
||||||
|
forge_objectives()
|
||||||
|
. = ..()
|
||||||
|
|
||||||
|
/datum/antagonist/slaughter/greet()
|
||||||
|
. = ..()
|
||||||
|
owner.announce_objectives()
|
||||||
|
|
||||||
|
/datum/antagonist/slaughter/proc/forge_objectives()
|
||||||
|
if(summoner)
|
||||||
|
var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate
|
||||||
|
new_objective.owner = owner
|
||||||
|
new_objective.target = summoner
|
||||||
|
new_objective.explanation_text = "[objective_verb] [summoner.name], the one who summoned you."
|
||||||
|
objectives += new_objective
|
||||||
|
var/datum/objective/new_objective2 = new /datum/objective
|
||||||
|
new_objective2.owner = owner
|
||||||
|
new_objective2.explanation_text = "[objective_verb] everyone[summoner ? " else while you're at it":""]."
|
||||||
|
objectives += new_objective2
|
||||||
|
|
||||||
|
/datum/antagonist/slaughter/laughter
|
||||||
|
name = "Laughter demon"
|
||||||
|
objective_verb = "Hug and Tickle"
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
player_mind.transfer_to(S)
|
player_mind.transfer_to(S)
|
||||||
player_mind.assigned_role = "Slaughter Demon"
|
player_mind.assigned_role = "Slaughter Demon"
|
||||||
player_mind.special_role = "Slaughter Demon"
|
player_mind.special_role = "Slaughter Demon"
|
||||||
player_mind.add_antag_datum(/datum/antagonist/auto_custom)
|
player_mind.add_antag_datum(/datum/antagonist/slaughter)
|
||||||
to_chat(S, S.playstyle_string)
|
to_chat(S, S.playstyle_string)
|
||||||
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>")
|
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>")
|
||||||
SEND_SOUND(S, 'sound/magic/demon_dies.ogg')
|
SEND_SOUND(S, 'sound/magic/demon_dies.ogg')
|
||||||
|
|||||||
@@ -1207,8 +1207,10 @@
|
|||||||
#include "code\modules\antagonists\devil\sintouched\objectives.dm"
|
#include "code\modules\antagonists\devil\sintouched\objectives.dm"
|
||||||
#include "code\modules\antagonists\devil\true_devil\_true_devil.dm"
|
#include "code\modules\antagonists\devil\true_devil\_true_devil.dm"
|
||||||
#include "code\modules\antagonists\devil\true_devil\inventory.dm"
|
#include "code\modules\antagonists\devil\true_devil\inventory.dm"
|
||||||
|
#include "code\modules\antagonists\ert\ert.dm"
|
||||||
#include "code\modules\antagonists\monkey\monkey.dm"
|
#include "code\modules\antagonists\monkey\monkey.dm"
|
||||||
#include "code\modules\antagonists\morph\morph.dm"
|
#include "code\modules\antagonists\morph\morph.dm"
|
||||||
|
#include "code\modules\antagonists\morph\morph_antag.dm"
|
||||||
#include "code\modules\antagonists\ninja\ninja.dm"
|
#include "code\modules\antagonists\ninja\ninja.dm"
|
||||||
#include "code\modules\antagonists\nukeop\nukeop.dm"
|
#include "code\modules\antagonists\nukeop\nukeop.dm"
|
||||||
#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm"
|
#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm"
|
||||||
@@ -1221,6 +1223,7 @@
|
|||||||
#include "code\modules\antagonists\revenant\revenant_spawn_event.dm"
|
#include "code\modules\antagonists\revenant\revenant_spawn_event.dm"
|
||||||
#include "code\modules\antagonists\revolution\revolution.dm"
|
#include "code\modules\antagonists\revolution\revolution.dm"
|
||||||
#include "code\modules\antagonists\slaughter\slaughter.dm"
|
#include "code\modules\antagonists\slaughter\slaughter.dm"
|
||||||
|
#include "code\modules\antagonists\slaughter\slaughter_antag.dm"
|
||||||
#include "code\modules\antagonists\slaughter\slaughterevent.dm"
|
#include "code\modules\antagonists\slaughter\slaughterevent.dm"
|
||||||
#include "code\modules\antagonists\swarmer\swarmer.dm"
|
#include "code\modules\antagonists\swarmer\swarmer.dm"
|
||||||
#include "code\modules\antagonists\swarmer\swarmer_event.dm"
|
#include "code\modules\antagonists\swarmer\swarmer_event.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user