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