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