Adds the Clockwork Obelisk, Mania Motor, and Vitality Matrix

This commit is contained in:
Joan Lung
2016-06-05 18:45:32 -04:00
parent 18051803ba
commit f64e687250
13 changed files with 778 additions and 268 deletions
+2 -2
View File
@@ -105,10 +105,10 @@ This file's folder contains:
S.show_laws()
return 1
/proc/send_hierophant_message(mob/user, message)
/proc/send_hierophant_message(mob/user, message, large)
if(!user || !message || !ticker || !ticker.mode)
return 0
var/parsed_message = "<span class='heavy_brass'>Servant [user.name == user.real_name ? user.name : "[user.real_name] (as [user.name])"]: </span><span class='brass'>\"[message]\"</span>"
var/parsed_message = "<span class='[large ? "big_brass":"heavy_brass"]'>Servant [user.name == user.real_name ? user.name : "[user.real_name] (as [user.name])"]: </span><span class='[large ? "large_brass":"brass"]'>\"[message]\"</span>"
for(var/M in mob_list)
if(isobserver(M))
var/link = FOLLOW_LINK(M, user)
+32 -25
View File
@@ -239,51 +239,51 @@
drivers += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Cost: </b>\
[req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
[req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
[req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
[req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
[req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.<br>\
[req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] belligerent eyes" : ""] \
[req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] vanguard cogwheels" : ""] \
[req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] guvax capacitors" : ""] \
[req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] replicant alloys" : "no"] \
[req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] hierophant ansibles" : "no"]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_SCRIPT)
scripts += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Cost: </b>\
[req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
[req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
[req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
[req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
[req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.<br>\
[req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] belligerent eyes" : ""] \
[req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] vanguard cogwheels" : ""] \
[req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] guvax capacitors" : ""] \
[req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] replicant alloys" : "no"] \
[req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] hierophant ansibles" : "no"]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_APPLICATION)
applications += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Cost: </b>\
[req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
[req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
[req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
[req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
[req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.<br>\
[req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] belligerent eyes" : ""] \
[req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] vanguard cogwheels" : ""] \
[req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] guvax capacitors" : ""] \
[req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] replicant alloys" : "no"] \
[req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] hierophant ansibles" : "no"]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_REVENANT)
revenant += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Cost: </b>\
[req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
[req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
[req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
[req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
[req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.<br>\
[req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] belligerent eyes" : ""] \
[req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] vanguard cogwheels" : ""] \
[req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] guvax capacitors" : ""] \
[req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] replicant alloys" : "no"] \
[req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] hierophant ansibles" : "no"]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
if(SCRIPTURE_JUDGEMENT)
judgement += "<br><b>[initial(S.name)]:</b> [initial(S.desc)]<br><b>Invocation Time:</b> [initial(S.channel_time) / 10] seconds<br>\
\
<b>Component Cost: </b>\
[req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \
[req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \
[req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \
[req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \
[req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.<br>\
[req_comps["belligerent_eye"] ? "[req_comps["belligerent_eye"]] belligerent eyes" : ""] \
[req_comps["vanguard_cogwheel"] ? "[req_comps["vanguard_cogwheel"]] vanguard cogwheels" : ""] \
[req_comps["guvax_capacitor"] ? "[req_comps["guvax_capacitor"]] guvax capacitors" : ""] \
[req_comps["replicant_alloy"] ? "[req_comps["replicant_alloy"]] replicant alloys" : "no"] \
[req_comps["hierophant_ansible"] ? "[req_comps["hierophant_ansible"]] hierophant ansibles" : "no"]<br>\
<b>Tip:</b> [initial(S.usage_tip)]<br>"
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>"
@@ -896,6 +896,13 @@
cultist_message = "\"Try not to lose your mind - I'll need it. Heh heh...\""
servant_of_ratvar_messages = list("\"Disgusting.\"", "\"Well, aren't you an inquisitive fellow?\"", "A foul presence pervades your mind, then vanishes.", "\"The fact that Ratvar has to depend on simpletons like you is appalling.\"")
/obj/item/clockwork/component/guvax_capacitor/antennae
name = "mania motor antennae"
desc = "A pair of dented antennae. They constantly emit a static hiss."
icon_state = "mania_motor_antennae"
cultist_message = "Your head is filled with a burst of static."
servant_of_ratvar_messages = list("\"Jub oebxr guvf.\"", "\"Qvq lbh oernx gurfr bss LBHEFRYS?\"", "\"Jul qvq jr tvir guvf gb fhpu fvzcyrgbaf, naljnl?\"", "\"Ng yrnfg jr pna hfr gur'fr sbe fbzrguvat - hayvxr lbh.\"")
/obj/item/clockwork/component/replicant_alloy
name = "replicant alloy"
desc = "A seemingly strong but very malleable chunk of metal. It seems as though it wants to be molded into something greater."
+165 -80
View File
@@ -140,6 +140,13 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
var/object_path = /obj/item/clockwork //The path of the object created
var/creator_message = "<span class='brass'>You create a meme.</span>" //Shown to the invoker
var/observer_message
var/one_per_tile = FALSE
/datum/clockwork_scripture/create_object/check_special_requirements()
if(one_per_tile && (locate(object_path) in get_turf(invoker)))
invoker << "<span class='warning'>You can only place one of this object on each tile!</span>"
return 0
return 1
/datum/clockwork_scripture/create_object/scripture_effects()
if(creator_message && observer_message)
@@ -221,6 +228,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
creator_message = "<span class='brass'>A sigil silently appears below you. The next non-servant to cross it will be immobilized.</span>"
usage_tip = "The sigil, while fairly powerful in its stun, does not induce muteness in its victim."
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
@@ -329,6 +337,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
creator_message = "<span class='brass'>A sigil appears below you. The next non-servant to cross it will be enslaved after a brief time if they do not move.</span>"
usage_tip = "This should not be your 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_DRIVER
one_per_tile = TRUE
@@ -363,6 +372,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
observer_message = "<span class='warning'>A hollow brass spire rises and begins to blaze!</span>"
usage_tip = "Slabs will draw components from the global cache before the slab's own repositories, making caches very efficient."
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
@@ -371,8 +381,8 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
desc = "Fabricates a pair of glasses that provides true sight but quickly damage vision."
invocations = list("Y'vsg gur fpnyrf sebz zl rl-rf.")
channel_time = 0
required_components = list("hierophant_ansible" = 1)
consumed_components = list("hierophant_ansible" = 2)
required_components = list("hierophant_ansible" = 2)
consumed_components = list("hierophant_ansible" = 1)
whispered = TRUE
object_path = /obj/item/clothing/glasses/wraith_spectacles
creator_message = "<span class='brass'>You form a pair of wraith spectacles, which will grant true sight when worn.</span>"
@@ -408,18 +418,22 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
observer_message = "<span class='warning'>A brass eye takes shape and slowly rises into the air, its red iris glaring!</span>"
usage_tip = "Although powerful, the warden is very weak and should optimally be placed behind barricades."
tier = SCRIPTURE_SCRIPT
one_per_tile = TRUE
/datum/clockwork_scripture/channeled/volt_void //Volt Void: Channeled for up to thirty times over thirty seconds. Consumes power from most power storages and deals slight burn damage to the invoker.
name = "Volt Void" //Alternative name: "On all levels but physical, I am a power sink"
desc = "Drains energy from nearby power sources, dealing slight fire damage depending on power consumed. Channeled every second for a maximum of thirty seconds."
desc = "Drains energy from nearby power sources, dealing if the total power consumed is above a threshhold. Channeled every second for a maximum of thirty seconds."
chant_invocation = "Qenj punetr gb guvf furyy!"
chant_amount = 30
chant_interval = 10
required_components = list("belligerent_eye" = 1, "hierophant_ansible" = 1)
usage_tip = "Very powerful against cyborgs and can drain a power cell in seconds."
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
var/total_power_drained = 0
var/power_damage_threshhold = 2000
var/augument_damage_threshhold = 5000
/datum/clockwork_scripture/channeled/volt_void/chant_effects()
playsound(invoker, 'sound/effects/EMPulse.ogg', 50, 1)
@@ -428,15 +442,15 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
if(A.cell.charge)
playsound(A, "sparks", 50, 1)
flick("apc-spark", A)
power_drained += min(A.cell.charge, 500)
A.cell.charge = max(0, A.cell.charge - 500) //Better than a power sink!
power_drained += 500
if(!A.cell.charge && !A.shorted)
A.shorted = 1
A.visible_message("<span class='warning'>The [A.name]'s screen blurs with static.</span>")
for(var/obj/machinery/power/smes/S in view(7, invoker))
if(S.charge)
S.charge = max(0, S.charge - 200)
power_drained += 200
power_drained += min(S.charge, 500)
S.charge = max(0, S.charge - 500)
if(!S.charge && !S.panel_open)
S.panel_open = TRUE
S.update_icon()
@@ -445,22 +459,46 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
spks.start()
qdel(spks)
S.visible_message("<span class='warning'>[S]'s panel flies open with a flurry of sparks.</span>")
for(var/obj/item/weapon/stock_parts/cell/C in view(7, invoker))
if(C.charge)
power_drained += min(C.charge, 100)
C.charge = C.use(max(0, C.charge - 100))
for(var/obj/machinery/light/L in view(7, invoker))
playsound(L, 'sound/effects/light_flicker.ogg', 50, 1)
L.flicker(2)
power_drained += 5
power_drained += 25
for(var/mob/living/silicon/robot/R in view(7, invoker))
if(!is_servant_of_ratvar(R) && R.cell.charge)
power_drained += min(R.cell.charge, 500)
R.cell.charge = max(0, R.cell.charge - 500)
R << "<span class='userdanger'>ERROR: Power loss detected!</span>"
var/datum/effect_system/spark_spread/spks = new(get_turf(R))
spks.set_up(3, 0, get_turf(R))
spks.start()
qdel(spks)
power_drained += 500
if(power_drained)
var/obj/effect/clockwork/sigil/transmission/ST = locate(/obj/effect/clockwork/sigil/transmission) in get_turf(invoker)
if(ST && power_drained >= 50)
var/sigil_drain = 0
while(power_drained >= 50)
ST.modify_charge(-50)
power_drained -= 50
sigil_drain += 10
power_drained += sigil_drain //readd part of the power given to the sigil to the power drained this cycle
ST.visible_message("<span class='warning'>[ST] flares a brilliant orange!</span>")
total_power_drained += power_drained
if(power_drained >= 100 && total_power_drained >= power_damage_threshhold)
var/power_damage = power_drained * 0.01
invoker.visible_message("<span class='warning'>[invoker] flares a brilliant orange!</span>", "<span class='warning'>You feel the warmth of electricity running into your body.</span>")
invoker.adjustFireLoss(power_drained / 200) //One point of burn damage for every (approximate) 200W drained - can be fatal if not careful
if(ishuman(invoker))
var/mob/living/carbon/human/H = invoker
for(var/X in H.bodyparts)
var/obj/item/bodypart/BP = X
if(ratvar_awakens || total_power_drained < augument_damage_threshhold) //if ratvar is alive, it won't damage and will always heal augumented limbs
BP.heal_damage(power_damage, power_damage, 1) //heals one point of burn and brute for every ~100W drained on augumented limbs
else
BP.take_damage(0, power_damage)
else if(isanimal(invoker))
var/mob/living/simple_animal/A = invoker
A.adjustHealth(-power_damage) //if a simple animal is using volt void, just heal it
return 1
@@ -504,7 +542,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/function_call //Function Call: Grants the invoker the ability to call forth a Ratvarian spear that deals significant damage to silicons.
name = "Function Call"
desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear that will deal significant damage to Nar-Sie's dogs in addition to silicon lifeforms. \
It will vanish several minutes after being called."
It will vanish five minutes after being called."
invocations = list("Tenag zr...", "...gur zvtug-bs oenff!")
channel_time = 20
required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1)
@@ -535,16 +573,18 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
required_components = list("replicant_alloy" = 1, "hierophant_ansible" = 1)
multiple_invokers_used = TRUE
multiple_invokers_optional = TRUE
usage_tip = "The gateway is strictly one-way and will only allow things through the invoker's portal."
usage_tip = "This gateway is strictly one-way and will only allow things through the invoker's portal."
tier = SCRIPTURE_SCRIPT
/datum/clockwork_scripture/spatial_gateway/check_special_requirements()
var/other_servants = 0
for(var/mob/living/L in living_mob_list)
if(L.z == invoker.z && is_servant_of_ratvar(L) && !L.stat != DEAD)
if(is_servant_of_ratvar(L) && !L.stat != DEAD)
other_servants++
for(var/obj/structure/clockwork/powered/clockwork_obelisk/O in all_clockwork_objects)
other_servants++
if(!other_servants)
invoker << "<span class='warning'>There are no other conscious servants on your z-level!</span>"
invoker << "<span class='warning'>There are no other servants or clockwork obelisks!</span>"
return 0
return 1
@@ -558,25 +598,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
if(ratvar_awakens)
portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned
duration = max(duration, 30)
var/list/possible_servants = list()
for(var/mob/living/L in living_mob_list)
if(!L.stat && is_servant_of_ratvar(L) && !L.Adjacent(invoker) && L != invoker) //People right next to the invoker can't be portaled to, for obvious reasons
possible_servants += L
if(!possible_servants.len)
invoker << "<span class='warning'>There are no other eligible servants for teleportation!</span>"
return 0
var/mob/living/chosen_servant = input(invoker, "Choose a servant to form a rift to.", "Spatial Gateway") as null|anything in possible_servants
if(!chosen_servant || !invoker.canUseTopic(slab))
return 0
invoker.visible_message("<span class='warning'>The air in front of [invoker] ripples before suddenly tearing open!</span>", \
"<span class='brass'>With a word, you rip open a one-way rift to [chosen_servant]. It will last for [duration / 10] seconds and has [portal_uses] use[portal_uses > 1 ? "s" : ""].</span>")
var/obj/effect/clockwork/spatial_gateway/S1 = new(get_step(invoker, invoker.dir))
var/obj/effect/clockwork/spatial_gateway/S2 = new(get_step(chosen_servant, chosen_servant.dir))
//Set up the portals now that they've spawned
S1.setup_gateway(S2, duration, portal_uses)
S2.visible_message("<span class='warning'>The air in front of [chosen_servant] ripples before suddenly tearing open!</span>")
return 1
invoker.procure_gateway(invoker, duration, portal_uses)
@@ -594,11 +616,11 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/break_will //Break Will: Deals minor brain damage and destroys the loyalty implants of nearby humans
name = "Break Will"
/datum/clockwork_scripture/dementia_doctrine //Dementia Doctrine: Deals minor brain damage and destroys the loyalty implants of nearby humans
name = "Dementia Doctrine"
desc = "Deals minor brain damage and disables loyalty implants of everyone adjacent to the invoker."
invocations = list("Lbh ner jrnx.", "Lbh ner nyernql qrnq.", "Gurl jba'g fnir lbh.")
channel_time = 30
invocations = list("Lbh ner jrnx.", "Lbh jvyy or uvf.", "Gurl jba'g fnir lbh - gurl'yy xvyy lbh.")
channel_time = 20
required_components = list("belligerent_eye" = 1, "guvax_capacitor" = 1)
usage_tip = "Extremely fast invocation time."
tier = SCRIPTURE_SCRIPT
@@ -607,10 +629,10 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
for(var/mob/living/carbon/human/H in range(1, invoker))
if(is_servant_of_ratvar(H))
continue
H.adjustBrainLoss(10)
if(isloyal(H))
H.visible_message("<span class='warning'>[H] visibly trembles!</span>", \
"<span class='userdanger'>The words invoke a horrible fear deep in your being. Your loyalty to Nanotrasen falls away as you see how weak they truly are.</span>")
H.adjustBrainLoss(5)
"<span class='sevtug'>Ohg jr pna cerirag gun'g. Jr pna znxr lbh zvar-naq-uvf.</span>")
for(var/obj/item/weapon/implant/loyalty/L in H)
if(L.implanted)
qdel(L)
@@ -636,16 +658,32 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/create_object/sigil_of_transmission
name = "Sigil of Transmission"
desc = "Scribes an almost-invisible sigil below the invoker. This sigil will transmit anything it hears over the hierophant network."
invocations = list("Qvivavgl...", "...hairvy gurgehgu!")
desc = "Scribes a sigil beneath the invoker which stores power to power clockwork structures."
invocations = list("Qvivavgl...", "punetr gurznpuvarf!")
channel_time = 50
required_components = list("belligerent_eye" = 1, "replicant_alloy" = 2, "hierophant_ansible" = 2)
whispered = TRUE
object_path = /obj/effect/clockwork/sigil/transmission
creator_message = "<span class='brass'>A sigil silently appears below you. It will automatically power clockwork structures adjecent to it.</span>"
usage_tip = "Can be recharged by using Volt Void while standing on it."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
/datum/clockwork_scripture/create_object/vitality_matrix
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."
invocations = list("Qvivavgl...", "fgrny gur've yvsr...", "sbe guv'f furyy!")
channel_time = 50
required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 3, "hierophant_ansible" = 1)
whispered = TRUE
object_path = /obj/effect/clockwork/sigil/transmission
creator_message = "<span class='brass'>A sigil silently appears below you. It will automatically transmit anything it hears over the hierophant network.</span>"
usage_tip = "Useful for eavesdropping or monitoring certain areas."
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 50 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
/datum/clockwork_scripture/memory_allocation //Memory Allocation: Finds a willing ghost and makes them into a clockwork marauders for the invoker.
@@ -748,32 +786,69 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/create_object/interdiction_lens //Interdiction Lens: Creates a powerful obelisk that can perform a variety of powerful sabotages every five minutes.
name = "Interdiction Lens"
desc = "Creates a clockwork totem that can sabotage a variety of mechanical apparatus. Requires a lengthy recharge between uses."
invocations = list("Znl guvf boryvfx...", "...fuebhq gur snyfr fhaf!")
invocations = list("Znl guvf gbgrz...", "...fuebhq gur snyfr fhaf!")
channel_time = 60
required_components = list("belligerent_eye" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 3)
object_path = /obj/structure/clockwork/interdiction_lens
object_path = /obj/structure/clockwork/powered/interdiction_lens
creator_message = "<span class='brass'>You form an interdiction lens, which can disrupt machinery every few minutes.</span>"
observer_message = "<span class='warning'>A brass obelisk rises from the ground, a purple gem appearing in its center!</span>"
invokers_required = 2
multiple_invokers_used = TRUE
usage_tip = "Can disrupt telecommunications, disable all cameras, or disable all cyborgs."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
/datum/clockwork_scripture/create_object/mending_motor //Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures and consume replicant alloy.
name = "Mending Motor"
desc = "Creates a mechanized prism that will rapidly repair damage to clockwork creatures, converted cyborgs, and clockwork structures. Requires replicant alloy to function."
invocations = list("Znl guvf boryvfx...", "...zraq bhe qragf naq fpengpurf!")
desc = "Creates a mechanized prism that will rapidly repair damage to clockwork creatures, converted cyborgs, and clockwork structures. Requires replicant alloy or power to function."
invocations = list("Znl guvf cevfz...", "...zraq bhe qragf naq fpengpurf!")
channel_time = 60
required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "replicant_alloy" = 3)
object_path = /obj/structure/clockwork/mending_motor/prefilled
creator_message = "<span class='brass'>You form a mending motor, which will consume replicant alloy to mend the wounds of mechanized servants.</span>"
object_path = /obj/structure/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>"
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 somewhat inefficient."
usage_tip = "Powerful healing but power use is very inefficient, and its alloy use is little better."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
/datum/clockwork_scripture/create_object/clockwork_obelisk //Clockwork Obelisk: Creates a powerful obelisk that can be used to broadcast messages or open a gateway to any servant or clockwork obelisk.
name = "Clockwork Obelisk"
desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spacial Gateway to any living servant or clockwork obelisk."
invocations = list("Znl guvf boryvfx...", "...gnxr hf gb nyy cynprf!")
channel_time = 60
required_components = list("guvax_capacitor" = 1, "replicant_alloy" = 3, "hierophant_ansible" = 1)
object_path = /obj/structure/clockwork/powered/clockwork_obelisk
creator_message = "<span class='brass'>You form a clockwork obelisk which can broadcast messages or produce Spacial Gateways.</span>"
observer_message = "<span class='warning'>A brass obelisk appears handing in midair!</span>"
invokers_required = 2
multiple_invokers_used = TRUE
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
/datum/clockwork_scripture/create_object/mania_motor //Mania Motor: Creates a powerful obelisk that can be used to broadcast messages or open a gateway to any servant or clockwork obelisk.
name = "Mania Motor"
desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-servant humans. It will also try to convert humans directly adjecent to the motor."
invocations = list("Znl guvf genafzvggre...", "...oernx gur jvyy bs nyy jub bccbfr hf!")
channel_time = 60
required_components = list("guvax_capacitor" = 1, "replicant_alloy" = 3, "hierophant_ansible" = 1)
object_path = /obj/structure/clockwork/powered/mania_motor
creator_message = "<span class='brass'>You form a mania motor which will cause brain damage and hallucinations in nearby humans while active.</span>"
observer_message = "<span class='warning'>A two-pronged machine rises from the ground!</span>"
invokers_required = 2
multiple_invokers_used = TRUE
usage_tip = "Eligible human servants next to the motor will be converted at an additonal power cost. It will also cure hallucinations and brain damage in nearby servants."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
@@ -800,18 +875,19 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
invocations = list("V pnyy hcba lbh, Nezbere!!", "Yrg lbhe znpuv'angvbaf ervta ba guvf zvfrenoyr fgng'vba!!", "Yrg lbhe cbjre sybj gueb-htu gur gbbyf bs lbhe znfgre!!")
channel_time = 150
required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 6)
usage_tip = "Ocular wardens will become empowered, clockwork proselytizers will require no alloy, tinkerer's daemons will produce twice as quickly, and mending motors will require no alloy."
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, and clockwork obelisks will all require no power."
tier = SCRIPTURE_REVENANT
/datum/clockwork_scripture/invoke_nezbere/check_special_requirements()
if(ratvar_awakens)
invoker << "<span class='heavy_brass'>\"Bhe znfgre vf urer nyernql. Lbh qb abg erdhver zl uryc, sevraq.\"</span>\n\
<span class='warning'>Nezbere will not grant his power while Ratvar's dwarfs his own!</span>"
return 0
if(clockwork_generals_invoked["nezbere"])
invoker << "<span class='heavy_brass'>\"Abg whfg lrg, sevraq. Cngvrapr vf n iveghr.\"</span>\n\
<span class='warning'>Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon.</span>"
return 0
if(ratvar_awakens)
invoker << "<span class='heavy_brass'>\"Bhe znfgre vf urer nyernql. Lbh qb abg erdhver zl uryc, sevraq.\"</span>\n\
<span class='warning'>Nezbere will not grant his power while Ratvar's dwarfs his own!</span>"
return 0
return 1
/datum/clockwork_scripture/invoke_nezbere/scripture_effects()
@@ -825,8 +901,8 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
P.uses_alloy = FALSE
for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects) //Daemons produce components twice as quickly
D.production_interval /= 2
for(var/obj/structure/clockwork/mending_motor/M in all_clockwork_objects) //Mending motors no longer require alloy
M.uses_alloy = FALSE
for(var/obj/structure/clockwork/powered/M in all_clockwork_objects) //Powered clockwork structures no longer need power
M.needs_power = FALSE
spawn(600)
for(var/obj/structure/clockwork/ocular_warden/W in all_clockwork_objects)
W.damage_per_tick = initial(W.damage_per_tick)
@@ -835,8 +911,8 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
P.uses_alloy = TRUE
for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects)
D.production_interval = initial(D.production_interval)
for(var/obj/structure/clockwork/mending_motor/M in all_clockwork_objects)
M.uses_alloy = TRUE
for(var/obj/structure/clockwork/powered/M in all_clockwork_objects)
M.needs_power = TRUE
spawn(3000) //5 minutes
clockwork_generals_invoked["nezbere"] = FALSE
return 1
@@ -854,14 +930,14 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
tier = SCRIPTURE_REVENANT
/datum/clockwork_scripture/targeted/invoke_sevtug/check_special_requirements()
if(ratvar_awakens)
invoker << "<font color='#AF0AAF'><b><i>\"Qb lbh ernyyl guvax nalguvat v pna qb evtug abj jvyy pbzcner gb Ratvar's cbjre?.\"</b></i></font>\n\
<span class='warning'>Sevtug will not grant his power while Ratvar's dwarfs his own!</span>"
return 0
if(clockwork_generals_invoked["sevtug"])
invoker << "<font color='#AF0AAF'><b><i>\"Vf vg ernyyl fb uneq - rira sbe n fvzcyrgba yvxr lbh - gb tenfc gur pbaprcg bs jnvgvat?\"</b></i></font>\n\
invoker << "<span class='sevtug'>\"Vf vg ernyyl fb uneq - rira sbe n fvzcyrgba yvxr lbh - gb tenfc gur pbaprcg bs jnvgvat?\"</span>\n\
<span class='warning'>Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah.</span>"
return 0
if(ratvar_awakens)
invoker << "<span class='sevtug'>\"Qb lbh ernyyl guvax nalguvat v pna qb evtug abj jvyy pbzcner gb Ratvar's cbjre?.\"</span>\n\
<span class='warning'>Sevtug will not grant his power while Ratvar's dwarfs his own!</span>"
return 0
return ..()
/datum/clockwork_scripture/targeted/invoke_sevtug/scripture_effects()
@@ -876,7 +952,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/invoke_nzcrentr //Invoke Nzcrentr, the Forgotten Arbiter: Imbues an immense amount of energy into the invoker. After several seconds, everyone nearby will be hit with a devastating chain lightning blast.
name = "Invoke Nzcrentr, the Forgotten Arbiter"
desc = "Taps the limitless power of Nzcrentr, one of Ratvar's four generals. The immense energy Nzcrentr wields will allow you to imbue a tiny fraction of it into your body. After several \
seconds (during which you will move extremely quickly) anyone nearby will be struck by a devastating lightning bolt."
seconds, anyone nearby will be struck by a devastating lightning bolt."
invocations = list("V pnyy hcba lbh, Nzcrentr!!", "Yrg lbhe raretl sybj guebhtu zr!!", "Yrg lbhe obhaq-yrff cbjre fung-gre fgnef!!")
channel_time = 150
required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 6)
@@ -885,7 +961,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements()
if(clockwork_generals_invoked["nzcrentr"])
invoker << "<span class='heavy_brass'><b><i>\"Gur obff fnlf lbh unir gb jnvg. Url, qb lbh guvax ur jbhyq zvaq vs v xvyyrq lbh? ...Ur jbhyq? Bx.\"</b></i></span>\n\
invoker << "<span class='nzcrentr'><b><i>\"Gur obff fnlf lbh unir gb jnvg. Url, qb lbh guvax ur jbhyq zvaq vs v xvyyrq lbh? ...Ur jbhyq? Bx.\"</b></i></span>\n\
<span class='warning'>Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Forgotten Arbiter.</span>"
return 0
return 1
@@ -894,20 +970,29 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
new/obj/effect/clockwork/general_marker/nzcrentr(get_turf(invoker))
clockwork_generals_invoked["nzcrentr"] = TRUE
invoker.visible_message("<span class='warning'>[invoker] begins to radiate a blinding light!</span>", \
"<span class='heavy_brass'>\"Gur obff fnlf vg'f bxnl gb qb guvf. Qba'g oynzr zr vs lbh qvr sebz vg.\"</span>\n\
"<span class='nzcrentr'>\"Gur obff fnlf vg'f bxnl gb qb guvf. Qba'g oynzr zr vs lbh qvr sebz vg.\"</span>\n \
<span class='userdanger'>You feel limitless power surging through you!</span>")
playsound(invoker, 'sound/magic/lightning_chargeup.ogg', 100, 0)
animate(invoker, color = list(rgb(255, 255, 255), rgb(255, 255, 255), rgb(255, 255, 255), rgb(0,0,0)), time = 88) //Gradual advancement to extreme brightness
spawn(88)
invoker.visible_message("<span class='warning'>Massive bolts of energy emerge from across [invoker]'s body!</span>", \
"<span class='userdanger'>TOO... MUCH! CAN'T... TAKE IT!</span>")
"<span class='nzcrentr'>\"V gbyq lbh lbh jbhyqa'g or noyr gb unaqyr vg.\"</span>\n \
<span class='userdanger'>TOO... MUCH! CAN'T... TAKE IT!</span>")
playsound(invoker, 'sound/magic/lightningbolt.ogg', 50, 0)
animate(invoker, color = initial(invoker.color), time = 10)
for(var/mob/living/L in range(5, invoker))
if(is_servant_of_ratvar(L))
continue
invoker.Beam(L, icon_state = "nzcrentrs_power", icon = 'icons/effects/beam.dmi', time = 5)
L.electrocute_act(rand(30, 50), "Nzcrentr's power")
invoker.Beam(L, icon_state = "nzcrentrs_power", icon = 'icons/effects/beam.dmi', time = 6)
if(iscarbon(L))
L.electrocute_act(rand(30, 50), "Nzcrentr's power")
else
L.adjustFireLoss(rand(30, 50))
L.visible_message(
"<span class='danger'>[src] was shocked by Nzcrentr's power!</span>", \
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
"<span class='italics'>You hear a heavy electrical crack.</span>" \
)
L.Weaken(8)
playsound(L, 'sound/magic/LightningShock.ogg', 50, 0)
spawn(3000)
@@ -928,7 +1013,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/invoke_inathneq/check_special_requirements()
if(clockwork_generals_invoked["inath-neq"])
invoker << "<font color='#1E8CE1'><b><i>\"V pnaabg yraq lbh zl nvq lrg, punzcvba. Cyrnfr or pnershy.\"</b></i></font>\n\
invoker << "<span class='inathneq'>\"V pnaabg yraq lbh zl nvq lrg, punzcvba. Cyrnfr or pnershy.\"</span>\n\
<span class='warning'>Inath-Neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel.</span>"
return 0
return 1
@@ -942,7 +1027,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
for(var/mob/living/L in range(7, invoker))
if(!is_servant_of_ratvar(L) || L.stat == DEAD)
continue
L << "<font color='#1E8CE1'><b><i>\"V yraq lbh zl nvq, punzcvba! Yrg tybel thvqr lbhe oybjf!\"</b></i></font>\n\
L << "<span class='inathneq'>\"V yraq lbh zl nvq, punzcvba! Yrg tybel thvqr lbhe oybjf!\"</span>\n\
<span class='notice'>Inath-Neq's power flows through you!</span>"
L.maxHealth += 500
L.health += 500
@@ -991,19 +1076,19 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/scripture_effects()
var/turf/T = get_turf(invoker)
new/obj/effect/clockwork/general_marker/nezbere(T)
T.visible_message("<span class='heavy_brass'>\"Ratvar! Pbzr sbegu!\"</span>")
T.visible_message("<span class='heavy_brass'>\"Ratvar, pbzr sbegu naq fuvar lbhe yvtug npebff guvf ernyz!\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 20, 0)
sleep(10)
new/obj/effect/clockwork/general_marker/sevtug(T)
T.visible_message("<font color='#AF0AAF'><b><i>\"Ratvar! Pbzr sbegu!\"</i></b></font>")
T.visible_message("<span class='sevtug'>\"Ratvar, pbzr sbegu naq fubj guvf fgngvba lbhe qrpbengvat fxvyyf!\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, 0)
sleep(10)
new/obj/effect/clockwork/general_marker/nzcrentr(T)
T.visible_message("<span class='heavy_brass'>\"Ratvar! Pbzr sbegu!\"</span>")
T.visible_message("<span class='nzcrentr'>\"Ratvar, pbzr sbegu.\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 40, 0)
sleep(10)
new/obj/effect/clockwork/general_marker/inathneq(T)
T.visible_message("<font color='#1E8CE1'><b><i>\"Ratvar! Pbzr sbegu!\"</i></b></font>")
T.visible_message("<span class='inathneq'>\"Ratvar, pbzr sbegu naq fubj lbhe freinagf lbhe zrepl!\"</span>")
playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 50, 0)
sleep(10)
new/obj/structure/clockwork/massive/celestial_gateway(T)
+500 -152
View File
@@ -327,28 +327,342 @@
else
return ..()
/obj/structure/clockwork/interdiction_lens //Interdiction lens: A powerful artifact that can massively disrupt electronics. Five-minute cooldown between uses.
/obj/structure/clockwork/powered
var/obj/machinery/power/apc/target_apc
var/active = FALSE
var/needs_power = TRUE
var/active_icon = null //icon_state while process() is being called
var/inactive_icon = null //icon_state while process() isn't being called
/obj/structure/clockwork/powered/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
var/powered = total_accessable_power()
user << "<span class='[powered ? "brass":"alloy"]'>It has access to [powered]W of power.</span>"
/obj/structure/clockwork/powered/Destroy()
SSfastprocess.processing -= src
SSobj.processing -= src
return ..()
/obj/structure/clockwork/powered/process()
var/powered = total_accessable_power()
return powered == PROCESS_KILL ? 25 : powered //make sure we don't accidentally return the arbitrary PROCESS_KILL define
/obj/structure/clockwork/powered/proc/toggle(fast_process, mob/living/user)
if(user)
if(!is_servant_of_ratvar(user))
return 0
user.visible_message("<span class='notice'>[user] [active ? "dis" : "en"]ables [src].</span>", "<span class='brass'>You [active ? "dis" : "en"]able [src].</span>")
active = !active
if(active)
icon_state = active_icon
if(fast_process)
SSfastprocess.processing |= src
else
SSobj.processing |= src
else
icon_state = inactive_icon
SSfastprocess.processing -= src
SSobj.processing -= src
/obj/structure/clockwork/powered/proc/total_accessable_power() //how much power we have and can use
if(!needs_power || ratvar_awakens)
return INFINITY //oh yeah we've got power why'd you ask
var/power = 0
power += accessable_apc_power()
power += accessable_sigil_power()
return power
/obj/structure/clockwork/powered/proc/accessable_apc_power()
var/power = 0
var/area/A = get_area(src)
var/area/targetAPCA
for(var/obj/machinery/power/apc/APC in apcs_list)
var/area/APCA = get_area(APC)
if(APCA == A)
target_apc = APC
if(target_apc)
targetAPCA = get_area(target_apc)
if(targetAPCA != A)
target_apc = null
else if(target_apc.cell)
var/apccharge = target_apc.cell.charge
if(apccharge >= 50)
power += apccharge
return power
/obj/structure/clockwork/powered/proc/accessable_sigil_power()
var/power = 0
for(var/obj/effect/clockwork/sigil/transmission/T in range(1, src))
power += T.power_charge
return power
/obj/structure/clockwork/powered/proc/try_use_power(amount) //try to use an amount of power
if(!needs_power)
return 1
if(amount <= 0)
return 0
var/power = total_accessable_power()
if(!power || power < amount)
return 0
return use_power(amount)
/obj/structure/clockwork/powered/proc/use_power(amount) //we've made sure we had power, so now we use it
var/sigilpower = accessable_sigil_power()
var/list/sigils_in_range = list()
for(var/obj/effect/clockwork/sigil/transmission/T in range(1, src))
sigils_in_range |= T
while(sigilpower && amount >= 50)
for(var/S in sigils_in_range)
var/obj/effect/clockwork/sigil/transmission/T = S
if(T.modify_charge(50))
sigilpower -= 50
amount -= 50
var/apcpower = accessable_apc_power()
while(apcpower >= 50 && amount >= 50)
if(target_apc.cell.use(50))
apcpower -= 50
amount -= 50
else
apcpower = 0
if(amount)
return 0
else
return 1
/obj/structure/clockwork/powered/mending_motor //Mending motor: A prism that consumes replicant alloy to repair nearby mechanical servants at a quick rate.
name = "mending motor"
desc = "A dark onyx prism, held in midair by spiraling tendrils of stone."
clockwork_desc = "A powerful prism that rapidly repairs nearby mechanical servants and clockwork structures."
icon_state = "mending_motor_inactive"
active_icon = "mending_motor"
inactive_icon = "mending_motor_inactive"
construction_value = 20
break_message = "<span class='warning'>The prism collapses with a heavy thud!</span>"
var/stored_alloy = 0 //250W = 1 alloy
var/max_alloy = 50000
/obj/structure/clockwork/powered/mending_motor/prefilled
stored_alloy = 5000 //starts with 20 alloy
/obj/structure/clockwork/powered/mending_motor/total_accessable_power()
. = ..()
. += accessable_alloy_power()
/obj/structure/clockwork/powered/mending_motor/proc/accessable_alloy_power()
return stored_alloy
/obj/structure/clockwork/powered/mending_motor/use_power(amount)
var/alloypower = accessable_alloy_power()
while(alloypower >= 50 && amount >= 50)
stored_alloy -= 50
alloypower -= 50
amount -= 50
return ..()
/obj/structure/clockwork/powered/mending_motor/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='alloy'>It has [stored_alloy*0.004]/[max_alloy*0.004] units of replicant alloy, which is equivalent to [stored_alloy]W/[max_alloy]W of power.</span>"
/obj/structure/clockwork/powered/mending_motor/process()
if(!..())
visible_message("<span class='warning'>[src] emits an airy chuckling sound and falls dark!</span>")
toggle()
return
for(var/atom/movable/M in range(5, src))
if(istype(M, /mob/living/simple_animal/hostile/clockwork_marauder))
var/mob/living/simple_animal/hostile/clockwork_marauder/E = M
if((E.health == E.maxHealth && !E.fatigue) || E.stat)
continue
if(!try_use_power(150))
break
E.adjustBruteLoss(-E.maxHealth) //Instant because marauders don't usually take health damage
E.fatigue = max(0, E.fatigue - 15)
else if(istype(M, /mob/living/simple_animal/hostile/anima_fragment))
var/mob/living/simple_animal/hostile/anima_fragment/F = M
if(F.health == F.maxHealth || F.stat)
continue
if(!try_use_power(200))
break
F.adjustBruteLoss(-15)
else if(istype(M, /obj/structure/clockwork))
var/obj/structure/clockwork/C = M
if(C.health == C.max_health)
continue
if(!try_use_power(250))
break
C.health = min(C.health + 15, C.max_health)
else if(issilicon(M))
var/mob/living/silicon/S = M
if(S.health == S.maxHealth || S.stat == DEAD || !is_servant_of_ratvar(S))
continue
if(!try_use_power(300))
break
S.adjustBruteLoss(-15)
S.adjustFireLoss(-15)
return 1
/obj/structure/clockwork/powered/mending_motor/attack_hand(mob/living/user)
if(user.canUseTopic(src, be_close = 1))
if(!total_accessable_power() < 300)
user << "<span class='warning'>[src] needs more power or replicant alloy to function!</span>"
return 0
toggle(0, user)
/obj/structure/clockwork/powered/mending_motor/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/clockwork/component/replicant_alloy) && is_servant_of_ratvar(user))
if(stored_alloy + 2500 > max_alloy)
user << "<span class='warning'>[src] is too full to accept any more alloy!</span>"
return 0
user.whisper("Genafzhgr vagb jngre.")
user.visible_message("<span class='notice'>[user] liquifies [I] and pours it onto [src].</span>", \
"<span class='notice'>You liquify [src] and pour it onto [src], transferring the alloy into its reserves.</span>")
stored_alloy = stored_alloy + 2500
user.drop_item()
qdel(I)
return 1
else
return ..()
/obj/structure/clockwork/powered/mania_motor //Mania motor: A pair of antenna that, while active, cause braindamage and hallucinations in nearby human mobs.
name = "mania motor"
desc = "A pair of antenna with what appear to be sockets around the base. It reminds you of an antlion."
clockwork_desc = "A transmitter that allows Sevtug to whisper into the minds of nearby non-servants, causing hallucinations and brain damage as long as it remains powered."
icon_state = "mania_motor_inactive"
active_icon = "mania_motor"
inactive_icon = "mania_motor_inactive"
construction_value = 20
break_message = "<span class='warning'>The antenna break off, leaving a pile of shards!</span>"
debris = list(/obj/item/clockwork/component/guvax_capacitor/antennae, /obj/item/clockwork/alloy_shards)
var/mania_messages = list("\"Tb ahgf.\"", "\"Gnxr n penpx ng penml.\"", "\"Znxr n ovq sbe vafnavgl.\"", "\"Trg xbbxl.\"", "\"Zbir gbjneqf znavn.\"", "\"Orpbzr orjvyqrerq.\"", "\"Jnk jvyq.\"", \
"\"Tb ebhaq gur oraq.\"", "\"Ynaq va yhanpl.\"", "\"Gel qrzragvn.\"", "\"Fgevir gb trg n fperj ybbfr.\"")
var/compel_messages = list("\"Pbzr pybfre.\"", "\"Nccebnpu gur genafzvggre.\"", "\"Gbhpu gur nagraanr.\"", "\"V nyjnlf unir gb qrny jvgu vqvbgf. Zbir gbjneqf gur znavn zbgbe.\"", \
"\"Nqinapr sbejneq naq cynpr lbhe urnq orgjrra gur nagraanr - gung'f nyy vg'f tbbq sbe.\"", "\"Vs lbh jrer fznegre, lbh'q or bire urer nyernql.\"", "\"Zbir SBEJNEQ, lbh sbby.\"")
var/mania_cost = 150
/obj/structure/clockwork/powered/mania_motor/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='sevtug_small'>It requires 150W of power to run, and 450W of power to convert humans adjecent to it.</span>"
/obj/structure/clockwork/powered/mania_motor/process()
if(!..())
visible_message("<span class='warning'>[src] hums loudly, then the sockets at its base fall dark!</span>")
playsound(src, 'sound/effects/screech.ogg', 20, 1)
toggle(0)
return
if(try_use_power(mania_cost))
for(var/mob/living/carbon/human/H in range(10, src))
if(!is_servant_of_ratvar(H))
var/distance = get_dist(get_turf(src), get_turf(H))
var/divided_distance = distance ? 100/distance : 100
if(distance >= 4 && prob(divided_distance))
H << "<span class='sevtug_small'>[pick(mania_messages)]</span>"
switch(distance)
if(0 to 1) //how did you get someone on top of it
if(try_use_power(150))
if(is_eligible_servant(H) && try_use_power(300))
H << "<span class='sevtug'>\"Lbh ner zvar-naq-uvf, abj.\"</span>"
add_servant_of_ratvar(H)
else if(H.getBrainLoss() >= H.maxHealth && !H.stat)
H.Paralyse(10)
H <<"<span class='sevtug'>\"Lbh jba'g qb. Tb gb fyrrc juvyr V gryy gurfr avgjvgf ubj gb pbaireg lbh.\"</span>"
else
H.adjustBrainLoss(100)
else
visible_message("<span class='warning'>[src]'s antennae fizzle quietly.</span>")
playsound(src, 'sound/effects/light_flicker.ogg', 50, 1)
if(2 to 3)
if(prob(divided_distance))
if(prob(divided_distance))
H << "<span class='sevtug_small'>[pick(mania_messages)]</span>"
else
H << "<span class='sevtug'>[pick(compel_messages)]</span>"
H.adjustBrainLoss(divided_distance)
H.adjust_drugginess(divided_distance)
H.hallucination += divided_distance
if(4 to 5)
H.adjustBrainLoss(rand(10, 20))
H.adjust_drugginess(rand(30, 40))
H.hallucination += rand(30, 40)
if(6 to 7)
H.adjustBrainLoss(rand(5, 10))
if(prob(100/distance))
H.adjust_drugginess(rand(20, 30))
else
H.hallucination += rand(20, 30)
if(8 to 9)
H.adjustBrainLoss(rand(1, 5))
if(prob(100/distance))
H.adjust_drugginess(rand(10, 20))
else
H.hallucination += rand(10, 20)
if(10)
if(prob(100/distance))
H.adjust_drugginess(rand(5, 10))
else
H.hallucination += rand(5, 10)
else
if(H.getBrainLoss() || H.hallucination || H.druggy)
H.adjustBrainLoss(-H.getBrainLoss()) //heals
H.hallucination = 0
H.adjust_drugginess(-H.druggy)
else
visible_message("<span class='warning'>[src] hums loudly, then the sockets at its base fall dark!</span>")
playsound(src, 'sound/effects/screech.ogg', 20, 1)
toggle(0)
return
/obj/structure/clockwork/powered/mania_motor/attack_hand(mob/living/user)
if(user.canUseTopic(src, be_close = 1))
if(!total_accessable_power() < mania_cost)
user << "<span class='warning'>[src] needs more power to function!</span>"
return 0
toggle(0, user)
/obj/structure/clockwork/powered/interdiction_lens //Interdiction lens: A powerful artifact that can massively disrupt electronics. Five-minute cooldown between uses.
name = "interdiction lens"
desc = "An ominous, double-pronged brass obelisk. There's a strange gemstone clasped between the pincers."
clockwork_desc = "A powerful obelisk that can devastate certain electronics. It needs to recharge between uses."
icon_state = "interdiction_lens"
construction_value = 25
active_icon = "interdiction_lens_inactive"
inactive_icon = "interdiction_lens"
break_message = "<span class='warning'>The lens flares a blinding violet before shattering!</span>"
break_sound = 'sound/effects/Glassbr3.ogg'
var/recharging = FALSE //If the lens is still recharging its energy
var/recharging = 0 //world.time when the lens was last used
var/recharge_time = 3000 //time, in deciseconds, the lens needs to recharge; 5 minutes by default
var/disrupt_cost = 1000 //how much power to use
/obj/structure/clockwork/interdiction_lens/examine(mob/user)
/obj/structure/clockwork/powered/interdiction_lens/examine(mob/user)
..()
user << "Its gemstone [recharging ? "has been breached by writhing tendrils of blackness that cover the obelisk" : "vibrates in place and thrums with power"],"
user << "<span class='[recharging >= world.time ? "alloy":"brass"]'>Its gemstone [recharging >= world.time ? "has been breached by writhing tendrils of blackness that cover the obelisk" \
: "vibrates in place and thrums with power"]."
/obj/structure/clockwork/interdiction_lens/attack_hand(mob/living/user)
/obj/structure/clockwork/powered/interdiction_lens/attack_hand(mob/living/user)
if(user.canUseTopic(src))
disrupt(user)
/obj/structure/clockwork/interdiction_lens/proc/disrupt(mob/living/user)
/obj/structure/clockwork/powered/interdiction_lens/process()
if(..() && recharging < world.time) //if we have power and have finished charging
visible_message("<span class='warning'>The writhing tendrils return to the gemstone, which begins to glow with power.</span>")
flick("[initial(icon_state)]_recharged", src)
toggle()
/obj/structure/clockwork/powered/interdiction_lens/proc/disrupt(mob/living/user)
if(!user || !is_servant_of_ratvar(user))
return 0
if(recharging)
if(!total_accessable_power() < disrupt_cost)
user << "<span class='warning'>[src] needs more power to function!</span>"
return 0
if(active || recharging >= world.time)
user << "<span class='warning'>As you place your hand on the gemstone, cold tendrils of black matter crawl up your arm. You quickly pull back.</span>"
return 0
user.visible_message("<span class='warning'>[user] places their hand on [src]' gemstone...</span>", "<span class='brass'>You place your hand on the gemstone...</span>")
@@ -356,11 +670,13 @@
if(!user.canUseTopic(src) || !target)
user.visible_message("<span class='warning'>[user] pulls their hand back.</span>", "<span class='brass'>On second thought, maybe not right now.</span>")
return 0
if(!try_use_power(disrupt_cost))
user.visible_message("<span class='warning'>The len flickers once, but nothing happens.</span>", "<span class='heavy_brass'>The lens lacks the power to activate.</span>")
return 0
user.visible_message("<span class='warning'>Violet tendrils engulf [user]'s arm as the gemstone glows with furious energy!</span>", \
"<span class='heavy_brass'>A mass of violet tendrils cover your arm as [src] unleashes a blast of power!</span>")
user.notransform = TRUE
icon_state = "[initial(icon_state)]_active"
recharging = TRUE
sleep(30)
switch(target)
if("Disrupt Telecommunications")
@@ -369,14 +685,14 @@
M << "<span class='warning'>You sense a strange force pass through you...</span>"
H.visible_message("<span class='warning'>The lights on [H] flare a blinding yellow before falling dark!</span>")
H.emp_act(1)
if("Disable Cameras")
for(var/obj/machinery/camera/C in cameranet.cameras)
C.emp_act(1)
for(var/mob/living/silicon/ai/A in living_mob_list)
A << "<span class='userdanger'>Massive energy surge detected. All cameras offline.</span>"
A << 'sound/machines/warning-buzzer.ogg'
if("Disable Cameras")
for(var/obj/machinery/camera/C in cameranet.cameras)
C.emp_act(1)
for(var/mob/living/silicon/ai/A in living_mob_list)
A << "<span class='userdanger'>Massive energy surge detected. All cameras offline.</span>"
A << 'sound/machines/warning-buzzer.ogg'
if("Disable Cyborgs")
for(var/mob/living/silicon/robot/R in living_mob_list) //Doesn't include AIs, for obvious reasons
for(var/mob/living/silicon/robot/R in living_mob_list)
if(is_servant_of_ratvar(R) || R.stat) //Doesn't affect already-offline cyborgs
continue
R.visible_message("<span class='warning'>[R] shuts down with no warning!</span>", \
@@ -386,120 +702,59 @@
user.visible_message("<span class='warning'>The tendrils around [user]'s arm turn to an onyx black and wither away!</span>", \
"<span class='heavy_brass'>The tendrils around your arm turn a horrible black and sting your skin before they shrivel away.</span>")
user.notransform = FALSE
if(!src)
return 0
recharging = world.time + recharge_time
flick("[initial(icon_state)]_discharged", src)
icon_state = "[initial(icon_state)]_recharging"
spawn(3000) //5 minutes
if(!src)
return 0
visible_message("<span class='warning'>The writhing tendrils return to the gemstone, which begins to glow with power.</span>")
flick("[initial(icon_state)]_recharged", src)
icon_state = initial(icon_state)
recharging = FALSE
toggle()
return 1
/obj/structure/clockwork/mending_motor //Mending motor: A prism that consumes replicant alloy to repair nearby mechanical servants at a quick rate.
name = "mending motor"
desc = "A dark onyx prism, held in midair by spiraling tendrils of stone."
clockwork_desc = "A powerful prism that rapidly repairs nearby mechanical servants and clockwork structures."
icon_state = "mending_motor"
/obj/structure/clockwork/powered/clockwork_obelisk
name = "clockwork obelisk"
desc = "A large brass obelisk hanging in midair."
clockwork_desc = "A powerful obelisk that can send a message to all servants or open a gateway to a target servant or clockwork obelisk."
icon_state = "obelisk_inactive"
active_icon = "obelisk"
inactive_icon = "obelisk_inactive"
construction_value = 20
break_message = "<span class='warning'>The prism collapses with a heavy thud!</span>"
var/stored_alloy = 0
var/max_alloy = 150
var/uses_alloy = TRUE
var/active = TRUE
break_message = "<span class='warning'>The obelisk breaks apart in midair!</span>"
debris = list(/obj/item/clockwork/alloy_shards)
var/hierophant_cost = 50 //how much it costs to broadcast with large text
var/gateway_cost = 2000 //how much it costs to open a gateway
/obj/structure/clockwork/mending_motor/prefilled
stored_alloy = 30
/obj/structure/clockwork/mending_motor/New()
/obj/structure/clockwork/powered/clockwork_obelisk/New()
..()
SSobj.processing += src
toggle() //Toggles off as soon as it's created, but starts online for reasons
toggle(1)
/obj/structure/clockwork/mending_motor/Destroy()
SSobj.processing -= src
..()
/obj/structure/clockwork/mending_motor/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "It has [stored_alloy]/[max_alloy] units of replicant alloy."
/obj/structure/clockwork/mending_motor/process()
if(!active)
return 0
if(!stored_alloy && uses_alloy)
visible_message("<span class='warning'>[src] emits an airy chuckling sound and falls dark!</span>")
toggle()
return 0
for(var/atom/movable/M in range(5, src))
if(istype(M, /mob/living/simple_animal/hostile/anima_fragment))
var/mob/living/simple_animal/hostile/anima_fragment/F = M
if(F.health == F.maxHealth || F.stat)
continue
F.adjustBruteLoss(-15)
if(uses_alloy)
stored_alloy = max(0, stored_alloy - 2)
else if(istype(M, /mob/living/simple_animal/hostile/clockwork_marauder))
var/mob/living/simple_animal/hostile/clockwork_marauder/E = M
if((E.health == E.maxHealth && !E.fatigue) || E.stat)
continue
E.adjustBruteLoss(-E.maxHealth) //Instant because marauders don't usually take health damage
E.fatigue = max(0, E.fatigue - 15)
if(uses_alloy)
stored_alloy = max(0, stored_alloy - 2)
else if(istype(M, /mob/living/silicon))
var/mob/living/silicon/S = M
if(S.health == S.maxHealth || S.stat == DEAD || !is_servant_of_ratvar(S))
continue
S.adjustBruteLoss(-25)
S.adjustFireLoss(-25)
if(uses_alloy)
stored_alloy = max(0, stored_alloy - 5) //Much higher cost because silicons are much more useful
else if(istype(M, /obj/structure/clockwork))
var/obj/structure/clockwork/C = M
if(C.health == C.max_health)
continue
C.health = min(C.health + 10, C.max_health)
if(uses_alloy)
stored_alloy = max(0, stored_alloy - 1)
return 1
/obj/structure/clockwork/mending_motor/attack_hand(mob/living/user)
if(user.canUseTopic(src)) //Unnecessary?
if(!stored_alloy)
user << "<span class='warning'>[src] needs more replicant alloy to function!</span>"
return 0
toggle(user)
/obj/structure/clockwork/mending_motor/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/clockwork/component/replicant_alloy) && is_servant_of_ratvar(user))
if(stored_alloy + 10 > max_alloy)
user << "<span class='warning'>[src] is too full to accept any more alloy!</span>"
return 0
user.whisper("Genafzhgr vagb jngre.")
user.visible_message("<span class='notice'>[user] liquifies [I] and pours it onto [src].</span>", \
"<span class='notice'>You liquify [src] and pour it onto [src], which transfers the alloy into its reserves.</span>")
stored_alloy = min(max(0, stored_alloy + 10), max_alloy)
user.drop_item()
qdel(I)
return 1
/obj/structure/clockwork/powered/clockwork_obelisk/process()
if(locate(/obj/effect/clockwork/spatial_gateway) in loc)
icon_state = active_icon
density = 0
else
return ..()
icon_state = inactive_icon
density = 1
/obj/structure/clockwork/powered/clockwork_obelisk/attack_hand(mob/living/user)
if(!total_accessable_power() < hierophant_cost)
user << "<span class='warning'>You place your hand on the obelisk, but it doesn't react.</span>"
return
var/choice = alert(user,"You place your hand on the obelisk...",,"Hierophant Broadcast","Spacial Gateway","Cancel")
switch(choice)
if("Hierophant Broadcast")
var/input = stripped_input(usr, "Please choose a message to send over the Hierophant Network.", "Hierophant Broadcast", "")
if(user.canUseTopic(src, be_close = 1))
if(try_use_power(hierophant_cost))
send_hierophant_message(user, input, 1)
else
user << "<span class='warning'>The obelisk lacks the power to broadcast!</span>"
if("Spacial Gateway")
if(total_accessable_power() >= gateway_cost)
if(procure_gateway(user, 100, 5, 1))
user.say("Fcnpvny tngrjnl, npgvingr!")
try_use_power(gateway_cost)
else
user << "<span class='warning'>The obelisk lacks the power to open a gateway!</span>"
if("Cancel")
return
/obj/structure/clockwork/mending_motor/proc/toggle(mob/living/user)
if(user)
if(!is_servant_of_ratvar(user))
return 0
user.visible_message("<span class='notice'>[user] [active ? "dis" : "en"]ables [src].</span>", "<span class='brass'>You [active ? "dis" : "en"]able [src].</span>")
active = !active
if(active)
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]_inactive"
/obj/structure/clockwork/wall_gear
name = "massive gear"
@@ -599,7 +854,7 @@
qdel(src)
//set up a gateway with another gateway
/obj/effect/clockwork/spatial_gateway/proc/setup_gateway(obj/effect/clockwork/spatial_gateway/gatewayB, set_duration, uses, two_way)
/obj/effect/clockwork/spatial_gateway/proc/setup_gateway(obj/effect/clockwork/spatial_gateway/gatewayB, set_duration, set_uses, two_way)
if(!gatewayB || !set_duration || !uses)
return 0
linked_gateway = gatewayB
@@ -612,8 +867,8 @@
gatewayB.sender = FALSE
lifetime = set_duration
gatewayB.lifetime = set_duration
uses = uses
gatewayB.uses = uses
uses = set_uses
gatewayB.uses = set_uses
return 1
/obj/effect/clockwork/spatial_gateway/examine(mob/user)
@@ -672,7 +927,7 @@
animate(linked_gateway, transform = matrix() / 1.5, time = 10)
A.forceMove(get_turf(linked_gateway))
uses = max(0, uses - 1)
linked_gateway.uses = max(0, uses - 1)
linked_gateway.uses = max(0, linked_gateway.uses - 1)
spawn(10)
if(!uses)
qdel(src)
@@ -700,7 +955,7 @@
icon = 'icons/effects/340x428.dmi'
icon_state = "nezbere"
pixel_x = -154
pixel_y = -192
pixel_y = -198
/obj/effect/clockwork/general_marker/sevtug
name = "Sevtug, the Formless Pariah"
@@ -708,8 +963,8 @@
clockwork_desc = "One of Ratvar's four generals. Sevtug taught him how to manipulate minds and is one of his oldest allies."
icon = 'icons/effects/211x247.dmi'
icon_state = "sevtug"
pixel_x = -113
pixel_y = -131
pixel_x = -89
pixel_y = -107
/obj/effect/clockwork/general_marker/nzcrentr
name = "Nzcrentr, the Forgotten Arbiter"
@@ -718,8 +973,8 @@
insane. Nzcrentr seeks out any and all sentient life to slaughter it for sport."
icon = 'icons/effects/254x361.dmi'
icon_state = "nzcrentr"
pixel_x = -110
pixel_y = -163
pixel_x = -111
pixel_y = -164
/obj/effect/clockwork/general_marker/inathneq
name = "Inath-Neq, the Resonant Cogwheel"
@@ -730,8 +985,9 @@
merged her soul with those of the Cogs slain with her on the battlefield."
icon = 'icons/effects/187x381.dmi'
icon_state = "inath-neq"
pixel_x = -91
pixel_y = -199
pixel_x = -77
pixel_y = -174
/obj/effect/clockwork/sigil //Sigils: Rune-like markings on the ground with various effects.
name = "sigil"
@@ -741,6 +997,7 @@
layer = LOW_OBJ_LAYER
alpha = 50
var/affects_servants = FALSE
var/affects_stat = FALSE
/obj/effect/clockwork/sigil/attack_hand(mob/user)
if(iscarbon(user) && !user.stat && user.a_intent == "harm")
@@ -753,7 +1010,7 @@
..()
if(isliving(AM))
var/mob/living/L = AM
if(!L.stat)
if(!L.stat || affects_stat)
if(!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && affects_servants))
sigil_effects(L)
return 1
@@ -780,7 +1037,7 @@
L.adjustBruteLoss(10)
L.Weaken(5)
L.Stun(5)
PoolOrNew(/obj/effect/overlay/temp/ratvar/transgression, get_turf(src))
PoolOrNew(/obj/effect/overlay/temp/ratvar/sigil/transgression, get_turf(src))
qdel(src)
return 1
@@ -794,7 +1051,7 @@
/obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L)
visible_message("<span class='warning'>[src] begins to glow a piercing magenta!</span>")
animate(src, color = "#EE54DE", time = 30)
animate(src, color = "#AF0AAF", time = 30)
var/I = 0
while(I < 30 && get_turf(L) == get_turf(src))
I++
@@ -823,27 +1080,118 @@
/obj/effect/clockwork/sigil/transmission
name = "suspicious sigil"
desc = "A barely-visible sigil. Things seem a bit quieter around it."
clockwork_desc = "A sigil that will listen for and transmit anything it hears."
desc = "A glowing orange sigil. The air around it feels staticky."
clockwork_desc = "A sigil that will serve as a battery for clockwork structures. Use Volt Void while standing on it to charge it."
icon_state = "sigiltransmission"
color = "#6F6E5F"
color = "#EC8A2D"
alpha = 75
flags = HEAR
languages = ALL
var/power_charge = 4000 //starts with 4000W by default
/obj/effect/clockwork/sigil/transmission/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='[power_charge ? "brass":"alloy"]'>It is storing [power_charge]W of power.</span>"
/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L)
for(var/mob/M in mob_list)
if(is_servant_of_ratvar(M) || isobserver(M))
M << "<span class='heavy_brass'>Sigil of Transmission in [get_area(src)] crossed by [L.name].</span>"
return 0
if(power_charge)
L << "<span class='brass'>You feel a slight, static shock.</span>"
return 1
/obj/effect/clockwork/sigil/transmission/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(!message || !speaker)
/obj/effect/clockwork/sigil/transmission/New()
..()
alpha = min(75 + power_charge*0.02, 255)
/obj/effect/clockwork/sigil/transmission/proc/modify_charge(amount)
if(power_charge - amount < 0)
return 0
var/parsed_message = "<span class='heavy_brass'>(Sigil of Tranmission in [get_area(src)]): </span><span class='brass'>[message]</span>"
for(var/M in mob_list)
if(isobserver(M))
var/link = FOLLOW_LINK(M, speaker)
M << "[link] [parsed_message]"
else if(is_servant_of_ratvar(M))
M << parsed_message
power_charge -= amount
alpha = min(initial(alpha) + power_charge*0.02, 255)
return 1
/obj/effect/clockwork/sigil/vitality
name = "comforting sigil"
desc = "A faint blue sigil. Looking at it makes you feel protected."
clockwork_desc = "A sigil that will drain non-servants that remain on it. Servants that remain on it will be healed if it has any vitality drained."
icon_state = "sigilvitality"
color = "#123456"
alpha = 75
affects_servants = TRUE
affects_stat = TRUE
var/vitality = 0
var/base_revive_cost = 25
var/sigil_active = FALSE
/obj/effect/clockwork/sigil/vitality/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='[vitality ? "inathneq_small":"alloy"]'>It is storing [vitality] units of vitality.</span>"
user << "<span class='inathneq_small'>It requires at least [base_revive_cost] units of vitality to revive dead servants, in addition to any damage the servant has.</span>"
/obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L)
if(L.suiciding || sigil_active || !is_servant_of_ratvar(L) && L.stat == DEAD)
return 0
visible_message("<span class='warning'>[src] begins to glow bright blue!</span>")
animate(src, alpha = 255, time = 10)
sleep(10)
sigil_active = TRUE
//as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality
while((!is_servant_of_ratvar(L) && L.stat != DEAD || (is_servant_of_ratvar(L) && vitality)) && get_turf(L) == get_turf(src))
PoolOrNew(/obj/effect/overlay/temp/ratvar/sigil/vitality, get_turf(src))
if(!is_servant_of_ratvar(L))
var/vitality_drained = L.adjustToxLoss(4)
if(vitality_drained)
vitality += vitality_drained
else
break
else
var/clone_to_heal = L.getCloneLoss()
var/tox_to_heal = L.getToxLoss()
var/burn_to_heal = L.getFireLoss()
var/brute_to_heal = L.getBruteLoss()
var/oxy_to_heal = L.getOxyLoss()
var/total_damage = clone_to_heal + tox_to_heal + burn_to_heal + brute_to_heal + oxy_to_heal
if(L.stat == DEAD)
var/revival_cost = base_revive_cost + total_damage - oxy_to_heal //ignores oxygen damage
if(vitality >= revival_cost)
L.revive(1, 1)
L.visible_message("<span class='warning'>[L] suddenly gets back up, their mouth dripping blue ichor!</span>", "<span class='inathneq'>\"Lbh jvyy or bxnl, puvyq.\"</span>")
vitality -= revival_cost
break
if(!total_damage)
break
var/vitality_for_cycle = min(vitality, 8)
if(clone_to_heal && vitality_for_cycle)
var/healing = min(vitality_for_cycle, clone_to_heal)
vitality_for_cycle -= healing
L.adjustCloneLoss(-healing)
vitality -= healing
if(tox_to_heal && vitality_for_cycle)
var/healing = min(vitality_for_cycle, tox_to_heal)
vitality_for_cycle -= healing
L.adjustToxLoss(-healing)
vitality -= healing
if(burn_to_heal && vitality_for_cycle)
var/healing = min(vitality_for_cycle, burn_to_heal)
vitality_for_cycle -= healing
L.adjustFireLoss(-healing)
vitality -= healing
if(brute_to_heal && vitality_for_cycle)
var/healing = min(vitality_for_cycle, brute_to_heal)
vitality_for_cycle -= healing
L.adjustBruteLoss(-healing)
vitality -= healing
if(oxy_to_heal && vitality_for_cycle)
var/healing = min(vitality_for_cycle, oxy_to_heal)
vitality_for_cycle -= healing
L.adjustOxyLoss(-healing)
vitality -= healing
sleep(8)
sigil_active = FALSE
animate(src, alpha = initial(alpha), time = 30)
visible_message("<span class='warning'>[src] slowly stops glowing!</span>")
@@ -13,6 +13,59 @@
usr.verbs -= /mob/living/carbon/human/proc/function_call
return 1
//allows a mob to select a target to gate to
/atom/movable/proc/procure_gateway(mob/living/invoker, time_duration, gateway_uses, two_way)
var/list/possible_targets = list()
var/list/teleportnames = list()
var/list/duplicatenamecount = list()
for(var/obj/structure/clockwork/powered/clockwork_obelisk/O in all_clockwork_objects)
if(!O.Adjacent(invoker)) //don't list obelisks that we're next to
var/area/A = get_area(O)
var/locname = initial(A.name)
var/resultkey = "[locname] [O.name]"
if(resultkey in teleportnames) //why the fuck did you put two obelisks in the same area
duplicatenamecount[resultkey]++
resultkey = "[resultkey] ([duplicatenamecount[resultkey]])"
else
teleportnames.Add(resultkey)
duplicatenamecount[resultkey] = 1
if(O != src && (O.z <= ZLEVEL_SPACEMAX))
possible_targets[resultkey] = O
for(var/mob/living/L in living_mob_list)
if(!L.stat && is_servant_of_ratvar(L) && !L.Adjacent(invoker) && L != invoker) //People right next to the invoker can't be portaled to, for obvious reasons
var/resultkey = "[L.name] ([L.real_name])"
if(resultkey in teleportnames)
duplicatenamecount[resultkey]++
resultkey = "[resultkey] ([duplicatenamecount[resultkey]])"
else
teleportnames.Add(resultkey)
duplicatenamecount[resultkey] = 1
if(L.z <= ZLEVEL_SPACEMAX)
possible_targets[resultkey] = L
if(!possible_targets.len)
invoker << "<span class='warning'>There are no other eligible targets for a Spacial Gateway!</span>"
return 0
var/input_target_key = input(invoker, "Choose a target to form a rift to.", "Spatial Gateway") as null|anything in possible_targets
var/atom/movable/target = possible_targets[input_target_key]
if(!target || !invoker.canUseTopic(src, be_close = 1))
return 0
var/istargetobelisk = istype(target, /obj/structure/clockwork/powered/clockwork_obelisk)
if(istargetobelisk)
gateway_uses *= 2
time_duration *= 2
invoker.visible_message("<span class='warning'>The air in front of [invoker] ripples before suddenly tearing open!</span>", \
"<span class='brass'>With a word, you rip open a [two_way ? "two-way":"one-way"] rift to [input_target_key]. It will last for [time_duration / 10] seconds and has [gateway_uses] use[gateway_uses > 1 ? "s" : ""].</span>")
var/obj/effect/clockwork/spatial_gateway/S1 = new(istype(src, /obj/structure/clockwork/powered/clockwork_obelisk) ? src.loc : get_step(invoker, invoker.dir))
var/obj/effect/clockwork/spatial_gateway/S2 = new(istargetobelisk ? target.loc : get_step(target, target.dir))
//Set up the portals now that they've spawned
S1.setup_gateway(S2, time_duration, gateway_uses, two_way)
S2.visible_message("<span class='warning'>The air in front of [target] ripples before suddenly tearing open!</span>")
return 1
/*
The Ratvarian Language
+10 -2
View File
@@ -184,19 +184,27 @@
pixel_y = -16
pixel_x = -16
/obj/effect/overlay/temp/ratvar/transgression
/obj/effect/overlay/temp/ratvar/sigil
name = "glowing circle"
icon = 'icons/effects/clockwork_effects.dmi'
icon_state = "sigildull"
/obj/effect/overlay/temp/ratvar/sigil/transgression
color = "#FAE48C"
layer = ABOVE_MOB_LAYER
duration = 40
/obj/effect/overlay/temp/ratvar/transgression/New()
/obj/effect/overlay/temp/ratvar/sigil/transgression/New()
..()
var/oldtransform = transform
animate(src, transform = matrix()*2, time = 5)
animate(transform = oldtransform, alpha = 0, time = 25)
/obj/effect/overlay/temp/ratvar/sigil/vitality
color = "#1E8CE1"
icon_state = "sigilactiveoverlay"
layer = BELOW_MOB_LAYER
/obj/effect/overlay/temp/revenant
name = "spooky lights"
@@ -47,7 +47,7 @@
return -10
/mob/living/carbon/alien/adjustToxLoss(amount)
return
return 0
/mob/living/carbon/alien/adjustFireLoss(amount) // Weak to Fire
if(amount > 0)
+1
View File
@@ -300,6 +300,7 @@ Sorry Giacom. Please don't be mad :(
toxloss = Clamp(toxloss + amount, 0, maxHealth*2)
if(updating_health)
updatehealth()
return amount
/mob/living/proc/setToxLoss(amount, updating_health=1)
if(status_flags & GODMODE)
+4 -6
View File
@@ -113,13 +113,11 @@
//Cannot remove negative damage (i.e. apply damage)
/obj/item/bodypart/proc/heal_damage(brute, burn, robotic)
if(robotic && status != ORGAN_ROBOTIC) // This makes organic limbs not heal when the proc is in Robotic mode.
brute = max(0, brute - 3)
burn = max(0, burn - 3)
if(robotic && status != ORGAN_ROBOTIC) //This makes organic limbs not heal when the proc is in Robotic mode.
return
if(!robotic && status == ORGAN_ROBOTIC) // This makes robolimbs not healable by chems.
brute = max(0, brute - 3)
burn = max(0, burn - 3)
if(!robotic && status == ORGAN_ROBOTIC) //This makes robolimbs not healable by chems.
return
brute_dam = max(brute_dam - brute, 0)
burn_dam = max(burn_dam - burn, 0)
Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 83 KiB

+10
View File
@@ -76,6 +76,16 @@ h1.alert, h2.alert {color: #000000;}
.brass {color: #BE8700;}
.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;}
.large_brass {color: #BE8700; font-size: 3;}
.big_brass {color: #BE8700; font-size: 3; font-weight: bold; font-style: italic;}
.alloy {color: #42474D;}
.heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;}
.large_alloy {color: #42474D; font-size: 3;}
.sevtug {color: #AF0AAF; font-weight: bold; font-style: italic;}
.sevtug_small {color: #AF0AAF;}
.inathneq {color: #1E8CE1; font-weight: bold; font-style: italic;}
.inathneq_small {color: #1E8CE1;}
.nzcrentr {color: #FAE48C; font-weight: bold; font-style: italic;}
.nzcrentr_small {color: #FAE48C;}
.revennotice {color: #1d2953;}
.revenboldnotice {color: #1d2953; font-weight: bold;}