diff --git a/code/datums/action.dm b/code/datums/action.dm
index a1d57ea70df..ff8738eb198 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -82,6 +82,8 @@
/datum/action/proc/UpdateButtonIcon()
if(button)
+ button.name = name
+ button.desc = desc
button.icon = button_icon
button.icon_state = background_icon_state
@@ -207,11 +209,9 @@
if(H.friendly_fire_check)
button_icon_state = "vortex_ff_off"
name = "Toggle Friendly Fire \[OFF\]"
- button.name = name
else
button_icon_state = "vortex_ff_on"
name = "Toggle Friendly Fire \[ON\]"
- button.name = name
..()
/datum/action/item_action/vortex_recall
@@ -253,15 +253,13 @@
desc = "Allows you to communicate with other Servants."
button_icon_state = "hierophant_slab"
-/datum/action/item_action/clock/guvax
- name = "Guvax"
- desc = "Allows you to convert an adjacent target nonservant. Click your slab to disable."
- button_icon_state = "guvax_capacitor"
+/datum/action/item_action/clock/quickbind_one
+ name = "Quickbind"
+ desc = "If you're seeing this, file a bug report."
-/datum/action/item_action/clock/vanguard
- name = "Vanguard"
- desc = "Allows you to temporarily absorb stuns. All stuns absorbed will affect you when disabled."
- button_icon_state = "vanguard_cogwheel"
+/datum/action/item_action/clock/quickbind_two
+ name = "Quickbind"
+ desc = "If you're seeing this, file a bug report."
/datum/action/item_action/toggle_helmet_flashlight
name = "Toggle Helmet Flashlight"
diff --git a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
index e8b4de725ab..f08e6191151 100644
--- a/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
+++ b/code/game/gamemodes/clock_cult/clock_helpers/component_helpers.dm
@@ -83,7 +83,7 @@
if(HIEROPHANT_ANSIBLE)
return "nzcrentr"
else
- return null
+ return "brass"
//returns a component color from a component id, but with a brighter replicant alloy color
/proc/get_component_color_brightalloy(id)
diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm
index d4c6209d953..7c69b1eb554 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm
@@ -90,7 +90,6 @@
strip_delay = 50
put_on_delay = 30
body_parts_covered = ARMS
- resistance_flags = 0
siemens_coefficient = 0
permeability_coefficient = 0.05
resistance_flags = FIRE_PROOF | ACID_PROOF
diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
index a1a0b550f22..ddd86a37cd6 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
@@ -13,8 +13,11 @@
var/produces_components = TRUE //if it produces components at all
var/list/shown_scripture = list(SCRIPTURE_DRIVER = FALSE, SCRIPTURE_SCRIPT = FALSE, SCRIPTURE_APPLICATION = FALSE, SCRIPTURE_REVENANT = FALSE, SCRIPTURE_JUDGEMENT = FALSE)
var/text_hidden = FALSE
+ var/compact_scripture = FALSE
var/obj/effect/proc_holder/slab/slab_ability //the slab's current bound ability, for certain scripture
- actions_types = list(/datum/action/item_action/clock/hierophant, /datum/action/item_action/clock/guvax, /datum/action/item_action/clock/vanguard)
+ var/datum/clockwork_scripture/quickbind_slot_one //these are paths, not instances
+ var/datum/clockwork_scripture/quickbind_slot_two //accordingly, use initial() for non-list vars
+ actions_types = list(/datum/action/item_action/clock/hierophant, /datum/action/item_action/clock/quickbind_one, /datum/action/item_action/clock/quickbind_two)
/obj/item/clockwork/slab/starter
stored_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, GUVAX_CAPACITOR = 1, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1)
@@ -38,6 +41,8 @@
/obj/item/clockwork/slab/New()
..()
+ quickbind_to_one(/datum/clockwork_scripture/ranged_ability/guvax_prep)
+ quickbind_to_two(/datum/clockwork_scripture/vanguard)
START_PROCESSING(SSobj, src)
production_time = world.time + SLAB_PRODUCTION_TIME
@@ -91,8 +96,12 @@
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "Use the Hierophant Network action button to communicate with other servants."
- user << "Clockwork slabs will only generate components if held by a human or if inside a storage item held by a human, and when generating a component will prevent all other slabs held from generating components.
"
- user << "Attacking a slab, a fellow Servant with a slab, or a cache with this slab will transfer this slab's components into that slab's components, their slab's components, or the global cache, respectively."
+ user << "Clockwork slabs will only make components if held or if inside an item held by a human, and when making a component will prevent all other slabs held from making components."
+ user << "Hitting a slab, a Servant with a slab, or a cache will transfer this slab's components into the target, the target's slab, or the global cache, respectively."
+ if(quickbind_slot_one)
+ user << "Quickbind button One: [initial(quickbind_slot_one.name)]"
+ if(quickbind_slot_two)
+ user << "Quickbind button Two: [initial(quickbind_slot_two.name)]"
if(clockwork_caches)
user << "Stored components (with global cache):"
for(var/i in stored_components)
@@ -150,31 +159,15 @@
else
return ..()
-//Slab actions; Hierophant, Guvax, Vanguard
+//Slab actions; Hierophant, Quickbind One and Two
/obj/item/clockwork/slab/ui_action_click(mob/user, actiontype)
switch(actiontype)
if(/datum/action/item_action/clock/hierophant)
show_hierophant(user)
- if(/datum/action/item_action/clock/guvax)
- if(!nonhuman_usable && !ishuman(user))
- return
- if(src == user.get_active_held_item())
- var/datum/clockwork_scripture/ranged_ability/guvax_prep/convert = new
- convert.slab = src
- convert.invoker = user
- convert.run_scripture()
- else
- user << "You need to hold the slab in your active hand to recite scripture!"
- if(/datum/action/item_action/clock/vanguard)
- if(!nonhuman_usable && !ishuman(user))
- return
- if(src == user.get_active_held_item())
- var/datum/clockwork_scripture/vanguard/antistun = new
- antistun.slab = src
- antistun.invoker = user
- antistun.run_scripture()
- else
- user << "You need to hold the slab in your active hand to recite scripture!"
+ if(/datum/action/item_action/clock/quickbind_one)
+ recite_scripture(quickbind_slot_one, user, FALSE)
+ if(/datum/action/item_action/clock/quickbind_two)
+ recite_scripture(quickbind_slot_two, user, FALSE)
/obj/item/clockwork/slab/proc/show_hierophant(mob/living/user)
var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant")
@@ -216,10 +209,7 @@
return 0
switch(action)
if("Recital")
- if(user.get_active_held_item() != src)
- user << "You need to hold the slab in your active hand to recite scripture!"
- return
- recite_scripture(user)
+ try_recite_scripture(user)
if("Recollection")
user.set_machine(src)
interact(user)
@@ -227,7 +217,7 @@
return
return 1
-/obj/item/clockwork/slab/proc/recite_scripture(mob/living/user)
+/obj/item/clockwork/slab/proc/try_recite_scripture(mob/living/user)
var/list/tiers_of_scripture = scripture_unlock_check()
for(var/i in tiers_of_scripture)
if(!tiers_of_scripture[i] && !ratvar_awakens && !no_cost)
@@ -235,33 +225,38 @@
tiers_of_scripture -= i
var/scripture_tier = input(user, "Choose a category of scripture to recite.", "[src]") as null|anything in tiers_of_scripture
if(!scripture_tier || !user.canUseTopic(src))
- return 0
+ return FALSE
var/list/available_scriptures = list()
- var/datum/clockwork_scripture/scripture_to_recite
switch(scripture_tier)
if(SCRIPTURE_DRIVER,SCRIPTURE_SCRIPT,SCRIPTURE_APPLICATION,SCRIPTURE_REVENANT,SCRIPTURE_JUDGEMENT); //; for the empty if
else
user << "That section of scripture is still locked!"
- return 0
+ return FALSE
for(var/S in sortList(subtypesof(/datum/clockwork_scripture), /proc/cmp_clockscripture_priority))
var/datum/clockwork_scripture/C = S
if(initial(C.tier) == scripture_tier)
available_scriptures["[initial(C.name)] ([initial(C.descname)])"] = C
if(!available_scriptures.len)
- return 0
+ return FALSE
var/chosen_scripture_key = input(user, "Choose a piece of scripture to recite.", "[src]") as null|anything in available_scriptures
var/datum/clockwork_scripture/chosen_scripture = available_scriptures[chosen_scripture_key]
- if(!chosen_scripture || !user.canUseTopic(src) || user.get_active_held_item() != src)
- return 0
- tiers_of_scripture = scripture_unlock_check()
- if(!ratvar_awakens && !no_cost && !tiers_of_scripture[initial(chosen_scripture.tier)])
- user << "That scripture is no longer unlocked, and cannot be recited!"
- return 0
- scripture_to_recite = new chosen_scripture
+ return recite_scripture(chosen_scripture, user, TRUE)
+
+/obj/item/clockwork/slab/proc/recite_scripture(datum/clockwork_scripture/scripture, mob/living/user, delayed)
+ if(!scripture || !user || !user.canUseTopic(src) || (!nonhuman_usable && !ishuman(user)))
+ return FALSE
+ if(user.get_active_held_item() != src)
+ user << "You need to hold the slab in your active hand to recite scripture!"
+ return FALSE
+ var/list/tiers_of_scripture = scripture_unlock_check()
+ if(!ratvar_awakens && !no_cost && !tiers_of_scripture[initial(scripture.tier)])
+ user << "That scripture is no[delayed ? " longer":"t"] unlocked, and cannot be recited!"
+ return FALSE
+ var/datum/clockwork_scripture/scripture_to_recite = new scripture
scripture_to_recite.slab = src
scripture_to_recite.invoker = user
scripture_to_recite.run_scripture()
- return 1
+ return TRUE
//Guide to Serving Ratvar
/obj/item/clockwork/slab/interact(mob/living/user)
@@ -304,7 +299,7 @@
Components, fragments of the Justicar, from Reebe, and those Components can be used to draw power and material from Reebe through arcane chants \
known as Scripture.
\
\
- One component of a random type is produced in this slab every [production_text].
\
+ One component of a random type is made in this slab every [production_text].
\
Components are stored either within slabs, where they can only be accessed by that slab, or in the Global Cache accessed by Tinkerer's Caches, which all slabs \
can draw from to recite scripture.
\
There are five types of component, and in general, Belligerent Eyes are aggressive and judgemental, Vanguard Cogwheels are defensive and \
@@ -327,31 +322,33 @@
to the invoker, or even, at one of the highest tiers, granting all nearby Servants temporary invulnerability.
\
However, the most important scripture is Guvax, which allows you to convert heathens with relative ease.
\
\
- The second function of the clockwork slab is Recollection, which will display this guide.
\
+ The second function of the clockwork slab is Recollection, which will display this guide and allows for the quickbinding and recital \
+ of scripture.
\
\
The third to fifth functions are three buttons in the top left while holding the slab.
From left to right, they are:
\
Hierophant Network, which allows communication to other Servants.
\
- Guvax, which simply allows you to quickly invoke the Guvax Driver.
\
- Vanguard, which, like the Guvax button, simply allows you to quickly invoke the Vanguard Driver.
\
+ Quickbind slot One, currently set to [initial(quickbind_slot_one.name)].
\
+ Quickbind slot Two, currently set to [initial(quickbind_slot_two.name)].
\
\
Examine the slab to check the number of components it has available.
\
\
Hide Above Information
"
- text += "A complete list of scripture, its effects, and its requirements can be found below.
\
- Key:
"
+ text += "A complete list of scripture, its effects, and its requirements can be found, and thus Quickbound to this slab, below.
\
+ Key:
"
for(var/i in clockwork_component_cache)
- text += "[get_component_acronym(i)] = [get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]
"
+ text += "[get_component_acronym(i)] = [get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]
"
+ text += "
Compact Scripture Text: [compact_scripture ? "ON":"OFF"]
"
var/text_to_add = ""
- var/drivers = "
[SCRIPTURE_DRIVER]
These scriptures are always unlocked.
"
- var/scripts = "
[SCRIPTURE_SCRIPT]
These scriptures require at least 5 Servants and \
- 1 Tinkerer's Cache.
"
- var/applications = "
[SCRIPTURE_APPLICATION]
These scriptures require at least 8 Servants, \
- 3 Tinkerer's Caches, and 100CV.
"
- var/revenant = "
[SCRIPTURE_REVENANT]
These scriptures require at least 10 Servants, \
- 4 Tinkerer's Caches, and 200CV.
"
- var/judgement = "
[SCRIPTURE_JUDGEMENT]
This scripture requires at least 12 Servants, \
- 5 Tinkerer's Caches, and 300CV.
In addition, there may not be any active non-Servant AIs.
"
+ var/drivers = "
[SCRIPTURE_DRIVER]
These scriptures are always unlocked.[compact_scripture ? "":""]
"
+ var/scripts = "
[SCRIPTURE_SCRIPT]
These scriptures require at least 5 Servants and \
+ 1 Tinkerer's Cache.[compact_scripture ? "":""]
"
+ var/applications = "
[SCRIPTURE_APPLICATION]
These scriptures require at least 8 Servants, \
+ 3 Tinkerer's Caches, and 100CV.[compact_scripture ? "":""]
"
+ var/revenant = "
[SCRIPTURE_REVENANT]
These scriptures require at least 10 Servants, \
+ 4 Tinkerer's Caches, and 200CV.[compact_scripture ? "":""]
"
+ var/judgement = "
[SCRIPTURE_JUDGEMENT]
This scripture requires at least 12 Servants, \
+ 5 Tinkerer's Caches, and 300CV.
In addition, there may not be any active non-Servant AIs.[compact_scripture ? "":""]
"
for(var/V in sortList(subtypesof(/datum/clockwork_scripture), /proc/cmp_clockscripture_priority))
var/datum/clockwork_scripture/S = V
var/initial_tier = initial(S.tier)
@@ -360,20 +357,27 @@
var/list/req_comps = S2.required_components
var/list/cons_comps = S2.consumed_components
qdel(S2)
- var/scripture_text = "
[initial(S.name)]:
[initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] second\s
\
- [initial(S.invokers_required) > 1 ? "Invokers Required: [initial(S.invokers_required)]
":""]\
- Component Requirement: "
+ var/scripture_text = "
[initial(S.name)]:"
+ if(!compact_scripture)
+ scripture_text += "
[initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] second\s\
+ [initial(S.invokers_required) > 1 ? "
Invokers Required: [initial(S.invokers_required)]":""]\
+
Component Requirement:"
for(var/i in req_comps)
if(req_comps[i])
- scripture_text += "[req_comps[i]] [get_component_acronym(i)] "
- for(var/a in cons_comps)
- if(cons_comps[a])
- scripture_text += "
Component Cost: "
- for(var/i in cons_comps)
- if(cons_comps[i])
- scripture_text += "[cons_comps[i]] [get_component_acronym(i)] "
- break //we want this to only show up if the scripture has a cost of some sort
- scripture_text += "
Tip: [initial(S.usage_tip)]
"
+ scripture_text += " [req_comps[i]] [get_component_acronym(i)]"
+ if(!compact_scripture)
+ for(var/a in cons_comps)
+ if(cons_comps[a])
+ scripture_text += "
Component Cost:"
+ for(var/i in cons_comps)
+ if(cons_comps[i])
+ scripture_text += " [cons_comps[i]] [get_component_acronym(i)]"
+ break //we want this to only show up if the scripture has a cost of some sort
+ scripture_text += "
Tip: [initial(S.usage_tip)]"
+ if(initial(S.quickbind))
+ scripture_text += "
[S == quickbind_slot_one || S == quickbind_slot_two ? "Currently Quickbound":\
+ "Quickbind to button One| Quickbind to button Two"]"
+ scripture_text += "
Recite
"
switch(initial_tier)
if(SCRIPTURE_DRIVER)
drivers += scripture_text
@@ -385,8 +389,11 @@
revenant += scripture_text
if(SCRIPTURE_JUDGEMENT)
judgement += scripture_text
- text_to_add += "[drivers]
[scripts]
[applications]
[revenant]
[judgement]
"
- text_to_add += "Purge all untruths and honor Ratvar."
+ if(compact_scripture)
+ text_to_add += "[drivers][scripts][applications][revenant][judgement]"
+ else
+ text_to_add += "[drivers][scripts][applications][revenant][judgement]"
+ text_to_add += "
Purge all untruths and honor Ratvar."
text += text_to_add
var/datum/browser/popup = new(user, "slab", "", 600, 500)
popup.set_content(text)
@@ -403,11 +410,49 @@
usr.unset_machine()
return 0
+ if(href_list["Recite"])
+ href_list["Recite"] = text2path(href_list["Recite"])
+ addtimer(src, "recite_scripture", 0, FALSE, href_list["Recite"], usr, FALSE)
+ return
+
+ if(href_list["Quickbindone"])
+ quickbind_to_one(href_list["Quickbindone"])
+
+ if(href_list["Quickbindtwo"])
+ quickbind_to_two(href_list["Quickbindtwo"])
+
if(href_list["hidetext"])
text_hidden = !text_hidden
+ if(href_list["compactscripture"])
+ compact_scripture = !compact_scripture
+
for(var/i in shown_scripture)
if(href_list[i])
shown_scripture[i] = !shown_scripture[i]
interact(usr)
+
+/obj/item/clockwork/slab/proc/quickbind_to_one(datum/clockwork_scripture/scripture) //takes a typepath(typecast for initial()) and binds it to slot 1
+ if(!ispath(scripture) && istext(scripture))
+ scripture = text2path(scripture) //if given as a href, the scripture will be a string and not a path. obviously, we need a path and not a string
+ if(!scripture || quickbind_slot_two == scripture)
+ return
+ quickbind_slot_one = scripture
+ for(var/datum/action/item_action/clock/quickbind_one/O in actions)
+ O.name = initial(quickbind_slot_one.name)
+ O.desc = initial(quickbind_slot_one.quickbind_desc)
+ O.button_icon_state = initial(quickbind_slot_one.name)
+ O.UpdateButtonIcon()
+
+/obj/item/clockwork/slab/proc/quickbind_to_two(datum/clockwork_scripture/scripture) //takes a typepath(typecast for initial()) and binds it to slot 2
+ if(!ispath(scripture) && istext(scripture))
+ scripture = text2path(scripture) //if given as a href, the scripture will be a string and not a path. obviously, we need a path and not a string
+ if(!scripture || quickbind_slot_one == scripture)
+ return
+ quickbind_slot_two = scripture
+ for(var/datum/action/item_action/clock/quickbind_two/O in actions)
+ O.name = initial(quickbind_slot_two.name)
+ O.desc = initial(quickbind_slot_two.quickbind_desc)
+ O.button_icon_state = initial(quickbind_slot_two.name)
+ O.UpdateButtonIcon()
diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm
index b4b639e3b92..515a7527482 100644
--- a/code/game/gamemodes/clock_cult/clock_scripture.dm
+++ b/code/game/gamemodes/clock_cult/clock_scripture.dm
@@ -25,6 +25,9 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
var/multiple_invokers_used = FALSE //If scripture requires more than one invoker
var/multiple_invokers_optional = FALSE //If scripture can have multiple invokers to bolster its effects
var/tier = SCRIPTURE_PERIPHERAL //The scripture's tier
+ var/quickbind = FALSE //if this scripture can be quickbound to a clockwork slab
+ var/quickbind_desc = "This shouldn't be quickbindable. File a bug report!"
+ var/primary_component
var/sort_priority = 1 //what position the scripture should have in a list of scripture. Should be based off of component costs/reqs, but you can't initial() lists.
//components the scripture used from a slab
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
index 411702a3bcb..cef59b408d7 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm
@@ -19,26 +19,32 @@
usage_tip = "It will remain after converting a target, unless that target has a mindshield implant, which it will break to convert them, but consume itself in the process."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
+ primary_component = BELLIGERENT_EYE
sort_priority = 1
+ quickbind = TRUE
+ quickbind_desc = "Creates a Sigil of Accession, which can convert a mindshielded non-Servant that remains on it."
//Vitality Matrix: Creates a sigil which will drain health from nonservants and can use that health to heal or even revive servants.
/datum/clockwork_scripture/create_object/vitality_matrix
descname = "Damage Trap"
name = "Vitality Matrix"
- desc = "Scribes a sigil beneath the invoker which drains life from any living non-servants that cross it. Servants that cross it, however, will be healed based on how much it drained from non-servants. \
- Dead servants can be revived by this sigil if it has enough stored vitality."
+ desc = "Scribes a sigil beneath the invoker which drains life from any living non-Servants that cross it. Servants that cross it, however, will be healed based on how much it drained from non-Servants. \
+ Dead Servants can be revived by this sigil if it has enough stored vitality."
invocations = list("Divinity...", "...steal their life...", "...for these shells!")
channel_time = 70
required_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 3, HIEROPHANT_ANSIBLE = 1)
consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 2, HIEROPHANT_ANSIBLE = 1)
whispered = TRUE
object_path = /obj/effect/clockwork/sigil/vitality
- creator_message = "A vitality matrix appears below you. It will drain life from non-servants and heal servants that cross it."
- usage_tip = "To revive a servant, the sigil must have 20 vitality plus the target servant's non-oxygen damage. It will still heal dead servants if it lacks the vitality to outright revive them."
+ creator_message = "A vitality matrix appears below you. It will drain life from non-Servants and heal Servants that cross it."
+ usage_tip = "To revive a Servant, the sigil must have 20 vitality plus the target Servant's non-oxygen damage. It will still heal dead Servants if it lacks the vitality to outright revive them."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
+ primary_component = VANGUARD_COGWHEEL
sort_priority = 2
+ quickbind = TRUE
+ quickbind_desc = "Creates a Vitality Matrix, which drains non-Servants on it to heal Servants that cross it."
//Memory Allocation: Finds a willing ghost and makes them into a clockwork marauders for the invoker.
@@ -55,6 +61,7 @@
consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, GUVAX_CAPACITOR = 2)
usage_tip = "Marauders are useful as personal bodyguards and frontline warriors, although they do little damage."
tier = SCRIPTURE_APPLICATION
+ primary_component = GUVAX_CAPACITOR
sort_priority = 3
/datum/clockwork_scripture/memory_allocation/check_special_requirements()
@@ -124,7 +131,10 @@
observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!"
usage_tip = "Useless without a soul vessel and should not be created without one."
tier = SCRIPTURE_APPLICATION
+ primary_component = REPLICANT_ALLOY
sort_priority = 4
+ quickbind = TRUE
+ quickbind_desc = "Creates a Fragment Shell, which produces an Anima Fragment when filled with a Soul Vessel."
//Sigil of Transmission: Creates a sigil of transmission that can store power for clockwork structures.
@@ -142,7 +152,10 @@
usage_tip = "Can be recharged by using Volt Void while standing on it."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
+ primary_component = HIEROPHANT_ANSIBLE
sort_priority = 5
+ quickbind = TRUE
+ quickbind_desc = "Creates a Sigil of Transmission, which stores power for clockwork structures."
//Interdiction Lens: Creates a powerful totem that disables radios and cameras and drains power into nearby sigils of transmission.
@@ -162,7 +175,10 @@
usage_tip = "If it fails to funnel power into a nearby Sigil of Transmission or the area's APC and fails to disable even one thing, it will disable itself for two minutes."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
+ primary_component = BELLIGERENT_EYE
sort_priority = 6
+ quickbind = TRUE
+ quickbind_desc = "Creates an Interdiction Lens, which drains power into nearby Sigils of Transmission."
//Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures and consume power or replicant alloy.
@@ -175,14 +191,17 @@
required_components = list(VANGUARD_COGWHEEL = 4, GUVAX_CAPACITOR = 1, REPLICANT_ALLOY = 1)
consumed_components = list(VANGUARD_COGWHEEL = 3, GUVAX_CAPACITOR = 1, REPLICANT_ALLOY = 1)
object_path = /obj/structure/destructible/clockwork/powered/mending_motor/prefilled
- creator_message = "You form a mending motor, which will consume power or replicant alloy to mend the wounds of mechanized servants."
+ creator_message = "You form a mending motor, which will consume power or replicant alloy to mend constructs and structures."
observer_message = "An onyx prism forms in midair and sprouts tendrils to support itself!"
invokers_required = 2
multiple_invokers_used = TRUE
usage_tip = "Powerful healing but power use is very inefficient, and its alloy use is little better."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
+ primary_component = VANGUARD_COGWHEEL
sort_priority = 7
+ quickbind = TRUE
+ quickbind_desc = "Creates a Mending Motor, which rapidly repairs constructs and structures at a power cost."
//Mania Motor: Creates a malevolent transmitter that will broadcast the whispers of Sevtug into the minds of nearby nonservants, causing a variety of mental effects at a power cost.
@@ -202,7 +221,10 @@
usage_tip = "Eligible human servants next to the motor will be converted at an additional power cost. It will also cure hallucinations and brain damage in nearby servants."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
+ primary_component = GUVAX_CAPACITOR
sort_priority = 8
+ quickbind = TRUE
+ quickbind_desc = "Creates a Mania Motor, which can convert adjacent non-Servants with power."
//Tinkerer's Daemon: Creates an efficient machine that rapidly produces components at a power cost.
@@ -221,6 +243,7 @@
usage_tip = "Vital to your success!"
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
+ primary_component = REPLICANT_ALLOY
sort_priority = 9
/datum/clockwork_scripture/create_object/tinkerers_daemon/check_special_requirements()
@@ -254,4 +277,7 @@
usage_tip = "Producing a gateway has a high power cost. Gateways to or between clockwork obelisks recieve double duration and uses."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
+ primary_component = HIEROPHANT_ANSIBLE
sort_priority = 10
+ quickbind = TRUE
+ quickbind_desc = "Creates a Clockwork Obelisk, which can send messages or open Spatial Gateways with power."
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
index a56431cae96..078a3c7a895 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
@@ -14,7 +14,10 @@
required_components = list(BELLIGERENT_EYE = 1)
usage_tip = "Useful for crowd control in a populated area and disrupting mass movement."
tier = SCRIPTURE_DRIVER
+ primary_component = BELLIGERENT_EYE
sort_priority = 1
+ quickbind = TRUE
+ quickbind_desc = "Forces nearby non-Servants to walk, doing minor damage with each chant.
Maximum 15 chants."
var/noncultist_damage = 2 //damage per chant to noncultists
var/cultist_damage = 8 //damage per chant to non-walking cultists
@@ -50,6 +53,7 @@
usage_tip = "The visor has a thirty-second cooldown once used, and the marker it creates has a delay of 3 seconds before exploding."
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
+ primary_component = BELLIGERENT_EYE
sort_priority = 2
@@ -64,7 +68,10 @@
required_components = list(VANGUARD_COGWHEEL = 1)
usage_tip = "You cannot reactivate Vanguard while still shielded by it."
tier = SCRIPTURE_DRIVER
+ primary_component = VANGUARD_COGWHEEL
sort_priority = 3
+ quickbind = TRUE
+ quickbind_desc = "Allows you to temporarily absorb stuns. All stuns absorbed will affect you when disabled."
/datum/clockwork_scripture/vanguard/check_special_requirements()
if(islist(invoker.stun_absorption) && invoker.stun_absorption["vanguard"] && invoker.stun_absorption["vanguard"]["end_time"] > world.time)
@@ -88,7 +95,10 @@
consumed_components = list(VANGUARD_COGWHEEL = 1)
usage_tip = "The Compromise is very fast to invoke, and will remove holy water from the target Servant."
tier = SCRIPTURE_DRIVER
+ primary_component = VANGUARD_COGWHEEL
sort_priority = 4
+ quickbind = TRUE
+ quickbind_desc = "Allows you to convert a Servant's brute and burn damage to half toxin damage.
Click your slab to disable."
slab_icon = "compromise"
ranged_type = /obj/effect/proc_holder/slab/compromise
ranged_message = "You charge the clockwork slab with healing power.\n\
@@ -107,7 +117,10 @@
required_components = list(GUVAX_CAPACITOR = 1)
usage_tip = "Is melee range and does not penetrate mindshield implants. Much more efficient than a Sigil of Submission at low Servant amounts."
tier = SCRIPTURE_DRIVER
+ primary_component = GUVAX_CAPACITOR
sort_priority = 5
+ quickbind = TRUE
+ quickbind_desc = "Allows you to bind and start converting an adjacent target non-Servant.
Click your slab to disable."
slab_icon = "guvax"
ranged_type = /obj/effect/proc_holder/slab/guvax
ranged_message = "You charge the clockwork slab with divine energy.\n\
@@ -176,7 +189,10 @@
consumed_components = list(GUVAX_CAPACITOR = 1)
usage_tip = "Useful for fleeing attackers, as few will be able to follow someone using this scripture."
tier = SCRIPTURE_DRIVER
+ primary_component = GUVAX_CAPACITOR
sort_priority = 6
+ quickbind = TRUE
+ quickbind_desc = "Weakens, confuses, and dizzies nearby non-servants, then allows some movement.
Maximum 5 chants."
var/flee_time = 47 //allow fleeing for 5 seconds
var/grace_period = 3 //very short grace period so you don't have to stop immediately
var/datum/progressbar/progbar
@@ -219,7 +235,10 @@
whispered = TRUE
usage_tip = "This is inefficient as a way to produce components, as the slab produced must be held by someone with no other slabs to produce components."
tier = SCRIPTURE_DRIVER
+ primary_component = REPLICANT_ALLOY
sort_priority = 7
+ quickbind = TRUE
+ quickbind_desc = "Creates a new Clockwork Slab."
/datum/clockwork_scripture/replicant/scripture_effects()
invoker << "You copy a piece of replicant alloy and command it into a new slab." //No visible message, for stealth purposes
@@ -243,7 +262,10 @@
usage_tip = "Slabs will draw components from the global cache after the slab's own repositories, making caches very efficient."
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
+ primary_component = REPLICANT_ALLOY
sort_priority = 8
+ quickbind = TRUE
+ quickbind_desc = "Creates a Tinkerer's Cache, which stores components globally for slab access."
/datum/clockwork_scripture/create_object/tinkerers_cache/New()
var/cache_cost_increase = min(round(clockwork_caches*0.2), 5)
@@ -270,6 +292,7 @@
usage_tip = "\"True sight\" means that you are able to see through walls and in darkness."
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
+ primary_component = HIEROPHANT_ANSIBLE
sort_priority = 9
@@ -288,4 +311,7 @@
usage_tip = "The sigil, while fairly powerful in its stun, does not induce muteness in its victim."
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
+ primary_component = HIEROPHANT_ANSIBLE
sort_priority = 10
+ quickbind = TRUE
+ quickbind_desc = "Creates a Sigil of Transgression, which will stun the first non-Servant to cross it."
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm
index c831fe8cc50..f9888e4cbc0 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_revenant.dm
@@ -13,6 +13,7 @@
consumed_components = list(VANGUARD_COGWHEEL = 6, GUVAX_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 3)
usage_tip = "Those affected by this scripture are only weak to things that outright destroy bodies, such as bombs or the singularity."
tier = SCRIPTURE_REVENANT
+ primary_component = VANGUARD_COGWHEEL
sort_priority = 2
/datum/clockwork_scripture/invoke_inathneq/check_special_requirements()
@@ -49,6 +50,7 @@
usage_tip = "Ocular wardens will become empowered, clockwork proselytizers will require no alloy, tinkerer's daemons will produce twice as quickly, \
and interdiction lenses, mending motors, mania motors, tinkerer's daemons, and clockwork obelisks will all require no power."
tier = SCRIPTURE_REVENANT
+ primary_component = REPLICANT_ALLOY
sort_priority = 3
invokers_required = 3
multiple_invokers_used = TRUE
@@ -106,6 +108,7 @@
usage_tip = "Causes brain damage, hallucinations, confusion, and dizziness in massive amounts."
tier = SCRIPTURE_REVENANT
sort_priority = 4
+ primary_component = GUVAX_CAPACITOR
invokers_required = 3
multiple_invokers_used = TRUE
var/list/mindbreaksayings = list("\"Oh, great. I get to shatter some minds.\"", "\"More minds to crush.\"", \
@@ -156,7 +159,6 @@
H << "[text2ratvar(pick(mindbreaksayings))]"
H.playsound_local(T, hum, visualsdistance, 1)
flash_color(H, flash_color="#AF0AAF", flash_time=visualsdistance*10)
- H.set_drugginess(visualsdistance + H.druggy)
H.dizziness = minordistance + H.dizziness
H.hallucination = minordistance + H.hallucination
H.confused = majordistance + H.confused
@@ -176,6 +178,7 @@
consumed_components = list(BELLIGERENT_EYE = 3, GUVAX_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 6)
usage_tip = "Struck targets will also be knocked down for about sixteen seconds."
tier = SCRIPTURE_REVENANT
+ primary_component = HIEROPHANT_ANSIBLE
sort_priority = 5
/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements()
diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
index 4803ce5cd0e..3e2bfa3c3ab 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm
@@ -18,11 +18,14 @@
tier = SCRIPTURE_SCRIPT
one_per_tile = TRUE
space_allowed = TRUE
+ primary_component = BELLIGERENT_EYE
sort_priority = 1
+ quickbind = TRUE
+ quickbind_desc = "Creates an Ocular Warden, which will automatically attack nearby unrestrained non-Servants that can see it."
/datum/clockwork_scripture/create_object/ocular_warden/check_special_requirements()
for(var/obj/structure/destructible/clockwork/ocular_warden/W in range(3, invoker))
- invoker << "You sense another ocular warden too near this location. Placing another this close would cause them to fight." //fluff message
+ invoker << "You sense another ocular warden too near this location. Placing another this close would cause them to fight." //fluff message
return FALSE
return ..()
@@ -41,7 +44,10 @@
observer_message = "The slab disgorges a puddle of black metal that contracts and forms into a strange shell!"
usage_tip = "Useless without a soul vessel and should not be created without one."
tier = SCRIPTURE_SCRIPT
+ primary_component = BELLIGERENT_EYE
sort_priority = 2
+ quickbind = TRUE
+ quickbind_desc = "Creates a Cogscarab Shell, which produces a Cogscarab when filled with a Soul Vessel."
//Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor.
@@ -58,7 +64,10 @@
tier = SCRIPTURE_SCRIPT
multiple_invokers_used = TRUE
multiple_invokers_optional = TRUE
+ primary_component = VANGUARD_COGWHEEL
sort_priority = 4
+ quickbind = TRUE
+ quickbind_desc = "Attempts to armor all nearby Servants with powerful Ratvarian armor."
/datum/clockwork_scripture/fellowship_armory/run_scripture()
for(var/mob/living/L in orange(1, get_turf(invoker)))
@@ -94,7 +103,10 @@
usage_tip = "This is not a primary conversion method - use Guvax for that. It is advantageous as a trap, however, as it will transmit the name of the newly-converted."
tier = SCRIPTURE_SCRIPT
one_per_tile = TRUE
+ primary_component = GUVAX_CAPACITOR
sort_priority = 5
+ quickbind = TRUE
+ quickbind_desc = "Creates a Sigil of Submission, which will convert one non-Servant that remains on it."
//Soul Vessel: Creates a soul vessel, which can seek a ghost or be used on the uncovered head of a dead or dying human to take their brain.
@@ -112,7 +124,10 @@
usage_tip = "The vessel can be used as a teleport target for Spatial Gateway, though it is generally better-used by placing it in a shell or cyborg body."
tier = SCRIPTURE_SCRIPT
space_allowed = TRUE
+ primary_component = GUVAX_CAPACITOR
sort_priority = 6
+ quickbind = TRUE
+ quickbind_desc = "Creates a Soul Vessel, which can be placed in construct shells and cyborg bodies once filled."
//Clockwork Proselytizer: Creates a clockwork proselytizer, used to convert objects and repair clockwork structures.
@@ -130,7 +145,10 @@
usage_tip = "Clockwork Walls cause nearby tinkerer's caches to generate components passively, making them a vital tool. Clockwork Floors heal toxin damage in Servants standing on them."
tier = SCRIPTURE_SCRIPT
space_allowed = TRUE
+ primary_component = REPLICANT_ALLOY
sort_priority = 7
+ quickbind = TRUE
+ quickbind_desc = "Creates a Clockwork Proselytizer, which can convert various objects to Ratvarian variants."
//Function Call: Grants the invoker the ability to call forth a Ratvarian spear that deals significant damage to silicons.
@@ -146,6 +164,7 @@
whispered = TRUE
usage_tip = "You can impale human targets with the spear by pulling them, then attacking. Throwing the spear at a mob will do massive damage and stun them, but break the spear."
tier = SCRIPTURE_SCRIPT
+ primary_component = REPLICANT_ALLOY
sort_priority = 8
/datum/clockwork_scripture/function_call/check_special_requirements()
@@ -212,7 +231,10 @@
multiple_invokers_optional = TRUE
usage_tip = "This gateway is strictly one-way and will only allow things through the invoker's portal."
tier = SCRIPTURE_SCRIPT
+ primary_component = HIEROPHANT_ANSIBLE
sort_priority = 9
+ quickbind = TRUE
+ quickbind_desc = "Allows you to create a one-way Spatial Gateway to a living Servant or Clockwork Obelisk."
/datum/clockwork_scripture/spatial_gateway/check_special_requirements()
if(!isturf(invoker.loc))
@@ -220,7 +242,7 @@
return FALSE
var/other_servants = 0
for(var/mob/living/L in living_mob_list)
- if(is_servant_of_ratvar(L) && !L.stat != DEAD)
+ if(is_servant_of_ratvar(L) && !L.stat && L != invoker)
other_servants++
for(var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/O in all_clockwork_objects)
other_servants++
@@ -254,13 +276,17 @@
consumed_components = list(GUVAX_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 1)
usage_tip = "If standing on a Sigil of Transmission, will transfer power to it. Augumented limbs will also be healed unless above a very high threshhold."
tier = SCRIPTURE_SCRIPT
+ primary_component = HIEROPHANT_ANSIBLE
sort_priority = 10
+ quickbind = TRUE
+ quickbind_desc = "Drains power from nearby objects. If standing on a Sigil of Transmission, gives it that power.
Maximum 30 chants."
var/total_power_drained = 0
var/power_damage_threshhold = 3000
var/augument_damage_threshhold = 6000
/datum/clockwork_scripture/channeled/volt_void/chant_effects(chant_number)
playsound(invoker, 'sound/effects/EMPulse.ogg', 50, 1)
+ PoolOrNew(/obj/effect/overlay/temp/ratvar/sigil/voltvoid, get_turf(invoker))
var/power_drained = 0
for(var/atom/movable/A in view(7, invoker))
power_drained += A.power_drain(TRUE)
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index b3a7d46def9..169307e9d98 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -340,6 +340,18 @@
animate(src, transform = matrix()*2, time = 5)
animate(transform = oldtransform, alpha = 0, time = 65)
+/obj/effect/overlay/temp/ratvar/sigil/voltvoid
+ color = "#EC8A2D"
+ layer = ABOVE_MOB_LAYER
+ duration = 10
+ luminosity = 3
+
+/obj/effect/overlay/temp/ratvar/sigil/voltvoid/New()
+ ..()
+ var/oldtransform = transform
+ animate(src, transform = matrix()*3, time = 1)
+ animate(transform = oldtransform, alpha = 0, time = 9)
+
/obj/effect/overlay/temp/ratvar/sigil/vitality
color = "#1E8CE1"
icon_state = "sigilactivepulse"
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 9e8bceda4d8..af6a75e2c6b 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ