mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-25 16:45:42 +00:00
* Deadchat Announcement Variety Pack 1 (#75140) ## About The Pull Request Adds announce_to_ghosts()/notify_ghosts() calls to a bunch of different things. **THIS INCLUDES:** - Powersink being activated/reaching critical (explosion) heat capacity. - His Grace being awoken. - Hot Potatoes being armed. - Ascension Rituals being completed. - Eyesnatcher victims. - Ovens exploding as a result of the Aurora Caelus event. - Wizard Imposter spawns. - Rock-Paper-Scissors with death as the result of Helbital consumption. - BSA impact sites. - Spontaneous Appendicitis. - The purchasing of a badass syndie balloon. - The Supermatter beginning to delaminate. This was everything that I could think of that would be worth announcing to deadchat. These were all chosen with consideration to questions like "how easy would it be to spam deadchat with this?" and "will observers actually see the interesting thing happen, or just the aftermath?". Not gonna lie, I've really become an observer main as of recently. Maybe that's being reflected in my recent PRs. Who's to say? Deadchat Announcement Variety Pack 2 will probably never come out. Sorry. ## Why It's Good For The Game Gives deadchat a better indiciation of when/where something **REALLY FUNNY** is about to happen. Draws attention to certain things that are likely to gather an audience anyways, but sooner (for your viewing pleasure). In simple terms, it helps the observers observe things better. Some cases, such as the aurora caelus or helbitaljanken, are occurrences so rare that they deserve the audience. ## Changelog 🆑 Rhials qol: Observers now recieve an alert when a powersink is activated/about to explode. qol: His Grace being awoken now alerts observers, to give you a headstart on your murderbone ghost ring. qol: Ascension Rituals being completed will also alert observers, for basically the same reason. qol: Arming a hot potato will now alert observers. Catch! qol: Eyesnatcher victims will now notify observers, and invite them to laugh at their state of misery and impotence. qol: Observers will be notified of any acute references to The Simpsons or other 20th Television America copyright properties. qol: Wizard Imposter spawns alert observers, much like any other ghost role event should. qol: Playing Rock-Paper-Scissors with death will now alert the observers and invite them to watch. Better not choke! qol: Observers now get an orbit link for BSA impact sites. Why does it keep teleporting me to the AI upload?? qol: Spontaneous Appendicitis now alerts deadchat. qol: The purchasing of a badass syndie balloon now alerts deadchat. You might not be any more powerful, but at least you have an audience. qol: When beginning to delaminate, the Supermatter will alert observers and invite them to watch the fireworks. /🆑 * Deadchat Announcement Variety Pack 1 --------- Co-authored-by: Rhials <Datguy33456@gmail.com>
277 lines
11 KiB
Plaintext
277 lines
11 KiB
Plaintext
//His Grace is a very special weapon granted only to traitor chaplains.
|
|
//When awakened, He thirsts for blood and begins ticking a "bloodthirst" counter.
|
|
//The wielder of His Grace is immune to stuns and gradually heals.
|
|
//If the wielder fails to feed His Grace in time, He will devour them and become incredibly aggressive.
|
|
//Leaving His Grace alone for some time will reset His thirst and put Him to sleep.
|
|
//Using His Grace effectively requires extreme speed and care.
|
|
/obj/item/his_grace
|
|
name = "artistic toolbox"
|
|
desc = "A toolbox painted bright green. Looking at it makes you feel uneasy."
|
|
icon = 'icons/obj/storage/toolbox.dmi'
|
|
icon_state = "green"
|
|
inhand_icon_state = "artistic_toolbox"
|
|
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
|
|
w_class = WEIGHT_CLASS_GIGANTIC
|
|
force = 12
|
|
demolition_mod = 1.25
|
|
attack_verb_continuous = list("robusts")
|
|
attack_verb_simple = list("robust")
|
|
hitsound = 'sound/weapons/smash.ogg'
|
|
drop_sound = 'sound/items/handling/toolbox_drop.ogg'
|
|
pickup_sound = 'sound/items/handling/toolbox_pickup.ogg'
|
|
var/awakened = FALSE
|
|
var/bloodthirst = HIS_GRACE_SATIATED
|
|
var/prev_bloodthirst = HIS_GRACE_SATIATED
|
|
var/force_bonus = 0
|
|
var/ascended = FALSE
|
|
var/victims_needed = 25
|
|
var/ascend_bonus = 15
|
|
|
|
/obj/item/his_grace/Initialize(mapload)
|
|
. = ..()
|
|
START_PROCESSING(SSprocessing, src)
|
|
SSpoints_of_interest.make_point_of_interest(src)
|
|
RegisterSignal(src, COMSIG_MOVABLE_POST_THROW, PROC_REF(move_gracefully))
|
|
update_appearance()
|
|
|
|
/obj/item/his_grace/Destroy()
|
|
STOP_PROCESSING(SSprocessing, src)
|
|
for(var/mob/living/L in src)
|
|
L.forceMove(get_turf(src))
|
|
return ..()
|
|
|
|
/obj/item/his_grace/update_icon_state()
|
|
icon_state = ascended ? "gold" : "green"
|
|
inhand_icon_state = ascended ? "toolbox_gold" : "artistic_toolbox"
|
|
return ..()
|
|
|
|
/obj/item/his_grace/update_overlays()
|
|
. = ..()
|
|
if(ascended)
|
|
. += "triple_latch"
|
|
else if(awakened)
|
|
. += "single_latch_open"
|
|
else
|
|
. += "single_latch"
|
|
|
|
/obj/item/his_grace/attack_self(mob/living/user)
|
|
if(!awakened)
|
|
INVOKE_ASYNC(src, PROC_REF(awaken), user)
|
|
|
|
/obj/item/his_grace/attack(mob/living/M, mob/user)
|
|
if(awakened && M.stat)
|
|
consume(M)
|
|
else
|
|
..()
|
|
|
|
/obj/item/his_grace/CtrlClick(mob/user) //you can't pull his grace
|
|
return
|
|
|
|
/obj/item/his_grace/examine(mob/user)
|
|
. = ..()
|
|
if(awakened)
|
|
switch(bloodthirst)
|
|
if(HIS_GRACE_SATIATED to HIS_GRACE_PECKISH)
|
|
. += span_his_grace("[src] isn't very hungry. Not yet.")
|
|
if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY)
|
|
. += span_his_grace("[src] would like a snack.")
|
|
if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED)
|
|
. += span_his_grace("[src] is quite hungry now.")
|
|
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
|
|
. += span_his_grace("[src] is openly salivating at the sight of you. Be careful.")
|
|
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
|
. += "<span class='his_grace bold'>You walk a fine line. [src] is very close to devouring you.</span>"
|
|
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
|
|
. += "<span class='his_grace bold'>[src] is shaking violently and staring directly at you.</span>"
|
|
else
|
|
. += span_his_grace("[src] is latched closed.")
|
|
|
|
/obj/item/his_grace/relaymove(mob/living/user, direction) //Allows changelings, etc. to climb out of Him after they revive, provided He isn't active
|
|
if(!awakened)
|
|
user.forceMove(get_turf(src))
|
|
user.visible_message(span_warning("[user] scrambles out of [src]!"), span_notice("You climb out of [src]!"))
|
|
|
|
/obj/item/his_grace/process(seconds_per_tick)
|
|
if(!bloodthirst)
|
|
drowse()
|
|
return
|
|
if(bloodthirst < HIS_GRACE_CONSUME_OWNER && !ascended)
|
|
adjust_bloodthirst((1 + FLOOR(LAZYLEN(contents) * 0.5, 1)) * seconds_per_tick) //Maybe adjust this?
|
|
else
|
|
adjust_bloodthirst(1 * seconds_per_tick) //don't cool off rapidly once we're at the point where His Grace consumes all.
|
|
var/mob/living/master = get_atom_on_turf(src, /mob/living)
|
|
if(istype(master) && (src in master.held_items))
|
|
switch(bloodthirst)
|
|
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
|
|
master.visible_message(span_boldwarning("[src] turns on [master]!"), "<span class='his_grace big bold'>[src] turns on you!</span>")
|
|
do_attack_animation(master, null, src)
|
|
master.emote("scream")
|
|
master.remove_status_effect(/datum/status_effect/his_grace)
|
|
REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
|
master.Paralyze(60)
|
|
master.adjustBruteLoss(master.maxHealth)
|
|
playsound(master, 'sound/effects/splat.ogg', 100, FALSE)
|
|
else
|
|
master.apply_status_effect(/datum/status_effect/his_grace)
|
|
return
|
|
forceMove(get_turf(src)) //no you can't put His Grace in a locker you just have to deal with Him
|
|
if(bloodthirst < HIS_GRACE_CONSUME_OWNER)
|
|
return
|
|
if(bloodthirst >= HIS_GRACE_FALL_ASLEEP)
|
|
drowse()
|
|
return
|
|
var/list/targets = list()
|
|
for(var/mob/living/L in oview(2, src))
|
|
targets += L
|
|
if(!LAZYLEN(targets))
|
|
return
|
|
var/mob/living/L = pick(targets)
|
|
step_to(src, L)
|
|
if(Adjacent(L))
|
|
if(!L.stat)
|
|
L.visible_message(span_warning("[src] lunges at [L]!"), "<span class='his_grace big bold'>[src] lunges at you!</span>")
|
|
do_attack_animation(L, null, src)
|
|
playsound(L, 'sound/weapons/smash.ogg', 50, TRUE)
|
|
playsound(L, 'sound/misc/desecration-01.ogg', 50, TRUE)
|
|
L.adjustBruteLoss(force)
|
|
adjust_bloodthirst(-5) //Don't stop attacking they're right there!
|
|
else
|
|
consume(L)
|
|
|
|
/obj/item/his_grace/proc/awaken(mob/user) //Good morning, Mr. Grace.
|
|
if(awakened)
|
|
return
|
|
awakened = TRUE
|
|
user.visible_message(span_boldwarning("[src] begins to rattle. He thirsts."), span_his_grace("You flick [src]'s latch up. You hope this is a good idea."))
|
|
name = "His Grace"
|
|
desc = "A bloodthirsty artifact created by a profane rite."
|
|
gender = MALE
|
|
adjust_bloodthirst(1)
|
|
force_bonus = HIS_GRACE_FORCE_BONUS * LAZYLEN(contents)
|
|
notify_ghosts("[user] has awoken His Grace!", source = src, action = NOTIFY_ORBIT, header = "All Hail His Grace!")
|
|
playsound(user, 'sound/effects/pope_entry.ogg', 100)
|
|
update_appearance()
|
|
move_gracefully()
|
|
|
|
/obj/item/his_grace/proc/move_gracefully()
|
|
SIGNAL_HANDLER
|
|
|
|
if(!awakened)
|
|
return
|
|
var/static/list/transforms
|
|
if(!transforms)
|
|
var/matrix/M1 = matrix()
|
|
var/matrix/M2 = matrix()
|
|
var/matrix/M3 = matrix()
|
|
var/matrix/M4 = matrix()
|
|
M1.Translate(-1, 0)
|
|
M2.Translate(0, 1)
|
|
M3.Translate(1, 0)
|
|
M4.Translate(0, -1)
|
|
transforms = list(M1, M2, M3, M4)
|
|
|
|
animate(src, transform=transforms[1], time=0.2, loop=-1)
|
|
animate(transform=transforms[2], time=0.1)
|
|
animate(transform=transforms[3], time=0.2)
|
|
animate(transform=transforms[4], time=0.3)
|
|
|
|
/obj/item/his_grace/proc/drowse() //Good night, Mr. Grace.
|
|
if(!awakened || ascended)
|
|
return
|
|
var/turf/T = get_turf(src)
|
|
T.visible_message(span_boldwarning("[src] slowly stops rattling and falls still, His latch snapping shut."))
|
|
playsound(loc, 'sound/weapons/batonextend.ogg', 100, TRUE)
|
|
name = initial(name)
|
|
desc = initial(desc)
|
|
animate(src, transform=matrix())
|
|
gender = initial(gender)
|
|
force = initial(force)
|
|
force_bonus = initial(force_bonus)
|
|
awakened = FALSE
|
|
bloodthirst = 0
|
|
update_appearance()
|
|
|
|
/obj/item/his_grace/proc/consume(mob/living/meal) //Here's your dinner, Mr. Grace.
|
|
if(!meal)
|
|
return
|
|
var/victims = 0
|
|
meal.visible_message(span_warning("[src] swings open and devours [meal]!"), "<span class='his_grace big bold'>[src] consumes you!</span>")
|
|
meal.adjustBruteLoss(200)
|
|
playsound(meal, 'sound/misc/desecration-02.ogg', 75, TRUE)
|
|
playsound(src, 'sound/items/eatfood.ogg', 100, TRUE)
|
|
meal.forceMove(src)
|
|
force_bonus += HIS_GRACE_FORCE_BONUS
|
|
prev_bloodthirst = bloodthirst
|
|
if(prev_bloodthirst < HIS_GRACE_CONSUME_OWNER)
|
|
bloodthirst = max(LAZYLEN(contents), 1) //Never fully sated, and His hunger will only grow.
|
|
else
|
|
bloodthirst = HIS_GRACE_CONSUME_OWNER
|
|
for(var/mob/living/C in contents)
|
|
if(C.mind)
|
|
victims++
|
|
if(victims >= victims_needed)
|
|
ascend()
|
|
update_stats()
|
|
|
|
/obj/item/his_grace/proc/adjust_bloodthirst(amt)
|
|
prev_bloodthirst = bloodthirst
|
|
if(prev_bloodthirst < HIS_GRACE_CONSUME_OWNER && !ascended)
|
|
bloodthirst = clamp(bloodthirst + amt, HIS_GRACE_SATIATED, HIS_GRACE_CONSUME_OWNER)
|
|
else if(!ascended)
|
|
bloodthirst = clamp(bloodthirst + amt, HIS_GRACE_CONSUME_OWNER, HIS_GRACE_FALL_ASLEEP)
|
|
update_stats()
|
|
|
|
/obj/item/his_grace/proc/update_stats()
|
|
REMOVE_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
|
var/mob/living/master = get_atom_on_turf(src, /mob/living)
|
|
switch(bloodthirst)
|
|
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
|
|
if(HIS_GRACE_CONSUME_OWNER > prev_bloodthirst)
|
|
master.visible_message(span_userdanger("[src] enters a frenzy!"))
|
|
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
|
ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
|
if(HIS_GRACE_STARVING > prev_bloodthirst)
|
|
master.visible_message(span_boldwarning("[src] is starving!"), "<span class='his_grace big'>[src]'s bloodlust overcomes you. [src] must be fed, or you will become His meal.\
|
|
[force_bonus < 15 ? " And still, His power grows.":""]</span>")
|
|
force_bonus = max(force_bonus, 15)
|
|
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
|
|
ADD_TRAIT(src, TRAIT_NODROP, HIS_GRACE_TRAIT)
|
|
if(HIS_GRACE_FAMISHED > prev_bloodthirst)
|
|
master.visible_message(span_warning("[src] is very hungry!"), "<span class='his_grace big'>Spines sink into your hand. [src] must feed immediately.\
|
|
[force_bonus < 10 ? " His power grows.":""]</span>")
|
|
force_bonus = max(force_bonus, 10)
|
|
if(prev_bloodthirst >= HIS_GRACE_STARVING)
|
|
master.visible_message(span_warning("[src] is now only very hungry!"), "<span class='his_grace big'>Your bloodlust recedes.</span>")
|
|
if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED)
|
|
if(HIS_GRACE_HUNGRY > prev_bloodthirst)
|
|
master.visible_message(span_warning("[src] is getting hungry."), "<span class='his_grace big'>You feel [src]'s hunger within you.\
|
|
[force_bonus < 5 ? " His power grows.":""]</span>")
|
|
force_bonus = max(force_bonus, 5)
|
|
if(prev_bloodthirst >= HIS_GRACE_FAMISHED)
|
|
master.visible_message(span_warning("[src] is now only somewhat hungry."), span_his_grace("[src]'s hunger recedes a little..."))
|
|
if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY)
|
|
if(HIS_GRACE_PECKISH > prev_bloodthirst)
|
|
master.visible_message(span_warning("[src] is feeling snackish."), span_his_grace("[src] begins to hunger."))
|
|
if(prev_bloodthirst >= HIS_GRACE_HUNGRY)
|
|
master.visible_message(span_warning("[src] is now only a little peckish."), "<span class='his_grace big'>[src]'s hunger recedes somewhat...</span>")
|
|
if(HIS_GRACE_SATIATED to HIS_GRACE_PECKISH)
|
|
if(prev_bloodthirst >= HIS_GRACE_PECKISH)
|
|
master.visible_message(span_warning("[src] is satiated."), "<span class='his_grace big'>[src]'s hunger recedes...</span>")
|
|
force = initial(force) + force_bonus
|
|
|
|
/obj/item/his_grace/proc/ascend()
|
|
if(ascended)
|
|
return
|
|
var/mob/living/carbon/human/master = loc
|
|
force_bonus += ascend_bonus
|
|
desc = "A legendary toolbox and a distant artifact from The Age of Three Powers. On its three latches engraved are the words \"The Sun\", \"The Moon\", and \"The Stars\". The entire toolbox has the words \"The World\" engraved into its sides."
|
|
ascended = TRUE
|
|
update_appearance()
|
|
playsound(src, 'sound/effects/his_grace_ascend.ogg', 100)
|
|
if(istype(master))
|
|
master.update_held_items()
|
|
master.visible_message("<span class='his_grace big bold'>Gods will be watching.</span>")
|
|
name = "[master]'s mythical toolbox of three powers"
|
|
master.client?.give_award(/datum/award/achievement/misc/ascension, master)
|