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
<details>
<summary>Screenshots/Videos</summary>
<img width="1848" height="1354" alt="image"
src="https://github.com/user-attachments/assets/379d1bfa-3c18-4574-b51c-6359168e9f3c"
/>


</details>

## Changelog
🆑
add: Added a bloodwriting ability to the revenant that works like a
built-in crayon
/🆑

---------

Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>
Co-authored-by: Alexis <catmc8565@gmail.com>
This commit is contained in:
NiklasNeighbor
2026-01-21 22:34:28 +01:00
committed by GitHub
parent fceb1787a7
commit 2dfa70ea48
3 changed files with 92 additions and 0 deletions
@@ -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)
@@ -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
+1
View File
@@ -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"