adds the proteon orb. (heretic requirement) (#27705)

* adds the proteon orb.

* oops

* Update code/datums/components/ghost_direct_control.dm

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Signed-off-by: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Charlie Nolan <funnyman3595@gmail.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>

* revert that

* Update code/game/objects/structures/monster_spawner.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>

* lewcs stuff

* Update code/game/objects/structures/monster_spawner.dm

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>

* Update monster_spawner.dm

---------

Signed-off-by: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>
Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
Co-authored-by: Charlie Nolan <funnyman3595@gmail.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
This commit is contained in:
Qwertytoforty
2025-01-10 19:11:53 +00:00
committed by GitHub
co-authored by DGamerL Charlie Nolan Luc
parent 678bb87de3
commit 60c00ce0d5
14 changed files with 363 additions and 8 deletions
+4
View File
@@ -1438,3 +1438,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
*/
/atom/proc/relaydrive(mob/living/user, direction)
return !(SEND_SIGNAL(src, COMSIG_RIDDEN_DRIVER_MOVE, user, direction) & COMPONENT_DRIVER_BLOCK_MOVE)
/// Used with the spawner component to do something when a mob is spawned.
/atom/proc/on_mob_spawn(mob/created_mob)
return
+8
View File
@@ -42,6 +42,10 @@
var/harvester_icon_state = "harvester"
var/harvester_dead_state = "shade_dead"
//Proteon Construct
var/proteon_name = "Proteon"
var/proteon_icon_state = "proteon"
var/proteon_dead_state = "shade_dead"
//Shade Spirit
var/shade_name = "Shade"
var/shade_icon_state = "shade2"
@@ -211,6 +215,8 @@
return harvester_name
if("wraith")
return wraith_name
if("proteon")
return proteon_name
if("shade")
return shade_name
@@ -230,6 +236,8 @@
return harvester_icon_state
if("wraith")
return wraith_icon_state
if("proteon")
return proteon_icon_state
if("shade")
return shade_icon_state
if("forge")
+85
View File
@@ -829,3 +829,88 @@
icon = 'icons/obj/biomass.dmi'
icon_state = "rift"
color = "red"
#define GATEWAY_TURF_SCAN_RANGE 40
GLOBAL_LIST_EMPTY(proteon_portals)
/obj/item/proteon_orb
name = "summoning orb"
desc = "An eerie translucent orb that feels impossibly light. Legends say summoning orbs are created from corrupted scrying orbs. If you hold it close to your ears, you can hear the screams of the damned."
icon = 'icons/obj/wizard.dmi'
icon_state ="scrying_orb"
light_range = 3
light_color = LIGHT_COLOR_RED
new_attack_chain = TRUE
/// A nice blood colour matrix
var/list/blood_color_matrix = list(1.25,-0.1,-0.1,0, 0,0.15,0,0, 0,0,0.15,0, 0,0,0,1, 0,0,0,0)
/obj/item/proteon_orb/Initialize(mapload)
. = ..()
color = blood_color_matrix
/obj/item/proteon_orb/examine(mob/user)
. = ..()
if(!IS_CULTIST(user) && isliving(user))
var/mob/living/living_user = user
living_user.adjustBrainLoss(5)
. += "<span class='danger'>It hurts just to look at it. Better keep away.</span>"
else
. += "<span class='cult'>It can be used to create a gateway to Nar'Sie's domain, which will summon weak, sentient constructs over time.</span>"
/obj/item/proteon_orb/activate_self(mob/user)
if(..())
return
var/list/portals_to_scan = GLOB.proteon_portals
if(!IS_CULTIST(user))
to_chat(user, "<span class='cultlarge'>\"You want to enter my domain? Go ahead.\"</span>")
portals_to_scan = null // narsie wants to have some fun and the veil wont stop her
for(var/obj/structure/spawner/sentient/proteon_spawner/P as anything in portals_to_scan)
if(get_dist(P, src) <= 40)
to_chat(user, "<span class='cult'><b>There's a gateway too close nearby. The veil is not yet weak enough to allow such close rips in its fabric.</b></span>")
return
to_chat(user, "<span class='cultitalic'><b>You focus on [src] and direct it into the ground. It rumbles...</b></span>")
var/turf/hole_spot = get_turf(user)
if(!isfloorturf(hole_spot))
to_chat(user, "<span class='notice'>This is not a suitable spot.</span>")
return
INVOKE_ASYNC(hole_spot, TYPE_PROC_REF(/turf/simulated/floor, quake_gateway), user)
qdel(src)
/**
* Bespoke proc that happens when a proteon orb is activated, creating a gateway.
* If activated by a non-cultist, they get an unusual game over.
*/
/turf/simulated/floor/proc/quake_gateway(mob/living/user)
ChangeTurf(/turf/simulated/floor/engine/cult)
Shake(4, 4, 5 SECONDS)
var/fucked = FALSE
if(!IS_CULTIST(user))
fucked = TRUE
user.notransform = TRUE
user.add_atom_colour(LIGHT_COLOR_RED, TEMPORARY_COLOUR_PRIORITY)
user.visible_message("<span class='cult'><b>Dark tendrils appear from the ground and root [user] in place!</b></span>")
sleep(5 SECONDS) // can we still use these or. i mean its async
new /obj/structure/spawner/sentient/proteon_spawner(src)
visible_message("<span class='cult'><b>A mysterious hole appears out of nowhere!</b></span>")
if(!fucked || QDELETED(user))
return
if(get_turf(user) != src) // they get away. for now
user.notransform = FALSE
user.visible_message("<span class='cult'><b>[user] is pulled into the portal through an infinitesmally minuscule hole, shredding [user.p_their()] body!</b></span>")
add_attack_logs(user, user, "Killed themselfs via use of a proteon orb as a non cultist", ATKLOG_ALL)
user.gib() // total destruction
sleep(5 SECONDS)
user.visible_message("<span class='cultitalic'>An unusually large construct appears through the portal!</span>")
var/mob/living/simple_animal/hostile/construct/proteon/hostile/remnant = new(get_step_rand(src))
remnant.name = "[user]" // no, they do not become it
remnant.appearance_flags += PIXEL_SCALE
remnant.transform *= 1.5
#undef GATEWAY_TURF_SCAN_RANGE
@@ -24,6 +24,7 @@
return
..()
/obj/structure/spawner/syndicate
name = "warp beacon"
icon = 'icons/obj/device.dmi'
@@ -74,3 +75,87 @@
name = "basilisk den"
desc = "A den housing a nest of basilisks, bring a coat."
mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk)
/obj/structure/spawner/sentient
var/role_name = "A sentient mob"
var/assumed_control_message = "You are a sentient mob from a badly coded spawner"
/obj/structure/spawner/sentient/Initialize(mapload)
. = ..()
notify_ghosts("\A [name] has been created in \the [get_area(src)]!", source = src, title = "Sentient Spawner Created", flashwindow = FALSE
)
/obj/structure/spawner/sentient/on_mob_spawn(mob/created_mob)
created_mob.AddComponent(\
/datum/component/ghost_direct_control,\
role_name = src.role_name,\
assumed_control_message = src.assumed_control_message,\
after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\
)
/obj/structure/spawner/sentient/proc/became_player_controlled(mob/proteon)
return
/obj/structure/spawner/sentient/proteon_spawner
name = "eldritch gateway"
desc = "A dizzying structure that somehow links into Nar'Sie's own domain. The screams of the damned echo continously."
icon = 'icons/obj/cult.dmi'
icon_state = "hole"
light_power = 2
light_color = LIGHT_COLOR_RED
max_integrity = 50
density = FALSE
max_mobs = 2
spawn_time = 15 SECONDS
mob_types = list(/mob/living/simple_animal/hostile/construct/proteon/hostile)
spawn_text = "arises from"
faction = list("cult")
role_name = "A proteon cult construct"
assumed_control_message = null
/// The GPS inside the spawner, lets security find them, especially if someone is space basing them.
var/obj/item/gps/internal/proteon/gps
/obj/structure/spawner/sentient/proteon_spawner/Initialize(mapload)
. = ..()
GLOB.proteon_portals += src
gps = new /obj/item/gps/internal/proteon(src)
/obj/structure/spawner/sentient/proteon_spawner/Destroy()
GLOB.proteon_portals -= src
QDEL_NULL(gps)
return ..()
/obj/structure/spawner/sentient/proteon_spawner/examine_status(mob/user)
if(IS_CULTIST(user) || !isliving(user))
return "<span class='cult'>It's at <b>[round(obj_integrity * 100 / max_integrity)]%</b> stability.</span>"
return ..()
/obj/structure/spawner/sentient/proteon_spawner/examine(mob/user)
. = ..()
if(!IS_CULTIST(user) && isliving(user))
var/mob/living/living_user = user
living_user.adjustBrainLoss(5)
. += "<span class='userdanger'>The voices of the damned echo relentlessly in your mind, continously rebounding on the walls of your self the more you focus on [src]. Your head pounds, better keep away...</span>"
else
. += "<span class='cult'>The gateway will create one weak proteon construct every [spawn_time * 0.1] seconds, up to a total of [max_mobs], that may be controlled by the spirits of the dead.</span>"
/obj/structure/spawner/sentient/proteon_spawner/became_player_controlled(mob/living/simple_animal/hostile/construct/proteon/hostile/proteon)
proteon.mind.add_antag_datum(/datum/antagonist/cultist)
proteon.add_filter("awoken_proteon", 3, list("type" = "outline", "color" = LIGHT_COLOR_RED, "size" = 2))
visible_message("<span class='cult'>[proteon] awakens, glowing an eerie red as it stirs from its stupor!</span>")
addtimer(CALLBACK(src, PROC_REF(remove_wake_outline), proteon), 8 SECONDS)
/obj/structure/spawner/sentient/proteon_spawner/proc/remove_wake_outline(mob/proteon)
proteon.remove_filter("awoken_proteon")
proteon.add_filter("sentient_proteon", 3, list("type" = "outline", "color" = LIGHT_COLOR_RED, "size" = 2, "alpha" = 40))
/obj/structure/spawner/sentient/proteon_spawner/obj_destruction(damage_flag)
playsound(src, 'sound/hallucinations/veryfar_noise.ogg', 75)
visible_message("<span class='cult'><b>[src] completely falls apart, the screams of the damned reaching a feverous pitch before slowly fading away into nothing.</b></span>")
return ..()
/obj/item/gps/internal/proteon
local = FALSE // Let security find the cult bases in space with it.
icon_state = null
gpstag = "Eldritch Signal"
desc = "You (can)'t just BSA a hole into hell!"