///////////// // SCRIPTS // ///////////// //Ocular Warden: Creates an ocular warden, which defends a small area near it. /datum/clockwork_scripture/create_object/ocular_warden descname = "Turret" name = "Ocular Warden" desc = "Forms an automatic short-range turret that deals low sustained damage to the unenlightened in its range." invocations = list("Guardians...", "...of the Engine...", "...defend us!") channel_time = 120 required_components = list("belligerent_eye" = 2, "replicant_alloy" = 1) consumed_components = list("belligerent_eye" = 1, "replicant_alloy" = 1) object_path = /obj/structure/destructible/clockwork/ocular_warden creator_message = "You form an ocular warden, which will focus its searing gaze upon nearby unenlightened." observer_message = "A brass eye takes shape and slowly rises into the air, its red iris glaring!" usage_tip = "Although powerful, the warden is very fragile and should optimally be placed behind barricades." tier = SCRIPTURE_SCRIPT one_per_tile = TRUE space_allowed = TRUE sort_priority = 1 /datum/clockwork_scripture/create_object/ocular_warden/check_special_requirements() for(var/obj/structure/destructible/clockwork/ocular_warden/W in range(3, invoker)) invoker << "You sense another ocular warden too near this location. Placing another this close would cause them to fight." //fluff message return FALSE return ..() //Cogscarab: Creates an empty cogscarab shell, which produces a cogscarab dedicated to maintaining and defending the cult. /datum/clockwork_scripture/create_object/cogscarab descname = "Constructor Soul Vessel Shell" name = "Cogscarab" desc = "Creates a small shell fitted for soul vessels. Adding an active soul vessel to it results in a small construct with tools and an inbuilt proselytizer." invocations = list("Call forth...", "...the workers of Armorer.") channel_time = 60 required_components = list("belligerent_eye" = 2, "hierophant_ansible" = 1) consumed_components = list("belligerent_eye" = 1, "hierophant_ansible" = 1) object_path = /obj/structure/destructible/clockwork/shell/cogscarab creator_message = "You form a cogscarab, a constructor soul vessel receptable." observer_message = "The slab disgorges a puddle of black metal that contracts and forms into a strange shell!" usage_tip = "Useless without a soul vessel and should not be created without one." tier = SCRIPTURE_SCRIPT sort_priority = 2 //Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor. /datum/clockwork_scripture/fellowship_armory descname = "Area Servant Armor" name = "Fellowship Armory" desc = "Equips the invoker and any nearby servants with Ratvarian armor. This armor provides high melee resistance but a weakness to lasers. \ It grows faster to invoke with more nearby servants." invocations = list("Shield me...", "...with the...", "... fragments of Engine!") channel_time = 100 required_components = list("vanguard_cogwheel" = 2, "replicant_alloy" = 1) consumed_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1) usage_tip = "Before using, advise adjacent allies to remove their helmets, external suits, gloves, and shoes." tier = SCRIPTURE_SCRIPT multiple_invokers_used = TRUE multiple_invokers_optional = TRUE sort_priority = 4 /datum/clockwork_scripture/fellowship_armory/run_scripture() for(var/mob/living/L in orange(1, invoker)) if(is_servant_of_ratvar(L) && L.can_speak_vocal()) channel_time = max(channel_time - 10, 0) return ..() /datum/clockwork_scripture/fellowship_armory/scripture_effects() for(var/mob/living/L in range(1, invoker)) if(!is_servant_of_ratvar(L)) continue L.visible_message("Strange armor appears on [L]!", "A bright shimmer runs down your body, equipping you with Ratvarian armor.") playsound(L, 'sound/magic/clockwork/fellowship_armory.ogg', 50, 1) L.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), slot_head) L.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), slot_wear_suit) L.equip_to_slot_or_del(new/obj/item/clothing/gloves/clockwork(null), slot_gloves) L.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), slot_shoes) return TRUE //Sigil of Submission: Creates a sigil of submission, which converts one heretic above it after a delay. /datum/clockwork_scripture/create_object/sigil_of_submission descname = "Conversion Trap" name = "Sigil of Submission" desc = "Places a luminous sigil that will enslave any valid beings standing on it after a time." invocations = list("Divinity, enlighten...", "...those who trespass here!") channel_time = 60 required_components = list("belligerent_eye" = 1, "guvax_capacitor" = 2) consumed_components = list("belligerent_eye" = 1, "guvax_capacitor" = 1) whispered = TRUE object_path = /obj/effect/clockwork/sigil/submission creator_message = "A luminous sigil appears below you. The next non-servant to cross it will be enslaved after a brief time if they do not move." 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 sort_priority = 5 //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. /datum/clockwork_scripture/create_object/soul_vessel descname = "Clockwork Posibrain" name = "Soul Vessel" desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar." invocations = list("Herd the souls of...", "...the blasphemous damned!") channel_time = 30 required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 2) consumed_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1) whispered = TRUE object_path = /obj/item/device/mmi/posibrain/soul_vessel creator_message = "You form a soul vessel, which can be used in-hand to attract spirits, or used on an unconscious or dead human to extract their consciousness." 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 sort_priority = 6 //Clockwork Proselytizer: Creates a clockwork proselytizer, used to convert objects and repair clockwork structures. /datum/clockwork_scripture/create_object/clockwork_proselytizer descname = "Necessary, Converts Objects" name = "Clockwork Proselytizer" desc = "Forms a device that, when used on certain objects, converts them into their Ratvarian equivalents. It requires replicant alloys to function." invocations = list("With this device...", "...his presence shall be made known.") channel_time = 20 required_components = list("guvax_capacitor" = 1, "replicant_alloy" = 2) consumed_components = list("guvax_capacitor" = 1, "replicant_alloy" = 1) whispered = TRUE object_path = /obj/item/clockwork/clockwork_proselytizer/preloaded creator_message = "You form a clockwork proselytizer, which is already pre-loaded with a small amount of replicant alloy." usage_tip = "Clockwork Walls cause adjacent 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 sort_priority = 7 //Function Call: Grants the invoker the ability to call forth a Ratvarian spear that deals significant damage to silicons. /datum/clockwork_scripture/function_call descname = "Summonable Spear" name = "Function Call" desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear every three minutes. The spear will deal significant damage to Nar-Sie's dogs and silicon lifeforms, but will \ vanish three minutes after being summoned." invocations = list("Grant me...", "...the might of brass!") channel_time = 20 required_components = list("replicant_alloy" = 2, "hierophant_ansible" = 1) consumed_components = list("replicant_alloy" = 1, "hierophant_ansible" = 1) 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 sort_priority = 8 /datum/clockwork_scripture/function_call/check_special_requirements() for(var/datum/action/innate/function_call/F in invoker.actions) invoker << "You have already bound a Ratvarian spear to yourself!" return FALSE return invoker.can_hold_items() /datum/clockwork_scripture/function_call/scripture_effects() invoker.visible_message("A shimmer of yellow light infuses [invoker]!", \ "You bind a Ratvarian spear to yourself. Use the \"Function Call\" action button to call it forth.") var/datum/action/innate/function_call/F = new() F.Grant(invoker) return TRUE //Function Call action: Calls forth a Ratvarian spear once every 3 minutes. /datum/action/innate/function_call name = "Function Call" desc = "Allows you to summon a Ratvarian spear to fight enemies." button_icon_state = "ratvarian_spear" background_icon_state = "bg_clock" check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS buttontooltipstyle = "clockcult" var/cooldown = 0 var/base_cooldown = 1800 /datum/action/innate/function_call/IsAvailable() if(!is_servant_of_ratvar(owner) || cooldown > world.time) return FALSE return ..() /datum/action/innate/function_call/Activate() if(!owner.get_empty_held_indexes()) usr << "You need an empty to hand to call forth your spear!" return FALSE owner.visible_message("A strange spear materializes in [owner]'s hands!", "You call forth your spear!") var/obj/item/clockwork/ratvarian_spear/R = new(get_turf(usr)) owner.put_in_hands(R) if(!ratvar_awakens) owner << "Your spear begins to break down in this plane of existence. You can't use it for long!" addtimer(R, "break_spear", base_cooldown, FALSE) cooldown = base_cooldown + world.time owner.update_action_buttons_icon() addtimer(src, "update_actions", base_cooldown, FALSE) return TRUE /datum/action/innate/function_call/proc/update_actions() if(owner) owner.update_action_buttons_icon() //Spatial Gateway: Allows the invoker to teleport themselves and any nearby allies to a conscious servant or clockwork obelisk. /datum/clockwork_scripture/spatial_gateway descname = "Teleport Gate" name = "Spatial Gateway" desc = "Tears open a miniaturized gateway in spacetime to any conscious servant that can transport objects or creatures to its destination. \ Each servant assisting in the invocation adds one additional use and four additional seconds to the gateway's uses and duration." invocations = list("Spatial Gateway...", "...activate!") channel_time = 80 required_components = list("vanguard_cogwheel" = 1, "hierophant_ansible" = 2) consumed_components = list("vanguard_cogwheel" = 1, "hierophant_ansible" = 1) multiple_invokers_used = TRUE 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 sort_priority = 9 /datum/clockwork_scripture/spatial_gateway/check_special_requirements() if(!isturf(invoker.loc)) invoker << "You must not be inside an object to use this scripture!" return FALSE var/other_servants = 0 for(var/mob/living/L in living_mob_list) if(is_servant_of_ratvar(L) && !L.stat != DEAD) other_servants++ for(var/obj/structure/destructible/clockwork/powered/clockwork_obelisk/O in all_clockwork_objects) other_servants++ if(!other_servants) invoker << "There are no other servants or clockwork obelisks!" return FALSE return TRUE /datum/clockwork_scripture/spatial_gateway/scripture_effects() var/portal_uses = 0 var/duration = 0 for(var/mob/living/L in range(1, invoker)) if(!L.stat && is_servant_of_ratvar(L)) portal_uses++ duration += 40 //4 seconds if(ratvar_awakens) portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned duration = max(duration, 100) return slab.procure_gateway(invoker, duration, portal_uses) //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. /datum/clockwork_scripture/channeled/volt_void descname = "Channeled, Area Power Drain" name = "Volt Void" //Alternative name: "On all levels but physical, I am a power sink" desc = "Drains energy from nearby power sources, dealing burn damage if the total power consumed is above a threshhold. Channeled every second for a maximum of thirty seconds." chant_invocations = list("Draw charge to this shell!") chant_amount = 30 chant_interval = 10 required_components = list("guvax_capacitor" = 1, "hierophant_ansible" = 2) 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 sort_priority = 10 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) var/power_drained = 0 for(var/atom/movable/A in view(7, invoker)) power_drained += A.power_drain(TRUE) 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("[ST] flares a brilliant orange!") 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("[invoker] flares a brilliant orange!", "You feel the warmth of electricity running into your body.") 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 || (BP.status == BODYPART_ROBOTIC && total_power_drained < augument_damage_threshhold)) //if ratvar is alive, it won't damage and will always heal augumented limbs if(BP.heal_damage(power_damage, power_damage, 1, 0)) //heals one point of burn and brute for every ~100W drained on augumented limbs H.update_damage_overlays() else if(BP.receive_damage(0, power_damage)) H.update_damage_overlays() 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 TRUE