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 3eaf2701c5f..eb2681c72b0 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -272,7 +272,6 @@ resist_string = "glows shimmering yellow" sigil_name = "Vitality Matrix" var/static/vitality = 0 - var/base_revive_cost = 20 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 @@ -281,7 +280,10 @@ ..() if(is_servant_of_ratvar(user) || isobserver(user)) user << "It has access to [ratvar_awakens ? "INFINITE":"[vitality]"] units of vitality." - user << "It requires at least [base_revive_cost] units of vitality to revive dead Servants, in addition to any damage the Servant has." + if(ratvar_awakens) + user << "It can revive Servants at no cost!" + else + user << "It can revive Servants at a cost of vitality equal to the damage they have, in addition to being destroyed in the process." /obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L) if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active) @@ -311,14 +313,17 @@ qdel(W) L.dust() else - vitality_drained = L.adjustToxLoss(1.5) + if(!ratvar_awakens && L.stat == CONSCIOUS) + vitality_drained = L.adjustToxLoss(1) + else + vitality_drained = L.adjustToxLoss(1.5) if(vitality_drained) 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 = L.getCloneLoss() + L.getToxLoss() + L.getFireLoss() + L.getBruteLoss() + L.getOxyLoss() if(ratvar_awakens) revival_cost = 0 var/mob/dead/observer/ghost = L.get_ghost(TRUE) @@ -326,14 +331,20 @@ if(ghost) ghost.reenter_corpse() L.revive(1, 1) + var/obj/effect/overlay/temp/ratvar/sigil/vitality/V = new /obj/effect/overlay/temp/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, [L.p_their()] mouth dripping blue ichor!", \ + L.visible_message("[L] suddenly gets back up, [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(!ratvar_awakens) + qdel(src) break - var/vitality_for_cycle = min(vitality, 3) - if(ratvar_awakens) - vitality_for_cycle = 3 + var/vitality_for_cycle = 3 + if(!ratvar_awakens) + if(L.stat == CONSCIOUS) + vitality_for_cycle = 2 + vitality_for_cycle = min(vitality, vitality_for_cycle) var/vitality_used = L.heal_ordered_damage(vitality_for_cycle, damage_heal_order) if(!vitality_used) diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm index 1c90cb96f30..fbf792c9971 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_armor.dm @@ -187,6 +187,9 @@ all_clockwork_objects -= src return ..() +/obj/item/clothing/shoes/clockwork/negates_gravity() + return TRUE + /obj/item/clothing/shoes/clockwork/ratvar_act() if(ratvar_awakens) flags |= NOSLIP 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 1949823a09c..4bed1b38f27 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -58,8 +58,8 @@ /datum/clockwork_scripture/create_object/soul_vessel, /datum/clockwork_scripture/create_object/sigil_of_transmission, /datum/clockwork_scripture/create_object/interdiction_lens) /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/fellowship_armory, \ - /datum/clockwork_scripture/create_object/vitality_matrix, /datum/clockwork_scripture/create_object/mending_motor) + 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/fellowship_armory, /datum/clockwork_scripture/create_object/mending_motor) /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, \ @@ -75,7 +75,7 @@ /obj/item/clockwork/slab/cyborg/service //five scriptures, plus xray vision quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/tinkerers_cache, \ - /datum/clockwork_scripture/fellowship_armory, /datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/create_object/clockwork_obelisk) + /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_void/cyborg) 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 d3bf150c11c..24ab8c41e6e 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -24,26 +24,71 @@ quickbind_desc = "Creates a Sigil of Accession, which can convert a mindshielded non-Servant that remains on it." -//Vitality Matrix: Creates a sigil which will drain health from nonservants and can use that health to heal or even revive servants. -/datum/clockwork_scripture/create_object/vitality_matrix - descname = "Trap, Damage to Healing" - name = "Vitality Matrix" - desc = "Scribes a sigil beneath the invoker which drains life from any living non-Servants that cross it. Servants that cross it, however, will be healed based on how much it drained from non-Servants. \ - Dead Servants can be revived by this sigil if it has enough stored vitality." - invocations = list("Divinity...", "...steal their life...", "...for these shells!") - channel_time = 70 - consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 2, HIEROPHANT_ANSIBLE = 1) - whispered = TRUE - object_path = /obj/effect/clockwork/sigil/vitality - creator_message = "A vitality matrix appears below you. It will drain life from non-Servants and heal Servants that cross it." - usage_tip = "To revive a Servant, the sigil must have 20 vitality plus the target Servant's non-oxygen damage. It will still heal dead Servants if it lacks the vitality to outright revive them." +//Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor. +/datum/clockwork_scripture/fellowship_armory + descname = "Area Servant Armor" + name = "Fellowship Armory" + desc = "Equips the invoker and all visible Servants with Ratvarian armor. This armor provides high melee resistance but a weakness to lasers. \ + It grows faster to invoke with more adjacent Servants." + invocations = list("Shield us...", "...with the...", "... fragments of Engine!") + channel_time = 100 + consumed_components = list(VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 1) + usage_tip = "This scripture will replace all weaker armor worn by affected Servants." tier = SCRIPTURE_APPLICATION - one_per_tile = TRUE + multiple_invokers_used = TRUE + multiple_invokers_optional = TRUE primary_component = VANGUARD_COGWHEEL sort_priority = 2 quickbind = TRUE - quickbind_desc = "Creates a Vitality Matrix, which drains non-Servants on it to heal Servants that cross it." + quickbind_desc = "Attempts to armor all nearby Servants with powerful Ratvarian armor." + var/static/list/ratvarian_armor_typecache = typecacheof(list( + /obj/item/clothing/suit/armor/clockwork, + /obj/item/clothing/head/helmet/clockwork, + /obj/item/clothing/gloves/clockwork, + /obj/item/clothing/shoes/clockwork)) //don't replace this ever + var/static/list/better_armor_typecache = typecacheof(list( + /obj/item/clothing/suit/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/shoes/magboots)) //replace this only if ratvar is up +/datum/clockwork_scripture/fellowship_armory/run_scripture() + for(var/mob/living/L in orange(1, get_turf(invoker))) + if(is_servant_of_ratvar(L) && L.can_speak_vocal()) + channel_time = max(channel_time - 10, 0) + return ..() + +/datum/clockwork_scripture/fellowship_armory/scripture_effects() + var/affected = 0 + for(var/mob/living/L in view(7, invoker)) + if(!is_servant_of_ratvar(L)) + continue + var/do_message = 0 + var/obj/item/I = L.get_item_by_slot(slot_wear_suit) + if(remove_item_if_better(I, L)) + do_message += L.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), slot_wear_suit) + I = L.get_item_by_slot(slot_head) + if(remove_item_if_better(I, L)) + do_message += L.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), slot_head) + I = L.get_item_by_slot(slot_gloves) + if(remove_item_if_better(I, L)) + do_message += L.equip_to_slot_or_del(new/obj/item/clothing/gloves/clockwork(null), slot_gloves) + I = L.get_item_by_slot(slot_shoes) + if(remove_item_if_better(I, L)) + do_message += L.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), slot_shoes) + if(do_message) + L.visible_message("Strange armor appears on [L]!", "A bright shimmer runs down your body, equipping you with Ratvarian armor.") + playsound(L, 'sound/magic/clockwork/fellowship_armory.ogg', 15*do_message, 1) //get sound loudness based on how much we equipped + affected++ + return affected + +/datum/clockwork_scripture/fellowship_armory/proc/remove_item_if_better(obj/item/I, mob/user) + if(!I) + return TRUE + if(is_type_in_typecache(I, ratvarian_armor_typecache)) + return FALSE + if(!ratvar_awakens && is_type_in_typecache(I, better_armor_typecache)) + return FALSE + return user.dropItemToGround(I) //Memory Allocation: Finds a willing ghost and makes them into a clockwork marauders for the invoker. /datum/clockwork_scripture/memory_allocation @@ -254,7 +299,7 @@ desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spatial Gateway to any living servant or clockwork obelisk." invocations = list("May this obelisk...", "...take us to all places!") channel_time = 80 - consumed_components = list(VANGUARD_COGWHEEL = 1, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 3) + consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 3) object_path = /obj/structure/destructible/clockwork/powered/clockwork_obelisk creator_message = "You form a clockwork obelisk which can broadcast messages or produce Spatial Gateways." observer_message = "A brass obelisk appears handing in midair!" 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 3f5347593fb..47257c8ca83 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -48,45 +48,25 @@ quickbind_desc = "Creates a Cogscarab Shell, which produces a Cogscarab when filled with a Soul Vessel." -//Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor. -/datum/clockwork_scripture/fellowship_armory - descname = "Area Servant Armor" - name = "Fellowship Armory" - desc = "Equips the invoker and any nearby servants with Ratvarian armor. This armor provides high melee resistance but a weakness to lasers. \ - It grows faster to invoke with more nearby servants." - invocations = list("Shield us...", "...with the...", "... fragments of Engine!") - channel_time = 100 - consumed_components = list(VANGUARD_COGWHEEL = 1, REPLICANT_ALLOY = 1) - usage_tip = "Before using, advise adjacent allies to remove their helmets, external suits, gloves, and shoes." +//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 = "Scribes a sigil beneath the invoker which drains life from any living non-Servants that cross it. Servants that cross it, however, will be healed based on how much 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 damage." + invocations = list("Divinity...", "...steal their life...", "...for these shells!") + channel_time = 60 + consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1) + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/vitality + creator_message = "A vitality matrix appears below you. It will drain life from non-Servants and heal Servants that cross it." + usage_tip = "The sigil will be consumed upon reviving a Servant." tier = SCRIPTURE_SCRIPT - multiple_invokers_used = TRUE - multiple_invokers_optional = TRUE + one_per_tile = TRUE primary_component = VANGUARD_COGWHEEL - sort_priority = 4 + sort_priority = 3 quickbind = TRUE - quickbind_desc = "Attempts to armor all nearby Servants with powerful Ratvarian armor." - -/datum/clockwork_scripture/fellowship_armory/run_scripture() - for(var/mob/living/L in orange(1, get_turf(invoker))) - if(is_servant_of_ratvar(L) && L.can_speak_vocal()) - channel_time = max(channel_time - 10, 0) - return ..() - -/datum/clockwork_scripture/fellowship_armory/scripture_effects() - var/affected = 0 - for(var/mob/living/L in range(1, invoker)) - if(!is_servant_of_ratvar(L)) - continue - var/do_message = 0 - do_message += L.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), slot_head) - do_message += L.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), slot_wear_suit) - do_message += L.equip_to_slot_or_del(new/obj/item/clothing/gloves/clockwork(null), slot_gloves) - do_message += L.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), slot_shoes) - if(do_message) - L.visible_message("Strange armor appears on [L]!", "A bright shimmer runs down your body, equipping you with Ratvarian armor.") - playsound(L, 'sound/magic/clockwork/fellowship_armory.ogg', 15*do_message, 1) //get sound loudness based on how much we equipped - affected++ - return affected + quickbind_desc = "Creates a Vitality Matrix, which drains non-Servants on it to heal Servants that cross it." //Sigil of Submission: Creates a sigil of submission, which converts one heretic above it after a delay. diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index eeacd3ab97d..71fd44a596a 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -40,7 +40,7 @@ return head if(slot_generic_dextrous_storage) return internal_storage - ..() + return ..() /mob/living/simple_animal/drone/equip_to_slot(obj/item/I, slot)