diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index bc5816dbb9..0bfbe31fb1 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -31,5 +31,6 @@
/////////////
#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark
+#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index d07f66609b..918f67f7b7 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -13,6 +13,7 @@
/datum/status_effect/shadow_mend/on_apply()
owner.visible_message("Violet light wraps around [owner]'s body!", "Violet light wraps around your body!")
playsound(owner, 'sound/magic/Teleport_app.ogg', 50, 1)
+ return ..()
/datum/status_effect/shadow_mend/tick()
owner.adjustBruteLoss(-15)
@@ -75,6 +76,7 @@
progbar = new(owner, duration, owner)
progbar.bar.color = list("#FAE48C", "#FAE48C", "#FAE48C", rgb(0,0,0))
progbar.update(duration - world.time)
+ return ..()
/datum/status_effect/vanguard_shield/tick()
progbar.update(duration - world.time)
@@ -127,6 +129,7 @@
animate(owner, color = oldcolor, time = 150, easing = EASE_IN)
addtimer(CALLBACK(owner, /atom/proc/update_atom_colour), 150)
playsound(owner, 'sound/magic/Ethereal_Enter.ogg', 50, 1)
+ return ..()
/datum/status_effect/inathneqs_endowment/on_remove()
add_logs(owner, null, "lost Inath-neq's invulnerability")
@@ -178,6 +181,7 @@
/datum/status_effect/his_grace/on_apply()
add_logs(owner, null, "gained His Grace's stun immunity")
owner.add_stun_absorption("hisgrace", INFINITY, 3, null, "His Grace protects you from the stun!")
+ return ..()
/datum/status_effect/his_grace/tick()
bloodlust = 0
@@ -211,6 +215,7 @@
/datum/status_effect/wish_granters_gift/on_apply()
to_chat(owner, "Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...")
+ return ..()
/datum/status_effect/wish_granters_gift/on_remove()
owner.revive(full_heal = 1, admin_revive = 1)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index f78a3ae522..8eec853047 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -29,3 +29,50 @@
owner.adjustBruteLoss(0.1)
owner.adjustFireLoss(0.1)
owner.adjustToxLoss(0.2, TRUE, TRUE)
+
+/datum/status_effect/belligerent
+ id = "belligerent"
+ duration = 70
+ tick_interval = 0 //tick as fast as possible
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = /obj/screen/alert/status_effect/belligerent
+ var/leg_damage_on_toggle = 2 //damage on initial application and when the owner tries to toggle to run
+ var/cultist_damage_on_toggle = 10 //damage on initial application and when the owner tries to toggle to run, but to cultists
+
+/obj/screen/alert/status_effect/belligerent
+ name = "Belligerent"
+ desc = "Kneel, her-eti'c."
+ icon_state = "belligerent"
+ alerttooltipstyle = "clockcult"
+
+/datum/status_effect/belligerent/on_apply()
+ return do_movement_toggle(TRUE)
+
+/datum/status_effect/belligerent/tick()
+ if(!do_movement_toggle())
+ qdel(src)
+
+/datum/status_effect/belligerent/proc/do_movement_toggle(force_damage)
+ var/number_legs = owner.get_num_legs()
+ if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.null_rod_check() && number_legs)
+ if(force_damage || owner.m_intent != MOVE_INTENT_WALK)
+ if(GLOB.ratvar_awakens)
+ owner.Weaken(1)
+ if(iscultist(owner))
+ owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "l_leg")
+ owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, "r_leg")
+ else
+ owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "l_leg")
+ owner.apply_damage(leg_damage_on_toggle * 0.5, BURN, "r_leg")
+ if(owner.m_intent != MOVE_INTENT_WALK)
+ if(!iscultist(owner))
+ to_chat(owner, "Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!")
+ else //Cultists take extra burn damage
+ to_chat(owner, "Your leg[number_legs > 1 ? "s burn":" burns"] with pain!")
+ owner.toggle_move_intent()
+ return TRUE
+ return FALSE
+
+/datum/status_effect/belligerent/on_remove()
+ if(owner.m_intent == MOVE_INTENT_WALK)
+ owner.toggle_move_intent()
diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index c2c070dbec..ff92b67978 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -16,6 +16,7 @@
cube = icon('icons/effects/freeze.dmi', "ice_cube")
owner.add_overlay(cube)
owner.update_canmove()
+ return ..()
/datum/status_effect/freon/tick()
owner.update_canmove()
diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm
index 51b4f8fc5f..b0f080a3a0 100644
--- a/code/datums/status_effects/status_effect.dm
+++ b/code/datums/status_effects/status_effect.dm
@@ -30,10 +30,9 @@
/datum/status_effect/proc/start_ticking()
if(!src)
return
- if(!owner)
+ if(!owner || !on_apply())
qdel(src)
return
- on_apply()
if(duration != -1)
duration = world.time + initial(duration)
tick_interval = world.time + initial(tick_interval)
diff --git a/code/datums/status_effects/status_effect.dm.rej b/code/datums/status_effects/status_effect.dm.rej
new file mode 100644
index 0000000000..a174c87f7b
--- /dev/null
+++ b/code/datums/status_effects/status_effect.dm.rej
@@ -0,0 +1,11 @@
+diff a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm (rejected hunks)
+@@ -54,7 +53,8 @@ var/global/list/all_status_effects = list() //a list of all status effects, if f
+ if(duration != -1 && duration < world.time)
+ qdel(src)
+
+-/datum/status_effect/proc/on_apply() //Called whenever the buff is applied.
++/datum/status_effect/proc/on_apply() //Called whenever the buff is applied; returning FALSE will cause it to autoremove itself.
++ return TRUE
+ /datum/status_effect/proc/tick() //Called every tick.
+ /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed.
+ /datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself
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 35caabab5a..0ea612ea10 100644
--- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm
@@ -21,7 +21,6 @@
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/maximum_quickbound = 5 //how many quickbound scriptures we can have
actions_types = list(/datum/action/item_action/clock/hierophant)
/obj/item/clockwork/slab/starter
@@ -52,7 +51,6 @@
nonhuman_usable = TRUE
quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \
/datum/clockwork_scripture/create_object/tinkerers_cache)
- 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 //five scriptures, plus a proselytizer
@@ -372,12 +370,11 @@
The remaining functions are several buttons in the top left while holding the slab.
From left to right, they are:
\
Hierophant Network, which allows communication to other Servants.
")
if(LAZYLEN(quickbound))
- for(var/i in 1 to maximum_quickbound)
- if(LAZYLEN(quickbound) < i || !quickbound[i])
- textlist += "A Quickbind slot, currently set to Nothing.
"
- else
- var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
- textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
"
+ for(var/i in 1 to quickbound.len)
+ if(!quickbound[i])
+ continue
+ var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
+ textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
"
textlist += "
\
Examine the slab or swap to Recital to check the number of components it has available.
\
\
@@ -489,8 +486,8 @@
quickbound[found_index] = null //otherwise, leave it as a null so the scripture maintains position
update_quickbind()
else
- var/target_index = input("Position of [initial(path.name)], 1 to [maximum_quickbound]?", "Input") as num|null
- if(isnum(target_index) && target_index > 0 && target_index <= maximum_quickbound && !..())
+ var/target_index = input("Position of [initial(path.name)], 1 to 5?", "Input") as num|null
+ if(isnum(target_index) && target_index > 0 && target_index < 6 && !..())
var/datum/clockwork_scripture/S
if(LAZYLEN(quickbound) >= target_index)
S = quickbound[target_index]
diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej
new file mode 100644
index 0000000000..06e60a70e4
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm.rej
@@ -0,0 +1,46 @@
+diff a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm (rejected hunks)
+@@ -21,6 +21,7 @@
+ 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/maximum_quickbound = 5 //how many quickbound scriptures we can have
+ actions_types = list(/datum/action/item_action/clock/hierophant)
+
+ /obj/item/clockwork/slab/starter
+@@ -51,6 +52,7 @@
+ nonhuman_usable = TRUE
+ quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \
+ /datum/clockwork_scripture/create_object/tinkerers_cache)
++ 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 //five scriptures, plus a proselytizer
+@@ -362,11 +364,12 @@
+ The remaining functions are several buttons in the top left while holding the slab.
From left to right, they are:
\
+ Hierophant Network, which allows communication to other Servants.
")
+ if(LAZYLEN(quickbound))
+- for(var/i in 1 to quickbound.len)
+- if(!quickbound[i])
+- continue
+- var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
+- textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
"
++ for(var/i in 1 to maximum_quickbound)
++ if(LAZYLEN(quickbound) < i || !quickbound[i])
++ textlist += "A Quickbind slot, currently set to Nothing.
"
++ else
++ var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
++ textlist += "A Quickbind slot, currently set to [initial(quickbind_slot.name)].
"
+ textlist += "
\
+ Examine the slab or swap to Recital to check the number of components it has available.
\
+ \
+@@ -478,8 +481,8 @@
+ quickbound[found_index] = null //otherwise, leave it as a null so the scripture maintains position
+ update_quickbind()
+ else
+- var/target_index = input("Position of [initial(path.name)], 1 to 5?", "Input") as num|null
+- if(isnum(target_index) && target_index > 0 && target_index < 6 && !..())
++ var/target_index = input("Position of [initial(path.name)], 1 to [maximum_quickbound]?", "Input") as num|null
++ if(isnum(target_index) && target_index > 0 && target_index <= maximum_quickbound && !..())
+ var/datum/clockwork_scripture/S
+ if(LAZYLEN(quickbound) >= target_index)
+ S = quickbound[target_index]
diff --git a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm
index 1b6c80af73..6d17fe4e74 100644
--- a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm
@@ -129,6 +129,7 @@
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
apply_eye_damage(H)
+ return ..()
/datum/status_effect/wraith_spectacles/tick()
if(!ishuman(owner))
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 023cd50dd1..2e822199d3 100644
--- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
+++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm
@@ -17,23 +17,10 @@
sort_priority = 1
quickbind = TRUE
quickbind_desc = "Forces nearby non-Servants to walk, doing minor damage with each chant.
Maximum 15 chants."
- var/noncultist_damage = 2 //damage per chant to noncultists
- var/cultist_damage = 8 //damage per chant to non-walking cultists
/datum/clockwork_scripture/channeled/belligerent/chant_effects(chant_number)
for(var/mob/living/carbon/C in hearers(7, invoker))
- var/number_legs = C.get_num_legs()
- if(!is_servant_of_ratvar(C) && !C.null_rod_check() && number_legs) //you have legs right
- C.apply_damage(noncultist_damage * 0.5, BURN, "l_leg")
- C.apply_damage(noncultist_damage * 0.5, BURN, "r_leg")
- if(C.m_intent != MOVE_INTENT_WALK)
- if(!iscultist(C))
- to_chat(C, "Your leg[number_legs > 1 ? "s shiver":" shivers"] with pain!")
- else //Cultists take extra burn damage
- to_chat(C, "Your leg[number_legs > 1 ? "s burn":" burns"] with pain!")
- C.apply_damage(cultist_damage * 0.5, BURN, "l_leg")
- C.apply_damage(cultist_damage * 0.5, BURN, "r_leg")
- C.toggle_move_intent()
+ C.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
return TRUE
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
index 614a22a6f5..0529b67ffd 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
@@ -77,7 +77,7 @@
if(!prey && LAZYLEN(meals))
prey = pick(meals)
to_chat(prey, "\"You will do, heretic.\"\n\
- ")
+ You feel something massive turn its crushing focus to you...")
prey << 'sound/effects/ratvar_reveal.ogg'
else
if((!istype(prey, /obj/singularity/narsie) && prob(10) && LAZYLEN(meals) > 1) || prey.z != z || !(prey in meals))
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 5858925d86..46666cdd5f 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ