Adds hauntium as a reagent with new fun uses. (#77471)

## About The Pull Request
Adds the material hauntium as a reagent, along with bringing some unique
effects with the reagent.

There are a few new ways to get it other than just the camera obscura as
before, such as grinding certain ghostly things.

Unique effects it brings:

- It works in metalgen (I believe the metalgen recipe is still broken as
of making this) to make hauntium infused metalgen.


https://github.com/tgstation/tgstation/assets/58376695/121ca6b2-00b7-4203-bc6a-48976b1af802


- Any object touched by the chem will temporarily have the haunted
effect, letting it teleport around randomly and even attack people.



https://github.com/tgstation/tgstation/assets/58376695/103aeee5-ed3e-4fdd-85e4-ac7338823c46


- If you put it in your body, it hurts your "soul" (soul being heart and
mood)

![image](https://github.com/tgstation/tgstation/assets/58376695/34182a4c-face-4fe7-b170-a7b10122a14d)
...unless you are morbid or undead, in which it gives a slight mood
boost and acts like an addiction-less drug
## Why It's Good For The Game
Hauntium previously was super niche and not very useful other than
making funny haunted toolboxes from it. This expands it's usage and
makes it a lot more interesting. I also know a good few people who have
also wished this was available to use in metalgen and now you can!
## Changelog
🆑
add: Lets you grind things into a hauntium reagent which works similarly
to the solid form but is versatile and has some unique effects.

/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
This commit is contained in:
die_amond
2023-08-12 03:35:19 +02:00
committed by GitHub
co-authored by Ghom
parent 6756325efe
commit 6977b041b7
13 changed files with 82 additions and 6 deletions
+3
View File
@@ -752,6 +752,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_CUSTOM_TAP_SOUND "no_tap_sound"
/// Makes the feedback message when someone else is putting this item on you more noticeable
#define TRAIT_DANGEROUS_OBJECT "dangerous_object"
// determines whether or not objects are haunted and teleport/attack randomly
#define TRAIT_HAUNTED "haunted"
//quirk traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
@@ -1015,6 +1017,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define HYPNOCHAIR_TRAIT "hypnochair"
#define FLASHLIGHT_EYES "flashlight_eyes"
#define IMPURE_OCULINE "impure_oculine"
#define HAUNTIUM_REAGENT_TRAIT "hauntium_reagent_trait"
#define TRAIT_SANTA "santa"
#define SCRYING_ORB "scrying-orb"
#define ABDUCTOR_ANTAGONIST "abductor-antagonist"
+1
View File
@@ -237,6 +237,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE,
"TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT,
"TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE,
"TRAIT_HAUNTED" = TRAIT_HAUNTED,
),
/atom = list(
"TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER,
+10
View File
@@ -24,3 +24,13 @@
REMOVE_TRAIT(master, TRAIT_MOVE_FLYING, ELEMENT_TRAIT(type))
master.RemoveElement(/datum/element/movetype_handler)
return ..()
/atom/movable/proc/make_haunted(source, color) //if not haunted, make haunted
if(!HAS_TRAIT(src, TRAIT_HAUNTED))
AddElement(/datum/element/haunted, color)
ADD_TRAIT(src, TRAIT_HAUNTED, source)
/atom/movable/proc/remove_haunted(source) //if haunted, make not haunted
REMOVE_TRAIT(src, TRAIT_HAUNTED, source)
if(!HAS_TRAIT(src, TRAIT_HAUNTED))
RemoveElement(/datum/element/haunted)
+2 -4
View File
@@ -15,10 +15,8 @@
/datum/material/hauntium/on_applied_obj(obj/o, amount, material_flags)
. = ..()
if(isitem(o))
o.AddElement(/datum/element/haunted)
o.make_haunted(INNATE_TRAIT, "#f8f8ff")
/datum/material/hauntium/on_removed_obj(obj/o, amount, material_flags)
. = ..()
if(isitem(o))
o.RemoveElement(/datum/element/haunted)
o.remove_haunted(INNATE_TRAIT)
+5
View File
@@ -121,3 +121,8 @@
/datum/mood_event/nicotine_withdrawal_severe
description = "Head pounding. Cold sweating. Feeling anxious. Need a smoke to calm down!"
mood_change = -8
/datum/mood_event/hauntium_spirits
description = "I feel my soul degrading!"
mood_change = -8
timeout = 8 MINUTES
+5
View File
@@ -32,6 +32,11 @@ Intended to push a creepy, mad scientist/doctor vibe, or someone who is downrigh
mood_change = 2
timeout = 2 MINUTES
/datum/mood_event/morbid_hauntium
description = "I feel a better connection with the spirits, I love this!"
mood_change = 3
timeout = 6 MINUTES
// Negative Events - We helped someone stay alive.
/datum/mood_event/morbid_tend_wounds
@@ -859,6 +859,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
merge_type = /obj/item/stack/sheet/hauntium
material_type = /datum/material/hauntium
material_modifier = 1 //None of that wussy stuff
grind_results = list(/datum/reagent/hauntium = 20)
/obj/item/stack/sheet/hauntium/fifty
amount = 50
+1
View File
@@ -581,6 +581,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
gender = PLURAL
icon = 'icons/effects/magic.dmi'
icon_state = "ectoplasm"
grind_results = list(/datum/reagent/hauntium = 25) //can be ground into hauntium
/obj/item/ectoplasm/suicide_act(mob/living/user)
user.visible_message(span_suicide("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the astral plane!"))
@@ -34,7 +34,7 @@
if(istype(haunted_item.ai_controller, /datum/ai_controller/haunted)) // already spooky
return COMPONENT_INCOMPATIBLE
haunted_item.AddElement(/datum/element/haunted, haunt_color)
haunted_item.make_haunted(MAGIC_TRAIT, haunt_color)
if(isnull(haunted_item.ai_controller)) // failed to make spooky! don't go on
return COMPONENT_INCOMPATIBLE
@@ -71,7 +71,7 @@
// because we want to make sure they always get dealt with no matter how the component is removed
if(!isnull(pre_haunt_throwforce))
haunted_item.throwforce = pre_haunt_throwforce
haunted_item.RemoveElement(/datum/element/haunted)
haunted_item.remove_haunted(MAGIC_TRAIT)
return ..()
/datum/component/haunted_item/RegisterWithParent()
@@ -24,6 +24,7 @@
var/theme = THEME_CULT
/// Role check, if any needed
var/required_role = /datum/antagonist/cult
grind_results = list(/datum/reagent/hauntium = 25, /datum/reagent/silicon = 10) //can be ground into hauntium
/obj/item/soulstone/Initialize(mapload)
. = ..()
+1
View File
@@ -43,6 +43,7 @@
if(!isobserver(seen))
continue
set_custom_materials(list(/datum/material/hauntium =SHEET_MATERIAL_AMOUNT))
grind_results = list(/datum/reagent/hauntium = 20)
break
/obj/item/photo/update_icon_state()
@@ -2891,3 +2891,42 @@
if(SPT_PROB(10, seconds_per_tick))
carbon_metabolizer.set_heartattack(TRUE)
/datum/reagent/hauntium
name = "Hauntium"
color = "#3B3B3BA3"
description = "An eerie liquid created by purifying the prescence of ghosts. If it happens to get in your body, it starts hurting your soul." //soul as in mood and heart
taste_description = "evil spirits"
metabolization_rate = 0.75 * REAGENTS_METABOLISM
material = /datum/material/hauntium
ph = 10
chemical_flags = REAGENT_CAN_BE_SYNTHESIZED
/datum/reagent/hauntium/expose_obj(obj/exposed_obj, volume) //gives 15 seconds of haunting effect for every unit of it that touches an object
. = ..()
if(HAS_TRAIT_FROM(exposed_obj, TRAIT_HAUNTED, HAUNTIUM_REAGENT_TRAIT))
return
exposed_obj.make_haunted(HAUNTIUM_REAGENT_TRAIT, "#f8f8ff")
addtimer(CALLBACK(exposed_obj, TYPE_PROC_REF(/atom/movable/, remove_haunted), HAUNTIUM_REAGENT_TRAIT), volume * 20 SECONDS)
/datum/reagent/hauntium/on_mob_metabolize(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
to_chat(affected_mob, span_userdanger("You feel an evil presence inside you!"))
if(affected_mob.mob_biotypes & MOB_UNDEAD || HAS_MIND_TRAIT(affected_mob, TRAIT_MORBID))
affected_mob.add_mood_event("morbid_hauntium", /datum/mood_event/morbid_hauntium, name) //8 minutes of slight mood buff if undead or morbid
else
affected_mob.add_mood_event("hauntium_spirits", /datum/mood_event/hauntium_spirits, name) //8 minutes of mood debuff
/datum/reagent/hauntium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired)
if(affected_mob.mob_biotypes & MOB_UNDEAD || HAS_MIND_TRAIT(affected_mob, TRAIT_MORBID)) //if morbid or undead,acts like an addiction-less drug
affected_mob.remove_status_effect(/datum/status_effect/jitter)
affected_mob.AdjustStun(-50 * REM * seconds_per_tick)
affected_mob.AdjustKnockdown(-50 * REM * seconds_per_tick)
affected_mob.AdjustUnconscious(-50 * REM * seconds_per_tick)
affected_mob.AdjustParalyzed(-50 * REM * seconds_per_tick)
affected_mob.AdjustImmobilized(-50 * REM * seconds_per_tick)
..()
else
affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, REM * seconds_per_tick) //1 heart damage per tick
if(SPT_PROB(10, seconds_per_tick))
affected_mob.emote(pick("twitch","choke","shiver","gag"))
..()
@@ -950,3 +950,14 @@
for(var/i in rand(1, created_volume) to created_volume)
new /mob/living/basic/ant(location)
..()
/datum/chemical_reaction/hauntium_solidification
required_reagents = list(/datum/reagent/water/holywater = 10, /datum/reagent/hauntium = 20, /datum/reagent/iron = 1)
mob_react = FALSE
reaction_flags = REACTION_INSTANT
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER
/datum/chemical_reaction/hauntium_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i in 1 to created_volume)
new /obj/item/stack/sheet/hauntium(location)