diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm new file mode 100644 index 0000000000..ddb8f8e6e6 --- /dev/null +++ b/code/datums/brain_damage/special.dm @@ -0,0 +1,122 @@ +//Brain traumas that are rare and/or somewhat beneficial; +//they are the easiest to cure, which means that if you want +//to keep them, you can't cure your other traumas +/datum/brain_trauma/special + +/datum/brain_trauma/special/godwoken + name = "Godwoken Syndrome" + desc = "Patient occasionally and uncontrollably channels an eldritch god when speaking." + scan_desc = "god delusion" + gain_text = "You feel a higher power inside your mind..." + lose_text = "The divine presence leaves your head, no longer interested." + var/next_speech = 0 + var/inspiration = FALSE + +/datum/brain_trauma/special/godwoken/on_life() + ..() + if(!inspiration && world.time > next_speech && prob(4)) + to_chat(owner, "[pick("You feel inspired!","You feel power course through you...","You feel something within you itching to speak...")]") + inspiration = TRUE + +/datum/brain_trauma/special/godwoken/on_say(message) + if(world.time > next_speech && inspiration) + playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 300, 1, 5) + var/cooldown = voice_of_god(message, owner, list("colossus","yell"), 2) + cooldown *= 0.33 + next_speech = world.time + cooldown + inspiration = FALSE + return "" + else + return message + +/datum/brain_trauma/special/bluespace_prophet + name = "Bluespace Prophecy" + desc = "Patient can sense the bob and weave of bluespace around them, showing them passageways no one else can see." + scan_desc = "bluespace attunement" + gain_text = "You feel the bluespace pulsing around you..." + lose_text = "The faint pulsing of bluespace fades into silence." + var/next_portal = 0 + +/datum/brain_trauma/special/bluespace_prophet/on_life() + if(world.time > next_portal) + next_portal = world.time + 100 + var/list/turf/possible_turfs = list() + for(var/turf/T in range(owner, 8)) + if(!T.density) + var/clear = TRUE + for(var/obj/O in T) + if(O.density) + clear = FALSE + break + if(clear) + possible_turfs += T + + if(!LAZYLEN(possible_turfs)) + return + + var/turf/first_turf = pick(possible_turfs) + if(!first_turf) + return + + possible_turfs -= (possible_turfs & range(first_turf, 3)) + + var/turf/second_turf = pick(possible_turfs) + if(!second_turf) + return + + var/obj/effect/hallucination/simple/bluespace_stream/first = new(first_turf, owner) + var/obj/effect/hallucination/simple/bluespace_stream/second = new(second_turf, owner) + + first.linked_to = second + second.linked_to = first + first.seer = owner + second.seer = owner + +/obj/effect/hallucination/simple/bluespace_stream + name = "bluespace stream" + desc = "You see a hidden pathway through bluespace..." + image_icon = 'icons/effects/effects.dmi' + image_state = "bluestream" + image_layer = ABOVE_MOB_LAYER + var/obj/effect/hallucination/simple/bluespace_stream/linked_to + var/mob/living/carbon/seer + +/obj/effect/hallucination/simple/bluespace_stream/Initialize() + . = ..() + QDEL_IN(src, 300) + +/obj/effect/hallucination/simple/bluespace_stream/attack_hand(mob/user) + if(user != seer || !linked_to) + return + var/slip_in_message = pick("slides sideways in an odd way, and disappears", "jumps into an unseen dimension",\ + "sticks one leg straight out, wiggles [user.p_their()] foot, and is suddenly gone", "stops, then blinks out of reality", \ + "is pulled into an invisible vortex, vanishing from sight") + var/slip_out_message = pick("silently fades in", "leaps out of thin air","appears", "walks out of an invisible doorway",\ + "slides out of a fold in spacetime") + to_chat(user, "You try to align with the bluespace stream...") + if(do_after(user, 20, target = src)) + new /obj/effect/temp_visual/bluespace_fissure(get_turf(src)) + new /obj/effect/temp_visual/bluespace_fissure(get_turf(linked_to)) + user.forceMove(get_turf(linked_to)) + user.visible_message("[user] [slip_in_message].", ignored_mob = user) + user.visible_message("[user] [slip_out_message].", "...and find your way to the other side.") + +/datum/brain_trauma/special/psychotic_brawling + name = "Violent Psychosis" + desc = "Patient fights in unpredictable ways, ranging from helping his target to hitting them with brutal strength." + scan_desc = "violent psychosis" + gain_text = "You feel unhinged..." + lose_text = "You feel more balanced." + var/datum/martial_art/psychotic_brawling/psychotic_brawling + +/datum/brain_trauma/special/psychotic_brawling/on_gain() + ..() + psychotic_brawling = new(null) + if(!psychotic_brawling.teach(owner, TRUE)) + to_chat(owner, "But your martial knowledge keeps you grounded.") + qdel(src) + +/datum/brain_trauma/special/psychotic_brawling/on_lose() + ..() + psychotic_brawling.remove(owner) + QDEL_NULL(psychotic_brawling) \ No newline at end of file