diff --git a/code/game/gamemodes/clock_cult/__clock_defines.dm b/code/game/gamemodes/clock_cult/__clock_defines.dm index 3516eac2b30..cb8f0def38e 100644 --- a/code/game/gamemodes/clock_cult/__clock_defines.dm +++ b/code/game/gamemodes/clock_cult/__clock_defines.dm @@ -5,12 +5,15 @@ var/global/list/clockwork_generals_invoked = list("nezbere" = FALSE, "sevtug" = var/global/list/all_clockwork_objects = list() //All clockwork items, structures, and effects in existence var/global/list/all_clockwork_mobs = list() //All clockwork SERVANTS (not creatures) in existence var/global/list/clockwork_component_cache = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //The pool of components that caches draw from +var/global/ratvar_awakens = FALSE //If Ratvar has been summoned -#define SCRIPTURE_PERIPHERAL 0 //Should never be used +#define SCRIPTURE_PERIPHERAL 0 //Scripture tiers; peripherals should never be used #define SCRIPTURE_DRIVER 1 #define SCRIPTURE_SCRIPT 2 #define SCRIPTURE_APPLICATION 3 #define SCRIPTURE_REVENANT 4 #define SCRIPTURE_JUDGEMENT 5 -#define SLAB_PRODUCTION_THRESHOLD 60 //How many cycles it takes slabs to produce a single component; defaults to one minute +#define SLAB_PRODUCTION_THRESHOLD 60 //How many cycles slabs require to produce a single component; defaults to one minute + +#define GATEWAY_SUMMON_RATE 3 //The speed multiplier used by the Gateway to the Celestial Derelict; defaults to 3x speed diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 3228797df67..57f6ef1ee68 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -117,7 +117,6 @@ This file's folder contains: // GAME MODE // /////////////// -var/global/ratvar_awakens = FALSE //If Ratvar has been summoned /datum/game_mode var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar var/required_escapees = 0 //How many servants need to escape, if applicable diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index 7d6b6700ff9..cbc537bc983 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -1,6 +1,7 @@ /mob/living/simple_animal/hostile/anima_fragment //Anima fragment: Low health but high melee power. Created by inserting a soul vessel into an empty fragment. name = "anima fragment" desc = "An ominous humanoid shell with a spinning cogwheel as its head, lifted by a jet of blazing red flame." + faction = list("ratvar") icon = 'icons/mob/clockwork_mobs.dmi' icon_state = "anime_fragment" health = 75 //Glass cannon @@ -34,6 +35,8 @@ qdel(src) return 1 + + /mob/living/simple_animal/hostile/clockwork_marauder //Clockwork marauder: Slow but with high damage, resides inside of a servant. Created via the Memory Allocation scripture. name = "clockwork marauder" desc = "A stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield." @@ -271,6 +274,8 @@ /mob/living/simple_animal/hostile/clockwork_marauder/proc/is_in_host() //Checks if the marauder is inside of their host return host && loc == host + + /mob/living/mind_control_holder name = "imprisoned mind" desc = "A helpless mind, imprisoned in its own body." diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm index 98215f0a96f..0baf48455cd 100644 --- a/code/game/gamemodes/clock_cult/clock_ratvar.dm +++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm @@ -52,7 +52,6 @@ icon_state = "clockwork_gateway_disrupted" takes_damage = FALSE sleep(27) - animate(src, transform = matrix() * 2, time = 2) explosion(src, 1, 3, 8, 8) qdel(src) return 1 @@ -66,7 +65,7 @@ M << "You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]..." if(!health) return 0 - progress_in_seconds++ + progress_in_seconds += GATEWAY_SUMMON_RATE switch(progress_in_seconds) if(-INFINITY to 100) if(!first_sound_played) @@ -87,9 +86,11 @@ if(!purpose_fulfilled) takes_damage = FALSE purpose_fulfilled = TRUE - animate(src, transform = matrix() * 1.5, time = 136) + animate(src, transform = matrix() * 1.5, alpha = 255, time = 126) world << sound('sound/effects/ratvar_rises.ogg', 0, channel = 8) //End the sounds - sleep(136) + sleep(131) + animate(src, transform = matrix() * 3, alpha = 0, time = 5) + sleep(5) new/obj/structure/clockwork/massive/ratvar(get_turf(src)) qdel(src) @@ -98,8 +99,8 @@ if(is_servant_of_ratvar(user)) var/arrival_text = "IMMINENT" if(300 - progress_in_seconds > 0) - arrival_text = "[max(300 - progress_in_seconds, 0)]s" - user << "Seconds until Ratvar's arrival: [arrival_text]" + arrival_text = "[max((300 - progress_in_seconds) / GATEWAY_SUMMON_RATE, 0)]" + user << "Seconds until Ratvar's arrival: [arrival_text]s" switch(progress_in_seconds) if(-INFINITY to 100) user << "It's still opening." @@ -131,7 +132,8 @@ /obj/structure/clockwork/massive/ratvar/New() ..() SSobj.processing += src - world << "\"I AM FREE!\"" + world << "\"BAPR NTNVA ZL YVTUG FUNYY FUVAR NPEBFF GUVF CNGURGVP ERNYZ!!\"" + world << 'sound/effects/ratvar_reveal.ogg' ratvar_awakens = TRUE spawn(50) SSshuttle.emergency.request(null, 0.3) @@ -168,8 +170,7 @@ You feel tremendous relief as a set of horrible eyes loses sight of you..." prey = null else - if(prob(75)) - dir_to_step_in = get_dir(src, prey) + dir_to_step_in = get_dir(src, prey) //Unlike Nar-Sie, Ratvar ruthlessly chases down his target forceMove(get_step(src, dir_to_step_in)) /obj/structure/clockwork/massive/ratvar/narsie_act() @@ -178,13 +179,13 @@ clashing = TRUE world << "\"[pick("BLOOD GOD!!!", "NAR-SIE!!!", "AT LAST, YOUR TIME HAS COME!")]\"" world << "\"Ratvar?! How?!\"" - for(var/obj/singularity/narsie/N in range(7, src)) + for(var/obj/singularity/narsie/N in range(15, src)) clash_of_the_titans(N) //IT'S TIME FOR THE BATTLE OF THE AGES N.clashing = TRUE break return 1 -/obj/structure/clockwork/massive/ratvar/proc/clash_of_the_titans(obj/singularity/narsie/narsie) //IT'S TIME FOR A BATTLE OF THE ELDER GODS +/obj/structure/clockwork/massive/ratvar/proc/clash_of_the_titans(obj/singularity/narsie/narsie) var/winner = "Undeclared" var/base_victory_chance = 0 while(TRUE) @@ -249,5 +250,5 @@ /mob/dead/observer/ratvar_act() //Ghosts flash yellow for a second var/old_color = color - color = rgb(75, 53, 0) //A nice brassy yellow + color = rgb(75, 53, 0) animate(src, color = old_color, time = 10) diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index 164354d6d58..33224352ce3 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -34,9 +34,9 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed /datum/clockwork_scripture/proc/run_scripture() if(can_recite() && check_special_requirements()) slab.busy = "Invocation ([name]) in progress" - if(recital() && check_special_requirements()) + if(check_special_requirements() && recital()) slab.busy = null - if(scripture_effects() && check_special_requirements() && (!ratvar_awakens && !slab.no_cost)) + if(check_special_requirements() && scripture_effects() && (!ratvar_awakens && !slab.no_cost)) for(var/i in required_components) if(tier <= SCRIPTURE_DRIVER || consumed_component_override) if(clockwork_component_cache[i] >= consumed_components[i]) //Draw components from the global cache first @@ -67,7 +67,8 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed if(multiple_invokers_used && !multiple_invokers_optional) var/nearby_servants = 0 for(var/mob/living/L in range(1, invoker)) - nearby_servants++ + if(is_servant_of_ratvar(L)) + nearby_servants++ if(nearby_servants < invokers_required) invoker << "There aren't enough servants nearby ([nearby_servants]/[invokers_required])!" return 0 @@ -513,7 +514,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed tier = SCRIPTURE_SCRIPT /datum/clockwork_scripture/function_call/check_special_requirements() - if(!invoker.verbs & /mob/living/carbon/human/proc/function_call) + if(invoker.verbs.Find(/mob/living/carbon/human/proc/function_call)) invoker << "You have already bound a Ratvarian spear to yourself!" return 0 return ishuman(invoker) @@ -610,16 +611,18 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed usage_tip = "Extremely fast invocation time." tier = SCRIPTURE_SCRIPT -/datum/clockwork_scripture/scripture_effects() +/datum/clockwork_scripture/break_will/scripture_effects() for(var/mob/living/carbon/human/H in range(1, invoker)) - if(is_servant_of_ratvar(H) || !isloyal(H)) + if(is_servant_of_ratvar(H)) continue - H.visible_message("[H] visibly trembles!", \ - "The words invoke a horrible fear deep in your being. Your loyalty to Nanotrasen falls away as you see how weak they truly are.") - H.adjustBrainLoss(5) - for(var/obj/item/weapon/implant/loyalty/L in H) - if(L.implanted) - qdel(L) + if(isloyal(H)) + H.visible_message("[H] visibly trembles!", \ + "The words invoke a horrible fear deep in your being. Your loyalty to Nanotrasen falls away as you see how weak they truly are.") + H.adjustBrainLoss(5) + for(var/obj/item/weapon/implant/loyalty/L in H) + if(L.implanted) + qdel(L) + return 1 ////////////////// // APPLICATIONS // diff --git a/code/game/gamemodes/clock_cult/clock_unsorted.dm b/code/game/gamemodes/clock_cult/clock_unsorted.dm index 2f57de3252b..7e083adc6ee 100644 --- a/code/game/gamemodes/clock_cult/clock_unsorted.dm +++ b/code/game/gamemodes/clock_cult/clock_unsorted.dm @@ -97,9 +97,6 @@ usr.verbs -= /mob/living/carbon/human/proc/function_call return 1 -/datum/clockwork_cache //The global cache datum, used to link together all tinkerer's caches - var/list/stored_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) - /* The Ratvarian Language diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index eaf4e1c8c68..7aabfb2c209 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -198,14 +198,17 @@ "You can't save him. Nothing can save him now.", "It seems that Nar-Sie will triumph after all.")]" if("emote") M.visible_message("[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")]") - if(data >= 75 && prob(33)) // 30 units, 135 seconds + if(data >= 75) // 30 units, 135 seconds if (!M.confused) M.confused = 1 M.confused += 3 - if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M)) || is_servant_of_ratvar(M)) - ticker.mode.remove_cultist(M.mind, 1, 1) - ticker.mode.remove_hog_follower(M.mind) - remove_servant_of_ratvar(M.mind) + if(iscultist(M) || is_handofgod_cultist(M) || is_handofgod_prophet(M) || is_servant_of_ratvar(M)) + if(iscultist(M)) + ticker.mode.remove_cultist(M.mind, 1, 1) + else if(is_handofgod_cultist(M) || is_handofgod_prophet(M)) + ticker.mode.remove_hog_follower(M.mind) + else if(is_servant_of_ratvar(M)) + remove_servant_of_ratvar(M) holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? M.jitteriness = 0 M.stuttering = 0 diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index 29d1c7cbd2f..123a48b8383 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -23,6 +23,7 @@ action_icon_state = "floorconstruct" action_background_icon_state = "bg_cult" + /obj/effect/proc_holder/spell/aoe_turf/conjure/wall name = "Summon Cult Wall" desc = "This spell constructs a cult wall" @@ -38,6 +39,7 @@ summon_type = list(/turf/closed/wall/mineral/cult/artificer) //we don't want artificer-based runed metal farms + /obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced name = "Greater Construction" desc = "This spell constructs a reinforced metal wall" diff --git a/sound/effects/ratvar_reveal.ogg b/sound/effects/ratvar_reveal.ogg new file mode 100644 index 00000000000..e70cd9873c5 Binary files /dev/null and b/sound/effects/ratvar_reveal.ogg differ diff --git a/sound/effects/ratvar_rises.ogg b/sound/effects/ratvar_rises.ogg index 6201ce790d6..4c22d250c38 100644 Binary files a/sound/effects/ratvar_rises.ogg and b/sound/effects/ratvar_rises.ogg differ