From 8ca4b9d6147a0ba56c8867fe407efa79b711aa65 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 4 Aug 2017 13:46:22 -0500 Subject: [PATCH] Clockcult Combat Rebalance + Conversion Rework (#2020) * Removes Soul Vessel, Cogscarab, and Anima Fragment Scriptures * Update tips.txt * no one cares * manual clockcult syn --- code/__DEFINES/clockcult.dm | 1 + .../clock_cult/clock_effects/clock_sigils.dm | 77 +++-------- .../clock_helpers/slab_abilities.dm | 86 ++++++++----- .../clock_cult/clock_items/clockwork_slab.dm | 72 +++++------ .../clock_cult/clock_items/judicial_visor.dm | 21 +-- .../clock_cult/clock_items/ratvarian_spear.dm | 108 ++++------------ .../scripture_applications.dm | 42 ------ .../clock_scriptures/scripture_cyborg.dm | 2 +- .../clock_scriptures/scripture_drivers.dm | 120 ++++-------------- .../clock_scriptures/scripture_scripts.dm | 115 +---------------- .../clock_structures/clock_shells.dm | 48 ------- .../clock_structures/geis_binding.dm | 58 ++++----- .../effects/temporary_visuals/clockcult.dm | 54 +------- icons/effects/geis_target_remove.dmi | Bin 0 -> 1013 bytes strings/tips.txt | 14 +- tgstation.dme | 2 - 16 files changed, 212 insertions(+), 608 deletions(-) delete mode 100644 code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm create mode 100644 icons/effects/geis_target_remove.dmi diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index c74bf9c61e..0bedf57620 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -7,6 +7,7 @@ GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult GLOBAL_VAR_INIT(clockwork_caches, 0) //How many clockwork caches exist in the world (not each individual) +GLOBAL_VAR_INIT(clockwork_vitality, 0) //How much Vitality is stored, total GLOBAL_LIST_EMPTY(active_daemons) //A list of all active tinkerer's daemons GLOBAL_LIST_EMPTY(all_clockwork_objects) //All clockwork items, structures, and effects in existence GLOBAL_LIST_EMPTY(all_clockwork_mobs) //All clockwork SERVANTS (not creatures) in existence diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index 297021ff5a..7443188255 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -81,7 +81,7 @@ /obj/effect/clockwork/sigil/submission name = "ominous sigil" desc = "A luminous golden sigil. Something about it really bothers you." - clockwork_desc = "A sigil that will enslave the first person to cross it, provided they remain on it for seven seconds." + clockwork_desc = "A sigil that will enslave any non-Servant that remains on it for 8 seconds. Cannot penetrate mindshield implants." icon_state = "sigilsubmission" layer = LOW_SIGIL_LAYER alpha = 125 @@ -91,17 +91,15 @@ light_color = "#FAE48C" stat_affected = UNCONSCIOUS resist_string = "glows faintly yellow" - var/convert_time = 70 + var/convert_time = 80 var/delete_on_finish = TRUE sigil_name = "Sigil of Submission" - var/glow_type - -/obj/effect/clockwork/sigil/submission/proc/post_channel(mob/living/L) + var/glow_type = /obj/effect/temp_visual/ratvar/sigil/submission /obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L) L.visible_message("[src] begins to glow a piercing magenta!", "You feel something start to invade your mind...") var/oldcolor = color - animate(src, color = "#AF0AAF", time = convert_time) + animate(src, color = "#AF0AAF", time = convert_time, flags = ANIMATION_END_NOW) var/obj/effect/temp_visual/ratvar/sigil/glow if(glow_type) glow = new glow_type(get_turf(src)) @@ -113,16 +111,15 @@ if(get_turf(L) != get_turf(src)) if(glow) qdel(glow) - animate(src, color = oldcolor, time = 20) + animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20) visible_message("[src] slowly stops glowing!") return - post_channel(L) if(is_eligible_servant(L)) to_chat(L, "\"You belong to me now.\"") if(add_servant_of_ratvar(L)) L.log_message("Conversion was done with a [sigil_name].", INDIVIDUAL_ATTACK_LOG) - L.Knockdown(60) //Completely defenseless for about five seconds - mainly to give them time to read over the information they've just been presented with + L.Knockdown(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with if(iscarbon(L)) var/mob/living/carbon/C = L C.silent += 5 @@ -136,39 +133,9 @@ to_chat(M, "[message] you!") else to_chat(M, "[message] [L.real_name]!") - if(delete_on_finish) - qdel(src) - else - animate(src, color = oldcolor, time = 20) - addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20) - visible_message("[src] slowly stops glowing!") - - -//Sigil of Accession: After a short time, converts any non-servant standing on it though implants. Knocks down and silences them for five seconds afterwards. -/obj/effect/clockwork/sigil/submission/accession - name = "terrifying sigil" - desc = "A luminous brassy sigil. Something about it makes you want to flee." - clockwork_desc = "A sigil that will enslave any person who crosses it, provided they remain on it for seven seconds. \n\ - It can convert a mindshielded target once before disppearing, but can convert any number of non-implanted targets." - icon_state = "sigiltransgression" - alpha = 200 - color = "#A97F1B" - light_range = 3 //bright light - light_power = 1 - light_color = "#A97F1B" - delete_on_finish = FALSE - sigil_name = "Sigil of Accession" - glow_type = /obj/effect/temp_visual/ratvar/sigil/accession - resist_string = "glows bright orange" - -/obj/effect/clockwork/sigil/submission/accession/post_channel(mob/living/L) - if(L.isloyal()) - L.log_message("Had their mindshield implant broken by a [sigil_name].", INDIVIDUAL_ATTACK_LOG) - delete_on_finish = TRUE - L.visible_message("[L] visibly trembles!", \ - "[text2ratvar("You will be mine and his. This puny trinket will not stop me.")]") - for(var/obj/item/weapon/implant/mindshield/M in L.implants) - qdel(M) + animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW) + addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20) + visible_message("[src] slowly stops glowing!") //Sigil of Transmission: Stores power for clockwork machinery, serving as a battery. @@ -326,8 +293,7 @@ stat_affected = DEAD resist_string = "glows shimmering yellow" sigil_name = "Vitality Matrix" - var/static/vitality = 0 - var/base_revive_cost = 20 + var/revive_cost = 150 var/sigil_active = FALSE var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets var/static/list/damage_heal_order = list(CLONE, TOX, BURN, BRUTE, OXY) //we heal damage in this order @@ -335,11 +301,11 @@ /obj/effect/clockwork/sigil/vitality/examine(mob/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "It has access to [GLOB.ratvar_awakens ? "INFINITE":"[vitality]"] units of vitality.") + to_chat(user, "It has access to [GLOB.ratvar_awakens ? "INFINITE":GLOB.clockwork_vitality] units of vitality.") if(GLOB.ratvar_awakens) to_chat(user, "It can revive Servants at no cost!") else - to_chat(user, "It can revive Servants at a cost of [base_revive_cost] vitality plus vitality equal to the non-oxygen damage they have, in addition to being destroyed in the process.") + to_chat(user, "It can revive Servants at a cost of [revive_cost] vitality.") /obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L) if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active) @@ -348,7 +314,7 @@ animate(src, alpha = 255, time = 10, flags = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay. sleep(10) //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(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || vitality))) && get_turf(L) == get_turf(src)) + while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || GLOB.clockwork_vitality))) && get_turf(L) == get_turf(src)) sigil_active = TRUE if(animation_number >= 4) new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) @@ -373,40 +339,37 @@ else vitality_drained = L.adjustToxLoss(1.5) if(vitality_drained) - vitality += vitality_drained + GLOB.clockwork_vitality += vitality_drained else break else if(L.stat == DEAD) - var/revival_cost = base_revive_cost + L.getCloneLoss() + L.getToxLoss() + L.getFireLoss() + L.getBruteLoss() //ignores oxygen damage + var/revival_cost = revive_cost if(GLOB.ratvar_awakens) revival_cost = 0 var/mob/dead/observer/ghost = L.get_ghost(TRUE) - if(vitality >= revival_cost && (ghost || (L.mind && L.mind.active))) + if(GLOB.clockwork_vitality >= revival_cost && (ghost || (L.mind && L.mind.active))) if(ghost) ghost.reenter_corpse() L.revive(1, 1) var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) animate(V, alpha = 0, transform = matrix()*2, time = 8) playsound(L, 'sound/magic/staff_healing.ogg', 50, 1) - L.visible_message("[L] suddenly gets back up, [GLOB.ratvar_awakens ? "[L.p_their()] body dripping blue ichor":"even as [src] scatters into blue sparks around [L.p_them()]"]!", \ - "\"[text2ratvar("You will be okay, child.")]\"") - vitality -= revival_cost - if(!GLOB.ratvar_awakens) - qdel(src) + L.visible_message("[L] suddenly gets back up, [L.p_their()] body dripping blue ichor!", "\"[text2ratvar("You will be okay, child.")]\"") + GLOB.clockwork_vitality -= revival_cost break var/vitality_for_cycle = 3 if(!GLOB.ratvar_awakens) if(L.stat == CONSCIOUS) vitality_for_cycle = 2 - vitality_for_cycle = min(vitality, vitality_for_cycle) + vitality_for_cycle = min(GLOB.clockwork_vitality, vitality_for_cycle) var/vitality_used = L.heal_ordered_damage(vitality_for_cycle, damage_heal_order) if(!vitality_used) break if(!GLOB.ratvar_awakens) - vitality -= vitality_used + GLOB.clockwork_vitality -= vitality_used sleep(2) diff --git a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm index 790088e8d5..f21cbb8987 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm @@ -24,11 +24,15 @@ //For the Geis scripture; binds a target to convert. /obj/effect/proc_holder/slab/geis ranged_mousepointer = 'icons/effects/geis_target.dmi' + var/obj/structure/destructible/clockwork/geis_binding/binding //we always have a reference to the binding + var/obj/structure/destructible/clockwork/geis_binding/pulled_binding //we use this to see if we're pulling it or not + +/obj/effect/proc_holder/slab/geis/remove_ranged_ability(msg) + ..() + binding = null + pulled_binding = null /obj/effect/proc_holder/slab/geis/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return TRUE - var/turf/T = ranged_ability_user.loc if(!isturf(T)) return TRUE @@ -36,6 +40,20 @@ var/target_is_binding = istype(target, /obj/structure/destructible/clockwork/geis_binding) if((target_is_binding || isliving(target)) && ranged_ability_user.Adjacent(target)) + if(in_progress || ..()) + var/mob/living/L = target + if(!pulled_binding) + if(target == binding || (isliving(target) && L.buckled == binding)) + pulled_binding = binding + ranged_ability_user.start_pulling(binding) + remove_mousepointer(ranged_ability_user.client) + ranged_mousepointer = 'icons/effects/geis_target_remove.dmi' + add_mousepointer(ranged_ability_user.client) + else if(target == pulled_binding || (isliving(target) && L.buckled == pulled_binding)) + ranged_ability_user.visible_message("[ranged_ability_user] dispels [pulled_binding]!", "You dispel the binding!") + binding.take_damage(obj_integrity) + remove_ranged_ability() + return TRUE if(target_is_binding) var/obj/structure/destructible/clockwork/geis_binding/GB = target GB.repair_and_interrupt() @@ -65,19 +83,44 @@ in_progress = TRUE clockwork_say(ranged_ability_user, text2ratvar("Be bound, heathen!")) remove_mousepointer(ranged_ability_user.client) + ranged_mousepointer = 'icons/effects/geis_target_remove.dmi' + add_mousepointer(ranged_ability_user.client) add_logs(ranged_ability_user, L, "bound with Geis") + playsound(target, 'sound/magic/blink.ogg', 50, TRUE, frequency = 0.5) if(slab.speed_multiplier >= 0.5) //excuse my debug... ranged_ability_user.notransform = TRUE - addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 5) //stop us moving for a little bit so we don't break the scripture following this - slab.busy = null - var/datum/clockwork_scripture/geis/conversion = new - conversion.slab = slab - conversion.invoker = ranged_ability_user - conversion.target = target - conversion.run_scripture() + addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 5) //stop us moving for a little bit so we don't break the binding immediately + if(L.buckled) + L.buckled.unbuckle_mob(target, TRUE) + binding = new(get_turf(target)) + binding.setDir(target.dir) + binding.buckle_mob(target, TRUE) + pulled_binding = binding + ranged_ability_user.start_pulling(binding) + slab.busy = "sustaining Geis" + slab.flags |= NODROP + while(!QDELETED(binding) && !QDELETED(ranged_ability_user)) + if(ranged_ability_user.pulling == binding) + pulled_binding = binding + if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target.dmi') + remove_mousepointer(ranged_ability_user.client) + ranged_mousepointer = 'icons/effects/geis_target_remove.dmi' + add_mousepointer(ranged_ability_user.client) + else //if we're not pulling it, swap our mousepointer + pulled_binding = null + if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target_remove.dmi') + remove_mousepointer(ranged_ability_user.client) + ranged_mousepointer = 'icons/effects/geis_target.dmi' + add_mousepointer(ranged_ability_user.client) + sleep(1) + if(!QDELETED(slab)) + slab.flags &= ~NODROP + in_progress = FALSE successful = TRUE remove_ranged_ability() + else + ..() return TRUE @@ -145,29 +188,6 @@ return TRUE -//For the Volt Void scripture, fires a ray of energy at a target location -/obj/effect/proc_holder/slab/volt - ranged_mousepointer = 'icons/effects/volt_target.dmi' - -/obj/effect/proc_holder/slab/volt/InterceptClickOn(mob/living/caller, params, atom/target) - if(target == slab || ..()) //we can't cancel - return TRUE - - var/turf/T = ranged_ability_user.loc - if(!isturf(T)) - return TRUE - - if(target in view(7, get_turf(ranged_ability_user))) - successful = TRUE - ranged_ability_user.visible_message("[ranged_ability_user] fires a ray of energy at [target]!", "You fire a volt ray at [target].") - playsound(ranged_ability_user, 'sound/effects/light_flicker.ogg', 50, 1) - T = get_turf(target) - new/obj/effect/temp_visual/ratvar/volt_hit(T, ranged_ability_user) - add_logs(ranged_ability_user, T, "fired a volt ray") - remove_ranged_ability() - - return TRUE - //For the cyborg Linked Vanguard scripture, grants you and a nearby ally Vanguard /obj/effect/proc_holder/slab/vanguard ranged_mousepointer = 'icons/effects/vanguard_target.dmi' diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index e28fd8a10d..343f2e70e7 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -21,8 +21,8 @@ var/selected_scripture = SCRIPTURE_DRIVER var/recollecting = FALSE //if we're looking at fancy recollection var/obj/effect/proc_holder/slab/slab_ability //the slab's current bound ability, for certain scripture - var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis_prep, /datum/clockwork_scripture/create_object/replicant, \ - /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index + var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis, /datum/clockwork_scripture/create_object/sigil_of_submission, \ + /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index var/maximum_quickbound = 5 //how many quickbound scriptures we can have var/recollection_category = "Default" actions_types = list(/datum/action/item_action/clock/hierophant) @@ -53,21 +53,18 @@ maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more actions_types = list() -/obj/item/clockwork/slab/cyborg/engineer //four scriptures, plus a fabricator - quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/cogscarab, \ - /datum/clockwork_scripture/create_object/soul_vessel, /datum/clockwork_scripture/create_object/sigil_of_transmission) +/obj/item/clockwork/slab/cyborg/engineer //two scriptures, plus a fabricator + quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission) /obj/item/clockwork/slab/cyborg/medical //five scriptures, plus a spear quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \ /datum/clockwork_scripture/create_object/vitality_matrix, /datum/clockwork_scripture/channeled/mending_mantra, /datum/clockwork_scripture/fellowship_armory) -/obj/item/clockwork/slab/cyborg/security //four scriptures, plus a spear - quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade, \ - /datum/clockwork_scripture/channeled/volt_blaster) +/obj/item/clockwork/slab/cyborg/security //twoscriptures, plus a spear + quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker) -/obj/item/clockwork/slab/cyborg/peacekeeper //four scriptures, plus a spear - quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade, \ - /datum/clockwork_scripture/channeled/volt_blaster) +/obj/item/clockwork/slab/cyborg/peacekeeper //two scriptures, plus a spear + quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker) /obj/item/clockwork/slab/cyborg/janitor //five scriptures, plus a fabricator quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \ @@ -77,8 +74,8 @@ quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/tinkerers_cache, \ /datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/fellowship_armory, /datum/clockwork_scripture/create_object/clockwork_obelisk) -/obj/item/clockwork/slab/cyborg/miner //three scriptures, plus a spear and xray vision - quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/channeled/volt_blaster) +/obj/item/clockwork/slab/cyborg/miner //two scriptures, plus a spear and xray vision + quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/spatial_gateway) /obj/item/clockwork/slab/cyborg/access_display(mob/living/user) if(!GLOB.ratvar_awakens) @@ -136,7 +133,7 @@ production_time = world.time + SLAB_PRODUCTION_TIME + production_slowdown var/mob/living/L L = get_atom_on_turf(src, /mob/living) - if(istype(L) && can_recite_scripture(L)) + if(istype(L) && (no_cost || can_recite_scripture(L))) var/component_to_generate = target_component_id if(!component_to_generate) component_to_generate = get_weighted_component_id(src) //more likely to generate components that we have less of @@ -267,7 +264,7 @@ if(busy) to_chat(user, "[src] refuses to work, displaying the message: \"[busy]!\"") return 0 - if(!can_recite_scripture(user)) + if(!no_cost && !can_recite_scripture(user)) to_chat(user, "[src] hums fitfully in your hands, but doesn't seem to do anything...") return 0 access_display(user) @@ -287,7 +284,7 @@ ui.open() /obj/item/clockwork/slab/proc/recite_scripture(datum/clockwork_scripture/scripture, mob/living/user) - if(!scripture || !user || !user.canUseTopic(src) || !can_recite_scripture(user)) + if(!scripture || !user || !user.canUseTopic(src) || (!no_cost && !can_recite_scripture(user))) return FALSE if(user.get_active_held_item() != src) to_chat(user, "You need to hold the slab in your active hand to recite scripture!") @@ -403,24 +400,21 @@ dat += "Servant: A person or robot who serves Ratvar. You are one of these.
" dat += "Cache: A Tinkerer's Cache, which is a structure that stores and creates components.
" dat += "CV: Construction Value. All clockwork structures, floors, and walls increase this number.
" + dat += "Vitality: Used for healing effects, produced by Ratvarian spear attacks and Vitality Matrices.
" dat += "Geis: An important scripture used to make normal crew and robots into Servants of Ratvar.
" dat += "[get_component_icon(BELLIGERENT_EYE)]BE: Belligerent Eye, a component type used in offensive scriptures.
" dat += "[get_component_icon(VANGUARD_COGWHEEL)]VC: Vanguard Cogwheel, a component type used in defensive scriptures.
" dat += "[get_component_icon(GEIS_CAPACITOR)]GC: Geis Capacitor, a component type used in mind-related scriptures.
" dat += "[get_component_icon(REPLICANT_ALLOY)]RA: Replicant Alloy, a component type used in construction scriptures.
" - dat += "[get_component_icon(HIEROPHANT_ANSIBLE)]HA: Hierophant Ansible, a component type used in energy scriptures.
" + dat += "[get_component_icon(HIEROPHANT_ANSIBLE)]HA: Hierophant Ansible, a component type used in energy-related scriptures.
" dat += "Ark: The cult's win condition, a huge structure that needs to be defended.

" dat += "Items
" dat += "Slab: A clockwork slab, a Servant's most important tool. You're holding one! Keep it safe and hidden.
" - dat += "Visor: A judicial visor, which is a pair of glasses that can stun everything in an area after a delay.
" + dat += "Visor: A judicial visor, which is a pair of glasses that can smite an area for a brief stun and delayed explosion.
" dat += "Wraith Specs: Wraith spectacles, which provide true sight (x-ray, night vision) but damage the wearer's eyes.
" - dat += "Spear: A Ratvarian spear, which is a very powerful melee weapon.
" + dat += "Spear: A Ratvarian spear, which is a very powerful melee weapon that produces Vitality.
" dat += "Fabricator: A replica fabricator, which converts objects into clockwork versions.

" dat += "Constructs
" - dat += "Vessel: A soul vessel, a clockwork brain used to activate constructs.
" - dat += "Shell: A construct shell of some type that can accept a soul vessel to activate.
" - dat += "Scarab: A cogscarab construct, which is a drone that maintains the cult's bases.
" - dat += "Fragment: An anim[prob(1) ? "e" : "a"] fragment, which is a fragile but powerful offensive construct.
" dat += "Marauder: A clockwork marauder, which is a powerful bodyguard that hides in its owner.

" dat += "Structures (* = requires power)
" dat += "Warden: An ocular warden, which is a ranged turret that damages non-Servants that see it.
" @@ -432,8 +426,9 @@ dat += "Note: Sigils can be stacked on top of one another, making certain sigils very effective when paired!
" dat += "Transgression: Stuns the first non-Servant to cross it for ten seconds and blinds others nearby. Disappears on use.
" dat += "Submission: Converts the first non-Servant to stand on the sigil for seven seconds. Disappears on use.
" + dat += "Matrix: Drains health from non-Servants, producing Vitality. Can heal and revive Servants.
" dat += "Accession: Identical to the Sigil of Submission, but doesn't disappear on use. It can also convert a single mindshielded target, but will disappear after doing this.
" - dat += "Transmission: Drains and stores power for clockwork structures. Feeding it brass sheets will create power.

" + dat += "Transmission: Drains and stores power for clockwork structures. Feeding it brass sheets will create additional power.

" dat += "-=-=-=-=-=-" if("Components") var/servants = 0 //Calculate the current production time for slab components @@ -465,7 +460,7 @@ dat += "Components are your primary resource as a Servant. There are five types of component, with each one being used in different roles:

" dat += "[get_component_icon(BELLIGERENT_EYE)]BE Belligerent Eyes are aggressive and judgemental, and are used in offensive scripture;
" dat += "[get_component_icon(VANGUARD_COGWHEEL)]VC Vanguard Cogwheels are defensive and repairing, and are used in defensive scripture;
" - dat += "[get_component_icon(GEIS_CAPACITOR)]GC Geis Capacitors are for conversion and control, and are used in mind-related scripture;
" //References the old name + dat += "[get_component_icon(GEIS_CAPACITOR)]GC Geis Capacitors are for conversion and control, and are used in mind-related scripture;
" dat += "[get_component_icon(REPLICANT_ALLOY)]RA Replicant Alloy is a strong, malleable metal and is used for construction and creation;
" dat += "[get_component_icon(HIEROPHANT_ANSIBLE)]HA Hierophant Ansibles are for transmission and power, and are used in power and teleportation scripture

" dat += "Although this is a good rule of thumb, their effects become much more nuanced when used together. For instance, a turret might have both belligerent eyes and \ @@ -503,8 +498,8 @@ and can be harnessed in several ways.

" dat += "To begin with, if there is no other source of power nearby, structures will draw from the area's APC, assuming it has one. This is inefficient and ill-advised as \ anything but a last resort. Instead, it is recommended that a Sigil of Transmission is created. This sigil serves as both battery and power generator for nearby clockwork \ - structures, and those structures will happily draw power from the sigil before they resort to pathetic APCs and other sources of energy.

" - dat += "The most reliable and efficient way to generate power is by using brass sheets; attacking a sigil of transmission with brass sheets will convert them \ + structures, and those structures will happily draw power from the sigil before they resort to APCs.

" + dat += "Generating power is less easy. The most reliable and efficient way is using brass sheets; attacking a sigil of transmission with brass sheets will convert them \ to power, at a rate of [POWER_FLOOR]W per sheet. (Brass sheets are created from replica fabricators, which are explained more in detail in the Conversion section.) \ Activating a sigil of transmission will also cause it to drain power from the nearby area, which, while effective, serves as an obvious tell that there is something wrong.

" dat += "Without power, many structures will not function, making a base vulnerable to attack. For this reason, it is critical that you keep an eye on your power reserves and \ @@ -516,15 +511,15 @@ they become a full-fledged Servant, ready and willing to serve the cause of Ratvar. It should also be noted that silicon crew, such as cyborgs and the AI, can be \ converted just like normal crew and will gain special abilities; this is covered later. This section will also cover converting the station's structure itself; walls, \ floors, windows, tables, and other objects can all be converted into clockwork versions, and serve an important purpose.

" - dat += "Methods of Conversion: There are several ways to convert humans and silicons. The first and most readily-available of these is \ - Geis, a Driver-tier scripture. Using it whispers an invocation very quickly - this is incredibly obvious - and charges your slab with power. In addition to making \ - the slab visible in your hand, you can now use it on a target within melee range to bind them and begin converting them. While there are six or fewer Servants, they are \ - unable to escape this binding, meaning that unless you are interrupted, the target is as good as yours. However, the scripture becomes slower for every Servant human or \ - silicon Servant past [SCRIPT_SERVANT_REQ], and the bindings can be resisted past this, meaning that eventually other methods become more desirable.

" - dat += "The other three methods of conversion are the sigils of submission and accession, whose purpose is to do so, and the mania motor. The sigil of \ - submission is a sigil that, when stood on by a non-Servant for seven full seconds, will convert that non-Servant. This time requirement does not scale with \ - Servants, making it the preferred option after Geis becomes too inefficient. It is, however, consumed after use; the sigil of accession solves this problem, and serves as a \ - permanent conversion sigil. The mania motor is generally unreliable, only converting those who stand near it for an extended period.

" + dat += "A Note on Geis: There are several ways to convert humans and silicons. However, the most important tool to making them work is \ + Geis, a Driver-tier scripture. Using it whispers an invocation very quickly and charges your slab with power. In addition to making the slab visible in your hand, \ + you can now use it on a target within melee range to bind and mute them. It is by far your most reliable tool for capturing potential converts and targets, though it is incredibly \ + obvious. In addition, you are unable to take any actions other than moving while your target is bound. The binding will last for 25 seconds and mute for about 13 seconds, though \ + allies can use Geis to refresh these effects.

" + dat += "Converting: The two methods of conversion are the sigil of submission, whose purpose is to do so, and the mania motor. \ + The sigil of submission is a sigil that, when stood on by a non-Servant for eight seconds, will convert that non-Servant. This is the only practical way to convert targets. \ + Sigils of submission are cheap, early, and permanent! Make sure sigils of submission are placed only in bases or otherwise hidden spots, or with a sigil of transgression on them. \ + The mania motor, however, is generally unreliable and unlocked later, only converting those who stand near it for an extended period.

" dat += "Converting Humans: For obvious reasons, humans are the most common conversion target. Because every crew member is different, and \ may be armed with different equipment, you should take precautions to ensure that they aren't able to resist. If able, removing a headset is essential, as is restraining \ them through handcuffs, cable ties, or other restraints. Some crew, like security, are also implanted with mindshield implants; these will prevent conversion and must be \ @@ -532,9 +527,8 @@ begins administering mindshield implants, this will greatly inhibit conversion. Also note that mindshield implants can be broken by a sigil of accession automatically, but \ the sigil will disappear.

" dat += "Converting Silicons: Due to their robotic nature, silicons are generally more predictable than humans in terms of conversion. \ - However, they are also much, much harder to subdue, especially cyborgs. The easiest way to convert a cyborg is by using a flash or a sigil of transgression to stun it, \ - then very quickly using Geis to restrain them. If you stack a sigil of transgression and one of the conversion sigils, a crossing cyborg will be stunned and helpless to \ - escape in time before the other sigil converts them.

" + However, they are also much, much harder to subdue, especially cyborgs. The easiest way to convert a cyborg is by using Geis to restrain them, then dragging them to a sigil \ + of submission. If you stack a sigil of transgression and a sigil of submission, a crossing cyborg will be stunned and helpless to escape before they are converted.

" dat += "Converting AIs is very often the hardest task of the cult, and has been the downfall of countless successful Servants. Their omnipresence across the station, \ coupled with their secure location and ability to lock themselves securely, makes them a powerful target. However, once the AI itself is reached, it is usually completely \ helpless to resist its own conversion. A very common tactic is to take advantage of a converted cyborg to rush the AI before it is able to react.

" diff --git a/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm b/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm index 8bc6cb5603..fb210625a2 100644 --- a/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm +++ b/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm @@ -145,7 +145,7 @@ return TRUE return FALSE -//Judicial marker: Created by the judicial visor. After three seconds, knocks down any non-Servants nearby and damages Nar-Sian cultists. +//Judicial marker: Created by the judicial visor. Immediately applies Belligerent and briefly knocks down, then after 3 seconds does large damage and briefly knocks down again /obj/effect/clockwork/judicial_marker name = "judicial marker" desc = "You get the feeling that you shouldn't be standing here." @@ -165,11 +165,18 @@ /obj/effect/clockwork/judicial_marker/proc/judicialblast() playsound(src, 'sound/magic/magic_missile.ogg', 50, 1, 1, 1) flick("judicial_marker", src) + for(var/mob/living/carbon/C in range(1, src)) + var/datum/status_effect/belligerent/B = C.apply_status_effect(STATUS_EFFECT_BELLIGERENT) + if(!QDELETED(B)) + B.duration = world.time + 30 + C.Knockdown(5) //knocks down for half a second if affected sleep(16) + name = "judicial blast" layer = ABOVE_ALL_MOB_LAYER flick("judicial_explosion", src) set_light(1.4, 2, "#B451A1") sleep(13) + name = "judicial explosion" var/targetsjudged = 0 playsound(src, 'sound/effects/explosionfar.ogg', 100, 1, 1, 1) set_light(0) @@ -181,21 +188,19 @@ L.visible_message("Strange energy flows into [L]'s [I.name]!", \ "Your [I.name] shields you from [src]!") continue + L.Knockdown(15) //knocks down briefly when exploding if(!iscultist(L)) L.visible_message("[L] is struck by a judicial explosion!", \ "[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]") - L.Knockdown(160) //knocks down targets for 14-16 seconds else L.visible_message("[L] is struck by a judicial explosion!", \ "\"Keep an eye out, filth.\"\nA burst of heat crushes you against the ground!") - L.Knockdown(80) //knocks down for 6-8 seconds, but set cultist targets on fire - L.adjust_fire_stacks(2) + L.adjust_fire_stacks(2) //sets cultist targets on fire L.IgniteMob() - if(iscarbon(L)) - var/mob/living/carbon/C = L - C.silent += 6 + L.adjustFireLoss(5) targetsjudged++ - L.adjustBruteLoss(10) //do a small amount of damage + if(!QDELETED(L)) + L.adjustBruteLoss(20) //does a decent amount of damage add_logs(user, L, "struck with a judicial blast") to_chat(user, "[targetsjudged ? "Successfully judged [targetsjudged]":"Judged no"] heretic[targetsjudged == 1 ? "":"s"].") sleep(3) //so the animation completes properly diff --git a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm index 8ba151830b..c1ea55e16d 100644 --- a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm +++ b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm @@ -6,14 +6,16 @@ icon = 'icons/obj/clockwork_objects.dmi' icon_state = "ratvarian_spear" item_state = "ratvarian_spear" + lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' force = 15 //Extra damage is dealt to targets in attack() - throwforce = 40 + throwforce = 25 + armour_penetration = 10 sharpness = IS_SHARP_ACCURATE attack_verb = list("stabbed", "poked", "slashed") hitsound = 'sound/weapons/bladeslice.ogg' w_class = WEIGHT_CLASS_BULKY - var/impale_cooldown = 50 //delay, in deciseconds, where you can't impale again - var/attack_cooldown = 10 //delay, in deciseconds, where you can't attack with the spear + var/bonus_burn = 5 var/timerid /obj/item/clockwork/ratvarian_spear/Destroy() @@ -22,107 +24,44 @@ /obj/item/clockwork/ratvarian_spear/ratvar_act() if(GLOB.ratvar_awakens) //If Ratvar is alive, the spear is extremely powerful - force = 25 - throwforce = 50 - armour_penetration = 10 + force = 20 + bonus_burn = 10 + throwforce = 40 + armour_penetration = 50 clockwork_desc = initial(clockwork_desc) deltimer(timerid) else force = initial(force) + bonus_burn = initial(bonus_burn) throwforce = initial(throwforce) - armour_penetration = 0 + armour_penetration = initial(armour_penetration) clockwork_desc = "A powerful spear of Ratvarian making. It's more effective against enemy cultists and silicons, though it won't last for long." deltimer(timerid) timerid = addtimer(CALLBACK(src, .proc/break_spear), RATVARIAN_SPEAR_DURATION, TIMER_STOPPABLE) /obj/item/clockwork/ratvarian_spear/cyborg/ratvar_act() //doesn't break! - if(GLOB.ratvar_awakens) - force = 25 - throwforce = 50 - armour_penetration = 10 - else - force = initial(force) - throwforce = initial(throwforce) - armour_penetration = 0 + ..() + clockwork_desc = "A powerful spear of Ratvarian making. It's more effective against enemy cultists and silicons." + deltimer(timerid) /obj/item/clockwork/ratvarian_spear/examine(mob/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "Stabbing a human you are pulling or have grabbed with the spear will impale them, doing massive damage and stunning.") + to_chat(user, "Attacks on living non-Servants will generate [bonus_burn] units of vitality.") if(!iscyborg(user)) to_chat(user, "Throwing the spear will do massive damage, break the spear, and knock down the target.") /obj/item/clockwork/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user) - var/impaling = FALSE - if(attack_cooldown > world.time) - to_chat(user, "You can't attack right now, wait [max(round((attack_cooldown - world.time)*0.1, 0.1), 0)] seconds!") - return - if(user.pulling && ishuman(user.pulling) && user.pulling == target) - if(impale_cooldown > world.time) - to_chat(user, "You can't impale [target] yet, wait [max(round((impale_cooldown - world.time)*0.1, 0.1), 0)] seconds!") - else - impaling = TRUE - attack_verb = list("impaled") - force += 22 //total 40 damage if ratvar isn't alive, 50 if he is - armour_penetration += 10 //if you're impaling someone, armor sure isn't that useful - user.stop_pulling() - - if(hitsound) - playsound(loc, hitsound, get_clamped_volume(), 1, -1) - user.lastattacked = target - target.lastattacker = user - user.do_attack_animation(target) - if(!target.attacked_by(src, user)) //TODO MAKE ATTACK() USE PROPER RETURN VALUES - impaling = FALSE //if we got blocked, stop impaling - else if(!target.null_rod_check()) //if they don't have a null rod, we do bonus damage on a successful attack + . = ..() + if(!QDELETED(target) && target.stat != DEAD && !target.null_rod_check() && !is_servant_of_ratvar(target)) //we do bonus damage on attacks unless they're a servant, have a null rod, or are dead + var/bonus_damage = bonus_burn //normally a total of 20 damage, 30 with ratvar if(issilicon(target)) - var/mob/living/silicon/S = target - if(S.stat != DEAD) - S.visible_message("[S] shudders violently at [src]'s touch!", "ERROR: Temperature rising!") - S.adjustFireLoss(22) //total 37 damage on borgs + target.visible_message("[target] shudders violently at [src]'s touch!", "ERROR: Temperature rising!") + bonus_damage *= 5 //total 40 damage on borgs, 70 with ratvar else if(iscultist(target) || isconstruct(target)) - var/mob/living/M = target - if(M.stat != DEAD) - to_chat(M, "Your body flares with agony at [src]'s presence!") - M.adjustFireLoss(15) //total 30 damage on cultists - else - target.adjustFireLoss(3) //anything else takes a total of 18 - add_logs(user, target, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") - add_fingerprint(user) - - attack_verb = list("stabbed", "poked", "slashed") - ratvar_act() - if(impaling) - impale_cooldown = world.time + initial(impale_cooldown) - attack_cooldown = world.time + initial(attack_cooldown) //can't attack until we're done impaling - if(target) - new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target)) - target.Stun(80) //brief stun - to_chat(user, "You prepare to remove your ratvarian spear from [target]...") - var/remove_verb = pick("pull", "yank", "drag") - if(do_after(user, 10, 1, target)) - var/turf/T = get_turf(target) - var/obj/effect/temp_visual/dir_setting/bloodsplatter/B = new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, get_dir(target, user)) - playsound(T, 'sound/misc/splort.ogg', 200, 1) - playsound(T, 'sound/weapons/pierce.ogg', 200, 1) - if(target.stat != CONSCIOUS) - user.visible_message("[user] [remove_verb]s [src] out of [target]!", "You [remove_verb] your spear from [target]!") - else - user.visible_message("[user] kicks [target] off of [src]!", "You kick [target] off of [src]!") - to_chat(target, "You scream in pain as you're kicked off of [src]!") - target.emote("scream") - step(target, get_dir(user, target)) - T = get_turf(target) - B.forceMove(T) - target.Knockdown(40) //then knockdown if we stayed next to them - playsound(T, 'sound/weapons/thudswoosh.ogg', 50, 1) - flash_color(target, flash_color="#911414", flash_time=8) - else if(target) //it's a do_after, we gotta check again to make sure they didn't get deleted - user.visible_message("[user] [remove_verb]s [src] out of [target]!", "You [remove_verb] your spear from [target]!") - if(target.stat == CONSCIOUS) - to_chat(target, "You scream in pain as [src] is suddenly [remove_verb]ed out of you!") - target.emote("scream") - flash_color(target, flash_color="#911414", flash_time=4) + to_chat(target, "Your body flares with agony at [src]'s presence!") + bonus_damage *= 3 //total 30 damage on cultists, 50 with ratvar + GLOB.clockwork_vitality += target.adjustFireLoss(bonus_damage) //adds the damage done to existing vitality /obj/item/clockwork/ratvarian_spear/throw_impact(atom/target) var/turf/T = get_turf(target) @@ -139,6 +78,7 @@ L.Knockdown(100) else L.Knockdown(40) + GLOB.clockwork_vitality += L.adjustFireLoss(bonus_burn * 3) //normally a total of 40 damage, 70 with ratvar break_spear(T) else ..() diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm index d4d6155461..d0b7f11eb4 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -2,28 +2,6 @@ // APPLICATIONS // ////////////////// -//Sigil of Accession: Creates a sigil of accession, which is like a sigil of submission, but can convert any number of non-implanted targets and up to one implanted target. -/datum/clockwork_scripture/create_object/sigil_of_accession - descname = "Trap, Permanent Conversion" - name = "Sigil of Accession" - desc = "Places a luminous sigil much like a Sigil of Submission, but it will remain even after successfully converting a non-implanted target. \ - It will penetrate mindshield implants once before disappearing." - invocations = list("Divinity, enslave...", "...all who trespass here!") - channel_time = 70 - consumed_components = list(BELLIGERENT_EYE = 4, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) - whispered = TRUE - object_path = /obj/effect/clockwork/sigil/submission/accession - prevent_path = /obj/effect/clockwork/sigil/submission - creator_message = "A luminous sigil appears below you. All non-servants to cross it will be enslaved after a brief time if they do not move." - 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." - - //Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor. /datum/clockwork_scripture/fellowship_armory descname = "Area Servant Armor" @@ -151,26 +129,6 @@ return TRUE -//Anima Fragment: Creates an empty anima fragment, which produces an anima fragment that moves at extreme speed and does high damage. -/datum/clockwork_scripture/create_object/anima_fragment - descname = "Fast Soul Vessel Shell" - name = "Anima Fragment" - desc = "Creates a large shell fitted for soul vessels. Adding an active soul vessel to it results in a powerful construct with decent health and slight regeneration, notable melee power, \ - and exceptional speed, though taking damage will temporarily slow it down." - invocations = list("Call forth...", "...the soldiers of Armorer.") - channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 4) - object_path = /obj/structure/destructible/clockwork/shell/fragment - creator_message = "You form an anima fragment, a powerful soul vessel receptacle." - observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!" - usage_tip = "Useless without a soul vessel and should not be created without one." - tier = SCRIPTURE_APPLICATION - primary_component = REPLICANT_ALLOY - sort_priority = 4 - quickbind = TRUE - quickbind_desc = "Creates a Fragment Shell, which produces an Anima Fragment when filled with a Soul Vessel." - - //Sigil of Transmission: Creates a sigil of transmission that can drain and store power for clockwork structures. /datum/clockwork_scripture/create_object/sigil_of_transmission descname = "Structure Power Generator & Battery" diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm index 85574db6b9..819dfac72e 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm @@ -37,7 +37,7 @@ invocations = list("May heathens...", "...kneel under our force!") channel_time = 30 primary_component = BELLIGERENT_EYE - quickbind_desc = "Allows you to place a Judicial Marker to knock down and damage non-Servants in an area.
Click your slab to disable." + quickbind_desc = "Allows you to smite an area, applying Belligerent and briefly stunning.
Click your slab to disable." slab_overlay = "judicial" ranged_type = /obj/effect/proc_holder/slab/judicial ranged_message = "You charge the clockwork slab with judicial force.\n\ diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm index 91ad4d586b..7818f9fae8 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm @@ -28,20 +28,20 @@ /datum/clockwork_scripture/create_object/judicial_visor descname = "Delayed Area Knockdown Glasses" name = "Judicial Visor" - desc = "Forms a visor that, when worn, will grant the ability to smite an area, knocking down, muting, and damaging non-Servants." + desc = "Creates a visor that can smite an area, applying Belligerent and briefly stunning. The smote area will explode after 3 seconds." invocations = list("Grant me the flames of Engine!") channel_time = 10 consumed_components = list(BELLIGERENT_EYE = 1) whispered = TRUE object_path = /obj/item/clothing/glasses/judicial_visor - creator_message = "You form a judicial visor, which is capable of smiting the unworthy." - usage_tip = "The visor has a thirty-second cooldown once used, and the marker it creates has a delay of 3 seconds before exploding." + creator_message = "You form a judicial visor, which is capable of smiting a small area." + usage_tip = "The visor has a thirty-second cooldown once used." tier = SCRIPTURE_DRIVER space_allowed = TRUE primary_component = BELLIGERENT_EYE sort_priority = 2 quickbind = TRUE - quickbind_desc = "Creates a Judicial Visor, which can create a Judicial Marker at an area, knocking down, muting, and damaging non-Servants after a delay." + quickbind_desc = "Creates a Judicial Visor, which can smite an area, applying Belligerent and briefly stunning." //Vanguard: Provides twenty seconds of stun immunity. At the end of the twenty seconds, 25% of all stuns absorbed are applied to the invoker. @@ -97,28 +97,28 @@ Click your slab to cancel." -//Geis: Grants a short-range binding that will immediately start chanting on binding a valid target. -/datum/clockwork_scripture/ranged_ability/geis_prep - descname = "Melee Convert Attack" +//Geis: Grants a short-range binding attack that allows you to mute and drag around a target in a very obvious manner. +/datum/clockwork_scripture/ranged_ability/geis + descname = "Melee Mute & Stun" name = "Geis" - desc = "Charges your slab with divine energy, allowing you to bind a nearby heretic for conversion. This is very obvious and will make your slab visible in-hand." - invocations = list("Divinity, grant...", "...me strength...", "...to enlighten...", "...the heathen!") + desc = "Charges your slab with divine energy, allowing you to bind and pull a struck heretic." + invocations = list("Divinity, grant me strength...", "...to bind the heathen!") whispered = TRUE channel_time = 20 - usage_tip = "Is melee range and does not penetrate mindshield implants. Much more efficient than a Sigil of Submission at low Servant amounts." + usage_tip = "You CANNOT TAKE ANY NON-PULL ACTIONS while the target is bound, so Sigils of Submission should be placed before use." tier = SCRIPTURE_DRIVER primary_component = GEIS_CAPACITOR sort_priority = 5 quickbind = TRUE - quickbind_desc = "Allows you to bind and start converting an adjacent target non-Servant.
Click your slab to disable." + quickbind_desc = "Allows you to bind and mute an adjacent target non-Servant.
Click your slab to disable." slab_overlay = "geis" ranged_type = /obj/effect/proc_holder/slab/geis ranged_message = "You charge the clockwork slab with divine energy.\n\ - Left-click a target within melee range to convert!\n\ + Left-click a target within melee range to bind!\n\ Click your slab to cancel." timeout_time = 100 -/datum/clockwork_scripture/ranged_ability/geis_prep/run_scripture() +/datum/clockwork_scripture/ranged_ability/geis/run_scripture() var/servants = 0 if(!GLOB.ratvar_awakens) for(var/mob/living/M in GLOB.living_mob_list) @@ -130,93 +130,25 @@ channel_time = min(channel_time + servants*3, 50) return ..() -//The scripture that does the converting. -/datum/clockwork_scripture/geis - name = "Geis Conversion" - invocations = list("Enlighten this heathen!", "All are insects before Engine!", "Purge all untruths and honor Engine.") - channel_time = 49 - tier = SCRIPTURE_PERIPHERAL - var/mob/living/target - var/obj/structure/destructible/clockwork/geis_binding/binding -/datum/clockwork_scripture/geis/Destroy() - if(binding && !QDELETED(binding)) - qdel(binding) - return ..() - -/datum/clockwork_scripture/geis/can_recite() - if(!target) - return FALSE - return ..() - -/datum/clockwork_scripture/geis/run_scripture() - var/servants = 0 - if(!GLOB.ratvar_awakens) - for(var/mob/living/M in GLOB.living_mob_list) - if(can_recite_scripture(M, TRUE)) - servants++ - if(target.buckled) - target.buckled.unbuckle_mob(target, TRUE) - binding = new(get_turf(target)) - if(servants > SCRIPT_SERVANT_REQ) - servants -= SCRIPT_SERVANT_REQ - channel_time = min(channel_time + servants*7, 120) - binding.can_resist = TRUE - binding.setDir(target.dir) - binding.buckle_mob(target, TRUE) - return ..() - -/datum/clockwork_scripture/geis/check_special_requirements() - return target && binding && target.buckled == binding && !is_servant_of_ratvar(target) && target.stat != DEAD - -/datum/clockwork_scripture/geis/scripture_effects() - . = add_servant_of_ratvar(target) - if(.) - add_logs(invoker, target, "Converted", object = "Geis") - - -//Taunting Tirade: Channeled for up to five times over thirty seconds. Confuses non-servants that can hear it and allows movement for a brief time after each chant. -/datum/clockwork_scripture/channeled/taunting_tirade - descname = "Channeled, Mobile Confusion Trail" - name = "Taunting Tirade" - desc = "Allows movement for five seconds, leaving a trail that confuses and knocks down. Chanted every second for up to thirty seconds." - chant_invocations = list("Hostiles on my back!", "Enemies on my trail!", "Gonna try and shake my tail.", "Bogeys on my six!") - chant_amount = 5 - chant_interval = 10 +//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 = "Trap, Conversion" + name = "Sigil of Submission" + desc = "Places a luminous sigil that will convert any non-Servants that remain on it for 8 seconds." + invocations = list("Divinity, enlighten...", "...those who trespass here!") + channel_time = 60 consumed_components = list(GEIS_CAPACITOR = 1) - usage_tip = "Useful for fleeing attackers, as few will be able to follow someone using this scripture." + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/submission + creator_message = "A luminous sigil appears below you. Any non-Servants to cross it will be converted after 8 seconds if they do not move." + usage_tip = "This is the primary conversion method, though it will not penetrate mindshield implants." tier = SCRIPTURE_DRIVER + one_per_tile = TRUE primary_component = GEIS_CAPACITOR sort_priority = 6 quickbind = TRUE - quickbind_desc = "Allows movement for five seconds, leaving a trail that confuses and knocks down.
Maximum 5 chants." - var/flee_time = 47 //allow fleeing for 5 seconds - var/grace_period = 3 //very short grace period so you don't have to stop immediately - var/datum/progressbar/progbar - -/datum/clockwork_scripture/channeled/taunting_tirade/chant_effects(chant_number) - invoker.visible_message("[invoker] is suddenly covered with a thin layer of purple smoke!") - var/invoker_old_color = invoker.color - invoker.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0)) - animate(invoker, color = invoker_old_color, time = flee_time+grace_period) - addtimer(CALLBACK(invoker, /atom/proc/update_atom_colour), flee_time+grace_period) - var/endtime = world.time + flee_time - progbar = new(invoker, flee_time, invoker) - progbar.bar.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0)) - animate(progbar.bar, color = initial(progbar.bar.color), time = flee_time+grace_period) - while(world.time < endtime && can_recite()) - sleep(1) - new/obj/structure/destructible/clockwork/taunting_trail(invoker.loc) - progbar.update(endtime - world.time) - qdel(progbar) - if(can_recite() && chant_number != chant_amount) - sleep(grace_period) - else - return FALSE - return TRUE - -/datum/clockwork_scripture/channeled/taunting_tirade/chant_end_effects() - qdel(progbar) + quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it." //Replicant: Creates a new clockwork slab. diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm index 47558a5ee9..0e42af3a65 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -29,31 +29,12 @@ 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 fabricator." - invocations = list("Call forth...", "...the workers of Armorer.") - channel_time = 60 - consumed_components = list(BELLIGERENT_EYE = 2, HIEROPHANT_ANSIBLE = 1) - object_path = /obj/structure/destructible/clockwork/shell/cogscarab - creator_message = "You form a cogscarab, a constructor soul vessel receptacle." - observer_message = "The slab disgorges a puddle of black metal that contracts and forms into a strange shell!" - usage_tip = "Useless without a soul vessel and should not be created without one." - tier = SCRIPTURE_SCRIPT - primary_component = BELLIGERENT_EYE - sort_priority = 2 - quickbind = TRUE - quickbind_desc = "Creates a Cogscarab Shell, which produces a Cogscarab when filled with a Soul Vessel." - - //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 = "Trap, Damage to Healing" name = "Vitality Matrix" - desc = "Places a sigil that drains life from any living non-Servants that cross it. Servants that cross it, however, will be healed based on how much Vitality all \ - Matrices have drained from non-Servants. Dead Servants can be revived by this sigil if there is vitality equal to the target Servant's non-oxygen damage." + desc = "Places a sigil that drains life from any living non-Servants that cross it, producing Vitality. Servants that cross it, however, will be healed using existing Vitality. \ + Dead Servants can be revived by this sigil at a cost of 150 Vitality." invocations = list("Divinity...", "...steal their life...", "...for these shells!") channel_time = 60 consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 2) @@ -181,46 +162,6 @@ 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 = "Trap, Conversion" - 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 - consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 2) - 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 Geis 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 = GEIS_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. -/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 - consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 2) - 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 - primary_component = GEIS_CAPACITOR - sort_priority = 6 - quickbind = TRUE - quickbind_desc = "Creates a Soul Vessel, which can be placed in construct shells and cyborg bodies once filled." - - //Replica Fabricator: Creates a replica fabricator, used to convert objects and repair clockwork structures. /datum/clockwork_scripture/create_object/replica_fabricator descname = "Replaces Objects with Ratvarian Versions" @@ -245,13 +186,12 @@ /datum/clockwork_scripture/function_call descname = "Permanent 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." + desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear every 3 minutes, with it lasting 3 minutes. The spear's attacks will generate Vitality, used for healing." invocations = list("Grant me...", "...the might of brass!") channel_time = 20 consumed_components = list(REPLICANT_ALLOY = 2, 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 knock them down, but break the spear." + usage_tip = "Throwing the spear at a mob will do massive damage and knock them down, but break the spear." tier = SCRIPTURE_SCRIPT primary_component = REPLICANT_ALLOY sort_priority = 8 @@ -345,50 +285,3 @@ 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 Blaster: Channeled for up to five times over ten seconds to fire up to five rays of energy at target locations. -/datum/clockwork_scripture/channeled/volt_blaster - descname = "Channeled, Targeted Energy Blasts" - name = "Volt Blaster" - desc = "Allows you to fire five energy rays at target locations. Channeled every fourth of a second for a maximum of ten seconds." - channel_time = 30 - invocations = list("Amperage...", "...grant me your power!") - chant_invocations = list("Use charge to kill!", "Slay with power!", "Hunt with energy!") - chant_amount = 5 - chant_interval = 4 - consumed_components = list(GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 2) - usage_tip = "Though it requires you to stand still, this scripture can do massive damage." - tier = SCRIPTURE_SCRIPT - primary_component = HIEROPHANT_ANSIBLE - sort_priority = 10 - quickbind = TRUE - quickbind_desc = "Allows you to fire energy rays at target locations.
Maximum 5 chants." - var/static/list/nzcrentr_insults = list("You're not very good at aiming.", "You hunt badly.", "What a waste of energy.", "Almost funny to watch.", - "Boss says \"Click something, you idiot!\".", "Stop wasting components if you can't aim.") - -/datum/clockwork_scripture/channeled/volt_blaster/chant_effects(chant_number) - slab.busy = null - var/datum/clockwork_scripture/ranged_ability/volt_ray/ray = new - ray.slab = slab - ray.invoker = invoker - var/turf/T = get_turf(invoker) - if(!ray.run_scripture() && slab && invoker) - if(can_recite() && T == get_turf(invoker)) - to_chat(invoker, "\"[text2ratvar(pick(nzcrentr_insults))]\"") - else - return FALSE - return TRUE - -/obj/effect/ebeam/volt_ray - name = "volt_ray" - layer = LYING_MOB_LAYER - -/datum/clockwork_scripture/ranged_ability/volt_ray - name = "Volt Ray" - slab_overlay = "volt" - allow_mobility = FALSE - ranged_type = /obj/effect/proc_holder/slab/volt - ranged_message = "You charge the clockwork slab with shocking might.\n\ - Left-click a target to fire, quickly!" - timeout_time = 20 diff --git a/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm b/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm deleted file mode 100644 index a2f1022abc..0000000000 --- a/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm +++ /dev/null @@ -1,48 +0,0 @@ -//Useless on their own, these shells can create powerful constructs. -/obj/structure/destructible/clockwork/shell - construction_value = 0 - anchored = FALSE - density = FALSE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - var/mobtype = /mob/living/simple_animal/hostile/clockwork - var/spawn_message = " is an error and you should yell at whoever spawned this shell." - -/obj/structure/destructible/clockwork/shell/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/device/mmi/posibrain/soul_vessel)) - if(!is_servant_of_ratvar(user)) - ..() - return 0 - var/obj/item/device/mmi/posibrain/soul_vessel/S = I - if(!S.brainmob) - to_chat(user, "[S] is inactive! Turn it on or capture a mind first.") - return 0 - if(S.brainmob && (!S.brainmob.client || !S.brainmob.mind)) - to_chat(user, "[S]'s trapped consciousness appears inactive!") - return 0 - user.visible_message("[user] places [S] in [src], where it fuses to the shell.", "You place [S] in [src], fusing it to the shell.") - var/mob/living/simple_animal/A = new mobtype(get_turf(src)) - A.visible_message("[src][spawn_message]") - S.brainmob.mind.transfer_to(A) - A.fully_replace_character_name(null, "[findtext(A.name, initial(A.name)) ? "[initial(A.name)]":"[A.name]"] ([S.brainmob.name])") - user.drop_item() - qdel(S) - qdel(src) - return 1 - else - return ..() - -/obj/structure/destructible/clockwork/shell/cogscarab - name = "cogscarab shell" - desc = "A small brass shell with a cube-shaped receptable in its center. It gives off an aura of obsessive perfectionism." - clockwork_desc = "A dormant receptable that, when powered with a soul vessel, will become a weak construct with an inbuilt fabricator." - icon_state = "clockdrone_shell" - mobtype = /mob/living/simple_animal/drone/cogscarab - spawn_message = "'s eyes blink open, glowing bright red." - -/obj/structure/destructible/clockwork/shell/fragment - name = "fragment shell" - desc = "A massive brass shell with a small cube-shaped receptable in its center. It gives off an aura of contained power." - clockwork_desc = "A dormant receptable that, when powered with a soul vessel, will become a powerful construct." - icon_state = "anime_fragment" - mobtype = /mob/living/simple_animal/hostile/clockwork/fragment - spawn_message = " whirs and rises from the ground on a flickering jet of reddish fire." diff --git a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm index ecb69c8a27..82d1e68ff3 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm @@ -5,8 +5,9 @@ clockwork_desc = "A binding ring around a target, preventing them from taking action while they're being converted." max_integrity = 25 light_range = 2 - light_power = 0.5 + light_power = 0.8 light_color = "#AF0AAF" + anchored = FALSE density = FALSE immune_to_servant_attacks = TRUE icon = 'icons/effects/clockwork_effects.dmi' @@ -16,16 +17,34 @@ debris = list() can_buckle = TRUE buckle_lying = 0 - buckle_prevents_pull = TRUE - var/resisting = FALSE - var/can_resist = FALSE var/mob_layer = MOB_LAYER +/obj/structure/destructible/clockwork/geis_binding/Initialize(mapload, obj/item/clockwork/slab/the_slab) + . = ..() + START_PROCESSING(SSprocessing, src) + +/obj/structure/destructible/clockwork/geis_binding/Destroy() + STOP_PROCESSING(SSprocessing, src) + return ..() + /obj/structure/destructible/clockwork/geis_binding/examine(mob/user) icon_state = "geisbinding_full" ..() icon_state = "geisbinding" +/obj/structure/destructible/clockwork/geis_binding/process() + if(LAZYLEN(buckled_mobs)) + for(var/V in buckled_mobs) + var/mob/living/L = V + if(is_servant_of_ratvar(L)) //servants are freed automatically + take_damage(obj_integrity) + return + var/tick_damage = 1 + if(!is_servant_of_ratvar(pulledby)) + tick_damage++ + take_damage(tick_damage, sound_effect = FALSE) + playsound(src, 'sound/effects/empulse.ogg', tick_damage * 20, TRUE) + /obj/structure/destructible/clockwork/geis_binding/attack_hand(mob/living/user) return @@ -48,10 +67,8 @@ var/obj/item/geis_binding/B = new(M) M.put_in_hands(B, i) M.regenerate_icons() - M.visible_message("A [name] appears around [M]!", \ - "A [name] appears around you![can_resist ? "\nResist!":""]") - if(!can_resist) - repair_and_interrupt() + M.visible_message("A [name] appears around [M]!", "A [name] appears around you!") + repair_and_interrupt() else var/obj/effect/temp_visual/ratvar/geis_binding/G = new /obj/effect/temp_visual/ratvar/geis_binding(M.loc) var/obj/effect/temp_visual/ratvar/geis_binding/T = new /obj/effect/temp_visual/ratvar/geis_binding/top(M.loc) @@ -65,11 +82,6 @@ for(var/obj/item/geis_binding/GB in M.held_items) M.dropItemToGround(GB, TRUE) -/obj/structure/destructible/clockwork/geis_binding/relaymove(mob/user, direction) - if(isliving(user) && can_resist) - var/mob/living/L = user - L.resist() - /obj/structure/destructible/clockwork/geis_binding/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) playsound(src, 'sound/effects/empulse.ogg', 50, 1) @@ -79,7 +91,7 @@ update_icon() /obj/structure/destructible/clockwork/geis_binding/update_icon() - alpha = min(initial(alpha) + ((obj_integrity - max_integrity) * 5), 255) + alpha = min(255 * ((obj_integrity/max_integrity) + 0.2) , 255) /obj/structure/destructible/clockwork/geis_binding/proc/repair_and_interrupt() obj_integrity = max_integrity @@ -87,10 +99,10 @@ for(var/m in buckled_mobs) var/mob/living/L = m if(L) - L.Stun(20, 1, 1) + L.Stun(130, 1, 1) //basically here to act as a mute for borgs if(iscarbon(L)) var/mob/living/carbon/C = L - C.silent += 4 + C.silent += 7 visible_message("[src] flares brightly!") var/obj/effect/temp_visual/ratvar/geis_binding/G1 = new /obj/effect/temp_visual/ratvar/geis_binding(loc) var/obj/effect/temp_visual/ratvar/geis_binding/G2 = new /obj/effect/temp_visual/ratvar/geis_binding(loc) @@ -106,18 +118,7 @@ animate(T2, pixel_y = pixel_y - 9, alpha = 0, time = 8, easing = EASE_IN) /obj/structure/destructible/clockwork/geis_binding/user_unbuckle_mob(mob/living/buckled_mob, mob/user) - if(buckled_mob == user) - if(!resisting && can_resist) - resisting = TRUE - user.visible_message("[user] starts struggling against [src]...", "You start breaking out of [src]...") - while(do_after(user, 10, target = src) && resisting && obj_integrity) - if(obj_integrity - 5 <= 0) - user.visible_message("[user] breaks [src]!", "You break [src]!") - take_damage(5) - return user - take_damage(5) - resisting = FALSE - else + if(buckled_mob != user) return ..() /obj/item/geis_binding @@ -128,5 +129,4 @@ flags = NODROP|ABSTRACT|DROPDEL /obj/item/geis_binding/pre_attackby(atom/target, mob/living/user, params) - user.resist() return FALSE diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index b550871389..c3894b8300 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -78,56 +78,6 @@ animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) animate(src, transform = M, time = duration, flags = ANIMATION_PARALLEL) -/obj/effect/temp_visual/ratvar/volt_hit - name = "volt blast" - layer = ABOVE_MOB_LAYER - duration = 8 - icon_state = "volt_hit" - light_range = 1.5 - light_power = 2 - light_color = LIGHT_COLOR_ORANGE - var/mob/user - var/damage = 25 - -/obj/effect/temp_visual/ratvar/volt_hit/Initialize(mapload, caster) - . = ..() - user = caster - if(user) - var/matrix/M = new - M.Turn(Get_Angle(src, user)) - transform = M - INVOKE_ASYNC(src, .proc/volthit) - -/obj/effect/temp_visual/ratvar/volt_hit/proc/volthit() - if(user) - Beam(get_turf(user), "volt_ray", time=duration, maxdistance=8, beam_type=/obj/effect/ebeam/volt_ray) - var/hit_amount = 0 - var/turf/T = get_turf(src) - for(var/mob/living/L in T) - if(is_servant_of_ratvar(L)) - continue - var/obj/item/I = L.null_rod_check() - if(I) - L.visible_message("Strange energy flows into [L]'s [I.name]!", \ - "Your [I.name] shields you from [src]!") - continue - L.visible_message("[L] is struck by a [name]!", "You're struck by a [name]!") - L.apply_damage(damage, BURN, "chest", L.run_armor_check("chest", "laser", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 0, "Your armor was penetrated by [src]!")) - add_logs(user, L, "struck with a volt blast") - hit_amount++ - for(var/obj/mecha/M in T) - if(M.occupant) - if(is_servant_of_ratvar(M.occupant)) - continue - to_chat(M.occupant, "Your [M.name] is struck by a [name]!") - M.visible_message("[M] is struck by a [name]!") - M.take_damage(damage, BURN, 0, 0) - hit_amount++ - if(hit_amount) - playsound(src, 'sound/machines/defib_zap.ogg', damage*hit_amount, 1, -1) - else - playsound(src, "sparks", 50, 1) - /obj/effect/temp_visual/ratvar/ocular_warden name = "warden's gaze" layer = ABOVE_MOB_LAYER @@ -232,9 +182,9 @@ light_power = 0.5 light_color = "#1E8CE1" -/obj/effect/temp_visual/ratvar/sigil/accession +/obj/effect/temp_visual/ratvar/sigil/submission color = "#AF0AAF" layer = ABOVE_MOB_LAYER - duration = 70 + duration = 80 icon_state = "sigilactiveoverlay" alpha = 0 diff --git a/icons/effects/geis_target_remove.dmi b/icons/effects/geis_target_remove.dmi new file mode 100644 index 0000000000000000000000000000000000000000..076f2f4ca5f8451d9e0ee6f1577dfb7f5f16e2f1 GIT binary patch literal 1013 zcmVV=-0C=3G%&`iCFcgL1IeChMu2M`}$1EjM9P}LmxitZ6B)RD8cd*dC+5R(} zug0T)4in5c$emISafQbH(n@gz#~vEDs}!EX?D-s-EfX{to(tq43l^QPDx!j1`pGJ*-GBD#HKfZKo3m;*ZkN^M!8%ab# zRCt{2o4-q2Q545Nd9g?Z1#Ks%DiqvZN^yA5Ev2Gs7N`0rUdnNCOIgxX|Q%LSRpY!f{dH2V;rxryKCOHMJFWcMUS=FFC zHZ}3b0?^(L&-NFqbs~>VZT!I1aC082aw3mSjr_pXkn`nAoXBHSD?e~Ggw4`UyTqy`p~)of~-n=b)9ordw|v>@2{>3*hGxu))gTlgmkOUMt@jfVdIw zWDLH74IEBI3kDLJT!0F#}opuyx z1Nb^ZBYzZt1l~-(-x@aP)?2S10RaBr68NvwJ)RC7$##NPel3ckG<*w(y7kt)&k1-G ze&@26I5KiVGrxAcaO{GgW-e&E1{vrlKRe+q{y$MeWf|?{vs(Tf<4QXQ4BlBE`O-Ps z4$t=IVDk-de$HT;1#mK&Y8~A|^V?vwj~lVWy!$EB%6D!@o2Dmw1qt(Q5Eka!G*p;x z3o&87ZAA$4Z8J`oKNf&8Te@YpgEjKKN%`lppZ?tW-lTkyr>9IOXyyBp@&({UozTo5 zjR9j$6ojXh$EH^PgF!fbL0Nban;QAvSx^=5A~v=0z3YIg;6-d|;yVLinx0$<8C43y zP?T@=0m8ES0AX2ufUvASKv-5EAS|m75SG;k2+QgNgrzwKd6V*0Ihx0&G+#pM j>jR{xq3Y`cqyz8|gTXI8Xvcct00000NkvXXu0mjf8Y|n{ literal 0 HcmV?d00001 diff --git a/strings/tips.txt b/strings/tips.txt index 4d1a8aa28a..0d1922b835 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -102,8 +102,8 @@ As the Bartender, the drinks you start with only give you the basics. If you wan As the Bartender, you can use a circular saw on your shotgun to make it easier to store. As a Janitor, if someone steals your janicart, you can instead use your space cleaner spray, grenades, water sprayer or order another from Cargo. As a Janitor, mousetraps can be used to create bombs or booby-trap containers. -As the Librarian, you are not completely defenseless. Your laser pointer can blind humans and cyborgs, and you can hide items in wirecut books. -As the Librarian, be sure to keep the shelves stocked and the library clean for crew. +As the Curator, you are not completely defenseless. Your laser pointer can blind humans and cyborgs, and you can hide items in wirecut books. +As the Curator, be sure to keep the shelves stocked and the library clean for crew. As a Cargo Technician, you can hack MULEbots to make them faster, run over people in their way, and even let you ride them! As a Cargo Technician, you can order contraband items from the supply shuttle console by de-constructing it and using a multitool on the circuit board, the re-assembling it. As a Cargo Technician, you can earn more cargo points by shipping back crates from maintenance, liquid containers, plasma sheets, rare seeds from hydroponics, and more! @@ -159,24 +159,22 @@ As a Servant, your Clockwork Slab fits in pockets and does not need to be held t As a Servant, remember that while the selection of scripture and tools Servant cyborgs get is limited, it is still extremely useful, and some of it is unique; for example, engineering and janitor cyborgs get a proselytizer that can use their own power in addition to its own. As a Servant, the Judicial Visor is an effective defensive combat tool in small spaces, as it stuns and mutes anyone still on it after 3 seconds. It is also useful for stunning already-stunned enemies for long enough to convert them or finish them off. As a Servant, making, and protecting, Tinkerer's Caches is extremely important, as caches are required to unlock scripture and share components. -As a Servant, Ocular Wardens, while fragile, do very high, rapid damage to a target non-servant that can see them and will even attack mechs that contain heretics. Place them behind objects that don't block vision to get the most use out of them. +As a Servant, Ocular Wardens, while fragile, do very high, rapid damage to a target non-Servant that can see them and will even attack mechs that contain heretics. Place them behind objects that don't block vision to get the most use out of them. As a Servant, Clockwork Structures that require power will draw power from the APC if they cannot find a different source of power, and most power-using Structures will rapidly drain the APC. As a Servant, you can repair Servant cyborgs and Clockwork Structures with a Replica Fabricator at a rate of 25W power to 1 health. Damaged Clockwork Structures are less efficient, so don't forget to repair them! As a Servant, securing a reliable source of component generation is high-priority, as simply handing out slabs will slowly become inefficient. Try placing Tinkerer's Caches near clockwork walls or creating and powering Tinkerer's Daemons. -As a Servant, only a single held Clockwork Slab will generate components, no matter how many you're holding. In addition, slabs will generate components slower with large amounts of servants; you can see the exact time with Recollection. +As a Servant, only a single held Clockwork Slab will generate components, no matter how many you're holding. In addition, slabs will generate components slower with large amounts of Servants; you can see the exact time with Recollection. As a Servant, you can use Geis to easily convert single targets, as it binds them in place, preventing escape unless they react quickly enough. Having another Servant apply Geis to someone already bound will prevent their escape and mute them, even if they reacted quickly. As a Servant, placing components in a slab or cache places those components in a globally-accessable storage that slabs will draw from to invoke scripture. As a Servant, you can stack different types of Sigils on the same turf; try stacking a Sigil of Transgression and a Sigil of Submission for a subtle conversion trap. -As a Servant, you can deconstruct a Clockwork Wall with a Clockwork Proselytizer to regain 1000W power. You can also construct Clockwork Walls on Clockwork Floors for a cost of 1000W power. -As a Servant, Volt Void will drain power from nearby Sigils of Transmission to up to double the damage of each volt ray. It'll even use your own power if you happen to be a cyborg! +As a Servant, you can deconstruct a Clockwork Wall with a Replica Fabricator to regain 1000W power. You can also construct Clockwork Walls on Clockwork Floors for a cost of 1000W power. As a Servant, Fellowship Armory invokes much faster for each nearby servant and attempts to provide each affected servant with powerful armor against melee, bullet, and bomb attacks. The gauntlets provided are also immune to elecricity. As a Servant, Spatial Gateway can teleport to any living Servant or Clockwork Obelisk, and gains additional uses and duration for each Servant assisting in the invocation. As a Servant, creating and activating the Gateway to the Celestial Derelict is your ultimate goal, and you must defend it with all the tools you have available. As a Servant, you can impale human targets with a Ratvarian Spear by pulling them, then attacking them. This does massive damage and stuns them, and should effectively win the fight. As a Servant, Sentinel's Compromise can instantly return you or another Servant to a fighting state by converting half of all their brute, burn, and oxygen damage to toxin, effectively halving the damage they have. Clockwork Floors will also rapidly heal toxin damage in Servants, allowing the Compromise more effectiveness. As a Servant, Belligerent and Taunting Tirade are extremely powerful for disabling and disrupting large groups of enemies, though they render you somewhat vulnerable, as Belligerent requires that you stand still, and Taunting Tirade makes you extremely obvious. -As a Servant, Soul Vessels can be placed in cyborg shells, mecha, Cogscarab shells, and Anima Fragment shells. -As a Servant, you can unwrench Clockwork Structures to move them around. +As a Servant, you can unwrench Clockwork Structures, but doing so will damage them, severely weakening them until repaired with a Replica Fabricator or Mending Mantra. Damage from other sources will also similarly weaken structures. You can deconvert Cultists of Nar-Sie and Servants of Ratvar by feeding them large amounts of holy water. As a Wizard, you can turn people to stone, then animate the resulting statue with a staff of animation to create an extremely powerful minion, for all of 5 minutes at least. As a Wizard, the fireball spell performs very poorly at close range, as it can easily catch you in the blast. It is best used as a form of artillery down long hallways. diff --git a/tgstation.dme b/tgstation.dme index 9e09f17fdb..dcf38e0f39 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -463,7 +463,6 @@ #include "code\game\gamemodes\clock_cult\clock_items\replica_fabricator.dm" #include "code\game\gamemodes\clock_cult\clock_items\soul_vessel.dm" #include "code\game\gamemodes\clock_cult\clock_items\wraith_spectacles.dm" -#include "code\game\gamemodes\clock_cult\clock_mobs\anima_fragment.dm" #include "code\game\gamemodes\clock_cult\clock_mobs\clockwork_marauder.dm" #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_applications.dm" #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_cyborg.dm" @@ -471,7 +470,6 @@ #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_judgement.dm" #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_scripts.dm" #include "code\game\gamemodes\clock_cult\clock_structures\ark_of_the_clockwork_justicar.dm" -#include "code\game\gamemodes\clock_cult\clock_structures\clock_shells.dm" #include "code\game\gamemodes\clock_cult\clock_structures\clockwork_obelisk.dm" #include "code\game\gamemodes\clock_cult\clock_structures\geis_binding.dm" #include "code\game\gamemodes\clock_cult\clock_structures\mania_motor.dm"