mirror of
https://github.com/Skyrat-SS13/Skyrat-tg.git
synced 2026-08-23 21:09:00 +01:00
* Minor Spider Rebalance (#83554) ## About The Pull Request Breacher and Viper player-controlled Spiders have swapped castes; Vipers now come from Abnormal Eggs, while Breachers will now come from Enriched Eggs. This means that Vipers may be seen more, while Breachers require the Nest to acquire at least a single kill to wrap and create an Enriched Egg from. Nurse Spiders also perform their heal action much faster, at the cost of a bit less healing. It was very difficult to heal others due to the long do_after and thus we saw very few Nurse Spiders. Breacher Spiders also are now NOT immune to cold, and will die if they try to space a room or go into space. ## Why It's Good For The Game Breacher Spiders are in kind of a difficult spot, both in theming and balance; their space resistance made them able to vent the station in multiple places by breaking key walls, and they had no need to commit to their sieges because they could escape into space at all times. It also broke part of the dynamic of Spiders wanting to keep the atmosphere in the station, and disincentivizing Breachers from venting the station also makes them more coherently a part of the Nest because they won't reduce the Nest's habitable area. Viper Spiders were seen quite little instead of the other options in the Enriched Egg; now, hopefully we'll see more. Likewise, the Breacher is quite powerful for being an Abnormal Egg, so perhaps now we'll see more focus on cocooning to unlock the powerful Breachers, or just overall less of them, which will help even the odds. Nurse Spiders were VERY underutilized despite their power— the do_after for their healing just felt obnoxiously long, and especially in tense situations, you'd have shuffle and Spiders yelling at one another because two of them have to Space Hulk the hallway for a semi-extended period of time. Now, Nurses will be able to heal and move on a bit faster. I don't believe this will create too many issues, balance-wise, as the time-to-kill on Spiders is still quite low for all but the tankiest against lasers and even welders. ## Changelog 🆑 Jane balance: Spider Breachers and Vipers have swapped castes. Breachers come from Enriched Eggs while Vipers come from Abnormals! Breachers can no longer survive in spaced rooms/temperatures. The Nurse wraps wounds faster, but with less damage healed per wrap. /🆑 * Minor Spider Rebalance --------- Co-authored-by: DrAmazing343 <147954468+DrAmazing343@users.noreply.github.com>
242 lines
8.6 KiB
Plaintext
242 lines
8.6 KiB
Plaintext
/obj/structure/spider/eggcluster
|
|
name = "egg cluster"
|
|
icon = 'icons/effects/effects.dmi'
|
|
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/abnormal
|
|
name = "abnormal egg cluster"
|
|
color = rgb(0, 148, 211)
|
|
|
|
/obj/structure/spider/eggcluster/enriched
|
|
name = "enriched egg cluster"
|
|
color = rgb(148, 0, 211)
|
|
|
|
/obj/structure/spider/eggcluster/bloody
|
|
icon = 'icons/mob/simple/meteor_heart.dmi'
|
|
icon_state = "eggs"
|
|
name = "bloody egg cluster"
|
|
|
|
/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
|
|
/// Which antag datum do we grant?
|
|
var/granted_datum = /datum/antagonist/spider
|
|
/// 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
|
|
var/notify_flags_to_pass = NOTIFY_CATEGORY_NOFLASH
|
|
if(flash_window)
|
|
notify_flags_to_pass &= GHOST_NOTIFY_FLASH_WINDOW
|
|
notify_ghosts(
|
|
"[src] is ready to hatch!",
|
|
source = src,
|
|
header = "Spider Infestation",
|
|
click_interact = TRUE,
|
|
ignore_key = POLL_IGNORE_SPIDER,
|
|
notify_flags = notify_flags_to_pass,
|
|
)
|
|
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)
|
|
. = ..()
|
|
if (isspider(spawned_mob))
|
|
spawned_mob.directive = directive
|
|
egg.spawner = null
|
|
QDEL_NULL(egg)
|
|
var/datum/antagonist/spider/spider_antag = new granted_datum(directive)
|
|
spawned_mob.mind.add_antag_datum(spider_antag)
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/abnormal
|
|
name = "abnormal egg cluster"
|
|
color = rgb(0, 148, 211)
|
|
cluster_type = /obj/structure/spider/eggcluster/abnormal
|
|
potentialspawns = list(
|
|
/mob/living/basic/spider/growing/spiderling/tank,
|
|
/mob/living/basic/spider/growing/spiderling/viper,
|
|
)
|
|
flash_window = TRUE
|
|
|
|
/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/breacher,
|
|
/mob/living/basic/spider/growing/spiderling/midwife,
|
|
)
|
|
flash_window = TRUE
|
|
|
|
/obj/effect/mob_spawn/ghost_role/spider/bloody
|
|
name = "bloody egg cluster"
|
|
icon = 'icons/mob/simple/meteor_heart.dmi'
|
|
icon_state = "eggs"
|
|
you_are_text = "You are a flesh spider."
|
|
flavour_text = "An abomination of nature set upon the station by changelings. Your only goal is to kill, terrorize, and survive."
|
|
faction = list()
|
|
directive = null
|
|
cluster_type = /obj/structure/spider/eggcluster/bloody
|
|
potentialspawns = list(
|
|
/mob/living/basic/flesh_spider,
|
|
)
|
|
flash_window = TRUE
|
|
granted_datum = /datum/antagonist/spider/flesh
|
|
|
|
/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/growing/spiderling/midwife, // We don't want the event to end instantly because broodmothers got a bad spawn
|
|
)
|
|
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/chosen_spider = length(potentialspawns) > 1 ? get_radial_choice(user) : potentialspawns[1]
|
|
if(QDELETED(src) || QDELETED(user) || isnull(chosen_spider))
|
|
return FALSE
|
|
mob_type = chosen_spider
|
|
return ..()
|
|
|
|
/// Pick a spider type from a radial menu
|
|
/obj/effect/mob_spawn/ghost_role/spider/proc/get_radial_choice(mob/user)
|
|
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, require_near = TRUE)
|
|
return spider_list[chosen_spider]
|