From eda1a04b7fb4f15f69331558d8d86cf4aabaee12 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Fri, 28 Jul 2017 19:45:36 -0400 Subject: [PATCH] Clockcult combat changes (#29326) * Clockcult combat changes * boom * nah, less * text changes * compile * more compile --- code/__DEFINES/clockcult.dm | 1 + .../clock_cult/clock_effects/clock_sigils.dm | 26 ++--- .../clock_helpers/slab_abilities.dm | 23 ---- .../clock_cult/clock_items/clockwork_slab.dm | 24 ++-- .../clock_cult/clock_items/judicial_visor.dm | 21 ++-- .../clock_cult/clock_items/ratvarian_spear.dm | 106 ++++-------------- .../clock_scriptures/scripture_cyborg.dm | 2 +- .../clock_scriptures/scripture_drivers.dm | 8 +- .../clock_scriptures/scripture_scripts.dm | 56 +-------- .../effects/temporary_visuals/clockcult.dm | 50 --------- strings/tips.txt | 3 +- 11 files changed, 69 insertions(+), 251 deletions(-) diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index c74bf9c61e9..0bedf57620f 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 297021ff5ae..77ae384c4a5 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -326,8 +326,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 +334,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 +347,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 +372,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 790088e8d59..c27d11b8040 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm @@ -145,29 +145,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 363370abc26..fb18ba2352f 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -58,13 +58,11 @@ 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 //three scriptures, plus a spear + quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade) -/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 //three scriptures, plus a spear + quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade) /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, \ @@ -74,8 +72,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) @@ -400,18 +398,19 @@ 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 += "Marauder: A clockwork marauder, which is a powerful bodyguard that hides in its owner.

" @@ -425,6 +424,7 @@ 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 additional power.

" dat += "-=-=-=-=-=-" @@ -458,7 +458,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 \ 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 8bc6cb56036..fb210625a2b 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 8ba151830b6..7a464aa5b13 100644 --- a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm +++ b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm @@ -7,13 +7,13 @@ icon_state = "ratvarian_spear" item_state = "ratvarian_spear" 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 +22,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 +76,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_cyborg.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm index 85574db6b9a..819dfac72e8 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 91ad4d586b6..de1560661ed 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. 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 fc210969006..d9686965a02 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -33,8 +33,8 @@ /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) @@ -206,13 +206,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 @@ -306,50 +305,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/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index b5508713896..e9d49408a0d 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 diff --git a/strings/tips.txt b/strings/tips.txt index 59c929bde9b..831dc09f7c5 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -157,7 +157,7 @@ As a Cultist, you can create an army of manifested goons using a combination of As a Cultist or Servant, check the alert in the upper-right of your screen for all the details about your cult's current status and objective. As a Servant, your Clockwork Slab fits in pockets and does not need to be held to communicate with other Servants. 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, the Judicial Visor is an effective defensive combat tool in small spaces, as it immediately slows and briefly knocks down enemies hit while giving them incentive to avoid staying in the hit area. 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, 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. @@ -171,7 +171,6 @@ As a Servant, you can deconstruct a Clockwork Wall with a Replica Fabricator to 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, you can unwrench Clockwork Structures to move them around.