mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-01-17 12:52:34 +00:00
Refactored Life() to receive seconds per tick and times fired as parameters. Life() now cannot be slept in, turned various sleepings into async calls procs. Optimized mob AI subsystems, gave them new priorities levels and flags. Grab upgrades are now elaborated asynchronously, tweaked them to avoid stacking multiple upgrades. Fixed plains tyrants keeping sending messages about stomping even if dead.
105 lines
3.2 KiB
Plaintext
105 lines
3.2 KiB
Plaintext
/mob/living/brain_ghost
|
|
name = "Brain Ghost"
|
|
desc = "A Telepathic connection."
|
|
accent = ACCENT_SROM
|
|
|
|
alpha = 200
|
|
|
|
var/mob/living/carbon/human/body = null
|
|
|
|
|
|
/mob/living/brain_ghost/Initialize(mapload, mob/living/carbon/human/dreamer)
|
|
. = ..()
|
|
|
|
body = dreamer
|
|
if(!istype(body))
|
|
//This is to handle the unit tests
|
|
if(!isnull(body))
|
|
stack_trace("No /mob/living/carbon/human found for brain ghost as loc!")
|
|
return INITIALIZE_HINT_QDEL
|
|
|
|
name = body.real_name
|
|
old_mob = body
|
|
|
|
var/mutable_appearance/MA = new(body)
|
|
MA.appearance_flags |= KEEP_APART | RESET_TRANSFORM
|
|
MA.transform = matrix() //Mutable appearances copy various vars, including transform, so we have to reset it here
|
|
|
|
AddOverlays(MA)
|
|
|
|
|
|
var/turf/T = pick(GLOB.dream_entries)
|
|
if(!T)
|
|
stack_trace("No dream entries found for Srom!")
|
|
awaken_impl(TRUE)
|
|
return
|
|
|
|
src.forceMove(T)
|
|
|
|
if(client)
|
|
LateLogin()
|
|
|
|
/mob/living/brain_ghost/Destroy()
|
|
body = null
|
|
|
|
. = ..()
|
|
|
|
/mob/living/brain_ghost/LateLogin()
|
|
..()
|
|
client.screen |= body.healths
|
|
|
|
/mob/living/brain_ghost/verb/awaken()
|
|
set name = "Awaken"
|
|
set category = "IC"
|
|
|
|
awaken_impl()
|
|
|
|
/mob/living/brain_ghost/proc/awaken_impl(var/force_awaken = FALSE)
|
|
|
|
if(body.willfully_sleeping)
|
|
body.willfully_sleeping = FALSE
|
|
if(force_awaken)
|
|
body.sleeping = 0
|
|
to_chat(src, SPAN_NOTICE("You suddenly feel like your connection to the dream is breaking up by the outside force."))
|
|
else
|
|
body.sleeping = max(body.sleeping - 5, 0)
|
|
to_chat(src, SPAN_NOTICE("You release your concentration on sleep, allowing yourself to wake up."))
|
|
else
|
|
to_chat(src, SPAN_WARNING("You've already released concentration. Wait to wake up naturally."))
|
|
|
|
/mob/living/brain_ghost/Life(seconds_per_tick, times_fired)
|
|
..()
|
|
// Out body was probs gibbed or somefin
|
|
if(!istype(body))
|
|
show_message(SPAN_DANGER("[src] suddenly pops from the Srom."))
|
|
to_chat(src, SPAN_DANGER("Your body was destroyed!"))
|
|
qdel(src)
|
|
return
|
|
|
|
if(body.stat == DEAD) // Body is dead, and won't get a life tick.
|
|
awaken_impl(TRUE)
|
|
body.handle_shared_dreaming(TRUE)
|
|
|
|
/mob/living/brain_ghost/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/ghost_hearing = GHOSTS_ALL_HEAR, var/whisper = FALSE, var/skip_edit = FALSE)
|
|
if(!istype(body) || body.stat!=UNCONSCIOUS)
|
|
return
|
|
if(prob(20)) // 1/5 chance to mumble out anything you say in the dream.
|
|
var/list/words = text2list(replacetext(message, "\[^a-zA-Z]*$", ""), " ")
|
|
var/word_count = rand(1, words.len) // How many words to mumble out from within the sentance
|
|
var/words_start = rand(1, words.len - (word_count - 1)) // Where the chunk of said words should start.
|
|
|
|
var/mumble_into = words_start == 1 ? "" : "..." // Text to show if we start mumbling after the start of a sentance
|
|
|
|
words = words.Copy(words_start, word_count + words_start) // Copy the chunk of the message we mumbled.
|
|
var/mumble_message = "[mumble_into][words.Join(" ")]..."
|
|
|
|
body.set_stat(CONSCIOUS) // FILTHY hack to get the sleeping person to say something.
|
|
body.say(mumble_message) // Mumble in Nral Malic
|
|
body.set_stat(UNCONSCIOUS) // Toggled before anything else can happen. Ideally.
|
|
|
|
..(message, speaking, verb="says", alt_name="")
|
|
|
|
|
|
/mob/living/brain_ghost/get_floating_chat_y_offset()
|
|
return 8
|