mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-19 21:46:42 +00:00
## About The Pull Request Fixes #77501 Spider egg ghost role spawners grant the spider antag datum, rather than the act of being a spider. This means that gold core, mapstart, polymorph belt, and other spiders will not have an antagonist datum. While doing this I also made a new abstract `mob/living/basic/spider` type which all three kinds of spider life stage (`spiderling`, `young`, `giant`) extend from, because there was a gross amount of copied code. Now there isn't. Also the Flesh Spider and Event Midwife eggs now simply hatch adult spiders instead of child ones. This is because there is no reason for either of these to have a two minute wait time before they get going. Midwife spiders spawned by the event should just start spidering immediately, and Flesh Spiders are made by changelings and shouldn't be effected by measures introduced to balance the spider gamemode. Eggs which are laid during a round and _can_ hatch into midwife spiders still hatch baby spiders. Also I swapped some white pixels on the animation of the ambush spiderling for a different colour because they looked bad. ## Why It's Good For The Game While the policy is always "if you turn yourself into something, you're not an antagonist" the presence of the antag datum still confuses people. Plus that code was gross and I didn't like it. ## Changelog 🆑 fix: Giant Spiders only have an antag datum if created by the round event. balance: Flesh spider eggs hatch into adult spiders instead of baby spiders. balance: The eggs spawned by the start of the spider infestation event hatch into adult Midwife spiders instead of baby ones. /🆑
205 lines
7.7 KiB
Plaintext
205 lines
7.7 KiB
Plaintext
/obj/structure/spider/eggcluster
|
|
name = "egg cluster"
|
|
desc = "There's something alive in there, and sooner or later it's going to find its way out."
|
|
icon_state = "eggs"
|
|
/// Mob spawner handling the actual spawn of the spider
|
|
var/obj/effect/mob_spawn/ghost_role/spider/spawner
|
|
|
|
/obj/structure/spider/eggcluster/Initialize(mapload)
|
|
pixel_x = base_pixel_x + rand(3,-3)
|
|
pixel_y = base_pixel_y + rand(3,-3)
|
|
return ..()
|
|
|
|
/obj/structure/spider/eggcluster/Destroy()
|
|
if(spawner)
|
|
QDEL_NULL(spawner)
|
|
return ..()
|
|
|
|
/obj/structure/spider/eggcluster/attack_ghost(mob/user)
|
|
if(spawner)
|
|
spawner.attack_ghost(user)
|
|
return ..()
|
|
|
|
/obj/structure/spider/eggcluster/examine_more(mob/user)
|
|
. = ..()
|
|
|
|
if(istype(user, /mob/living/basic/spider/giant/midwife))
|
|
switch(spawner.amount_grown)
|
|
if(0 to 24)
|
|
. += span_info("These eggs look shrunken and dormant.")
|
|
if(25 to 49)
|
|
. += span_info("These eggs have begun to move, pulsating, gestating...")
|
|
if(50 to 74)
|
|
. += span_info("These eggs are rippling, unseen life stirring beneath its skin.")
|
|
if(75 to 99)
|
|
. += span_info("These eggs swell with unseen life. They are almost ready to burst.")
|
|
if(100 to INFINITY)
|
|
. += span_info("These eggs are plump, teeming with life. Any moment now...")
|
|
|
|
/obj/structure/spider/eggcluster/enriched
|
|
name = "enriched egg cluster"
|
|
color = rgb(148, 0, 211)
|
|
|
|
/obj/structure/spider/eggcluster/bloody
|
|
name = "bloody egg cluster"
|
|
color = rgb(255, 0, 0)
|
|
|
|
/obj/structure/spider/eggcluster/midwife
|
|
name = "midwife egg cluster"
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider
|
|
name = "egg cluster"
|
|
desc = "They seem to pulse slightly with an inner life."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "eggs"
|
|
move_resist = MOVE_FORCE_NORMAL
|
|
density = FALSE
|
|
show_flavor = FALSE
|
|
you_are_text = "You are a spider."
|
|
flavour_text = "For the hive! Choose a spider and fulfill your role to take over the station... if that is within your directives, of course."
|
|
important_text = "Follow your directives at all costs."
|
|
faction = list(FACTION_SPIDER)
|
|
spawner_job_path = /datum/job/spider
|
|
role_ban = ROLE_ALIEN
|
|
prompt_ghost = FALSE
|
|
/// Prevents spawning from this mob_spawn until TRUE, set by the egg growing
|
|
var/ready = FALSE
|
|
/// The amount the egg cluster has grown. Is able to produce a spider when it hits 100.
|
|
var/amount_grown = 0
|
|
/// The mother's directive at the time the egg was produced. Passed onto the child.
|
|
var/directive = ""
|
|
/// Type of the cluster that the spawner spawns
|
|
var/cluster_type = /obj/structure/spider/eggcluster
|
|
/// Physical structure housing the spawner
|
|
var/obj/structure/spider/eggcluster/egg
|
|
/// The types of spiders that the spawner can produce
|
|
var/list/potentialspawns = list(
|
|
/mob/living/basic/spider/growing/spiderling/nurse,
|
|
/mob/living/basic/spider/growing/spiderling/hunter,
|
|
/mob/living/basic/spider/growing/spiderling/ambush,
|
|
/mob/living/basic/spider/growing/spiderling/tangle,
|
|
/mob/living/basic/spider/growing/spiderling/guard,
|
|
/mob/living/basic/spider/growing/spiderling/scout,
|
|
)
|
|
/// Do we flash the byond window when this particular egg type is available?
|
|
var/flash_window = FALSE
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/Initialize(mapload)
|
|
. = ..()
|
|
START_PROCESSING(SSobj, src)
|
|
potentialspawns = string_list(potentialspawns)
|
|
egg = new cluster_type(get_turf(loc))
|
|
egg.spawner = src
|
|
forceMove(egg)
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/Destroy()
|
|
egg = null
|
|
return ..()
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/process(seconds_per_tick)
|
|
amount_grown += rand(5, 15) * seconds_per_tick
|
|
if(amount_grown >= 100 && !ready)
|
|
ready = TRUE
|
|
notify_ghosts("[src] is ready to hatch!", null, enter_link = "<a href=?src=[REF(src)];activate=1>(Click to play)</a>", source = src, action = NOTIFY_ORBIT, ignore_key = POLL_IGNORE_SPIDER, flashwindow = flash_window)
|
|
STOP_PROCESSING(SSobj, src)
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/Topic(href, href_list)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
if(href_list["activate"])
|
|
var/mob/dead/observer/ghost = usr
|
|
if(istype(ghost))
|
|
ghost.ManualFollow(src)
|
|
attack_ghost(ghost)
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/allow_spawn(mob/user, silent = FALSE)
|
|
. = ..()
|
|
if(!.)
|
|
return FALSE
|
|
if(!ready)
|
|
if(!silent)
|
|
to_chat(user, span_warning("\The [src] is not ready to hatch yet!"))
|
|
return FALSE
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/spider/spawned_mob, mob/mob_possessor)
|
|
. = ..()
|
|
spawned_mob.directive = directive
|
|
egg.spawner = null
|
|
QDEL_NULL(egg)
|
|
var/datum/antagonist/spider/spider_antag = new(directive)
|
|
spawned_mob.mind.add_antag_datum(spider_antag)
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/enriched
|
|
name = "enriched egg cluster"
|
|
color = rgb(148, 0, 211)
|
|
you_are_text = "You are an enriched spider."
|
|
cluster_type = /obj/structure/spider/eggcluster/enriched
|
|
potentialspawns = list(
|
|
/mob/living/basic/spider/growing/spiderling/tarantula,
|
|
/mob/living/basic/spider/growing/spiderling/viper,
|
|
/mob/living/basic/spider/growing/spiderling/midwife,
|
|
)
|
|
flash_window = TRUE
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/bloody
|
|
name = "bloody egg cluster"
|
|
color = rgb(255, 0, 0)
|
|
you_are_text = "You are a bloody spider."
|
|
flavour_text = "An abomination of nature set upon the station by changelings. Your only goal is to kill, terrorize, and survive."
|
|
directive = "You are the spawn of a vicious changeling. You have no ambitions except to wreak havoc and ensure your own survival. You are aggressive to all living beings outside of your species, including changelings."
|
|
cluster_type = /obj/structure/spider/eggcluster/bloody
|
|
potentialspawns = list(
|
|
/mob/living/basic/spider/giant/hunter/flesh,
|
|
)
|
|
flash_window = TRUE
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/midwife
|
|
name = "midwife egg cluster"
|
|
you_are_text = "You are a midwife spider."
|
|
flavour_text = "The crux of the spider horde. You have the ability to reproduce and create more spiders, and turn victims into special spider eggs."
|
|
directive = "Ensure the survival of the spider species and overtake whatever structure you find yourself in."
|
|
cluster_type = /obj/structure/spider/eggcluster/midwife
|
|
potentialspawns = list(
|
|
/mob/living/basic/spider/giant/midwife, // We don't want the event to end instantly because of a 2 hp spiderling dying
|
|
)
|
|
flash_window = TRUE
|
|
|
|
/**
|
|
* Makes a ghost into a spider based on the type of egg cluster.
|
|
*
|
|
* Allows a ghost to get a prompt to use the egg cluster to become a spider.
|
|
*
|
|
* Arguments:
|
|
* * user - The ghost attempting to become a spider
|
|
* * newname - If set, renames the mob to this name
|
|
*/
|
|
/obj/effect/mob_spawn/ghost_role/spider/create(mob/user, newname)
|
|
var/list/spider_list = list()
|
|
var/list/display_spiders = list()
|
|
for(var/choice in potentialspawns)
|
|
var/mob/living/basic/spider/growing/spiderling/chosen_spiderling = choice
|
|
var/mob/living/basic/spider/growing/young/young_spider = initial(chosen_spiderling.grow_as)
|
|
var/mob/living/basic/spider/giant/spider = initial(young_spider.grow_as) // God this is so stupid
|
|
spider_list[initial(spider.name)] = chosen_spiderling
|
|
|
|
var/datum/radial_menu_choice/option = new
|
|
option.image = image(icon = initial(spider.icon), icon_state = initial(spider.icon_state))
|
|
|
|
var/datum/reagent/spider_poison = initial(spider.poison_type)
|
|
var/spider_description = initial(spider.menu_description)
|
|
if(initial(spider.poison_per_bite))
|
|
spider_description += " [initial(spider_poison.name)] injection of [initial(spider.poison_per_bite)]u per bite."
|
|
else
|
|
spider_description += " Does not inject [initial(spider_poison.name)]."
|
|
option.info = span_boldnotice(spider_description)
|
|
|
|
display_spiders[initial(spider.name)] = option
|
|
sort_list(display_spiders)
|
|
var/chosen_spider = show_radial_menu(user, egg, display_spiders, radius = 38)
|
|
chosen_spider = spider_list[chosen_spider]
|
|
if(QDELETED(src) || QDELETED(user) || !chosen_spider)
|
|
return FALSE
|
|
mob_type = chosen_spider
|
|
return ..()
|