You can now quickbind most Scripture to action buttons (#21379)

* You can now quickbind most Scripture to action buttons

* fixes

* short descs

* slow updating may be bad

* that'd be very bad

* no flickering

* center

* short&sweet

* fixes
This commit is contained in:
Joan Lung
2016-11-08 11:33:08 +13:00
committed by oranges
parent 2a8b848f9b
commit 3ecdd5b13c
11 changed files with 229 additions and 91 deletions
+8 -10
View File
@@ -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"
@@ -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)
@@ -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
@@ -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 <span class='brass'>Hierophant Network</span> 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.<br>"
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 <b>transfer</b> this slab's components into the target, the target's slab, or the global cache, respectively."
if(quickbind_slot_one)
user << "Quickbind button One: <span class='[get_component_span(initial(quickbind_slot_one.primary_component))]'>[initial(quickbind_slot_one.name)]</span>"
if(quickbind_slot_two)
user << "Quickbind button Two: <span class='[get_component_span(initial(quickbind_slot_two.primary_component))]'>[initial(quickbind_slot_two.name)]</span>"
if(clockwork_caches)
user << "<b>Stored components (with global cache):</b>"
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 << "<span class='warning'>You need to hold the slab in your active hand to recite scripture!</span>"
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 << "<span class='warning'>You need to hold the slab in your active hand to recite scripture!</span>"
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 << "<span class='warning'>You need to hold the slab in your active hand to recite scripture!</span>"
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 << "<span class='warning'>That section of scripture is still locked!</span>"
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 << "<span class='warning'>That scripture is no longer unlocked, and cannot be recited!</span>"
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 << "<span class='warning'>You need to hold the slab in your active hand to recite scripture!</span>"
return FALSE
var/list/tiers_of_scripture = scripture_unlock_check()
if(!ratvar_awakens && !no_cost && !tiers_of_scripture[initial(scripture.tier)])
user << "<span class='warning'>That scripture is no[delayed ? " longer":"t"] unlocked, and cannot be recited!</span>"
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 @@
<b><font color=#BE8700>Components</font></b>, fragments of the Justicar, from Reebe, and those Components can be used to draw power and material from Reebe through arcane chants \
known as <b><font color=#BE8700>Scripture</font></b>.<br><br>\
\
One component of a random type is produced in this slab every [production_text].<br>\
One component of a random type is made in this slab every [production_text].<br>\
<font color=#BE8700>Components</font> 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.<br>\
There are five types of component, and in general, <font color=#6E001A>Belligerent Eyes</font> are aggressive and judgemental, <font color=#1E8CE1>Vanguard Cogwheels</font> are defensive and \
@@ -327,31 +322,33 @@
to the invoker, or even, at one of the highest tiers, granting all nearby Servants temporary invulnerability.<br>\
However, the most important scripture is <font color=#AF0AAF>Guvax</font>, which allows you to convert heathens with relative ease.<br><br>\
\
The second function of the clockwork slab is <b><font color=#BE8700>Recollection</font></b>, which will display this guide.<br><br>\
The second function of the clockwork slab is <b><font color=#BE8700>Recollection</font></b>, which will display this guide and allows for the quickbinding and <font color=#BE8700>recital</font> \
of scripture.<br><br>\
\
The third to fifth functions are three buttons in the top left while holding the slab.<br>From left to right, they are:<br>\
<b><font color=#DAAA18>Hierophant Network</font></b>, which allows communication to other Servants.<br>\
<b><font color=#AF0AAF>Guvax</font></b>, which simply allows you to quickly invoke the Guvax Driver.<br>\
<b><font color=#1E8CE1>Vanguard</font></b>, which, like the Guvax button, simply allows you to quickly invoke the Vanguard Driver.<br><br>\
<b>Quickbind slot One</b>, currently set to <b><font color=[get_component_color_brightalloy(initial(quickbind_slot_one.primary_component))]>[initial(quickbind_slot_one.name)]</font></b>.<br>\
<b>Quickbind slot Two</b>, currently set to <b><font color=[get_component_color_brightalloy(initial(quickbind_slot_two.primary_component))]>[initial(quickbind_slot_two.name)]</font></b>.<br><br>\
\
Examine the slab to check the number of components it has available.<br><br>\
\
<center><font size=1><A href='?src=\ref[src];hidetext=1'>Hide Above Information</A></font></center><br>"
text += "A complete list of scripture, its effects, and its requirements can be found below.<br>\
Key:<br>"
text += "A complete list of scripture, its effects, and its requirements can be found, and thus <b>Quickbound</b> to this slab, below.<br>\
<font size=1>Key:<br>"
for(var/i in clockwork_component_cache)
text += "<font color=[get_component_color_brightalloy(i)]>[get_component_acronym(i)]</font> = [get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]<br>"
text += "<b><font color=[get_component_color_brightalloy(i)]>[get_component_acronym(i)]</font></b> = [get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]<br>"
text += "</font><br><center><font size=1><A href='?src=\ref[src];compactscripture=1'>Compact Scripture Text: [compact_scripture ? "ON":"OFF"]</A></font></center><br>"
var/text_to_add = ""
var/drivers = "<br><font size=3><b><A href='?src=\ref[src];Driver=1'>[SCRIPTURE_DRIVER]</A></b></font><br><i>These scriptures are always unlocked.</i><br>"
var/scripts = "<br><font size=3><b><A href='?src=\ref[src];Script=1'>[SCRIPTURE_SCRIPT]</A></b></font><br><i>These scriptures require at least <b>5</b> Servants and \
<b>1</b> Tinkerer's Cache.</i><br>"
var/applications = "<br><font size=3><b><A href='?src=\ref[src];Application=1'>[SCRIPTURE_APPLICATION]</A></b></font><br><i>These scriptures require at least <b>8</b> Servants, \
<b>3</b> Tinkerer's Caches, and <b>100CV</b>.</i><br>"
var/revenant = "<br><font size=3><b><A href='?src=\ref[src];Revenant=1'>[SCRIPTURE_REVENANT]</A></b></font><br><i>These scriptures require at least <b>10</b> Servants, \
<b>4</b> Tinkerer's Caches, and <b>200CV</b>.</i><br>"
var/judgement = "<br><font size=3><b><A href='?src=\ref[src];Judgement=1'>[SCRIPTURE_JUDGEMENT]</A></b></font><br><i>This scripture requires at least <b>12</b> Servants, \
<b>5</b> Tinkerer's Caches, and <b>300CV</b>.<br>In addition, there may not be any active non-Servant AIs.</i><br>"
var/drivers = "<br><b><A href='?src=\ref[src];Driver=1'>[SCRIPTURE_DRIVER]</A></b><br><font size=1><i>These scriptures are always unlocked.</i>[compact_scripture ? "":"</font>"]<br>"
var/scripts = "<br><b><A href='?src=\ref[src];Script=1'>[SCRIPTURE_SCRIPT]</A></b><br><font size=1><i>These scriptures require at least <b>5</b> Servants and \
<b>1</b> Tinkerer's Cache.</i>[compact_scripture ? "":"</font>"]<br>"
var/applications = "<br><b><A href='?src=\ref[src];Application=1'>[SCRIPTURE_APPLICATION]</A></b><br><font size=1><i>These scriptures require at least <b>8</b> Servants, \
<b>3</b> Tinkerer's Caches, and <b>100CV</b>.</i>[compact_scripture ? "":"</font>"]<br>"
var/revenant = "<br><b><A href='?src=\ref[src];Revenant=1'>[SCRIPTURE_REVENANT]</A></b><br><font size=1><i>These scriptures require at least <b>10</b> Servants, \
<b>4</b> Tinkerer's Caches, and <b>200CV</b>.</i>[compact_scripture ? "":"</font>"]<br>"
var/judgement = "<br><b><A href='?src=\ref[src];Judgement=1'>[SCRIPTURE_JUDGEMENT]</A></b><br><font size=1><i>This scripture requires at least <b>12</b> Servants, \
<b>5</b> Tinkerer's Caches, and <b>300CV</b>.<br>In addition, there may not be any active non-Servant AIs.</i>[compact_scripture ? "":"</font>"]<br>"
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 = "<br><b><font color=#BE8700>[initial(S.name)]</font>:</b><br>[initial(S.desc)]<br><b>Invocation Time:</b> <b>[initial(S.channel_time) / 10]</b> second\s<br>\
[initial(S.invokers_required) > 1 ? "<b>Invokers Required:</b> <b>[initial(S.invokers_required)]</b><br>":""]\
<b>Component Requirement: </b>"
var/scripture_text = "<br><b><font color=[get_component_color_brightalloy(initial(S.primary_component))]>[initial(S.name)]</font>:</b>"
if(!compact_scripture)
scripture_text += "<br>[initial(S.desc)]<br><b>Invocation Time:</b> <b>[initial(S.channel_time) / 10]</b> second\s\
[initial(S.invokers_required) > 1 ? "<br><b>Invokers Required:</b> <b>[initial(S.invokers_required)]</b>":""]\
<br><b>Component Requirement:</b>"
for(var/i in req_comps)
if(req_comps[i])
scripture_text += "<font color=[get_component_color_brightalloy(i)]><b>[req_comps[i]]</b> [get_component_acronym(i)]</font> "
for(var/a in cons_comps)
if(cons_comps[a])
scripture_text += "<br><b>Component Cost:</b> "
for(var/i in cons_comps)
if(cons_comps[i])
scripture_text += "<font color=[get_component_color_brightalloy(i)]><b>[cons_comps[i]]</b> [get_component_acronym(i)]</font> "
break //we want this to only show up if the scripture has a cost of some sort
scripture_text += "<br><b>Tip:</b> [initial(S.usage_tip)]<br>"
scripture_text += " <font color=[get_component_color_brightalloy(i)]><b>[req_comps[i]]</b> [get_component_acronym(i)]</font>"
if(!compact_scripture)
for(var/a in cons_comps)
if(cons_comps[a])
scripture_text += "<br><b>Component Cost:</b>"
for(var/i in cons_comps)
if(cons_comps[i])
scripture_text += " <font color=[get_component_color_brightalloy(i)]><b>[cons_comps[i]]</b> [get_component_acronym(i)]</font>"
break //we want this to only show up if the scripture has a cost of some sort
scripture_text += "<br><b>Tip:</b> [initial(S.usage_tip)]"
if(initial(S.quickbind))
scripture_text += "<br><font color=#BE8700 size=1>[S == quickbind_slot_one || S == quickbind_slot_two ? "Currently Quickbound":\
"<A href='?src=\ref[src];Quickbindone=[S]'>Quickbind to button One</A>| <A href='?src=\ref[src];Quickbindtwo=[S]'>Quickbind to button Two</A>"]</font>"
scripture_text += "<br><b><A href='?src=\ref[src];Recite=[S]'>Recite</A></b><br>"
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]<br>[scripts]<br>[applications]<br>[revenant]<br>[judgement]<br>"
text_to_add += "<font color=#BE8700 size=3><b><center>Purge all untruths and honor Ratvar.</center></b></font>"
if(compact_scripture)
text_to_add += "[drivers]</font>[scripts]</font>[applications]</font>[revenant]</font>[judgement]</font>"
else
text_to_add += "[drivers][scripts][applications][revenant][judgement]"
text_to_add += "<br><font color=#BE8700 size=3><b><center>Purge all untruths and honor Ratvar.</center></b></font>"
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()
@@ -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
@@ -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 = "<span class='brass'>A vitality matrix appears below you. It will drain life from non-servants and heal servants that cross it.</span>"
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 = "<span class='brass'>A vitality matrix appears below you. It will drain life from non-Servants and heal Servants that cross it.</span>"
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 = "<span class='warning'>The slab disgorges a puddle of black metal that expands and forms into a strange shell!</span>"
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 = "<span class='brass'>You form a mending motor, which will consume power or replicant alloy to mend the wounds of mechanized servants.</span>"
creator_message = "<span class='brass'>You form a mending motor, which will consume power or replicant alloy to mend constructs and structures.</span>"
observer_message = "<span class='warning'>An onyx prism forms in midair and sprouts tendrils to support itself!</span>"
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."
@@ -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.<br><b>Maximum 15 chants.</b>"
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.<br><b>Click your slab to disable.</b>"
slab_icon = "compromise"
ranged_type = /obj/effect/proc_holder/slab/compromise
ranged_message = "<span class='inathneq_small'><i>You charge the clockwork slab with healing power.</i>\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.<br><b>Click your slab to disable.</b>"
slab_icon = "guvax"
ranged_type = /obj/effect/proc_holder/slab/guvax
ranged_message = "<span class='sevtug_small'><i>You charge the clockwork slab with divine energy.</i>\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.<br><b>Maximum 5 chants.</b>"
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 << "<span class='brass'>You copy a piece of replicant alloy and command it into a new slab.</span>" //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."
@@ -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 << "<span class='sevtug'>[text2ratvar(pick(mindbreaksayings))]</span>"
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()
@@ -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 << "<span class='alloy'>You sense another ocular warden too near this location. Placing another this close would cause them to fight.</span>" //fluff message
invoker << "<span class='neovgre'>You sense another ocular warden too near this location. Placing another this close would cause them to fight.</span>" //fluff message
return FALSE
return ..()
@@ -41,7 +44,10 @@
observer_message = "<span class='warning'>The slab disgorges a puddle of black metal that contracts and forms into a strange shell!</span>"
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.<br><b>Maximum 30 chants.</b>"
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)
+12
View File
@@ -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"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 149 KiB