From 2dfa70ea4886ccf4a5a53ded2b115fbfc8471fc9 Mon Sep 17 00:00:00 2001
From: NiklasNeighbor <121561587+NiklasNeighbor@users.noreply.github.com>
Date: Wed, 21 Jan 2026 22:34:28 +0100
Subject: [PATCH] Adds a bloodwriting ability to the revenant, that functions
like an innate red crayon (#5116)
## About The Pull Request
Adds a free ability to the revenant, which allows them to write messages
and draw runes as if they had a crayon. clicking the ability button
opens the crayon menu, and clicking around allows the revenant to draw
what was selected
## Why It's Good For The Game
Encourages roleplay with revenants and gives them something to do if
they can't get their hands on enough corpses
## Proof Of Testing
Screenshots/Videos
## Changelog
:cl:
add: Added a bloodwriting ability to the revenant that works like a
built-in crayon
/:cl:
---------
Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>
Co-authored-by: Alexis
---
.../basic/space_fauna/revenant/_revenant.dm | 5 ++
.../antagonists/revenant/bloodwriting.dm | 86 +++++++++++++++++++
tgstation.dme | 1 +
3 files changed, 92 insertions(+)
create mode 100644 modular_zubbers/code/modules/antagonists/revenant/bloodwriting.dm
diff --git a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm
index 71eebf9d42c..da5879c5b96 100644
--- a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm
+++ b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm
@@ -73,6 +73,7 @@
/datum/action/cooldown/spell/aoe/revenant/malfunction,
/datum/action/cooldown/spell/aoe/revenant/overload,
/datum/action/cooldown/spell/list_target/telepathy/revenant,
+ /datum/action/cooldown/spell/pointed/revenant/bloodwriting, //BUBBER ADDITION
)
/// The resource, and health, of revenants.
@@ -202,6 +203,10 @@
relay_to_list_and_observers(rendered, GLOB.revenant_relay_mobs, src)
/mob/living/basic/revenant/ClickOn(atom/A, params) //revenants can't interact with the world directly, so we gotta do some wacky override stuff
+ //BUBBER ADDITION START
+ if(check_click_intercept(params,A) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
+ return
+ //BUBBER ADDITION END
var/list/modifiers = params2list(params)
if(LAZYACCESS(modifiers, SHIFT_CLICK))
ShiftClickOn(A)
diff --git a/modular_zubbers/code/modules/antagonists/revenant/bloodwriting.dm b/modular_zubbers/code/modules/antagonists/revenant/bloodwriting.dm
new file mode 100644
index 00000000000..edf942825b0
--- /dev/null
+++ b/modular_zubbers/code/modules/antagonists/revenant/bloodwriting.dm
@@ -0,0 +1,86 @@
+#define INFINITE_CHARGES -1
+
+/datum/action/cooldown/spell/pointed/revenant/bloodwriting
+ name = "Bloodwriting"
+ desc = "Write messages on the ground. In BLOOD!!"
+ button_icon = 'icons/effects/blood.dmi'
+ button_icon_state = "bubblegumfoot"
+ antimagic_flags = MAGIC_RESISTANCE_HOLY
+ spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC
+ cooldown_time = 2.5 SECONDS
+
+ ///The crayon used for the bloodwriting
+ var/obj/item/toy/crayon/revenant/blood_crayon
+ var/obj/item/toy/crayon/revenant/active_blood_crayon
+ ///used to check if the ability is active
+ active_msg = "You start writing in blood."
+ deactive_msg = "You stop writing in blood."
+ aim_assist = FALSE
+ unset_after_click = FALSE
+ var/list/click_params
+
+
+/datum/action/cooldown/spell/pointed/revenant/bloodwriting/on_activation(mob/on_who)
+ . = ..()
+ if(!blood_crayon)
+ blood_crayon = new()
+ blood_crayon.drawtype = pick(blood_crayon.all_drawables)
+
+ blood_crayon.forceMove(on_who)
+ active_blood_crayon = blood_crayon
+
+ blood_crayon.ui_interact(on_who, null)
+
+/datum/action/cooldown/spell/pointed/revenant/bloodwriting/on_deactivation(mob/on_who, refund_cooldown)
+ . = ..()
+ if(blood_crayon)
+ SStgui.close_uis(blood_crayon, on_who)
+ QDEL_NULL(blood_crayon)
+
+ active_blood_crayon = null
+
+/datum/action/cooldown/spell/pointed/revenant/bloodwriting/is_valid_target(atom/cast_on)
+ return isturf(cast_on)
+
+/datum/action/cooldown/spell/pointed/revenant/bloodwriting/cast(atom/cast_on)
+ . = ..()
+ if(active_blood_crayon)
+ if(!IsAvailable())
+ return FALSE
+
+ if(!active_blood_crayon.can_use_on(cast_on, owner))
+ return FALSE
+ StartCooldown()
+ active_blood_crayon.use_on(cast_on, owner, click_params)
+ return TRUE
+ return FALSE
+
+/datum/action/cooldown/spell/pointed/revenant/bloodwriting/InterceptClickOn(mob/living/clicker, params, atom/target)
+ src.click_params = params2list(params) //hacky solution, but I am sick and tired of working on this. I will not fiddle with porting everything in cast() down here.
+ return ..()
+
+//Crayon stuff neccessary for this
+/obj/item/toy/crayon/revenant
+ name = "bloodwriting"
+ desc = "If you're reading this, something went wrong. yell at coders."
+ icon = null
+ icon_state = null
+ charges = INFINITE_CHARGES
+ self_contained = FALSE
+ edible = FALSE
+ can_change_colour = FALSE
+ paint_color = COLOR_DARK_RED
+ actually_paints = TRUE
+ instant = TRUE
+ pre_noise = FALSE
+ post_noise = FALSE
+
+/obj/item/toy/crayon/revenant/ui_state(mob/user)
+ return GLOB.always_state
+
+/obj/item/toy/crayon/revenant/ui_data(mob/user)
+ . = ..()
+ // Force literacy for bloodwriting UI
+ .["is_literate_user"] = TRUE
+
+#undef INFINITE_CHARGES
diff --git a/tgstation.dme b/tgstation.dme
index 254a5cd21dd..661927b69ab 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -9205,6 +9205,7 @@
#include "modular_zubbers\code\modules\antagonists\malf\remove_malf.dm"
#include "modular_zubbers\code\modules\antagonists\nightmare\nightmare_species.dm"
#include "modular_zubbers\code\modules\antagonists\nukeop\equipment\nuclear_authentication_disk.dm"
+#include "modular_zubbers\code\modules\antagonists\revenant\bloodwriting.dm"
#include "modular_zubbers\code\modules\antagonists\voidwalker\voidwalker_mood.dm"
#include "modular_zubbers\code\modules\antagonists\voidwalker\voidwalker_trauma.dm"
#include "modular_zubbers\code\modules\antagonists\wizard\events_removal.dm"