diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm
index 83e7be22e84..617cdf3cb21 100644
--- a/code/__DEFINES/gamemode.dm
+++ b/code/__DEFINES/gamemode.dm
@@ -53,3 +53,4 @@
#define SPECIAL_ROLE_XENOMORPH_DRONE "Xenomorph Drone"
#define SPECIAL_ROLE_XENOMORPH_SENTINEL "Xenomorph Sentinel"
#define SPECIAL_ROLE_XENOMORPH_LARVA "Xenomorph Larva"
+#define SPECIAL_ROLE_EVENTMISC "Event Role"
\ No newline at end of file
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index d988fe3a011..59cf95a72d7 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -57,6 +57,7 @@
#define ANTAG_HUD_ABDUCTOR 18
#define DATA_HUD_ABDUCTOR 19
#define ANTAG_HUD_DEVIL 20
+#define ANTAG_HUD_EVENTMISC 21
// Notification action types
#define NOTIFY_JUMP "jump"
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 3b2ce8aadc1..7eaf300277a 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -42,6 +42,7 @@
#define ROLE_GSPIDER "giant spider"
#define ROLE_DRONE "drone"
#define ROLE_DEATHSQUAD "deathsquad"
+#define ROLE_EVENTMISC "eventmisc"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 9da1581ee1f..ac3249f9c5f 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -22,7 +22,8 @@ var/datum/atom_hud/huds = list( \
ANTAG_HUD_VAMPIRE = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),\
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),\
- ANTAG_HUD_DEVIL = new/datum/atom_hud/antag/hidden()\
+ ANTAG_HUD_DEVIL = new/datum/atom_hud/antag/hidden(),\
+ ANTAG_HUD_EVENTMISC = new/datum/atom_hud/antag/hidden()\
)
/datum/atom_hud
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 9774d56e23e..0658c81d90f 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -315,6 +315,13 @@
. += _memory_edit_role_enabled(ROLE_DEVIL)
+/datum/mind/proc/memory_edit_eventmisc(mob/living/H)
+ . = _memory_edit_header("event", list())
+ if(src in ticker.mode.eventmiscs)
+ . += "YES|no"
+ else
+ . += "Event Role|NO"
+
/datum/mind/proc/memory_edit_traitor()
. = _memory_edit_header("traitor", list("traitorchan", "traitorvamp"))
if(src in ticker.mode.traitors)
@@ -402,6 +409,7 @@
var/static/list/devils_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/carbon/true_devil, /mob/living/silicon/robot))
if(is_type_in_typecache(current, devils_typecache))
sections["devil"] = memory_edit_devil(H)
+ sections["eventmisc"] = memory_edit_eventmisc(H)
/** TRAITOR ***/
sections["traitor"] = memory_edit_traitor()
/** SILICON ***/
@@ -448,7 +456,7 @@
out += gen_objective_text(admin = TRUE)
out += "Add objective
"
out += "Announce objectives
"
- usr << browse(out, "window=edit_memory[src];size=400x500")
+ usr << browse(out, "window=edit_memory[src];size=500x500")
/datum/mind/Topic(href, href_list)
if(!check_rights(R_ADMIN))
@@ -1031,6 +1039,21 @@
else
to_chat(usr, "No valid nuke found!")
+ else if(href_list["eventmisc"])
+ switch(href_list["eventmisc"])
+ if("clear")
+ if(src in ticker.mode.eventmiscs)
+ ticker.mode.eventmiscs -= src
+ ticker.mode.update_eventmisc_icons_removed(src)
+ special_role = null
+ message_admins("[key_name_admin(usr)] has de-eventantag'ed [current].")
+ log_admin("[key_name(usr)] has de-eventantag'ed [current].")
+ if("eventmisc")
+ ticker.mode.eventmiscs += src
+ special_role = SPECIAL_ROLE_EVENTMISC
+ ticker.mode.update_eventmisc_icons_added(src)
+ message_admins("[key_name_admin(usr)] has eventantag'ed [current].")
+ log_admin("[key_name(usr)] has eventantag'ed [current].")
else if(href_list["devil"])
switch(href_list["devil"])
if("clear")
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 76074c254bb..8be8d68b0e3 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -35,6 +35,7 @@
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/list/player_draft_log = list()
var/list/datum/mind/xenos = list()
+ var/list/datum/mind/eventmiscs = list()
var/list/datum/station_goal/station_goals = list() // A list of all station goals for this game mode
@@ -454,6 +455,20 @@ proc/display_roundstart_logout_report()
text += " had [ply.p_their()] body destroyed"
return text
+/proc/printeventplayer(datum/mind/ply)
+ var/text = "[ply.key] was [ply.name]"
+ if(ply.special_role != SPECIAL_ROLE_EVENTMISC)
+ text += " the [ply.special_role]"
+ text += " and"
+ if(ply.current)
+ if(ply.current.stat == DEAD)
+ text += " died"
+ else
+ text += " survived"
+ else
+ text += " had [ply.p_their()] body destroyed"
+ return text
+
/proc/printobjectives(datum/mind/ply)
var/list/objective_parts = list()
var/count = 1
@@ -502,4 +517,14 @@ proc/display_roundstart_logout_report()
if((config.unrestricted_free_golems || !free_golems_disabled) && prob(config.prob_free_golems))
for(var/obj/effect/landmark/free_golem_spawn/L in GLOB.landmarks_list)
if(isturf(L.loc))
- new /obj/effect/mob_spawn/human/golem/adamantine(L.loc)
\ No newline at end of file
+ new /obj/effect/mob_spawn/human/golem/adamantine(L.loc)
+
+/datum/game_mode/proc/update_eventmisc_icons_added(datum/mind/mob_mind)
+ var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_EVENTMISC]
+ antaghud.join_hud(mob_mind.current)
+ set_antag_hud(mob_mind.current, "hudunknown1")
+
+/datum/game_mode/proc/update_eventmisc_icons_removed(datum/mind/mob_mind)
+ var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_EVENTMISC]
+ antaghud.leave_hud(mob_mind.current)
+ set_antag_hud(mob_mind.current, null)
\ No newline at end of file
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index beb52ee4d60..376668c16c4 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -460,6 +460,16 @@ var/round_start_time = 0
if(dronecount)
to_chat(world, "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round.")
+ if(ticker.mode.eventmiscs.len)
+ var/emobtext = ""
+ for(var/datum/mind/eventmind in ticker.mode.eventmiscs)
+ emobtext += printeventplayer(eventmind)
+ emobtext += "
"
+ emobtext += printobjectives(eventmind)
+ emobtext += "
"
+ emobtext += "
"
+ to_chat(world, emobtext)
+
mode.declare_completion()//To declare normal completion.
//calls auto_declare_completion_* for all modes
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 4f06e53f7b4..0a943e6a170 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -518,7 +518,7 @@
if(ticker.mode.vampire_enthralled.len)
dat += check_role_table("Vampire Thralls", ticker.mode.vampire_enthralled)
-
+
if(ticker.mode.devils.len)
dat += check_role_table("Devils", ticker.mode.devils)
@@ -534,6 +534,9 @@
if(ticker.mode.greyshirts.len)
dat += check_role_table("Greyshirts", ticker.mode.greyshirts)
+ if(ticker.mode.eventmiscs.len)
+ dat += check_role_table("Event Roles", ticker.mode.eventmiscs)
+
if(ts_spiderlist.len)
var/list/spider_minds = list()
for(var/mob/living/simple_animal/hostile/poison/terror_spider/S in ts_spiderlist)
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 1e6992c86a6..5f1867b37d5 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ