diff --git a/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm b/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm index 17a8f601581..4cab0e8a00f 100644 --- a/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm +++ b/code/game/gamemodes/clock_cult/clock_items/soul_vessel.dm @@ -18,16 +18,16 @@ The purpose of your existence is to further the goals of the servants and Ratvar himself. Above all else, serve Ratvar." new_mob_message = "The soul vessel emits a jet of steam before its cogwheel smooths out." dead_message = "Its cogwheel, scratched and dented, lies motionless." - fluff_names = list("Judge", "Guard", "Servant", "Smith", "Auger") + possible_names = list("Judge", "Guard", "Servant", "Smith", "Auger") autoping = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF force_replace_ai_name = TRUE -/obj/item/device/mmi/posibrain/soul_vessel/New() +/obj/item/device/mmi/posibrain/soul_vessel/Initialize() ..() - radio.on = 0 + radio.on = FALSE laws = new /datum/ai_laws/ratvar() - braintype = picked_fluff_name + braintype = picked_name GLOB.all_clockwork_objects += src /obj/item/device/mmi/posibrain/soul_vessel/Destroy() @@ -48,14 +48,16 @@ /obj/item/device/mmi/posibrain/soul_vessel/attack_self(mob/living/user) if(!is_servant_of_ratvar(user)) to_chat(user, "You fiddle around with [src], to no avail.") - return 0 + return FALSE ..() /obj/item/device/mmi/posibrain/soul_vessel/attack(mob/living/target, mob/living/carbon/human/user) if(!is_servant_of_ratvar(user) || !ishuman(target)) ..() return - if(used || (brainmob && brainmob.key)) + if(QDELETED(brainmob)) + return + if(brainmob.key) to_chat(user, "\"This vessel is filled, friend. Provide it with a body.\"") return if(is_servant_of_ratvar(target)) @@ -94,8 +96,8 @@ if(!prev_fakedeath) H.status_flags &= ~FAKEDEATH H.apply_status_effect(STATUS_EFFECT_SIGILMARK) //let them be affected by vitality matrices - picked_fluff_name = "Slave" - braintype = picked_fluff_name + picked_name = "Slave" + braintype = picked_name brainmob.timeofhostdeath = H.timeofdeath user.visible_message("[user] presses [src] to [H]'s head, ripping through the skull and carefully extracting the brain!", \ "You extract [H]'s consciousness from [H.p_their()] body, trapping it in the soul vessel.") diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index ceb3cae7048..a075c80e5cb 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -1,3 +1,5 @@ +GLOBAL_VAR(posibrain_notify_cooldown) + /obj/item/device/mmi/posibrain name = "positronic brain" desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." @@ -5,9 +7,9 @@ icon_state = "posibrain" w_class = WEIGHT_CLASS_NORMAL origin_tech = "biotech=3;programming=3;plasmatech=2" - var/notified = 0 + var/next_ask var/askDelay = 600 //one minute - var/used = 0 //Prevents split personality virus. May be reset if personality deletion code is added. + var/searching = FALSE brainmob = null req_access = list(GLOB.access_robotics) mecha = null//This does not appear to be used outside of reference in mecha.dm. @@ -23,10 +25,8 @@ Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm." var/new_mob_message = "The positronic brain chimes quietly." var/dead_message = "It appears to be completely inactive. The reset light is blinking." - var/list/fluff_names - var/picked_fluff_name //which fluff name we picked - var/static/posibrain_notif_cooldown = FALSE - + var/list/possible_names //If you leave this blank, it will use the global posibrain names + var/picked_name /obj/item/device/mmi/posibrain/Topic(href, href_list) if(href_list["activate"]) @@ -35,42 +35,42 @@ activate(ghost) /obj/item/device/mmi/posibrain/proc/ping_ghosts(msg, newlymade) - if(newlymade || !posibrain_notif_cooldown) + if(newlymade || GLOB.posibrain_notify_cooldown <= world.time) notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/effects/ghost2.ogg':null, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) if(!newlymade) - posibrain_notif_cooldown = TRUE - addtimer(CALLBACK(src, .proc/reset_posibrain_cooldown), askDelay) - -/obj/item/device/mmi/posibrain/proc/reset_posibrain_cooldown() - posibrain_notif_cooldown = FALSE + GLOB.posibrain_notify_cooldown = world.time + askDelay /obj/item/device/mmi/posibrain/attack_self(mob/user) - if(brainmob && !brainmob.key && !notified) - //Start the process of requesting a new ghost. - to_chat(user, begin_activation_message) - ping_ghosts("requested", FALSE) - notified = 1 - used = 0 - update_icon() - spawn(askDelay) //Seperate from the global cooldown. - notified = 0 - update_icon() - if(brainmob.client) - visible_message(success_message) - else - visible_message(fail_message) - - return //Code for deleting personalities recommended here. + if(!brainmob || brainmob.key) + return + if(next_ask > world.time) + return + //Start the process of requesting a new ghost. + to_chat(user, begin_activation_message) + ping_ghosts("requested", FALSE) + next_ask = world.time + askDelay + searching = TRUE + addtimer(CALLBACK(src, .proc/check_success), askDelay) +/obj/item/device/mmi/posibrain/proc/check_success() + searching = FALSE + update_icon() + if(QDELETED(brainmob)) + return + if(brainmob.client) + visible_message(success_message) + else + visible_message(fail_message) /obj/item/device/mmi/posibrain/attack_ghost(mob/user) activate(user) //Two ways to activate a positronic brain. A clickable link in the ghost notif, or simply clicking the object itself. /obj/item/device/mmi/posibrain/proc/activate(mob/user) - if(used || (brainmob && brainmob.key) || jobban_isbanned(user,"posibrain")) + if(QDELETED(brainmob)) + return + if(brainmob.key || jobban_isbanned(user,"posibrain")) return - var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No") if(posi_ask == "No" || QDELETED(src)) return @@ -96,10 +96,11 @@ update_icon() /obj/item/device/mmi/posibrain/proc/transfer_personality(mob/candidate) - if(used || (brainmob && brainmob.key)) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain. + if(QDELETED(brainmob)) + return + if(brainmob.key) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain. to_chat(candidate, "This brain has already been taken! Please try your possession again later!") return FALSE - notified = 0 if(candidate.mind && !isobserver(candidate)) candidate.mind.transfer_to(brainmob) else @@ -113,7 +114,6 @@ visible_message(new_mob_message) update_icon() - used = 1 return TRUE @@ -123,7 +123,7 @@ if(brainmob && brainmob.key) switch(brainmob.stat) if(CONSCIOUS) - if(!src.brainmob.client) + if(!brainmob.client) msg = "It appears to be in stand-by mode." //afk if(DEAD) msg = "It appears to be completely inactive." @@ -132,27 +132,27 @@ to_chat(user, msg) -/obj/item/device/mmi/posibrain/New() +/obj/item/device/mmi/posibrain/Initialize() + ..() brainmob = new(src) - if(!fluff_names || !fluff_names.len) - picked_fluff_name = pick(GLOB.posibrain_names) + var/new_name + if(!LAZYLEN(possible_names)) + new_name = pick(GLOB.posibrain_names) else - picked_fluff_name = pick(fluff_names) - brainmob.name = "[picked_fluff_name]-[rand(100, 999)]" + new_name = pick(possible_names) + brainmob.name = "[new_name]-[rand(100, 999)]" brainmob.real_name = brainmob.name brainmob.loc = src brainmob.container = src if(autoping) ping_ghosts("created", TRUE) - ..() - /obj/item/device/mmi/posibrain/attackby(obj/item/O, mob/user) return /obj/item/device/mmi/posibrain/update_icon() - if(notified) + if(searching) icon_state = "[initial(icon_state)]-searching" return if(brainmob && brainmob.key)