mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 12:07:27 +01:00
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:
co-authored by
DGamerL
Charlie Nolan
Luc
parent
678bb87de3
commit
60c00ce0d5
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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!"
|
||||
|
||||
Reference in New Issue
Block a user