Skip to content

Commit

Permalink
blood runes actually involve blood + polishing
Browse files Browse the repository at this point in the history
  • Loading branch information
Ava committed Mar 13, 2023
1 parent ec67bb0 commit de64c7d
Show file tree
Hide file tree
Showing 13 changed files with 64 additions and 36 deletions.
27 changes: 21 additions & 6 deletions code/game/gamemodes/cult/arcane_tome.dm
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
/// Arcane tomes are the quintessential cultist "tool" and are used to draw runes, smack things with, and other such things.
/// The interface they open (ArcaneTome.js) also contains a lot of in-game documentation about how the antagonist works.
/obj/item/arcane_tome
name = "arcane tome"
desc = "An old, dusty tome with frayed edges and a sinister-looking cover."
Expand Down Expand Up @@ -93,20 +95,33 @@
to_chat(user, SPAN_WARNING("You can only fit one rune on any given space."))
return
var/datum/gender/G = gender_datums[user.get_visible_gender()]
var/blood_name = "blood"
var/synth = user.isSynthetic()
if (ishuman(user))
var/mob/living/carbon/human/H = user
blood_name = H.species?.get_blood_name()
user.apply_damage(1, BRUTE, pick(BP_L_HAND, BP_R_HAND), sharp = TRUE, edge = TRUE, used_weapon = "long, precise cut")
user.visible_message(
SPAN_WARNING("\The [user] slices open [G.his] skin and begins painting on symbols on the floor with [G.his] own blood!"),
SPAN_DANGER("You slice open your skin and begin drawing a rune on the floor whilst invoking the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."),
SPAN_WARNING("\The [user] [!synth ? "slices open [G.his] skin" : "tears open [G.his] circulation"] and begins painting on symbols on the floor with [G.his] own [blood_name]"),
SPAN_NOTICE("You [!synth ? "slice open your skin" : "tear open your circulation"] and begin drawing a rune on the floor whilst invoking the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."),
SPAN_WARNING("You hear droplets softly splattering on the ground."),
range = 3)
user.apply_damage(1, BRUTE)
range = 3
)
if (ishuman(user))
var/mob/living/carbon/human/H = user
for (var/i in 1 to 4)
spawn (max(0, scribe_speed - 1 SECOND) / i)
H.drip(1)
if (!do_after(user, max(0, scribe_speed)))
return
if (locate(/obj/effect/rune) in get_turf(user))
to_chat(user, SPAN_WARNING("You can only fit one rune on any given space."))
return
for (var/obj/effect/decal/cleanable/blood/B in get_turf(user))
qdel(B)
user.visible_message(
SPAN_WARNING("\The [user] paints arcane markings with [G.his] own blood!"),
SPAN_DANGER("You finish drawing the arcane markings of the Geometer."),
SPAN_WARNING("\The [user] paints arcane markings with [G.his] own [blood_name]!"),
SPAN_NOTICE("You finish drawing the arcane markings of the Geometer."),
range = 3
)
var/obj/effect/rune/NR = new rune_type (get_turf(user))
Expand Down
2 changes: 1 addition & 1 deletion code/game/gamemodes/cult/runes/armor.dm
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@
var/datum/gender/G = gender_datums[L.get_visible_gender()]
L.visible_message(
SPAN_DANGER("The runes crawl onto [L]'s body as they expand to cocoon [G.him], before falling away and revealing [G.his] body once more in gushing spurts of black sludge."),
SPAN_DANGER("The runes wrap you tightly, and you allow them to shroud you with tainted magmellite before you cast them off as you would a cocoon.")
SPAN_NOTICE("The runes wrap you tightly, and you allow them to shroud you with tainted magmellite before you cast them off as you would a cocoon.")
)
qdel(src)
25 changes: 15 additions & 10 deletions code/game/gamemodes/cult/runes/communicate.dm
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
/obj/effect/rune/communicate
rune_name = "Communicate"
rune_desc = "Allows you to communicate with other cultists."
rune_shorthand = "Allows undetectable communication with other followers."
rune_desc = "Allows you to communicate with other cultists by speaking aloud next to the rune. Can be muted or unmuted through invocation."
talisman_path = /obj/item/paper/talisman/communicate
circle_words = list(CULT_WORD_SELF, CULT_WORD_OTHER, CULT_WORD_TECHNOLOGY)
invocation = "O bidai nabora se'sma!"
whispered = TRUE
var/muted = FALSE

/obj/effect/rune/communicate/examine(mob/user, infix, suffix)
. = ..()
if (iscultist(user) || isobserver(user))
. += SPAN_DANGER("This rune [muted ? "is muted, and must be invoked before it will function" : "can be muted by invoking it"].")

/obj/effect/rune/communicate/hear_talk(mob/M, list/message_pieces, verb)
var/msg = multilingual_to_message(message_pieces, with_capitalization = TRUE)
if (iscultist(M) && get_dist(M, src) <= 1 && !muted)
cult.cult_speak(M, msg)

/obj/effect/rune/communicate/invoke(list/invokers)
var/mob/living/L = invokers[1]
var/input = input(L, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") as null|text
if (!input || !CanInteract(L, physical_state))
return
input = sanitize(input)
log_and_message_admins("used a communicate rune to say '[input]'", usr)
for (var/mob/M in player_list)
if (iscultist(M) || isobserver(M))
to_chat(M, SPAN_OCCULT(input))
muted = !muted
to_chat(L, SPAN_NOTICE("This rune will [muted ? "no longer" : "now"] relay your words to the rest of the flock."))
2 changes: 2 additions & 0 deletions code/game/gamemodes/cult/runes/convert.dm
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
SPAN_DANGER(FONT_LARGE("...and you're able to force it out of your mind. You need to get away from here as fast as you can!"))
)
return
else
to_chat(user, SPAN_NOTICE("The ritual is begun. You must keep [converting] atop the rune until [G.him] succumb[G.s] to the Geometer's influence... or die from its revelation."))
impudence = 1
START_PROCESSING(SSprocessing, src)
process()
Expand Down
12 changes: 6 additions & 6 deletions code/game/gamemodes/cult/runes/drain_blood.dm
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
/obj/effect/rune/drain_blood
rune_name = "Drain Blood"
rune_desc = "Drains the blood of humans placed on top of all Drain Blood runes (no matter their location), healing the invoker based on the total amount drained."
rune_shorthand = "Drain the blood of humans on top of all Drain Blood runes in the world in order to heal the invoker."
rune_desc = "Drains the blood of humans on top of all existing runes of this type. The invoker will be healed and regenerate their own blood in the process."
circle_words = list(CULT_WORD_TRAVEL, CULT_WORD_BLOOD, CULT_WORD_SELF)
invocation = "Yu'gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!"
var/remaining_blood = 0
Expand All @@ -21,16 +20,16 @@
for (var/mob/living/carbon/human/H in get_turf(DB))
if (H.stat == DEAD)
continue
to_chat(H, SPAN_DANGER("You feel a heavy sense of weakness."))
var/drain = rand(1, 25)
H.take_overall_damage(drain)
to_chat(H, SPAN_DANGER("Warm crimson light pulses beneath you. You feel extremely [pick("dizzy", "woozy", "faint", "disoriented", "unsteady")]."))
var/drain = rand(10, 25)
H.remove_blood(drain)
total_blood += drain
if (!total_blood)
return fizzle()
var/datum/gender/G = gender_datums[L.get_visible_gender()]
L.visible_message(
SPAN_WARNING("\The [src] glows a sullen red as \the [L] presses [G.himself] against it. Blood seeps through the scrawlings."),
SPAN_DANGER("Blood flows from \the [src] into your frail moral body. You feel... empowered.")
SPAN_NOTICE("Blood flows from \the [src] into your frail moral body. You feel... empowered.")
)
L.heal_organ_damage(total_blood % 5)
total_blood -= total_blood % 5
Expand All @@ -46,6 +45,7 @@
return
remaining_blood--
cultist.heal_organ_damage(5, 0)
cultist.add_chemical_effect(CE_BLOODRESTORE, 2)
for (var/obj/item/organ/I in cultist.internal_organs)
if (I.damage > 0)
I.damage = max(I.damage - 5, 0)
Expand Down
2 changes: 1 addition & 1 deletion code/game/gamemodes/cult/runes/hide_and_reveal.dm
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

/obj/effect/rune/reveal_runes
rune_name = "Reveal Runes"
rune_desc = "Reverses the effects of <i>Hide Runes</i>, causing all nearby invisible runes to become visible once more."
rune_desc = "Reverses the effects of Hide Runes, causing all nearby invisible runes to become visible once more."
talisman_path = /obj/item/paper/talisman/reveal_runes
circle_words = list(CULT_WORD_BLOOD, CULT_WORD_SEE, CULT_WORD_HIDE)
invocation = "Nikt'o barada kla'atu!"
Expand Down
2 changes: 1 addition & 1 deletion code/game/gamemodes/cult/runes/imbue_talisman.dm
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
var/obj/effect/rune/chosen = pick(valid_runes)
var/obj/item/paper/talisman/T = new chosen.talisman_path (get_turf(src))
chosen.apply_to_talisman(T)
visible_message(SPAN_WARNING("The words from the runes slither onto \the [P], forming wet red symbols on its surface."))
visible_message(SPAN_NOTICE("The words from the runes slither onto \the [P], forming wet red symbols on its surface."))
qdel(P)
qdel(chosen)
qdel(src)
10 changes: 5 additions & 5 deletions code/game/gamemodes/cult/runes/raise_dead.dm
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/obj/effect/rune/raise_dead
rune_name = "Raise Dead"
rune_desc = "This rune allows for the resurrection of any dead person. You will need a dead human body and a living human sacrifice. Make 2 raise dead runes. Put a living, awake human on top of one, and a dead body on the other one. When you invoke the rune, the life force of the living human will be transferred into the dead body, allowing a ghost standing on top of the dead body to enter it, instantly and fully healing it. Use other runes to ensure there is a ghost ready to be resurrected."
rune_shorthand = "Brings a dead body to life using the sacrifice of a living human on another copy of the rune."
rune_shorthand = "Brings a dead body to life using the sacrifice of a living human on another copy of the rune. If the dead body is not a cultist, they will become one."
circle_words = list(CULT_WORD_BLOOD, CULT_WORD_JOIN, CULT_WORD_SELF)
invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!"

Expand Down Expand Up @@ -43,7 +43,7 @@
var/mob/living/L = invokers[1]
var/mob/living/carbon/human/shears = targets[1]
var/mob/living/carbon/human/lamb = targets[2]
to_chat(L, SPAN_OCCULT("The ritual is begun. Both bodies must remain in place..."))
to_chat(L, SPAN_NOTICE("The ritual is begun. Both bodies must remain in place..."))
shears.visible_message(SPAN_WARNING("\The [shears] is yanked upwards by invisible strings, dangling in the air like a puppet."))
lamb.visible_message(
SPAN_WARNING("\The [lamb] is yanked upwards by invisible strings, dangling in the air like a puppet."),
Expand All @@ -55,7 +55,7 @@
if (do_after(shears, 5 SECONDS, lamb, FALSE, incapacitation_flags = INCAPACITATION_NONE))
resurrect(shears, lamb)
return
to_chat(L, SPAN_OCCULT("The ritual's participants must remain stationary!"))
to_chat(L, SPAN_NOTICE("The ritual's participants must remain stationary!"))
if (shears)
shears.visible_message(SPAN_WARNING("\The [shears] drops unceremoniously to the ground."))
playsound(shears, "bodyfall", 50, TRUE)
Expand All @@ -69,7 +69,7 @@
/obj/effect/rune/raise_dead/proc/resurrect(mob/living/carbon/human/shears, mob/living/carbon/human/lamb, mob/living/invoker)
var/list/targets = get_targets()
if (targets[1] != shears || targets[2] != lamb)
to_chat(invoker, SPAN_DANGER("The ritual's subjects were moved before it could complete."))
to_chat(invoker, SPAN_WARNING("The ritual's subjects were moved before it could complete."))
return
if (!shears.client || !shears.mind)
shears.visible_message(SPAN_WARNING("\The [shears] drops unceremoniously to the ground."))
Expand All @@ -79,7 +79,7 @@
)
playsound(shears, "bodyfall", 50, TRUE)
playsound(lamb, "bodyfall", 50, TRUE)
to_chat(invoker, SPAN_DANGER("The deceased's spirit did not return to its body. It may if you try again, or it may not."))
to_chat(invoker, SPAN_WARNING("The deceased's spirit did not return to its body. It may if you try again, or it may not."))
return
var/datum/gender/GS = gender_datums[shears.get_visible_gender()]
lamb.visible_message(
Expand Down
4 changes: 2 additions & 2 deletions code/game/gamemodes/cult/runes/see_invisible.dm
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@

/obj/effect/rune/see_invisible/invoke(list/invokers)
var/mob/living/L = invokers[1]
to_chat(L, SPAN_WARNING("The world beyond opens to your eyes."))
to_chat(L, SPAN_NOTICE("The world beyond opens to your eyes."))
oracle = L
oracle.seer = TRUE
oracle.see_invisible = INVISIBILITY_OBSERVER
oracle.see_invisible = SEE_INVISIBLE_OBSERVER
START_PROCESSING(SSfastprocess, src)

/obj/effect/rune/see_invisible/process()
Expand Down
4 changes: 1 addition & 3 deletions code/game/gamemodes/cult/talismans/communicate.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,5 @@
return
input = sanitize(input)
log_and_message_admins("used a communicate talisman to say '[input]'", usr)
for (var/mob/M in player_list)
if (iscultist(M) || isobserver(M))
to_chat(M, SPAN_OCCULT(input))
cult.cult_speak(user, input)
qdel(src)
2 changes: 1 addition & 1 deletion code/game/objects/items/weapons/weaponry.dm
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
if (R.invisibility == SEE_INVISIBLE_CULT)
R.invisibility = 0
R.alpha = 255
R.visible_message(SPAN_WARNING("\A [src] appears to the [dir2text(get_dir(R, target))]!"))
R.visible_message(SPAN_WARNING("\A [R] appears to the [dir2text(get_dir(R, target))]!"))
user.setClickCooldown(2 SECONDS)

/obj/item/energy_net
Expand Down
5 changes: 5 additions & 0 deletions code/modules/antagonist/station/cultist.dm
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,8 @@ var/global/datum/antagonist/cultist/cult
if(L && (L.imp_in == player.current))
return 0
return 1

/datum/antagonist/cultist/proc/cult_speak(mob/speaker, message)
for (var/mob/M in player_list)
if (iscultist(M) || isobserver(M))
to_chat(M, SPAN_OCCULT("[speaker.GetVoice()][speaker.GetAltName()] intones, \"[message]\""))
3 changes: 3 additions & 0 deletions code/modules/mob/living/carbon/human/life.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1446,6 +1446,9 @@
see_in_dark = 8
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO

if (seer)
see_invisible = SEE_INVISIBLE_OBSERVER

for(var/datum/modifier/M in modifiers)
if(!isnull(M.vision_flags))
sight |= M.vision_flags
Expand Down

0 comments on commit de64c7d

Please sign in to comment.