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