diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm
index 5cd3bb7bf77..0287ed1fef8 100644
--- a/code/game/antagonist/antagonist.dm
+++ b/code/game/antagonist/antagonist.dm
@@ -79,6 +79,9 @@
Think through your actions and make the roleplay immersive! Please remember all \
rules aside from those without explicit exceptions apply to antagonists."
+ /// Sound to play when a player becomes an antagonist
+ var/welcome_sound = null
+
// Map template that antag needs to load before spawning. Nulled after it's loaded.
var/datum/map_template/base_to_load
diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm
index 6a0dd2a5d8b..72f1e23dc14 100644
--- a/code/game/antagonist/antagonist_create.dm
+++ b/code/game/antagonist/antagonist_create.dm
@@ -58,6 +58,8 @@
// Basic intro text.
to_chat(player.current, "You are a [role_text]!")
+ if(welcome_sound)
+ sound_to(player.current, welcome_sound)
if(leader_welcome_text && player == leader)
to_chat(player.current, "[get_leader_welcome_text(player.current)]")
else
@@ -75,7 +77,7 @@
/datum/antagonist/proc/set_antag_name(var/mob/living/player)
// Choose a name, if any.
- var/newname = sanitize(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN)
+ var/newname = sanitizeName(input(player, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text, MAX_NAME_LEN, TRUE)
if (newname)
player.real_name = newname
player.SetName(player.real_name)
diff --git a/code/game/antagonist/outsider/commando.dm b/code/game/antagonist/outsider/commando.dm
index 0c74257c258..77dcefd237a 100644
--- a/code/game/antagonist/outsider/commando.dm
+++ b/code/game/antagonist/outsider/commando.dm
@@ -8,6 +8,7 @@ GLOBAL_DATUM_INIT(commandos, /datum/antagonist/deathsquad/mercenary, new)
welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests."
id_type = /obj/item/card/id/centcom/ERT
flags = ANTAG_RANDOM_EXCEPTED
+ welcome_sound = 'sound/misc/antag_alerts/operative_alert.ogg'
hard_cap = 4
hard_cap_round = 8
diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm
index 84855d908b1..5fbaec443c7 100644
--- a/code/game/antagonist/outsider/deathsquad.dm
+++ b/code/game/antagonist/outsider/deathsquad.dm
@@ -9,6 +9,7 @@ GLOBAL_DATUM_INIT(deathsquad, /datum/antagonist/deathsquad, new)
flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_LEADER | ANTAG_RANDOM_EXCEPTED
default_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
antaghud_indicator = "huddeathsquad"
+ welcome_sound = 'sound/misc/antag_alerts/operative_alert.ogg'
hard_cap = 4
hard_cap_round = 8
diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm
index 24a201bded0..a15ebeae9ec 100644
--- a/code/game/antagonist/outsider/mercenary.dm
+++ b/code/game/antagonist/outsider/mercenary.dm
@@ -10,6 +10,7 @@ GLOBAL_DATUM_INIT(mercs, /datum/antagonist/mercenary, new)
welcome_text = "To speak on the strike team's private channel use :t."
flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER
antaghud_indicator = "hudoperative"
+ welcome_sound = 'sound/misc/antag_alerts/operative_alert.ogg'
hard_cap = 4
hard_cap_round = 8
diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm
index 1808d33a65a..9ca6bdf2821 100644
--- a/code/game/antagonist/outsider/wizard.dm
+++ b/code/game/antagonist/outsider/wizard.dm
@@ -8,6 +8,7 @@ GLOBAL_DATUM_INIT(wizards, /datum/antagonist/wizard, new)
welcome_text = "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.
In your pockets you will find a teleport scroll. Use it as needed."
flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE
antaghud_indicator = "hudwizard"
+ welcome_sound = 'sound/misc/antag_alerts/wizard_alert.ogg'
hard_cap = 1
hard_cap_round = 3
@@ -125,4 +126,4 @@ Made a proc so this is not repeated 14 (or more) times.*/
if(!is_wiz_garb(src.head) && (!species.hud || (slot_head in src.species.hud.equip_slots)))
to_chat(src, "I don't feel strong enough without my hat.")
return 0
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm
index c4ea4ac8c54..2dd2b3edd25 100644
--- a/code/game/antagonist/station/changeling.dm
+++ b/code/game/antagonist/station/changeling.dm
@@ -8,6 +8,7 @@ GLOBAL_DATUM_INIT(changelings, /datum/antagonist/changeling, new)
blacklisted_jobs = list(/datum/job/ai, /datum/job/cyborg, /datum/job/submap)
protected_jobs = list(/datum/job/officer, /datum/job/warden, /datum/job/detective, /datum/job/captain, /datum/job/hos)
welcome_text = "Use say \"%LANGUAGE_PREFIX%g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them."
+ welcome_sound = 'sound/misc/antag_alerts/changeling_alert.ogg'
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
antaghud_indicator = "hudchangeling"
diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm
index b7584021011..0b62887d4f6 100644
--- a/code/game/antagonist/station/cultist.dm
+++ b/code/game/antagonist/station/cultist.dm
@@ -30,6 +30,7 @@ GLOBAL_DATUM_INIT(cult, /datum/antagonist/cultist, new)
feedback_tag = "cult_objective"
antag_indicator = "hudcultist"
welcome_text = "You have a tome in your possession; one that will help you start the cult. Use it well and remember - there are others."
+ welcome_sound = 'sound/misc/antag_alerts/cult_alert.ogg'
victory_text = "The cult wins! It has succeeded in serving its dark masters!"
loss_text = "The staff managed to stop the cult!"
victory_feedback_tag = "win - cult win"
diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm
index 23e6c954928..006bdb45e89 100644
--- a/code/game/antagonist/station/revolutionary.dm
+++ b/code/game/antagonist/station/revolutionary.dm
@@ -14,6 +14,7 @@ GLOBAL_DATUM_INIT(revs, /datum/antagonist/revolutionary, new)
flags = ANTAG_SUSPICIOUS | ANTAG_VOTABLE
antaghud_indicator = "hud_rev"
skill_setter = /datum/antag_skill_setter/station
+ welcome_sound = 'sound/misc/antag_alerts/revolutionary_alert.ogg'
hard_cap = 2
hard_cap_round = 4
diff --git a/code/game/antagonist/station/rogue_ai.dm b/code/game/antagonist/station/rogue_ai.dm
index c0214a1e603..ef0cbb988fd 100644
--- a/code/game/antagonist/station/rogue_ai.dm
+++ b/code/game/antagonist/station/rogue_ai.dm
@@ -7,6 +7,7 @@ GLOBAL_DATUM_INIT(malf, /datum/antagonist/rogue_ai, new)
mob_path = /mob/living/silicon/ai
landmark_id = "AI"
welcome_text = "You are malfunctioning! You do not have to follow any laws."
+ welcome_sound = 'sound/misc/antag_alerts/malf_alert.ogg'
victory_text = "The AI has taken control of all systems."
loss_text = "The AI has been shut down!"
flags = ANTAG_VOTABLE | ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB | ANTAG_CHOOSE_NAME
diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm
index a4e1dfc50fb..202092eb702 100644
--- a/code/game/antagonist/station/traitor.dm
+++ b/code/game/antagonist/station/traitor.dm
@@ -15,6 +15,7 @@ GLOBAL_DATUM_INIT(traitors, /datum/antagonist/traitor, new)
protected_jobs = list(/datum/job/officer, /datum/job/warden, /datum/job/detective, /datum/job/captain, /datum/job/lawyer, /datum/job/hos)
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
skill_setter = /datum/antag_skill_setter/station
+ welcome_sound = 'sound/misc/antag_alerts/traitor_alert.ogg'
/datum/antagonist/traitor/get_extra_panel_options(var/datum/mind/player)
return "\[set crystals\]\[spawn uplink\]"
diff --git a/sound/misc/antag_alerts/changeling_alert.ogg b/sound/misc/antag_alerts/changeling_alert.ogg
new file mode 100644
index 00000000000..1132ccca29c
Binary files /dev/null and b/sound/misc/antag_alerts/changeling_alert.ogg differ
diff --git a/sound/misc/antag_alerts/cult_alert.ogg b/sound/misc/antag_alerts/cult_alert.ogg
new file mode 100644
index 00000000000..9fa22df51d3
Binary files /dev/null and b/sound/misc/antag_alerts/cult_alert.ogg differ
diff --git a/sound/misc/antag_alerts/malf_alert.ogg b/sound/misc/antag_alerts/malf_alert.ogg
new file mode 100644
index 00000000000..dc55188bec6
Binary files /dev/null and b/sound/misc/antag_alerts/malf_alert.ogg differ
diff --git a/sound/misc/antag_alerts/operative_alert.ogg b/sound/misc/antag_alerts/operative_alert.ogg
new file mode 100644
index 00000000000..7c2774f0a0b
Binary files /dev/null and b/sound/misc/antag_alerts/operative_alert.ogg differ
diff --git a/sound/misc/antag_alerts/revolutionary_alert.ogg b/sound/misc/antag_alerts/revolutionary_alert.ogg
new file mode 100644
index 00000000000..be8e4a74985
Binary files /dev/null and b/sound/misc/antag_alerts/revolutionary_alert.ogg differ
diff --git a/sound/misc/antag_alerts/traitor_alert.ogg b/sound/misc/antag_alerts/traitor_alert.ogg
new file mode 100644
index 00000000000..ca0efa0ea0f
Binary files /dev/null and b/sound/misc/antag_alerts/traitor_alert.ogg differ
diff --git a/sound/misc/antag_alerts/wizard_alert.ogg b/sound/misc/antag_alerts/wizard_alert.ogg
new file mode 100644
index 00000000000..3ee88a7ebcb
Binary files /dev/null and b/sound/misc/antag_alerts/wizard_alert.ogg differ