Files
Bubberstation/code/modules/research/anomaly/raw_anomaly.dm
SkyratBot 668bbcac4a [MIRROR] Adds the Ectoplasmic Outburst, a rare ghost-centric anomaly event [MDB IGNORE] (#19292)
* Adds the Ectoplasmic Outburst, a rare ghost-centric anomaly event (#73024)

## About The Pull Request

This PR description might be a bit rushed because I accidentally
submitted the PR and want to bang out a quick explanation of what this
is before people start asking questions.

Adds a new, rare, ghost-themed anomaly event -- The Ectoplasmic
Outburst.

![Animation](https://user-images.githubusercontent.com/28870487/215292488-cc5ce589-39be-490d-bd80-92a2ed6e948b.gif)

This event increases in power as more ghosts orbit it, with three
important thresholds to meet.

If 10% or more of all active observers are orbiting the anomaly, an
effect will occur in the nearby area akin to the revenant's defile
spell, damaging flooring, windows, and making a mess.

If 35% or more are orbiting the anomaly, nearby objects in the effect
radius have a chance to become haunted, and will fling themselves at
anyone nearby for a bit. Spooky!

Now, at 50% or more participation, things get serious. Ghosts orbiting
the anomaly will be polled to be brought back into the world for a brief
period as a vengeful spirit, anchored to a SUPER spooky ghost portal.
The portal closes after two minutes (alternatively, smash it with a
toolbox) and deletes all of the ghosts it spawned. Vengeful spirits are
mostly just meant to smash stuff and be a nuisance while they can. It's
a wonderful opportunity to let deadchat desalinate a little.

![spooky
ghosts](https://user-images.githubusercontent.com/28870487/215293550-f7bbede2-cfa0-49b1-87fe-f38ee45d1df8.gif)

Oh, also, the anomaly is deadchat controlled. With enough ghosts, you
could theoretically outrun anyone trying to neutralize it!

The associated reactive armor has an effect similar to the anomaly,
haunting nearby objects for a time when the wearer is struck. Not
particularly outstanding, but it can introduce an element of chaos into
a fight that your opponent might not expect.

## Why It's Good For The Game

Anomaly events are great for ghosts. Why not make one tailored just for
them!

Gives admins something to spawn when a wizard has killed half of the
crew but it's not quiiiite time for an ERT.

It's a bit of a silly event with a novelty reward, but I think it's rare
enough not to be a huge issue.

## Changelog

🆑 Rhials
add: Ectoplasmic Outburst anomaly event
add: Reactive Ectoplasm Armor
/🆑

* Adds the Ectoplasmic Outburst, a rare ghost-centric anomaly event

---------

Co-authored-by: Rhials <Datguy33456@gmail.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
2023-02-12 16:44:26 -08:00

98 lines
3.5 KiB
Plaintext

/**
* # Raw Anomaly Cores
*
* The current precursor to anomaly cores, these are manufactured into 'finished' anomaly cores for use in research, items, and more.
*
* The current amounts created is stored in `SSresearch.created_anomaly_types[ANOMALY_CORE_TYPE_DEFINE] = amount`.
* The hard limits are in `code/__DEFINES/anomalies.dm`.
*/
/obj/item/raw_anomaly_core
name = "raw anomaly core"
desc = "You shouldn't be seeing this. Someone screwed up."
icon = 'icons/obj/assemblies/new_assemblies.dmi'
icon_state = "broken_state"
/// Anomaly type
var/anomaly_type
/obj/item/raw_anomaly_core/bluespace
name = "raw bluespace core"
desc = "The raw core of a bluespace anomaly, glowing and full of potential."
anomaly_type = /obj/item/assembly/signaler/anomaly/bluespace
icon_state = "rawcore_bluespace"
/obj/item/raw_anomaly_core/vortex
name = "raw vortex core"
desc = "The raw core of a vortex anomaly. Feels heavy to the touch."
anomaly_type = /obj/item/assembly/signaler/anomaly/vortex
icon_state = "rawcore_vortex"
/obj/item/raw_anomaly_core/grav
name = "raw gravity core"
desc = "The raw core of a gravity anomaly. The air seems attracted to it."
anomaly_type = /obj/item/assembly/signaler/anomaly/grav
icon_state = "rawcore_grav"
/obj/item/raw_anomaly_core/pyro
desc = "The raw core of a pyro anomaly. It is warm to the touch."
name = "raw pyro core"
anomaly_type = /obj/item/assembly/signaler/anomaly/pyro
icon_state = "rawcore_pyro"
/obj/item/raw_anomaly_core/flux
name = "raw flux core"
desc = "The raw core of a flux anomaly, faintly crackling with energy."
anomaly_type = /obj/item/assembly/signaler/anomaly/flux
icon_state = "rawcore_flux"
/obj/item/raw_anomaly_core/hallucination
name = "raw hallucination core"
desc = "The raw core of a hallucination anomaly, makes your head spin."
anomaly_type = /obj/item/assembly/signaler/anomaly/hallucination
icon_state = "rawcore_hallucination"
/obj/item/raw_anomaly_core/random
name = "random raw core"
desc = "You should not see this!"
icon_state = "rawcore_bluespace"
/obj/item/raw_anomaly_core/bioscrambler
name = "raw bioscrambler core"
desc = "The raw core of a bioscrambler anomaly, it squirms."
anomaly_type = /obj/item/assembly/signaler/anomaly/bioscrambler
icon_state = "rawcore_bioscrambler"
/obj/item/raw_anomaly_core/dimensional
name = "raw dimensional core"
desc = "The raw core of a dimensional anomaly, vibrating with infinite potential."
anomaly_type = /obj/item/assembly/signaler/anomaly/dimensional
icon_state = "rawcore_dimensional"
/obj/item/raw_anomaly_core/ectoplasm //Has no cargo order option, but can sometimes be a roundstart pick
name = "\improper ectoplasm anomaly core"
desc = "The raw core of an ectoplasmic anomaly. It wants to share its secrets with you."
anomaly_type = /obj/item/assembly/signaler/anomaly/ectoplasm
icon_state = "dimensional_core"
/obj/item/raw_anomaly_core/random/Initialize(mapload)
. = ..()
var/path = pick(subtypesof(/obj/item/raw_anomaly_core))
new path(loc)
return INITIALIZE_HINT_QDEL
/**
* Created the resulting core after being "made" into it.
*
* Arguments:
* * newloc - Where the new core will be created
* * del_self - should we qdel(src)
* * count_towards_limit - should we increment the amount of created cores on SSresearch
*/
/obj/item/raw_anomaly_core/proc/create_core(newloc, del_self = FALSE, count_towards_limit = FALSE)
. = new anomaly_type(newloc)
if(count_towards_limit)
var/existing = SSresearch.created_anomaly_types[anomaly_type] || 0
SSresearch.created_anomaly_types[anomaly_type] = existing + 1
if(del_self)
qdel(src)