Skip to content

Commit de64c7d

Browse files
author
Ava
committed
blood runes actually involve blood + polishing
1 parent ec67bb0 commit de64c7d

File tree

13 files changed

+64
-36
lines changed

13 files changed

+64
-36
lines changed

code/game/gamemodes/cult/arcane_tome.dm

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
/// Arcane tomes are the quintessential cultist "tool" and are used to draw runes, smack things with, and other such things.
2+
/// The interface they open (ArcaneTome.js) also contains a lot of in-game documentation about how the antagonist works.
13
/obj/item/arcane_tome
24
name = "arcane tome"
35
desc = "An old, dusty tome with frayed edges and a sinister-looking cover."
@@ -93,20 +95,33 @@
9395
to_chat(user, SPAN_WARNING("You can only fit one rune on any given space."))
9496
return
9597
var/datum/gender/G = gender_datums[user.get_visible_gender()]
98+
var/blood_name = "blood"
99+
var/synth = user.isSynthetic()
100+
if (ishuman(user))
101+
var/mob/living/carbon/human/H = user
102+
blood_name = H.species?.get_blood_name()
103+
user.apply_damage(1, BRUTE, pick(BP_L_HAND, BP_R_HAND), sharp = TRUE, edge = TRUE, used_weapon = "long, precise cut")
96104
user.visible_message(
97-
SPAN_WARNING("\The [user] slices open [G.his] skin and begins painting on symbols on the floor with [G.his] own blood!"),
98-
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."),
105+
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]"),
106+
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."),
99107
SPAN_WARNING("You hear droplets softly splattering on the ground."),
100-
range = 3)
101-
user.apply_damage(1, BRUTE)
108+
range = 3
109+
)
110+
if (ishuman(user))
111+
var/mob/living/carbon/human/H = user
112+
for (var/i in 1 to 4)
113+
spawn (max(0, scribe_speed - 1 SECOND) / i)
114+
H.drip(1)
102115
if (!do_after(user, max(0, scribe_speed)))
103116
return
104117
if (locate(/obj/effect/rune) in get_turf(user))
105118
to_chat(user, SPAN_WARNING("You can only fit one rune on any given space."))
106119
return
120+
for (var/obj/effect/decal/cleanable/blood/B in get_turf(user))
121+
qdel(B)
107122
user.visible_message(
108-
SPAN_WARNING("\The [user] paints arcane markings with [G.his] own blood!"),
109-
SPAN_DANGER("You finish drawing the arcane markings of the Geometer."),
123+
SPAN_WARNING("\The [user] paints arcane markings with [G.his] own [blood_name]!"),
124+
SPAN_NOTICE("You finish drawing the arcane markings of the Geometer."),
110125
range = 3
111126
)
112127
var/obj/effect/rune/NR = new rune_type (get_turf(user))

code/game/gamemodes/cult/runes/armor.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@
1616
var/datum/gender/G = gender_datums[L.get_visible_gender()]
1717
L.visible_message(
1818
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."),
19-
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.")
19+
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.")
2020
)
2121
qdel(src)
Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
/obj/effect/rune/communicate
22
rune_name = "Communicate"
3-
rune_desc = "Allows you to communicate with other cultists."
4-
rune_shorthand = "Allows undetectable communication with other followers."
3+
rune_desc = "Allows you to communicate with other cultists by speaking aloud next to the rune. Can be muted or unmuted through invocation."
54
talisman_path = /obj/item/paper/talisman/communicate
65
circle_words = list(CULT_WORD_SELF, CULT_WORD_OTHER, CULT_WORD_TECHNOLOGY)
76
invocation = "O bidai nabora se'sma!"
7+
whispered = TRUE
8+
var/muted = FALSE
9+
10+
/obj/effect/rune/communicate/examine(mob/user, infix, suffix)
11+
. = ..()
12+
if (iscultist(user) || isobserver(user))
13+
. += SPAN_DANGER("This rune [muted ? "is muted, and must be invoked before it will function" : "can be muted by invoking it"].")
14+
15+
/obj/effect/rune/communicate/hear_talk(mob/M, list/message_pieces, verb)
16+
var/msg = multilingual_to_message(message_pieces, with_capitalization = TRUE)
17+
if (iscultist(M) && get_dist(M, src) <= 1 && !muted)
18+
cult.cult_speak(M, msg)
819

920
/obj/effect/rune/communicate/invoke(list/invokers)
1021
var/mob/living/L = invokers[1]
11-
var/input = input(L, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") as null|text
12-
if (!input || !CanInteract(L, physical_state))
13-
return
14-
input = sanitize(input)
15-
log_and_message_admins("used a communicate rune to say '[input]'", usr)
16-
for (var/mob/M in player_list)
17-
if (iscultist(M) || isobserver(M))
18-
to_chat(M, SPAN_OCCULT(input))
22+
muted = !muted
23+
to_chat(L, SPAN_NOTICE("This rune will [muted ? "no longer" : "now"] relay your words to the rest of the flock."))

code/game/gamemodes/cult/runes/convert.dm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
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!"))
4242
)
4343
return
44+
else
45+
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."))
4446
impudence = 1
4547
START_PROCESSING(SSprocessing, src)
4648
process()

code/game/gamemodes/cult/runes/drain_blood.dm

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
/obj/effect/rune/drain_blood
22
rune_name = "Drain Blood"
3-
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."
4-
rune_shorthand = "Drain the blood of humans on top of all Drain Blood runes in the world in order to heal the invoker."
3+
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."
54
circle_words = list(CULT_WORD_TRAVEL, CULT_WORD_BLOOD, CULT_WORD_SELF)
65
invocation = "Yu'gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!"
76
var/remaining_blood = 0
@@ -21,16 +20,16 @@
2120
for (var/mob/living/carbon/human/H in get_turf(DB))
2221
if (H.stat == DEAD)
2322
continue
24-
to_chat(H, SPAN_DANGER("You feel a heavy sense of weakness."))
25-
var/drain = rand(1, 25)
26-
H.take_overall_damage(drain)
23+
to_chat(H, SPAN_DANGER("Warm crimson light pulses beneath you. You feel extremely [pick("dizzy", "woozy", "faint", "disoriented", "unsteady")]."))
24+
var/drain = rand(10, 25)
25+
H.remove_blood(drain)
2726
total_blood += drain
2827
if (!total_blood)
2928
return fizzle()
3029
var/datum/gender/G = gender_datums[L.get_visible_gender()]
3130
L.visible_message(
3231
SPAN_WARNING("\The [src] glows a sullen red as \the [L] presses [G.himself] against it. Blood seeps through the scrawlings."),
33-
SPAN_DANGER("Blood flows from \the [src] into your frail moral body. You feel... empowered.")
32+
SPAN_NOTICE("Blood flows from \the [src] into your frail moral body. You feel... empowered.")
3433
)
3534
L.heal_organ_damage(total_blood % 5)
3635
total_blood -= total_blood % 5
@@ -46,6 +45,7 @@
4645
return
4746
remaining_blood--
4847
cultist.heal_organ_damage(5, 0)
48+
cultist.add_chemical_effect(CE_BLOODRESTORE, 2)
4949
for (var/obj/item/organ/I in cultist.internal_organs)
5050
if (I.damage > 0)
5151
I.damage = max(I.damage - 5, 0)

code/game/gamemodes/cult/runes/hide_and_reveal.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
/obj/effect/rune/reveal_runes
1818
rune_name = "Reveal Runes"
19-
rune_desc = "Reverses the effects of <i>Hide Runes</i>, causing all nearby invisible runes to become visible once more."
19+
rune_desc = "Reverses the effects of Hide Runes, causing all nearby invisible runes to become visible once more."
2020
talisman_path = /obj/item/paper/talisman/reveal_runes
2121
circle_words = list(CULT_WORD_BLOOD, CULT_WORD_SEE, CULT_WORD_HIDE)
2222
invocation = "Nikt'o barada kla'atu!"

code/game/gamemodes/cult/runes/imbue_talisman.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
var/obj/effect/rune/chosen = pick(valid_runes)
3333
var/obj/item/paper/talisman/T = new chosen.talisman_path (get_turf(src))
3434
chosen.apply_to_talisman(T)
35-
visible_message(SPAN_WARNING("The words from the runes slither onto \the [P], forming wet red symbols on its surface."))
35+
visible_message(SPAN_NOTICE("The words from the runes slither onto \the [P], forming wet red symbols on its surface."))
3636
qdel(P)
3737
qdel(chosen)
3838
qdel(src)

code/game/gamemodes/cult/runes/raise_dead.dm

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/obj/effect/rune/raise_dead
22
rune_name = "Raise Dead"
33
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."
4-
rune_shorthand = "Brings a dead body to life using the sacrifice of a living human on another copy of the rune."
4+
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."
55
circle_words = list(CULT_WORD_BLOOD, CULT_WORD_JOIN, CULT_WORD_SELF)
66
invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!"
77

@@ -43,7 +43,7 @@
4343
var/mob/living/L = invokers[1]
4444
var/mob/living/carbon/human/shears = targets[1]
4545
var/mob/living/carbon/human/lamb = targets[2]
46-
to_chat(L, SPAN_OCCULT("The ritual is begun. Both bodies must remain in place..."))
46+
to_chat(L, SPAN_NOTICE("The ritual is begun. Both bodies must remain in place..."))
4747
shears.visible_message(SPAN_WARNING("\The [shears] is yanked upwards by invisible strings, dangling in the air like a puppet."))
4848
lamb.visible_message(
4949
SPAN_WARNING("\The [lamb] is yanked upwards by invisible strings, dangling in the air like a puppet."),
@@ -55,7 +55,7 @@
5555
if (do_after(shears, 5 SECONDS, lamb, FALSE, incapacitation_flags = INCAPACITATION_NONE))
5656
resurrect(shears, lamb)
5757
return
58-
to_chat(L, SPAN_OCCULT("The ritual's participants must remain stationary!"))
58+
to_chat(L, SPAN_NOTICE("The ritual's participants must remain stationary!"))
5959
if (shears)
6060
shears.visible_message(SPAN_WARNING("\The [shears] drops unceremoniously to the ground."))
6161
playsound(shears, "bodyfall", 50, TRUE)
@@ -69,7 +69,7 @@
6969
/obj/effect/rune/raise_dead/proc/resurrect(mob/living/carbon/human/shears, mob/living/carbon/human/lamb, mob/living/invoker)
7070
var/list/targets = get_targets()
7171
if (targets[1] != shears || targets[2] != lamb)
72-
to_chat(invoker, SPAN_DANGER("The ritual's subjects were moved before it could complete."))
72+
to_chat(invoker, SPAN_WARNING("The ritual's subjects were moved before it could complete."))
7373
return
7474
if (!shears.client || !shears.mind)
7575
shears.visible_message(SPAN_WARNING("\The [shears] drops unceremoniously to the ground."))
@@ -79,7 +79,7 @@
7979
)
8080
playsound(shears, "bodyfall", 50, TRUE)
8181
playsound(lamb, "bodyfall", 50, TRUE)
82-
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."))
82+
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."))
8383
return
8484
var/datum/gender/GS = gender_datums[shears.get_visible_gender()]
8585
lamb.visible_message(

code/game/gamemodes/cult/runes/see_invisible.dm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323

2424
/obj/effect/rune/see_invisible/invoke(list/invokers)
2525
var/mob/living/L = invokers[1]
26-
to_chat(L, SPAN_WARNING("The world beyond opens to your eyes."))
26+
to_chat(L, SPAN_NOTICE("The world beyond opens to your eyes."))
2727
oracle = L
2828
oracle.seer = TRUE
29-
oracle.see_invisible = INVISIBILITY_OBSERVER
29+
oracle.see_invisible = SEE_INVISIBLE_OBSERVER
3030
START_PROCESSING(SSfastprocess, src)
3131

3232
/obj/effect/rune/see_invisible/process()

code/game/gamemodes/cult/talismans/communicate.dm

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,5 @@
1212
return
1313
input = sanitize(input)
1414
log_and_message_admins("used a communicate talisman to say '[input]'", usr)
15-
for (var/mob/M in player_list)
16-
if (iscultist(M) || isobserver(M))
17-
to_chat(M, SPAN_OCCULT(input))
15+
cult.cult_speak(user, input)
1816
qdel(src)

code/game/objects/items/weapons/weaponry.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
if (R.invisibility == SEE_INVISIBLE_CULT)
5757
R.invisibility = 0
5858
R.alpha = 255
59-
R.visible_message(SPAN_WARNING("\A [src] appears to the [dir2text(get_dir(R, target))]!"))
59+
R.visible_message(SPAN_WARNING("\A [R] appears to the [dir2text(get_dir(R, target))]!"))
6060
user.setClickCooldown(2 SECONDS)
6161

6262
/obj/item/energy_net

code/modules/antagonist/station/cultist.dm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,8 @@ var/global/datum/antagonist/cultist/cult
125125
if(L && (L.imp_in == player.current))
126126
return 0
127127
return 1
128+
129+
/datum/antagonist/cultist/proc/cult_speak(mob/speaker, message)
130+
for (var/mob/M in player_list)
131+
if (iscultist(M) || isobserver(M))
132+
to_chat(M, SPAN_OCCULT("[speaker.GetVoice()][speaker.GetAltName()] intones, \"[message]\""))

code/modules/mob/living/carbon/human/life.dm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,6 +1446,9 @@
14461446
see_in_dark = 8
14471447
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
14481448

1449+
if (seer)
1450+
see_invisible = SEE_INVISIBLE_OBSERVER
1451+
14491452
for(var/datum/modifier/M in modifiers)
14501453
if(!isnull(M.vision_flags))
14511454
sight |= M.vision_flags

0 commit comments

Comments
 (0)