mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 02:09:41 +00:00
193 lines
6.0 KiB
Plaintext
193 lines
6.0 KiB
Plaintext
var/list/blob_cores = list()
|
|
|
|
/obj/structure/blob/core
|
|
name = "blob core"
|
|
base_name = "core"
|
|
icon = 'icons/mob/blob.dmi'
|
|
icon_state = "blank_blob"
|
|
desc = "A huge, pulsating yellow mass."
|
|
density = TRUE //bandaid fix for PolarisSS13/6173
|
|
max_integrity = 150
|
|
point_return = -1
|
|
health_regen = 0 //we regen in Life() instead of when pulsed
|
|
var/datum/blob_type/desired_blob_type = null // If this is set, the core always creates an overmind possessing this blob type.
|
|
var/difficulty_threshold = null // Otherwise if this is set, it picks a random blob_type that is equal or lower in difficulty.
|
|
var/difficulty_floor = null // Related to the above var, acts as a floor value to the above, inclusive.
|
|
var/core_regen = 2
|
|
var/overmind_get_delay = 0 //we don't want to constantly try to find an overmind, this var tracks when we'll try to get an overmind again
|
|
var/resource_delay = 0
|
|
var/point_rate = 2
|
|
var/ai_controlled = TRUE
|
|
|
|
// Spawn this if you want a ghost to be able to play as the blob.
|
|
/obj/structure/blob/core/player
|
|
ai_controlled = FALSE
|
|
|
|
// Spawn these if you want a semi-random blob.
|
|
// Can give a random easy blob.
|
|
/obj/structure/blob/core/random_easy
|
|
difficulty_threshold = BLOB_DIFFICULTY_EASY
|
|
|
|
// Can give a random easy or medium blob.
|
|
/obj/structure/blob/core/random_medium
|
|
difficulty_threshold = BLOB_DIFFICULTY_MEDIUM
|
|
|
|
// Can give a random medium or hard blob.
|
|
/obj/structure/blob/core/random_hard
|
|
difficulty_threshold = BLOB_DIFFICULTY_HARD
|
|
difficulty_floor = BLOB_DIFFICULTY_MEDIUM
|
|
|
|
// Spawn these if you want a specific blob.
|
|
/obj/structure/blob/core/blazing_oil
|
|
desired_blob_type = /datum/blob_type/blazing_oil
|
|
|
|
/obj/structure/blob/core/grey_goo
|
|
desired_blob_type = /datum/blob_type/grey_goo
|
|
|
|
/obj/structure/blob/core/fabrication_swarm
|
|
desired_blob_type = /datum/blob_type/fabrication_swarm
|
|
|
|
/obj/structure/blob/core/electromagnetic_web
|
|
desired_blob_type = /datum/blob_type/electromagnetic_web
|
|
|
|
/obj/structure/blob/core/fungal_bloom
|
|
desired_blob_type = /datum/blob_type/fungal_bloom
|
|
|
|
/obj/structure/blob/core/fulminant_organism
|
|
desired_blob_type = /datum/blob_type/fulminant_organism
|
|
|
|
/obj/structure/blob/core/reactive_spines
|
|
desired_blob_type = /datum/blob_type/reactive_spines
|
|
|
|
/obj/structure/blob/core/synchronous_mesh
|
|
desired_blob_type = /datum/blob_type/synchronous_mesh
|
|
|
|
/obj/structure/blob/core/shifting_fragments
|
|
desired_blob_type = /datum/blob_type/shifting_fragments
|
|
|
|
/obj/structure/blob/core/cryogenic_goo
|
|
desired_blob_type = /datum/blob_type/cryogenic_goo
|
|
|
|
/obj/structure/blob/core/energized_jelly
|
|
desired_blob_type = /datum/blob_type/energized_jelly
|
|
|
|
/obj/structure/blob/core/explosive_lattice
|
|
desired_blob_type = /datum/blob_type/explosive_lattice
|
|
|
|
/obj/structure/blob/core/pressurized_slime
|
|
desired_blob_type = /datum/blob_type/pressurized_slime
|
|
|
|
/obj/structure/blob/core/radioactive_ooze
|
|
desired_blob_type = /datum/blob_type/radioactive_ooze
|
|
|
|
/obj/structure/blob/core/volatile_alluvium
|
|
desired_blob_type = /datum/blob_type/volatile_alluvium
|
|
|
|
/obj/structure/blob/core/classic
|
|
desired_blob_type = /datum/blob_type/classic
|
|
|
|
/obj/structure/blob/core/Initialize(newloc, client/new_overmind = null, new_rate = 2, placed = 0)
|
|
. = ..(newloc)
|
|
blob_cores += src
|
|
START_PROCESSING(SSobj, src)
|
|
update_icon() //so it atleast appears
|
|
if(!placed && !overmind)
|
|
create_overmind(new_overmind)
|
|
if(overmind)
|
|
update_icon()
|
|
point_rate = new_rate
|
|
|
|
/obj/structure/blob/core/Destroy()
|
|
blob_cores -= src
|
|
if(overmind)
|
|
overmind.blob_core = null
|
|
qdel(overmind)
|
|
overmind = null
|
|
STOP_PROCESSING(SSobj, src)
|
|
return ..()
|
|
|
|
/obj/structure/blob/core/update_icon()
|
|
overlays.Cut()
|
|
color = null
|
|
var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob")
|
|
if(overmind)
|
|
blob_overlay.color = overmind.blob_type.color
|
|
name = "[overmind.blob_type.name] [base_name]"
|
|
overlays += blob_overlay
|
|
overlays += mutable_appearance('icons/mob/blob.dmi', "blob_core_overlay")
|
|
|
|
/obj/structure/blob/core/process()
|
|
set waitfor = FALSE
|
|
if(QDELETED(src))
|
|
return
|
|
if(!overmind)
|
|
spawn(0)
|
|
create_overmind()
|
|
else
|
|
if(resource_delay <= world.time)
|
|
resource_delay = world.time + 1 SECOND
|
|
overmind.add_points(point_rate)
|
|
integrity = min(max_integrity, integrity + core_regen)
|
|
// if(overmind)
|
|
// overmind.update_health_hud()
|
|
pulse_area(overmind, 15, BLOB_CORE_PULSE_RANGE, BLOB_CORE_EXPAND_RANGE)
|
|
for(var/obj/structure/blob/normal/B in range(1, src))
|
|
if(prob(5))
|
|
B.change_to(/obj/structure/blob/shield/core, overmind)
|
|
|
|
/obj/structure/blob/core/proc/create_overmind(client/new_overmind, override_delay)
|
|
if(overmind_get_delay > world.time && !override_delay)
|
|
return
|
|
if(!ai_controlled) // Do we want a bona fide player blob?
|
|
overmind_get_delay = world.time + 15 SECONDS //if this fails, we'll try again in 15 seconds
|
|
|
|
if(overmind)
|
|
qdel(overmind)
|
|
|
|
|
|
var/client/C = null
|
|
if(!new_overmind)
|
|
var/datum/ghost_query/Q = new /datum/ghost_query/blob()
|
|
var/list/winner = Q.query()
|
|
if(winner.len)
|
|
var/mob/observer/dead/D = winner[1]
|
|
C = D.client
|
|
|
|
else
|
|
C = new_overmind
|
|
|
|
if(C)
|
|
if(!desired_blob_type && !isnull(difficulty_threshold))
|
|
desired_blob_type = get_random_blob_type()
|
|
var/mob/observer/blob/B = new(loc, TRUE, 60, desired_blob_type)
|
|
B.key = C.key
|
|
B.blob_core = src
|
|
src.overmind = B
|
|
update_icon()
|
|
if(B.mind && !B.mind.special_role)
|
|
B.mind.special_role = "Blob Overmind"
|
|
return TRUE
|
|
return FALSE
|
|
|
|
else // An AI opponent.
|
|
if(!desired_blob_type && !isnull(difficulty_threshold))
|
|
desired_blob_type = get_random_blob_type()
|
|
var/mob/observer/blob/B = new(loc, TRUE, 60, desired_blob_type)
|
|
overmind = B
|
|
B.blob_core = src
|
|
B.ai_controlled = TRUE
|
|
update_icon()
|
|
return TRUE
|
|
|
|
/obj/structure/blob/core/proc/get_random_blob_type()
|
|
if(!difficulty_threshold)
|
|
return
|
|
var/list/valid_types = list()
|
|
for(var/thing in subtypesof(/datum/blob_type))
|
|
var/datum/blob_type/BT = thing
|
|
if(initial(BT.difficulty) > difficulty_threshold) // Too hard.
|
|
continue
|
|
if(initial(BT.difficulty) < difficulty_floor) // Too easy.
|
|
continue
|
|
valid_types += BT
|
|
return pick(valid_types) |