diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index d8bfe2c35c..428f355c31 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -47,9 +47,9 @@ /datum/brain_trauma/special/imaginary_friend/proc/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND) + var/list/candidates = pollCandidatesForMob("Do you want to play as [owner]'s imaginary friend?", ROLE_PAI, null, null, 75, friend, POLL_IGNORE_IMAGINARYFRIEND) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) C.transfer_ckey(friend, FALSE) friend_initialized = TRUE else diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index a1284319f1..6586a065d0 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -27,9 +27,9 @@ /datum/brain_trauma/severe/split_personality/proc/get_ghost() set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY) + var/list/mob/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", ROLE_PAI, null, null, 75, stranger_backseat, POLL_IGNORE_SPLITPERSONALITY) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) C.transfer_ckey(stranger_backseat, FALSE) log_game("[key_name(stranger_backseat)] became [key_name(owner)]'s split personality.") message_admins("[ADMIN_LOOKUPFLW(stranger_backseat)] became [ADMIN_LOOKUPFLW(owner)]'s split personality.") diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 430b7e07b0..1bb927aa12 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -76,9 +76,9 @@ /datum/disease/transformation/proc/replace_banned_player(var/mob/living/new_mob) // This can run well after the mob has been transferred, so need a handle on the new mob to kill it if needed. set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [affected_mob.name]?", bantype, null, bantype, 50, affected_mob) + var/list/mob/candidates = pollCandidatesForMob("Do you want to play as [affected_mob.name]?", bantype, null, bantype, 50, affected_mob) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) to_chat(affected_mob, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(affected_mob)]) to replace a jobbaned player.") affected_mob.ghostize(0) diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm index a88cba851f..2c669aac80 100644 --- a/code/game/machinery/exp_cloner.dm +++ b/code/game/machinery/exp_cloner.dm @@ -51,7 +51,7 @@ var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) H.key = C.key if(grab_ghost_when == CLONER_FRESH_CLONE) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index e58bf5d4e4..bd9ac276a2 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -463,6 +463,16 @@ hitsound = 'sound/weapons/rapierhit.ogg' var/possessed = FALSE +/obj/item/nullrod/scythe/talking/process() + for(var/mob/living/simple_animal/shade/S in contents) + if(S.mind) + return + else + qdel(S) + possessed = FALSE + visible_message("The blade makes a short sigh. The spirit within seems to have passed on...") + return PROCESS_KILL + /obj/item/nullrod/scythe/talking/relaymove(mob/user) return //stops buckled message spam for the ghost. @@ -484,6 +494,8 @@ S.ckey = C.ckey S.status_flags |= GODMODE S.language_holder = user.language_holder.copy(S) + S.AddElement(/datum/element/ghost_role_eligibility) + START_PROCESSING(SSprocessing,src) var/input = stripped_input(S,"What are you named?", ,"", MAX_NAME_LEN) if(src && input) diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 81050e6eae..44dcfc0ae6 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -55,7 +55,7 @@ var/question = "Would you like to be [group_name]?" var/list/candidates = pollCandidatesForMobs(question, ROLE_PAI, null, FALSE, 100, bodies) while(LAZYLEN(candidates) && LAZYLEN(bodies)) - var/mob/dead/observer/C = pick_n_take(candidates) + var/mob/C = pick_n_take(candidates) var/mob/living/body = pick_n_take(bodies) to_chat(body, "Your mob has been taken over by a ghost!") diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index e73c5de1aa..2e3626dd4c 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -84,9 +84,9 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/antagonist/proc/replace_banned_player() set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [name]?", "[name]", null, job_rank, 50, owner.current) + var/list/mob/candidates = pollCandidatesForMob("Do you want to play as a [name]?", "[name]", null, job_rank, 50, owner.current) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.") owner.current.ghostize(0) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 51c8ceac44..edfa9caa22 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -248,7 +248,7 @@ if(used || QDELETED(src)) return used = TRUE - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) spawn_antag(C.client, get_turf(src), initial(demon_type.name),user.mind) to_chat(user, shatter_msg) to_chat(user, veil_msg) diff --git a/code/modules/antagonists/blob/blob/powers.dm b/code/modules/antagonists/blob/blob/powers.dm index 73d0c97476..dff8e22552 100644 --- a/code/modules/antagonists/blob/blob/powers.dm +++ b/code/modules/antagonists/blob/blob/powers.dm @@ -169,7 +169,7 @@ B.naut = TRUE //temporary placeholder to prevent creation of more than one per factory. to_chat(src, "You attempt to produce a blobbernaut.") - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as a [blobstrain.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly + var/list/mob/candidates = pollGhostCandidates("Do you want to play as a [blobstrain.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly if(LAZYLEN(candidates)) //if we got at least one candidate, they're a blobbernaut now. B.max_integrity = initial(B.max_integrity) * 0.25 //factories that produced a blobbernaut have much lower health B.obj_integrity = min(B.obj_integrity, B.max_integrity) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 62382966f0..daa4e24c69 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -352,9 +352,9 @@ break if(!L.client || L.client.is_afk()) set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [L.name], an inactive clock cultist?", ROLE_SERVANT_OF_RATVAR, null, ROLE_SERVANT_OF_RATVAR, 50, L) + var/list/mob/candidates = pollCandidatesForMob("Do you want to play as a [L.name], an inactive clock cultist?", ROLE_SERVANT_OF_RATVAR, null, ROLE_SERVANT_OF_RATVAR, 50, L) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) to_chat(L, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(L)]) to replace an inactive clock cultist.") L.ghostize(0) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 3d27fa942b..ec763a66d7 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -569,9 +569,9 @@ structure_check() searches for nearby cultist structures required for the invoca mob_to_revive.grab_ghost() if(!mob_to_revive.client || mob_to_revive.client.is_afk()) set waitfor = FALSE - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [mob_to_revive.name], an inactive blood cultist?", ROLE_CULTIST, null, ROLE_CULTIST, 50, mob_to_revive) + var/list/mob/candidates = pollCandidatesForMob("Do you want to play as a [mob_to_revive.name], an inactive blood cultist?", ROLE_CULTIST, null, ROLE_CULTIST, 50, mob_to_revive) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) to_chat(mob_to_revive.mind, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form.") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.") mob_to_revive.ghostize(0) diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 26efb92bec..2638a6a8e3 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -397,7 +397,7 @@ inert = TRUE visible_message("[src] settles down and seems lifeless.") return - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) C.transfer_ckey(revenant.key, FALSE) if(!revenant.key) qdel(revenant) diff --git a/code/modules/antagonists/traitor/equipment/contractor.dm b/code/modules/antagonists/traitor/equipment/contractor.dm index 8569f314d0..6c5d5766e4 100644 --- a/code/modules/antagonists/traitor/equipment/contractor.dm +++ b/code/modules/antagonists/traitor/equipment/contractor.dm @@ -127,7 +127,7 @@ . = ..() if (.) to_chat(user, "The uplink vibrates quietly, connecting to nearby agents...") - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the Contractor Support Unit for [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_CONTRACTOR_SUPPORT) + var/list/mob/candidates = pollGhostCandidates("Do you want to play as the Contractor Support Unit for [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_CONTRACTOR_SUPPORT) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) spawn_contractor_partner(user, C.key) @@ -224,4 +224,4 @@ /obj/item/storage/box/contractor/fulton_extraction/PopulateContents() new /obj/item/extraction_pack(src) - new /obj/item/fulton_core(src) \ No newline at end of file + new /obj/item/fulton_core(src) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 594eae5d46..0d96c125a1 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -266,6 +266,7 @@ M.equipOutfit(ctf_gear) M.dna.species.punchdamagehigh = 25 M.dna.species.punchdamagelow = 25 + M.AddElement(/datum/element/ghost_role_eligibility) spawned_mobs += M /obj/machinery/capture_the_flag/Topic(href, href_list) diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index a1453f6aa1..12bd609ff5 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -127,10 +127,10 @@ if(!current_wizard) return - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as Wizard Academy Defender?", ROLE_WIZARD, null, ROLE_WIZARD, 50, current_wizard) + var/list/mob/candidates = pollCandidatesForMob("Do you want to play as Wizard Academy Defender?", ROLE_WIZARD, null, ROLE_WIZARD, 50, current_wizard) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Wizard Academy Defender") current_wizard.ghostize() // on the off chance braindead defender gets back in C.transfer_ckey(current_wizard, FALSE) @@ -269,9 +269,9 @@ A.setup_master(user) servant_mind.transfer_to(H) - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [user.real_name] Servant?", ROLE_WIZARD, null, ROLE_WIZARD, 50, H) + var/list/mob/candidates = pollCandidatesForMob("Do you want to play as [user.real_name] Servant?", ROLE_WIZARD, null, ROLE_WIZARD, 50, H) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant") C.transfer_ckey(H, FALSE) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 2d39e4270a..1a303ec4bc 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -44,7 +44,7 @@ var/spawned_animals = 0 while(spawned_animals < animals && candidates.len && potential.len) var/mob/living/simple_animal/SA = pick_n_take(potential) - var/mob/dead/observer/SG = pick_n_take(candidates) + var/mob/SG = pick_n_take(candidates) spawned_animals++ @@ -59,7 +59,7 @@ SA.del_on_death = FALSE spawned_mobs += SA - + SA.AddElement(/datum/element/ghost_role_eligibility) to_chat(SA, "Hello world!") to_chat(SA, "Due to freak radiation and/or chemicals \ and/or lucky chance, you have gained human level intelligence \ diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index c201f437e4..fb478355e8 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -653,6 +653,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return 0 transfer_ckey(target, FALSE) + target.AddElement(/datum/element/ghost_role_eligibility) target.faction = list("neutral") return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 576410fe8c..1156b11db3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -161,7 +161,7 @@ While using this makes the system rely on OnFire, it still gives options for tim INVOKE_ASYNC(src, .proc/arena_checks) if(TUMOR_INACTIVE) activity = TUMOR_ACTIVE - var/mob/dead/observer/elitemind = null + var/mob/elitemind = null visible_message("[src] begins to convulse. Your instincts tell you to step back.") activator = user if(!boosted) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 12d74d2f8f..28ca97dc2b 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -443,10 +443,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp var/datum/antagonist/A = M.mind.has_antag_datum(/datum/antagonist/) if(A) poll_message = "[poll_message] Status:[A.name]." - var/list/mob/dead/observer/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M) + var/list/mob/candidates = pollCandidatesForMob(poll_message, ROLE_PAI, null, FALSE, 100, M) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) to_chat(M, "Your mob has been taken over by a ghost!") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(M)])") M.ghostize(FALSE, TRUE) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 967f874a02..00e22742e5 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -680,7 +680,7 @@ var/list/candidates = pollCandidatesForMob("Do you want to play as [SM.name]?", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, SM, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) C.transfer_ckey(SM, FALSE) SM.mind.enslave_mind_to_creator(user) SM.sentience_act()