diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index c35d9a7726..fe804c44f9 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -80,3 +80,9 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us #define CLOCKWORK_ARMOR_COOLDOWN 1800 //The cooldown period between summoning suits of clockwork armor #define RATVARIAN_SPEAR_COOLDOWN 300 //The cooldown period between summoning another Ratvarian spear + +#define MARAUDER_SCRIPTURE_SCALING_THRESHOLD 200 //The amount of deciseconds that must pass before marauder scripture will not gain a recital penalty + +#define MARAUDER_SCRIPTURE_SCALING_TIME 50 //The amount of extra deciseconds tacked on to the marauder scripture recital time per recent marauder + +#define MARAUDER_SCRIPTURE_SCALING_MAX 300 //The maximum extra time applied to the marauder scripture diff --git a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm index 1fabeeba3f..a1c3d211fb 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs/clockwork_marauder.dm @@ -17,6 +17,7 @@ attack_sound = 'sound/weapons/bladeslice.ogg' weather_immunities = list("lava") movement_type = FLYING + a_intent = INTENT_HARM loot = list(/obj/item/clockwork/component/geis_capacitor/fallen_armor) light_range = 2 light_power = 1.1 @@ -24,7 +25,6 @@ unique abilities, you're a fearsome fighter in one-on-one combat, and your shield protects from projectiles!

Obey the Servants and do as they \ tell you. Your primary goal is to defend the Ark from destruction; they are your allies in this, and should be protected from harm." empower_string = "The Anima Bulwark's power flows through you! Your weapon will strike harder, your armor is sturdier, and your shield is more durable." - var/deflect_chance = 40 //Chance to deflect any given projectile (non-damaging energy projectiles are always deflected) var/max_shield_health = 3 var/shield_health = 3 //Amount of projectiles that can be deflected within var/shield_health_regen = 0 //When world.time equals this, shield health will regenerate @@ -55,8 +55,6 @@ obj_damage = 100 max_shield_health = INFINITY else if(GLOB.ratvar_approaches) //Hefty health bonus and slight attack damage increase - health = 200 - maxHealth = 200 melee_damage_upper = 15 melee_damage_lower = 15 attacktext = "carves" diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index 049a49f5f4..8a019ed74b 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -53,6 +53,7 @@ Applications: 8 servants, 3 caches, and 100 CV if(slab.busy) to_chat(invoker, "[slab] refuses to work, displaying the message: \"[slab.busy]!\"") return FALSE + pre_recital() slab.busy = "Invocation ([name]) in progress" if(GLOB.ratvar_awakens) channel_time *= 0.5 //if ratvar has awoken, half channel time and no cost @@ -176,6 +177,9 @@ Applications: 8 servants, 3 caches, and 100 CV /datum/clockwork_scripture/proc/scripture_fail() //Called if the scripture fails to invoke. +/datum/clockwork_scripture/proc/pre_recital() //Called before the scripture is recited + + /datum/clockwork_scripture/proc/post_recital() //Called after the scripture is recited //Channeled scripture begins instantly but runs constantly 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 d7aa2777ca..bcb9d1d1df 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -7,12 +7,12 @@ /datum/clockwork_scripture/create_object/construct/clockwork_marauder descname = "Well-Rounded Combat Construct" name = "Clockwork Marauder" - desc = "Creates a shell for a clockwork marauder, a balanced frontline construct." + desc = "Creates a shell for a clockwork marauder, a balanced frontline construct that can deflect projectiles with its shield." invocations = list("Arise, avatar of Arbiter!", "Defend the Ark with vengeful zeal.") channel_time = 50 power_cost = 1000 creator_message = "Your slab disgorges several chunks of replicant alloy that form into a suit of thrumming armor." - usage_tip = "The marauder's shield can effectively deflect energy-based projectiles." + usage_tip = "Reciting this scripture multiple times in a short period will cause it to take longer!" tier = SCRIPTURE_APPLICATION one_per_tile = TRUE primary_component = BELLIGERENT_EYE @@ -22,6 +22,9 @@ object_path = /obj/item/clockwork/construct_chassis/clockwork_marauder construct_type = /mob/living/simple_animal/hostile/clockwork/marauder combat_construct = TRUE + var/static/recent_marauders = 0 + var/static/time_since_last_marauder = 0 + var/static/scaled_recital_time = 0 /datum/clockwork_scripture/create_object/construct/clockwork_marauder/update_construct_limit() var/human_servants = 0 @@ -32,15 +35,30 @@ construct_limit = human_servants / 4 //1 per 4 human servants, and a maximum of 3 marauders construct_limit = Clamp(construct_limit, 1, 3) -/datum/clockwork_scripture/create_object/prolonging_prism/check_special_requirements() - if(SSshuttle.emergency.mode == SHUTTLE_DOCKED || SSshuttle.emergency.mode == SHUTTLE_IGNITING || SSshuttle.emergency.mode == SHUTTLE_STRANDED || SSshuttle.emergency.mode == SHUTTLE_ESCAPE) - to_chat(invoker, "\"It is too late to construct one of these, champion.\"") - return FALSE - var/turf/T = get_turf(invoker) - if(!T || !(T.z in GLOB.station_z_levels)) - to_chat(invoker, "\"You must be on the station to construct one of these, champion.\"") - return FALSE - return ..() +/datum/clockwork_scripture/create_object/construct/clockwork_marauder/pre_recital() + channel_time = initial(channel_time) + calculate_scaling() + if(scaled_recital_time) + to_chat(invoker, "The Hierophant Network is under strain from repeated summoning, making this scripture [scaled_recital_time / 10] seconds slower!") + channel_time += scaled_recital_time + return TRUE + +/datum/clockwork_scripture/create_object/construct/clockwork_marauder/scripture_effects() + . = ..() + time_since_last_marauder = world.time + recent_marauders++ + calculate_scaling() + +/datum/clockwork_scripture/create_object/construct/clockwork_marauder/proc/calculate_scaling() + var/WT = world.time + var/MT = time_since_last_marauder //Cast it for quicker reference + var/marauders_to_exclude = 0 + if(world.time >= time_since_last_marauder + MARAUDER_SCRIPTURE_SCALING_THRESHOLD) + marauders_to_exclude = round(WT - MT) / MARAUDER_SCRIPTURE_SCALING_THRESHOLD //If at least 20 seconds have passed, lose one marauder for each 20 seconds + //i.e. world.time = 10000, last marauder = 9000, so we lose 5 marauders from the recent count since 10k - 9k = 1k, 1k / 200 = 5 + time_since_last_marauder = world.time //So that it can't be spammed to make the marauder exclusion plummet; this emulates "ticking" + recent_marauders = max(0, recent_marauders - marauders_to_exclude) + scaled_recital_time = min(recent_marauders * MARAUDER_SCRIPTURE_SCALING_TIME, MARAUDER_SCRIPTURE_SCALING_MAX) //Mania Motor: Creates a malevolent transmitter that will broadcast the whispers of Sevtug into the minds of nearby nonservants, causing a variety of mental effects at a power cost.