mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
His Grace is a better item and less globally-announced (#23951)
* His Grace is a better item and less globally-announced * grace * graceful * tiny eyes! * tiny eeeeyes * less lethal * You must have His Grace. * You just need to compile His Grace. * highly lethal grace * ding ding ding you're super fucked * rrr * His Grace
This commit is contained in:
@@ -128,4 +128,13 @@
|
|||||||
#define IS_SHARP 1
|
#define IS_SHARP 1
|
||||||
#define IS_SHARP_ACCURATE 2
|
#define IS_SHARP_ACCURATE 2
|
||||||
|
|
||||||
|
//His Grace.
|
||||||
|
#define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep.
|
||||||
|
#define HIS_GRACE_PECKISH 20 //Slightly hungry.
|
||||||
|
#define HIS_GRACE_HUNGRY 60 //Getting closer. Increases damage up to a minimum of 20.
|
||||||
|
#define HIS_GRACE_FAMISHED 100 //Dangerous. Increases damage up to a minimum of 25 and cannot be dropped.
|
||||||
|
#define HIS_GRACE_STARVING 120 //Incredibly close to breaking loose. Increases damage up to a minimum of 30.
|
||||||
|
#define HIS_GRACE_CONSUME_OWNER 140 //His Grace consumes His owner at this point and becomes aggressive.
|
||||||
|
#define HIS_GRACE_FALL_ASLEEP 160 //If it reaches this point, He falls asleep and resets.
|
||||||
|
|
||||||
|
#define HIS_GRACE_FORCE_BONUS 4 //How much force is gained per kill.
|
||||||
|
|||||||
@@ -16,8 +16,12 @@
|
|||||||
|
|
||||||
#define STATUS_EFFECT_POWERREGEN /datum/status_effect/cyborg_power_regen //Regenerates power on a given cyborg over time
|
#define STATUS_EFFECT_POWERREGEN /datum/status_effect/cyborg_power_regen //Regenerates power on a given cyborg over time
|
||||||
|
|
||||||
|
#define STATUS_EFFECT_HISGRACE /datum/status_effect/his_grace //His Grace.
|
||||||
|
|
||||||
/////////////
|
/////////////
|
||||||
// DEBUFFS //
|
// DEBUFFS //
|
||||||
/////////////
|
/////////////
|
||||||
|
|
||||||
#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark
|
#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark
|
||||||
|
|
||||||
|
#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
|
||||||
|
|||||||
@@ -151,3 +151,53 @@
|
|||||||
return
|
return
|
||||||
playsound(cyborg, 'sound/effects/light_flicker.ogg', 50, 1)
|
playsound(cyborg, 'sound/effects/light_flicker.ogg', 50, 1)
|
||||||
cyborg.cell.give(power_to_give)
|
cyborg.cell.give(power_to_give)
|
||||||
|
|
||||||
|
/datum/status_effect/his_grace
|
||||||
|
id = "his_grace"
|
||||||
|
duration = -1
|
||||||
|
tick_interval = 4
|
||||||
|
alert_type = /obj/screen/alert/status_effect/his_grace
|
||||||
|
var/bloodlust = 0
|
||||||
|
|
||||||
|
/obj/screen/alert/status_effect/his_grace
|
||||||
|
name = "His Grace"
|
||||||
|
desc = "His Grace hungers, and you must feed Him."
|
||||||
|
icon_state = "his_grace"
|
||||||
|
alerttooltipstyle = "hisgrace"
|
||||||
|
|
||||||
|
/obj/screen/alert/status_effect/his_grace/MouseEntered(location,control,params)
|
||||||
|
desc = initial(desc)
|
||||||
|
var/datum/status_effect/his_grace/HG = attached_effect
|
||||||
|
desc += "<br><font size=3><b>Current Bloodthirst: [HG.bloodlust]</b></font>\
|
||||||
|
<br>Becomes undroppable at <b>[HIS_GRACE_FAMISHED]</b>\
|
||||||
|
<br>Will consume you at <b>[HIS_GRACE_CONSUME_OWNER]</b>"
|
||||||
|
..()
|
||||||
|
|
||||||
|
/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!")
|
||||||
|
|
||||||
|
/datum/status_effect/his_grace/tick()
|
||||||
|
bloodlust = 0
|
||||||
|
var/graces = 0
|
||||||
|
for(var/obj/item/weapon/his_grace/HG in owner.held_items)
|
||||||
|
if(HG.bloodthirst > bloodlust)
|
||||||
|
bloodlust = HG.bloodthirst
|
||||||
|
if(HG.awakened)
|
||||||
|
graces++
|
||||||
|
if(!graces)
|
||||||
|
owner.apply_status_effect(STATUS_EFFECT_HISWRATH)
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
var/grace_heal = bloodlust * 0.05
|
||||||
|
owner.adjustBruteLoss(-grace_heal)
|
||||||
|
owner.adjustFireLoss(-grace_heal)
|
||||||
|
owner.adjustToxLoss(-grace_heal, TRUE, TRUE)
|
||||||
|
owner.adjustOxyLoss(-(grace_heal * 2))
|
||||||
|
owner.adjustCloneLoss(-grace_heal)
|
||||||
|
|
||||||
|
/datum/status_effect/his_grace/on_remove()
|
||||||
|
add_logs(owner, null, "lost His Grace's stun immunity")
|
||||||
|
if(islist(owner.stun_absorption) && owner.stun_absorption["hisgrace"])
|
||||||
|
owner.stun_absorption -= "hisgrace"
|
||||||
|
|
||||||
|
|||||||
@@ -9,3 +9,23 @@
|
|||||||
/datum/status_effect/sigil_mark/tick()
|
/datum/status_effect/sigil_mark/tick()
|
||||||
if(owner.stat < stat_allowed)
|
if(owner.stat < stat_allowed)
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
|
/datum/status_effect/his_wrath //does minor damage over time unless holding His Grace
|
||||||
|
id = "his_wrath"
|
||||||
|
duration = -1
|
||||||
|
tick_interval = 4
|
||||||
|
alert_type = /obj/screen/alert/status_effect/his_wrath
|
||||||
|
|
||||||
|
/obj/screen/alert/status_effect/his_wrath
|
||||||
|
name = "His Wrath"
|
||||||
|
desc = "You fled from His Grace instead of feeding Him, and now you suffer."
|
||||||
|
icon_state = "his_grace"
|
||||||
|
alerttooltipstyle = "hisgrace"
|
||||||
|
|
||||||
|
/datum/status_effect/his_wrath/tick()
|
||||||
|
for(var/obj/item/weapon/his_grace/HG in owner.held_items)
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
owner.adjustBruteLoss(0.1)
|
||||||
|
owner.adjustFireLoss(0.1)
|
||||||
|
owner.adjustToxLoss(0.2, TRUE, TRUE)
|
||||||
|
|||||||
206
code/game/objects/items/weapons/his_grace.dm
Normal file
206
code/game/objects/items/weapons/his_grace.dm
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
//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/weapon/his_grace
|
||||||
|
name = "artistic toolbox"
|
||||||
|
desc = "A toolbox painted bright green. Looking at it makes you feel uneasy."
|
||||||
|
icon_state = "green"
|
||||||
|
item_state = "artistic_toolbox"
|
||||||
|
icon = 'icons/obj/storage.dmi'
|
||||||
|
w_class = WEIGHT_CLASS_GIGANTIC
|
||||||
|
origin_tech = "combat=4;engineering=4;syndicate=2"
|
||||||
|
force = 12
|
||||||
|
attack_verb = list("robusted")
|
||||||
|
hitsound = 'sound/weapons/smash.ogg'
|
||||||
|
var/awakened = 0
|
||||||
|
var/bloodthirst = HIS_GRACE_SATIATED
|
||||||
|
var/prev_bloodthirst = HIS_GRACE_SATIATED
|
||||||
|
var/force_bonus = 0
|
||||||
|
var/list/warning_messages = list("peckish", "hungry", "famished", "starving", "consume") //Messages that have NOT been shown
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/New()
|
||||||
|
..()
|
||||||
|
START_PROCESSING(SSprocessing, src)
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/Destroy()
|
||||||
|
STOP_PROCESSING(SSprocessing, src)
|
||||||
|
for(var/mob/living/L in src)
|
||||||
|
L.forceMove(get_turf(src))
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/attack_self(mob/living/user)
|
||||||
|
if(!awakened)
|
||||||
|
INVOKE_ASYNC(src, .proc/awaken, user)
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/attack(mob/living/M, mob/user)
|
||||||
|
if(awakened && M.stat)
|
||||||
|
consume(M)
|
||||||
|
else
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/CtrlClick(mob/user) //you can't pull his grace
|
||||||
|
attack_hand(user)
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/examine(mob/user)
|
||||||
|
..()
|
||||||
|
if(awakened)
|
||||||
|
switch(bloodthirst)
|
||||||
|
if(HIS_GRACE_SATIATED to HIS_GRACE_PECKISH)
|
||||||
|
user << "<span class='his_grace'>[src] isn't very hungry. Not yet.</span>"
|
||||||
|
if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY)
|
||||||
|
user << "<span class='his_grace'>[src] would like a snack.</span>"
|
||||||
|
if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED)
|
||||||
|
user << "<span class='his_grace'>[src] is quite hungry now.</span>"
|
||||||
|
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
|
||||||
|
user << "<span class='his_grace'>[src] is openly salivating at the sight of you. Be careful.</span>"
|
||||||
|
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
||||||
|
user << "<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)
|
||||||
|
user << "<span class='his_grace bold'>[src] is shaking violently and staring directly at you.</span>"
|
||||||
|
else
|
||||||
|
user << "<span class='his_grace'>[src] is latched closed.</span>"
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/relaymove(mob/living/user) //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 class='warning'>[user] scrambles out of [src]!</span>", "<span class='notice'>You climb out of [src]!</span>")
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/process()
|
||||||
|
if(!bloodthirst)
|
||||||
|
drowse()
|
||||||
|
return
|
||||||
|
if(bloodthirst < HIS_GRACE_CONSUME_OWNER)
|
||||||
|
adjust_bloodthirst(1 + Floor(LAZYLEN(contents) * 0.5)) //Maybe adjust this?
|
||||||
|
else
|
||||||
|
adjust_bloodthirst(1) //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 class='boldwarning'>[src] turns on [master]!</span>", "<span class='his_grace big bold>[src] turns on you!</span>")
|
||||||
|
do_attack_animation(master, null, src)
|
||||||
|
master.emote("scream")
|
||||||
|
master.remove_status_effect(STATUS_EFFECT_HISGRACE)
|
||||||
|
flags &= ~NODROP
|
||||||
|
master.Weaken(3)
|
||||||
|
master.adjustBruteLoss(master.maxHealth)
|
||||||
|
playsound(master, 'sound/effects/splat.ogg', 100, 0)
|
||||||
|
else
|
||||||
|
master.apply_status_effect(STATUS_EFFECT_HISGRACE)
|
||||||
|
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 class='warning'>[src] lunges at [L]!</span>", "<span class='his_grace big bold'>[src] lunges at you!</span>")
|
||||||
|
do_attack_animation(L, null, src)
|
||||||
|
playsound(L, 'sound/weapons/smash.ogg', 50, 1)
|
||||||
|
playsound(L, 'sound/misc/desceration-01.ogg', 50, 1)
|
||||||
|
L.adjustBruteLoss(force)
|
||||||
|
adjust_bloodthirst(-5) //Don't stop attacking they're right there!
|
||||||
|
else
|
||||||
|
consume(L)
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/proc/awaken(mob/user) //Good morning, Mr. Grace.
|
||||||
|
if(awakened)
|
||||||
|
return
|
||||||
|
awakened = TRUE
|
||||||
|
user.visible_message("<span class='boldwarning'>[src] begins to rattle. He thirsts.</span>", "<span class='his_grace'>You flick [src]'s latch up. You hope this is a good idea.</span>")
|
||||||
|
name = "His Grace"
|
||||||
|
desc = "A bloodthirsty artefact created by a profane rite."
|
||||||
|
gender = MALE
|
||||||
|
adjust_bloodthirst(1)
|
||||||
|
force_bonus = HIS_GRACE_FORCE_BONUS * LAZYLEN(contents)
|
||||||
|
playsound(user, 'sound/effects/pope_entry.ogg', 100)
|
||||||
|
icon_state = "green_awakened"
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/proc/drowse() //Good night, Mr. Grace.
|
||||||
|
if(!awakened)
|
||||||
|
return
|
||||||
|
var/turf/T = get_turf(src)
|
||||||
|
T.visible_message("<span class='boldwarning'>[src] slowly stops rattling and falls still, His latch snapping closed.</span>")
|
||||||
|
playsound(loc, 'sound/weapons/batonextend.ogg', 100, 1)
|
||||||
|
name = initial(name)
|
||||||
|
desc = initial(desc)
|
||||||
|
icon_state = initial(icon_state)
|
||||||
|
gender = initial(gender)
|
||||||
|
force = initial(force)
|
||||||
|
force_bonus = initial(force_bonus)
|
||||||
|
awakened = FALSE
|
||||||
|
bloodthirst = 0
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/proc/consume(mob/living/meal) //Here's your dinner, Mr. Grace.
|
||||||
|
if(!meal)
|
||||||
|
return
|
||||||
|
meal.visible_message("<span class='warning'>[src] swings open and devours [meal]!</span>", "<span class='his_grace big bold'>[src] consumes you!</span>")
|
||||||
|
meal.adjustBruteLoss(200)
|
||||||
|
playsound(meal, 'sound/misc/desceration-02.ogg', 75, 1)
|
||||||
|
playsound(src, 'sound/items/eatfood.ogg', 100, 1)
|
||||||
|
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
|
||||||
|
update_stats()
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/proc/adjust_bloodthirst(amt)
|
||||||
|
prev_bloodthirst = bloodthirst
|
||||||
|
if(prev_bloodthirst < HIS_GRACE_CONSUME_OWNER)
|
||||||
|
bloodthirst = Clamp(bloodthirst + amt, HIS_GRACE_SATIATED, HIS_GRACE_CONSUME_OWNER)
|
||||||
|
else
|
||||||
|
bloodthirst = Clamp(bloodthirst + amt, HIS_GRACE_CONSUME_OWNER, HIS_GRACE_FALL_ASLEEP)
|
||||||
|
update_stats()
|
||||||
|
|
||||||
|
/obj/item/weapon/his_grace/proc/update_stats()
|
||||||
|
flags &= ~NODROP
|
||||||
|
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 class='userdanger'>[src] enters a frenzy!</span>")
|
||||||
|
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
||||||
|
flags |= NODROP
|
||||||
|
if(HIS_GRACE_STARVING > prev_bloodthirst)
|
||||||
|
master.visible_message("<span class='boldwarning'>[src] is starving!</span>", "<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)
|
||||||
|
flags |= NODROP
|
||||||
|
if(HIS_GRACE_FAMISHED > prev_bloodthirst)
|
||||||
|
master.visible_message("<span class='warning'>[src] is very hungry!</span>", "<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 class='warning'>[src] is now only very hungry!</span>", "<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 class='warning'>[src] is getting hungry.</span>", "<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 class='warning'>[src] is now only somewhat hungry.</span>", "<span class='his_grace'>[src]'s hunger recedes a little...</span>")
|
||||||
|
if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY)
|
||||||
|
if(HIS_GRACE_PECKISH > prev_bloodthirst)
|
||||||
|
master.visible_message("<span class='warning'>[src] is feeling snackish.</span>", "<span class='his_grace'>[src] begins to hunger.</span>")
|
||||||
|
if(prev_bloodthirst >= HIS_GRACE_HUNGRY)
|
||||||
|
master.visible_message("<span class='warning'>[src] is now only a little peckish.</span>", "<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 class='warning'>[src] is satiated.</span>", "<span class='his_grace big'>[src]'s hunger recedes...</span>")
|
||||||
|
force = initial(force) + force_bonus
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
item_state = "artistic_toolbox"
|
item_state = "artistic_toolbox"
|
||||||
max_combined_w_class = 20
|
max_combined_w_class = 20
|
||||||
storage_slots = 10
|
storage_slots = 10
|
||||||
w_class = 5 //Holds more than a regular toolbox!
|
w_class = WEIGHT_CLASS_GIGANTIC //Holds more than a regular toolbox!
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/New()
|
/obj/item/weapon/storage/toolbox/artistic/New()
|
||||||
..()
|
..()
|
||||||
@@ -165,216 +165,3 @@
|
|||||||
new/obj/item/stack/cable_coil/orange(src)
|
new/obj/item/stack/cable_coil/orange(src)
|
||||||
new/obj/item/stack/cable_coil/cyan(src)
|
new/obj/item/stack/cable_coil/cyan(src)
|
||||||
new/obj/item/stack/cable_coil/white(src)
|
new/obj/item/stack/cable_coil/white(src)
|
||||||
|
|
||||||
#define HIS_GRACE_SATIATED 0 //He hungers not. If bloodthirst is set to this, His Grace is asleep.
|
|
||||||
#define HIS_GRACE_PECKISH 30 //Slightly hungry. Slightly increased damage and nothing else.
|
|
||||||
#define HIS_GRACE_HUNGRY 60 //Getting closer. Increased danage and slight healing. It also starts eating anyone around it if it's left on the ground.
|
|
||||||
#define HIS_GRACE_FAMISHED 90 //Dangerous. Highly increased damage, good healing, and stun resist. It also becomes nodrop at this point.
|
|
||||||
#define HIS_GRACE_STARVING 110 //Incredibly close to breaking loose. Extreme damage and healing, and stun immunity.
|
|
||||||
#define HIS_GRACE_CONSUME_OWNER 120 //You're dead, kiddo. The toolbox consumes its owner at this point and resets to zero.
|
|
||||||
#define HIS_GRACE_FALL_ASLEEP 150 //If it reaches this point, it falls asleep and resets to zero.
|
|
||||||
|
|
||||||
//His Grace is a very special weapon granted only to traitor chaplains.
|
|
||||||
//When awakened through sacrifice, it thirsts for blood and begins ticking a "bloodthirst" counter.
|
|
||||||
//As His Grace grows hungrier, it grants its wielder various benefits.
|
|
||||||
//If the wielder fails to feed His Grace in time, it will devour them.
|
|
||||||
//Leaving His Grace alone for some time will reset its timer and put it to sleep.
|
|
||||||
//Using His Grace effectively is a delicate balancing act of keeping it hungry enough to induce benefits but sated enough to let you live.
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace
|
|
||||||
name = "artistic toolbox"
|
|
||||||
desc = "A toolbox painted bright green. Looking at it makes you feel uneasy."
|
|
||||||
origin_tech = "combat=4;engineering=4;syndicate=2"
|
|
||||||
var/awakened = 0
|
|
||||||
var/bloodthirst = HIS_GRACE_SATIATED
|
|
||||||
var/victims = 0
|
|
||||||
var/list/warning_messages = list("peckish", "hungry", "famished", "starving", "consume") //Messages that have NOT been shown
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/Destroy()
|
|
||||||
for(var/mob/living/L in src)
|
|
||||||
L.forceMove(get_turf(src))
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/attack_self(mob/living/user)
|
|
||||||
if(!awakened)
|
|
||||||
user << "<span class='notice'>[src] begins to vibrate...</span>"
|
|
||||||
addtimer(CALLBACK(src, .proc/awaken), 50)
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/attack(mob/living/M, mob/user)
|
|
||||||
if(awakened && M.stat)
|
|
||||||
consume(M)
|
|
||||||
else
|
|
||||||
..()
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/examine(mob/user)
|
|
||||||
..()
|
|
||||||
if(awakened)
|
|
||||||
if(victims)
|
|
||||||
user << "You hear the distant murmuring of [victims] victims to [src]."
|
|
||||||
switch(bloodthirst)
|
|
||||||
if(HIS_GRACE_SATIATED to HIS_GRACE_PECKISH)
|
|
||||||
user << "<span class='danger'>[src] isn't very hungry. Not yet.</span>"
|
|
||||||
if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY)
|
|
||||||
user << "<span class='danger'>[src] would like a snack.</span>"
|
|
||||||
if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED)
|
|
||||||
user << "<span class='warning'>[src] is quite hungry now...</span>"
|
|
||||||
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
|
|
||||||
user << "<span class='boldannounce'>[src] is openly salivating at the sight of you. Be careful.</span>"
|
|
||||||
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
|
||||||
user << "<span class='boldwarning'>You walk a fine line. [src] is very close to devouring you.</span>"
|
|
||||||
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
|
|
||||||
user << "<span class='boldwarning'>[src] is shaking violently and staring directly at you.</span>"
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/relaymove(mob/living/user) //Allows changelings, etc. to climb out of the box after they revive
|
|
||||||
user.forceMove(get_turf(src))
|
|
||||||
user.visible_message("<span class='warning'>[user] scrambles out of [src]!</span>", "<span class='notice'>You climb out of [src]!</span>")
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/process()
|
|
||||||
if(!awakened)
|
|
||||||
return
|
|
||||||
adjust_bloodthirst(1 + victims) //Maybe adjust this?
|
|
||||||
change_phases()
|
|
||||||
if(ishuman(loc))
|
|
||||||
var/mob/living/carbon/human/master = loc
|
|
||||||
switch(bloodthirst) //Handles benefits outside of stun absorbs, which are in change_phases()
|
|
||||||
if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED)
|
|
||||||
master.adjustBruteLoss(-1)
|
|
||||||
master.adjustFireLoss(-1)
|
|
||||||
master.adjustToxLoss(-0.5)
|
|
||||||
master.adjustOxyLoss(-5)
|
|
||||||
master.adjustCloneLoss(-0.5)
|
|
||||||
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
|
|
||||||
master.adjustBruteLoss(-2)
|
|
||||||
master.adjustFireLoss(-2)
|
|
||||||
master.adjustToxLoss(-1)
|
|
||||||
master.adjustOxyLoss(-10)
|
|
||||||
master.adjustCloneLoss(-1)
|
|
||||||
master.AdjustStunned(-1)
|
|
||||||
master.AdjustWeakened(-1)
|
|
||||||
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
|
||||||
master.adjustBruteLoss(-20) //The biggest danger at this point is the toolbox itself
|
|
||||||
master.adjustFireLoss(-20)
|
|
||||||
master.adjustToxLoss(-10)
|
|
||||||
master.setOxyLoss(0)
|
|
||||||
master.adjustCloneLoss(-5)
|
|
||||||
master.add_stun_absorption("his_grace", 15, 1, null, null, "[src] shields them from harm!")
|
|
||||||
if(HIS_GRACE_CONSUME_OWNER to HIS_GRACE_FALL_ASLEEP)
|
|
||||||
master.visible_message("<span class='boldwarning'>[src] turns on its master!</span>", "<span class='userdanger'>[src] turns on you!</span>")
|
|
||||||
playsound(src, 'sound/effects/tendril_destroyed.ogg', 100, 0)
|
|
||||||
master.Weaken(3)
|
|
||||||
master.adjustBruteLoss(100)
|
|
||||||
playsound(master, 'sound/misc/desceration-03.ogg', 100, )
|
|
||||||
playsound(master, 'sound/effects/splat.ogg', 100, 0)
|
|
||||||
master.emote("scream")
|
|
||||||
consume(master) //Y O U H A V E F A I L E D M E
|
|
||||||
if(HIS_GRACE_FALL_ASLEEP to INFINITY)
|
|
||||||
drowse()
|
|
||||||
else
|
|
||||||
if(bloodthirst >= HIS_GRACE_CONSUME_OWNER)
|
|
||||||
if(bloodthirst >= HIS_GRACE_FALL_ASLEEP)
|
|
||||||
drowse()
|
|
||||||
return
|
|
||||||
for(var/mob/living/L in range(1, src))
|
|
||||||
if(L.loc == src)
|
|
||||||
continue
|
|
||||||
if(!L.stat)
|
|
||||||
L.visible_message("<span class='warning'>[src] lunges at [L]!</span>", "<span class='userdanger'>[src] lunges at you!</span>")
|
|
||||||
playsound(L, 'sound/effects/splat.ogg', 50, 1)
|
|
||||||
playsound(L, 'sound/misc/desceration-01.ogg', 50, 1)
|
|
||||||
L.adjustBruteLoss(force)
|
|
||||||
return //Only one at a tome
|
|
||||||
else
|
|
||||||
consume(L)
|
|
||||||
return
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/proc/awaken() //Attempts to awaken. This can only occur if organs fill the box, and gives out a global warning.
|
|
||||||
if(awakened)
|
|
||||||
return
|
|
||||||
var/organ_count = 0
|
|
||||||
for(var/obj/item/organ/O in src) //Doesn't have to be any kind, we're not picky
|
|
||||||
organ_count++
|
|
||||||
if(organ_count < 5)
|
|
||||||
if(isliving(loc))
|
|
||||||
loc = get_turf(src)
|
|
||||||
visible_message("<span class='warning'>[src] stops shaking. It needs more organs.</span>")
|
|
||||||
else
|
|
||||||
for(var/obj/item/organ/O in src)
|
|
||||||
qdel(O) //delicious flesh
|
|
||||||
name = "His Grace"
|
|
||||||
desc = "A bloodthirsty artefact created by a profane rite."
|
|
||||||
gender = MALE
|
|
||||||
visible_message("<span class='boldwarning'>[src] begins to rattle. It thirsts.</span>") //rattle me bones capn
|
|
||||||
adjust_bloodthirst(1)
|
|
||||||
awakened = 1
|
|
||||||
send_to_playing_players("<span class='boldannounce'><font size=6>HIS GRACE THIRSTS FOR BLOOD</font></span>")
|
|
||||||
send_to_playing_players('sound/effects/his_grace_awaken.ogg')
|
|
||||||
icon_state = "green_awakened"
|
|
||||||
START_PROCESSING(SSprocessing, src)
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/proc/drowse() //Falls asleep, spitting out all victims and resetting to zero.
|
|
||||||
if(!awakened)
|
|
||||||
return
|
|
||||||
visible_message("<span class='boldwarning'>[src] slowly stops rattling and falls still... but it still lurks in its sleep.</span>")
|
|
||||||
name = initial(name)
|
|
||||||
desc = initial(desc)
|
|
||||||
icon_state = initial(icon_state)
|
|
||||||
gender = initial(gender)
|
|
||||||
awakened = 0
|
|
||||||
victims = 0
|
|
||||||
warning_messages = initial(warning_messages)
|
|
||||||
adjust_bloodthirst(-bloodthirst)
|
|
||||||
STOP_PROCESSING(SSprocessing, src)
|
|
||||||
send_to_playing_players("<span class='boldannounce'><font size=6>HIS GRACE HAS RETURNED TO SLUMBER</font></span>")
|
|
||||||
send_to_playing_players('sound/effects/pope_entry.ogg')
|
|
||||||
for(var/mob/living/L in src)
|
|
||||||
L.forceMove(get_turf(src))
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/proc/adjust_bloodthirst(amt)
|
|
||||||
bloodthirst = min(max(1, bloodthirst + amt), HIS_GRACE_FALL_ASLEEP)
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/proc/consume(mob/living/meal)
|
|
||||||
if(!meal)
|
|
||||||
return
|
|
||||||
meal.adjustBruteLoss(200)
|
|
||||||
meal.visible_message("<span class='warning'>[src] pulls [meal] into itself!</span>", "<span class='userdanger'>[src] consumes you!</span>")
|
|
||||||
playsound(meal, 'sound/misc/desceration-02.ogg', 75, 1)
|
|
||||||
playsound(src, 'sound/items/eatfood.ogg', 100, 1)
|
|
||||||
meal.forceMove(src)
|
|
||||||
adjust_bloodthirst(-(bloodthirst - victims)) //Never fully sated, and it starts off higher as it eats
|
|
||||||
victims++
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/toolbox/artistic/his_grace/proc/change_phases()
|
|
||||||
switch(bloodthirst)
|
|
||||||
if(HIS_GRACE_SATIATED to HIS_GRACE_PECKISH)
|
|
||||||
force = 15 //Constantly keep its power low if it's this full
|
|
||||||
if(HIS_GRACE_PECKISH to HIS_GRACE_HUNGRY)
|
|
||||||
if(is_string_in_list("peckish", warning_messages))
|
|
||||||
remove_strings_from_list("peckish", warning_messages)
|
|
||||||
loc.visible_message("<span class='warning'>[src] is feeling snackish.</span>", "<span class='danger'>[src] begins to hunger. Its damage has been increased.</span>")
|
|
||||||
force = 20
|
|
||||||
spawn(400) //To prevent spam
|
|
||||||
if(src)
|
|
||||||
warning_messages += "peckish"
|
|
||||||
if(HIS_GRACE_HUNGRY to HIS_GRACE_FAMISHED)
|
|
||||||
if(is_string_in_list("hungry", warning_messages))
|
|
||||||
remove_strings_from_list("hungry", warning_messages)
|
|
||||||
loc.visible_message("<span class='warning'>[src] is getting hungry. Its power grows.</span>", "<span class='boldannounce'>You feel a sense of hunger come over you. [src]'s damage has increased.</span>")
|
|
||||||
force = 25
|
|
||||||
spawn(400)
|
|
||||||
if(src)
|
|
||||||
warning_messages += "hungry"
|
|
||||||
if(HIS_GRACE_FAMISHED to HIS_GRACE_STARVING)
|
|
||||||
if(is_string_in_list("famished", warning_messages))
|
|
||||||
remove_strings_from_list("famished", warning_messages)
|
|
||||||
loc.visible_message("<span class='warning'>[src] is very hungry...</span>", "<span class='boldwarning'>Bloodlust overcomes you. You are now resistant to stuns.</span>")
|
|
||||||
force = 30
|
|
||||||
spawn(400)
|
|
||||||
if(src)
|
|
||||||
warning_messages += "famished"
|
|
||||||
if(HIS_GRACE_STARVING to HIS_GRACE_CONSUME_OWNER)
|
|
||||||
if(is_string_in_list("starving", warning_messages))
|
|
||||||
remove_strings_from_list("starving", warning_messages)
|
|
||||||
loc.visible_message("<span class='boldwarning'>[src] is starving!</span>", "<span class='userdanger'>[src] is at its full power! Feed it quickly or you will be consumed!</span>")
|
|
||||||
force = 40
|
|
||||||
spawn(400)
|
|
||||||
if(src)
|
|
||||||
warning_messages += "starving"
|
|
||||||
|
|||||||
@@ -62,7 +62,10 @@
|
|||||||
|
|
||||||
.colo-pod .wrap {border-color: #256fb9;}
|
.colo-pod .wrap {border-color: #256fb9;}
|
||||||
.colo-pod .content {border-color: #000000; background-color: #000000;}
|
.colo-pod .content {border-color: #000000; background-color: #000000;}
|
||||||
|
|
||||||
|
.hisgrace .wrap {border-color: #7C1414;}
|
||||||
|
.hisgrace .content {color: #15D512; border-color: #9D1414; background-color: #861414;}
|
||||||
|
|
||||||
/* TG: Themes */
|
/* TG: Themes */
|
||||||
/* ScreenUI */
|
/* ScreenUI */
|
||||||
.midnight .wrap {border-color: #2B2B33;}
|
.midnight .wrap {border-color: #2B2B33;}
|
||||||
|
|||||||
@@ -1193,11 +1193,11 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
|
|||||||
|
|
||||||
/datum/uplink_item/role_restricted/his_grace
|
/datum/uplink_item/role_restricted/his_grace
|
||||||
name = "His Grace"
|
name = "His Grace"
|
||||||
desc = "An incredibly dangerous weapon recovered from a station overcome by the grey tide. Once activated, it will thirst for blood and must be used to kill in order to sate that thirst. \
|
desc = "An incredibly dangerous weapon recovered from a station overcome by the grey tide. Once activated, He will thirst for blood and must be used to kill to sate that thirst. \
|
||||||
His Grace grants benefits to its wielder, with a more intense hunger equaling more benefits, but be wary: if it gets too hungry, it will kill you and destroy your body. \
|
His Grace grants gradual regeneration and complete stun immunity to His wielder, but be wary: if He gets too hungry, He will become impossible to drop and eventually kill you if not fed. \
|
||||||
If you leave His Grace alone for some time, it will eventually return to its inactive state. \
|
However, if left alone for long enough, He will fall back to slumber. \
|
||||||
To activate His Grace, place five assorted organs inside of it and use it in your hand."
|
To activate His Grace, simply unlatch Him."
|
||||||
item = /obj/item/weapon/storage/toolbox/artistic/his_grace
|
item = /obj/item/weapon/his_grace
|
||||||
cost = 20
|
cost = 20
|
||||||
restricted_roles = list("Chaplain")
|
restricted_roles = list("Chaplain")
|
||||||
surplus = 5 //Very low chance to get it in a surplus crate even without being the chaplain
|
surplus = 5 //Very low chance to get it in a surplus crate even without being the chaplain
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 80 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
@@ -13,6 +13,8 @@ em {font-style: normal; font-weight: bold;}
|
|||||||
|
|
||||||
.italics { font-style: italic;}
|
.italics { font-style: italic;}
|
||||||
|
|
||||||
|
.bold { font-weight: bold;}
|
||||||
|
|
||||||
.prefix { font-weight: bold;}
|
.prefix { font-weight: bold;}
|
||||||
|
|
||||||
.ooc { font-weight: bold;}
|
.ooc { font-weight: bold;}
|
||||||
@@ -129,12 +131,13 @@ h1.alert, h2.alert {color: #000000;}
|
|||||||
.papyrus {font-family: "Papyrus", cursive, sans-serif;}
|
.papyrus {font-family: "Papyrus", cursive, sans-serif;}
|
||||||
.robot {font-family: "Courier New", cursive, sans-serif;}
|
.robot {font-family: "Courier New", cursive, sans-serif;}
|
||||||
|
|
||||||
.command_headset {font-weight: bold; font-size: 3;}
|
.command_headset {font-weight: bold; font-size: 3;}
|
||||||
.big {font-size: 3;}
|
.big {font-size: 3;}
|
||||||
.reallybig {font-size: 4;}
|
.reallybig {font-size: 4;}
|
||||||
.greentext {color: #00FF00; font-size: 3;}
|
.greentext {color: #00FF00; font-size: 3;}
|
||||||
.redtext {color: #FF0000; font-size: 3;}
|
.redtext {color: #FF0000; font-size: 3;}
|
||||||
.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
|
.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
|
||||||
|
.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
|
||||||
|
|
||||||
BIG IMG.icon {width: 32px; height: 32px;}
|
BIG IMG.icon {width: 32px; height: 32px;}
|
||||||
|
|
||||||
|
|||||||
@@ -749,6 +749,7 @@
|
|||||||
#include "code\game\objects\items\weapons\flamethrower.dm"
|
#include "code\game\objects\items\weapons\flamethrower.dm"
|
||||||
#include "code\game\objects\items\weapons\gift.dm"
|
#include "code\game\objects\items\weapons\gift.dm"
|
||||||
#include "code\game\objects\items\weapons\handcuffs.dm"
|
#include "code\game\objects\items\weapons\handcuffs.dm"
|
||||||
|
#include "code\game\objects\items\weapons\his_grace.dm"
|
||||||
#include "code\game\objects\items\weapons\holosign_creator.dm"
|
#include "code\game\objects\items\weapons\holosign_creator.dm"
|
||||||
#include "code\game\objects\items\weapons\holy_weapons.dm"
|
#include "code\game\objects\items\weapons\holy_weapons.dm"
|
||||||
#include "code\game\objects\items\weapons\kitchen.dm"
|
#include "code\game\objects\items\weapons\kitchen.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user