From 497f18ea3215f6b0d3207d84efa31893bedd7a09 Mon Sep 17 00:00:00 2001 From: Jacquerel Date: Sat, 12 Aug 2023 03:43:04 +0100 Subject: [PATCH] Spiders don't automatically grant an antag datum (#77523) ## 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 :cl: 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. /:cl: --- _maps/RandomZLevels/caves.dmm | 14 +- _maps/RandomZLevels/snowdin.dmm | 10 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/shuttles/whiteship_delta.dmm | 8 +- code/__DEFINES/is_helpers.dm | 2 +- code/_globalvars/phobias.dm | 2 +- code/controllers/subsystem/minor_mapping.dm | 2 +- code/datums/memory/_memory.dm | 4 +- code/game/objects/items/weaponry.dm | 4 +- .../abductor/equipment/glands/spider.dm | 4 +- .../traitor/objectives/kill_pet.dm | 2 +- code/modules/cargo/packs/imports.dm | 4 +- code/modules/events/ghost_role/sentience.dm | 2 +- .../events/shuttle_loan/shuttle_loan_datum.dm | 8 +- code/modules/events/vent_clog.dm | 4 +- code/modules/events/wizard/petsplosion.dm | 2 +- code/modules/hydroponics/hydroponics.dm | 2 +- .../spider/giant_spider/giant_spider.dm | 107 ----------- ...nt_spider_variants.dm => giant_spiders.dm} | 147 +++++++-------- .../living/basic/space_fauna/spider/spider.dm | 176 ++++++++++++++++++ .../spider/spiderlings/spiderling.dm | 95 +--------- .../spider/spiderlings/spiderling_subtypes.dm | 46 ++--- .../spider/young_spider/young_spider.dm | 129 +------------ .../young_spider/young_spider_subtypes.dm | 87 +++------ code/modules/mob/living/living.dm | 4 +- .../mob_spawn/ghost_roles/spider_roles.dm | 36 ++-- .../chemistry/recipes/slime_extracts.dm | 2 +- .../spell_types/shapeshift/shapechange.dm | 2 +- icons/mob/simple/arachnoid.dmi | Bin 112233 -> 112244 bytes tgstation.dme | 4 +- .../Scripts/77523_giant_spider_repath.txt | 4 + 31 files changed, 362 insertions(+), 553 deletions(-) delete mode 100644 code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm rename code/modules/mob/living/basic/space_fauna/spider/giant_spider/{giant_spider_variants.dm => giant_spiders.dm} (85%) create mode 100644 code/modules/mob/living/basic/space_fauna/spider/spider.dm create mode 100644 tools/UpdatePaths/Scripts/77523_giant_spider_repath.txt diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 2e9df0b3616..697b0f4feef 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -1264,7 +1264,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "kE" = ( -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "kL" = ( @@ -1336,7 +1336,7 @@ /area/awaymission/caves/northblock) "pC" = ( /obj/item/mjollnir, -/mob/living/basic/giant_spider/nurse, +/mob/living/basic/spider/giant/nurse, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1440,7 +1440,7 @@ /obj/machinery/sleeper{ dir = 8 }, -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "uO" = ( @@ -1598,7 +1598,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "Bz" = ( -/mob/living/basic/giant_spider/nurse, +/mob/living/basic/spider/giant/nurse, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1680,7 +1680,7 @@ "FS" = ( /obj/machinery/light/small/built/directional/north, /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "FV" = ( @@ -1966,7 +1966,7 @@ /turf/open/floor/iron, /area/awaymission/caves/northblock) "Xs" = ( -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1988,7 +1988,7 @@ /area/awaymission/caves/bmp_asteroid/level_two) "XR" = ( /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 163c27e181e..5a4667cc428 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -5179,7 +5179,7 @@ /area/awaymission/snowdin/post/cavern2) "pc" = ( /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter/ice, +/mob/living/basic/spider/giant/hunter/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "pd" = ( @@ -10922,7 +10922,7 @@ dir = 5 }, /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter/ice, +/mob/living/basic/spider/giant/hunter/ice, /turf/open/floor/iron/freezer, /area/awaymission/snowdin/post/kitchen) "Ps" = ( @@ -11198,7 +11198,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/research) "QM" = ( -/mob/living/basic/giant_spider/nurse/ice, +/mob/living/basic/spider/giant/nurse/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "QN" = ( @@ -11443,7 +11443,7 @@ /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/cave) "Si" = ( -/mob/living/basic/giant_spider/hunter/ice, +/mob/living/basic/spider/giant/hunter/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "Sj" = ( @@ -12006,7 +12006,7 @@ }, /area/awaymission/snowdin/outside) "Vo" = ( -/mob/living/basic/giant_spider/ice, +/mob/living/basic/spider/giant/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "Vp" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index d7f9269b5fd..b86ec01b904 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -28206,7 +28206,7 @@ "kms" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/basic/giant_spider/sgt_araneus, +/mob/living/basic/spider/giant/sgt_araneus, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) "kmN" = ( diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index c70ba5f117f..c64f0236fa9 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -455,7 +455,7 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/old, -/mob/living/basic/giant_spider/hunter/scrawny, +/mob/living/basic/spider/giant/hunter/scrawny, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/abandoned/bar) @@ -944,7 +944,7 @@ dir = 8 }, /obj/structure/cable, -/mob/living/basic/giant_spider/tarantula/scrawny, +/mob/living/basic/spider/giant/tarantula/scrawny, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cg" = ( @@ -1504,7 +1504,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/mob/living/basic/giant_spider/nurse/scrawny, +/mob/living/basic/spider/giant/nurse/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "dx" = ( @@ -1576,7 +1576,7 @@ "dG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/mob/living/basic/giant_spider/hunter/scrawny, +/mob/living/basic/spider/giant/hunter/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dH" = ( diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 9b62b3004ae..766f0784742 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -169,7 +169,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isclown(A) (istype(A, /mob/living/simple_animal/hostile/retaliate/clown)) -#define isspider(A) (istype(A, /mob/living/basic/giant_spider)) +#define isspider(A) (istype(A, /mob/living/basic/spider/giant)) //Misc mobs diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 3d125902e54..5521dbfd0f4 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -80,7 +80,7 @@ GLOBAL_LIST_INIT(phobia_mobs, list( /mob/living/simple_animal/drone, )), "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)), - "spiders" = typecacheof(list(/mob/living/basic/giant_spider)), + "spiders" = typecacheof(list(/mob/living/basic/spider/giant)), "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), "snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/snake)), "the supernatural" = typecacheof(list( diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 37efece8fb6..aa922a0d130 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -26,7 +26,7 @@ SUBSYSTEM_DEF(minor_mapping) to_spawn-- if(HAS_TRAIT(SSstation, STATION_TRAIT_SPIDER_INFESTATION) && prob(PROB_SPIDER_REPLACEMENT)) - new /mob/living/basic/giant_spider/maintenance(proposed_turf) + new /mob/living/basic/spider/maintenance(proposed_turf) return if (prob(PROB_MOUSE_SPAWN)) diff --git a/code/datums/memory/_memory.dm b/code/datums/memory/_memory.dm index 808be225ef9..a7ca1b3d9cc 100644 --- a/code/datums/memory/_memory.dm +++ b/code/datums/memory/_memory.dm @@ -255,8 +255,8 @@ /mob/living/basic/cow, /mob/living/basic/cow/wisdom, /mob/living/basic/crab, - /mob/living/basic/giant_spider, - /mob/living/basic/giant_spider/hunter, + /mob/living/basic/spider/giant, + /mob/living/basic/spider/giant/hunter, /mob/living/basic/mining/goliath, /mob/living/basic/headslug, /mob/living/basic/killer_tomato, diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index a80ee924115..78837189561 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -867,13 +867,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /mob/living/basic/ant, /mob/living/basic/butterfly, /mob/living/basic/cockroach, - /mob/living/basic/spiderling, + /mob/living/basic/spider/growing/spiderling, /mob/living/basic/bee, /obj/effect/decal/cleanable/ants, /obj/item/queen_bee, )) strong_against = typecacheof(list( - /mob/living/basic/giant_spider, + /mob/living/basic/spider/giant, )) diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm index 52fe9a826b0..52ff520a876 100644 --- a/code/modules/antagonists/abductor/equipment/glands/spider.dm +++ b/code/modules/antagonists/abductor/equipment/glands/spider.dm @@ -10,5 +10,5 @@ /obj/item/organ/internal/heart/gland/spiderman/activate() to_chat(owner, span_warning("You feel something crawling in your skin.")) owner.faction |= FACTION_SPIDER - var/mob/living/basic/spiderling/S = new(owner.drop_location()) - S.directive = "Protect your nest inside [owner.real_name]." + var/mob/living/basic/spider/growing/spiderling/spider = new(owner.drop_location()) + spider.directive = "Protect your nest inside [owner.real_name]." diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm index fc46350aaa3..51a54d99e30 100644 --- a/code/modules/antagonists/traitor/objectives/kill_pet.dm +++ b/code/modules/antagonists/traitor/objectives/kill_pet.dm @@ -54,7 +54,7 @@ possible_heads = list( JOB_HEAD_OF_SECURITY = list( /mob/living/basic/carp/pet/lia, - /mob/living/basic/giant_spider/sgt_araneus, + /mob/living/basic/spider/giant/sgt_araneus, ), JOB_WARDEN = list( /mob/living/basic/pet/dog/pug/mcgriff diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index eda2bf3ecb2..a1f721180d3 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -42,7 +42,7 @@ name = "Duct Spider Crate" desc = "Awww! Straight from the Australicus sector to your station's ventilation system!" cost = CARGO_CRATE_VALUE * 6 - contains = list(/mob/living/basic/giant_spider/maintenance) + contains = list(/mob/living/basic/spider/maintenance) crate_name = "duct spider crate" crate_type = /obj/structure/closet/crate/critter @@ -50,7 +50,7 @@ name = "Duct Spider Crate?" desc = "Wait, is this the right crate? It has a frowny face, what does that mean?" cost = CARGO_CRATE_VALUE * 6 - contains = list(/mob/living/basic/giant_spider/hunter) + contains = list(/mob/living/basic/spider/giant/hunter) contraband = TRUE /datum/supply_pack/imports/bamboo50 diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index fbc1dfad9d5..caf49e13b6b 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /mob/living/basic/carp/pet/cayenne, /mob/living/basic/chicken, /mob/living/basic/cow, - /mob/living/basic/giant_spider/sgt_araneus, + /mob/living/basic/spider/giant/sgt_araneus, /mob/living/basic/lizard, /mob/living/basic/mouse/brown/tom, /mob/living/basic/pet, diff --git a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm index a69867cbcdf..6139cf5f388 100644 --- a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm +++ b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm @@ -196,11 +196,11 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/imports/specialops] pack.generate(pick_n_take(empty_shuttle_turfs)) - spawn_list.Add(/mob/living/basic/giant_spider) - spawn_list.Add(/mob/living/basic/giant_spider) - spawn_list.Add(/mob/living/basic/giant_spider/nurse) + spawn_list.Add(/mob/living/basic/spider/giant) + spawn_list.Add(/mob/living/basic/spider/giant) + spawn_list.Add(/mob/living/basic/spider/giant/nurse) if(prob(50)) - spawn_list.Add(/mob/living/basic/giant_spider/hunter) + spawn_list.Add(/mob/living/basic/spider/giant/hunter) var/turf/victim_turf = pick_n_take(empty_shuttle_turfs) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 87e692a787e..70a7900ef8c 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -75,7 +75,7 @@ var/static/list/mob_list = list( /mob/living/basic/butterfly, /mob/living/basic/cockroach, - /mob/living/basic/giant_spider/maintenance, + /mob/living/basic/spider/maintenance, /mob/living/basic/mouse, ) return pick(mob_list) @@ -222,7 +222,7 @@ var/static/list/mob_list = list( /mob/living/basic/bee, /mob/living/basic/cockroach/hauberoach, - /mob/living/basic/giant_spider, + /mob/living/basic/spider/giant, /mob/living/basic/mouse/rat, ) return pick(mob_list) diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm index d6b5bf40975..ebca9b70f3c 100644 --- a/code/modules/events/wizard/petsplosion.dm +++ b/code/modules/events/wizard/petsplosion.dm @@ -5,7 +5,7 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list( /mob/living/basic/carp/pet/cayenne, /mob/living/basic/chicken, /mob/living/basic/cow, - /mob/living/basic/giant_spider/sgt_araneus, + /mob/living/basic/spider/giant/sgt_araneus, /mob/living/basic/lizard, /mob/living/basic/mothroach, /mob/living/basic/mouse/brown/tom, diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 8b85d1fc276..94a9d401de0 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -833,7 +833,7 @@ message_admins("[ADMIN_LOOKUPFLW(user)] last altered a hydro tray's contents which spawned spiderlings.") user.log_message("last altered a hydro tray, which spiderlings spawned from.", LOG_GAME) visible_message(span_warning("The pests seem to behave oddly...")) - spawn_atom_to_turf(/mob/living/basic/spiderling/hunter, src, 3, FALSE) + spawn_atom_to_turf(/mob/living/basic/spider/growing/spiderling/hunter, src, 3, FALSE) else if(myseed) visible_message(span_warning("The pests seem to behave oddly in [myseed.name] tray, but quickly settle down...")) diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm deleted file mode 100644 index b7339787bd3..00000000000 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm +++ /dev/null @@ -1,107 +0,0 @@ -/** - * # Giant Spider - * - * A mob which can be created by dynamic event, botany, or xenobiology. - * The basic type is the guard, which is slow but sturdy and outputs good damage. - * All spiders can produce webbing. - */ -/mob/living/basic/giant_spider - name = "giant spider" - desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." - icon = 'icons/mob/simple/arachnoid.dmi' - icon_state = "guard" - icon_living = "guard" - icon_dead = "guard_dead" - mob_biotypes = MOB_ORGANIC|MOB_BUG - speak_emote = list("chitters") - butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - initial_language_holder = /datum/language_holder/spider - speed = 5 - maxHealth = 125 - health = 125 - damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) - basic_mob_flags = FLAMMABLE_MOB - status_flags = NONE - unsuitable_cold_damage = 4 - unsuitable_heat_damage = 4 - obj_damage = 30 - melee_damage_lower = 20 - melee_damage_upper = 25 - combat_mode = TRUE - faction = list(FACTION_SPIDER) - pass_flags = PASSTABLE - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - unique_name = TRUE - gold_core_spawnable = HOSTILE_SPAWN - // VERY red, to fit the eyes - lighting_cutoff_red = 22 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 5 - ai_controller = /datum/ai_controller/basic_controller/giant_spider - /// Speed modifier to apply if controlled by a human player - var/player_speed_modifier = -4 - /// What reagent the mob injects targets with - var/poison_type = /datum/reagent/toxin/hunterspider - /// How much of a reagent the mob injects on attack - var/poison_per_bite = 0 - /// Multiplier to apply to web laying speed. Fractional numbers make it faster, because it's a multiplier. - var/web_speed = 1 - /// Type of webbing ability to learn. - var/web_type = /datum/action/cooldown/lay_web - /// The message that the mother spider left for this spider when the egg was layed. - var/directive = "" - /// Short description of what this mob is capable of, for radial menu uses - var/menu_description = "Tanky and strong for the defense of the nest and other spiders." - /// If true then you shouldn't be told that you're a spider antagonist as soon as you are placed into this mob - var/apply_spider_antag = TRUE - -/mob/living/basic/giant_spider/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT) - AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) - AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) - AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") - AddElement(/datum/element/cliff_walking) - - if(poison_per_bite) - AddElement(/datum/element/venomous, poison_type, poison_per_bite) - - var/datum/action/cooldown/lay_web/webbing = new web_type(src) - webbing.webbing_time *= web_speed - webbing.Grant(src) - ai_controller.set_blackboard_key(BB_SPIDER_WEB_ACTION, webbing) - -/mob/living/basic/giant_spider/Login() - . = ..() - if(!. || !client) - return FALSE - GLOB.spidermobs[src] = TRUE - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier, multiplicative_slowdown = player_speed_modifier) - if (apply_spider_antag) - var/datum/antagonist/spider/spider_antag = new(directive) - mind.add_antag_datum(spider_antag) - -/mob/living/basic/giant_spider/Logout() - . = ..() - remove_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier) - -/mob/living/basic/giant_spider/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/basic/giant_spider/mob_negates_gravity() - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/mob/living/basic/giant_spider/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) - . = ..() - for(var/datum/reagent/toxin/pestkiller/current_reagent in reagents) - apply_damage(50 * volume_modifier, STAMINA, BODY_ZONE_CHEST) diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_variants.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm similarity index 85% rename from code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_variants.dm rename to code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm index 648174bd603..b6736a9d2a4 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_variants.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm @@ -1,9 +1,32 @@ /** - * ### Spider Ambush + * # Giant Spider + * + * A mob which can be created by dynamic event, botany, or xenobiology. + * The basic type is the guard, which is slow but sturdy and outputs good damage. + * All spiders can produce webbing. + */ +/mob/living/basic/spider/giant + name = "giant spider" + desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." + icon_state = "guard" + icon_living = "guard" + icon_dead = "guard_dead" + speed = 5 + maxHealth = 125 + health = 125 + obj_damage = 30 + melee_damage_lower = 20 + melee_damage_upper = 25 + gold_core_spawnable = HOSTILE_SPAWN + ai_controller = /datum/ai_controller/basic_controller/giant_spider + + +/** + * ### Ambush Spider * A subtype of the giant spider which is slower, stronger and able to sneak into its surroundings to pull pray aggressively. * This spider is only slightly slower than a human. */ -/mob/living/basic/giant_spider/ambush +/mob/living/basic/spider/giant/ambush name = "ambush spider" desc = "Furry and white, it makes you shudder to look at it. This one has sparkling pink eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -20,7 +43,7 @@ player_speed_modifier = -3.1 menu_description = "Slow spider variant specializing in stalking and ambushing prey, above avarage health and damage with a strong grip." -/mob/living/basic/giant_spider/ambush/Initialize(mapload) +/mob/living/basic/spider/giant/ambush/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_STRONG_GRABBER, INNATE_TRAIT) @@ -30,11 +53,11 @@ sneak_web.Grant(src) /** - * ### Spider Guard + * ### Guard Spider * A subtype of the giant spider which is similar on every single way, * This spider is only slightly slower than a human. */ -/mob/living/basic/giant_spider/guard +/mob/living/basic/spider/giant/guard name = "guard spider" desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -51,7 +74,7 @@ player_speed_modifier = -4 menu_description = "Tanky and strong for the defense of the nest and other spiders." -/mob/living/basic/giant_spider/guard/Initialize(mapload) +/mob/living/basic/spider/giant/guard/Initialize(mapload) . = ..() AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) @@ -59,11 +82,11 @@ shed.Grant(src) /** - * ### Spider Hunter + * ### Hunter Spider * A subtype of the giant spider which is faster, has toxin injection, but less health and damage. * This spider is only slightly slower than a human. */ -/mob/living/basic/giant_spider/hunter +/mob/living/basic/spider/giant/hunter name = "hunter spider" desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -79,17 +102,17 @@ player_speed_modifier = -3.1 menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less health and damage." -/mob/living/basic/giant_spider/hunter/Initialize(mapload) +/mob/living/basic/spider/giant/hunter/Initialize(mapload) . = ..() AddElement(/datum/element/web_walker, /datum/movespeed_modifier/fast_web) /** - * ### Spider Scout + * ### Scout Spider * A subtype of the giant spider which is faster, has thermal vision, but less health and damage. * This spider is only slightly faster than a human. */ -/mob/living/basic/giant_spider/scout +/mob/living/basic/spider/giant/scout name = "scout spider" desc = "Furry and blueish black, it makes you shudder to look at it. This one has sparkling blue eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -108,7 +131,7 @@ sight = SEE_SELF|SEE_MOBS menu_description = "Fast spider variant specializing in scouting and alerting of prey, with the ability to travel in vents." -/mob/living/basic/giant_spider/scout/Initialize(mapload) +/mob/living/basic/spider/giant/scout/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) @@ -116,13 +139,13 @@ spiders_communication.Grant(src) /** - * ### Spider Nurse + * ### Nurse Spider * * A subtype of the giant spider which specializes in support skills. * Nurses can place down webbing in a quarter of the time that other species can and can wrap other spiders' wounds, healing them. * Note that it cannot heal itself. */ -/mob/living/basic/giant_spider/nurse +/mob/living/basic/spider/giant/nurse name = "nurse spider" desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -143,7 +166,7 @@ ///The health HUD applied to the mob. var/health_hud = DATA_HUD_MEDICAL_ADVANCED -/mob/living/basic/giant_spider/nurse/Initialize(mapload) +/mob/living/basic/spider/giant/nurse/Initialize(mapload) . = ..() var/datum/atom_hud/datahud = GLOB.huds[health_hud] datahud.show_to(src) @@ -152,7 +175,7 @@ heal_brute = 25,\ heal_burn = 25,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant)),\ action_text = "%SOURCE% begins wrapping the wounds of %TARGET%.",\ complete_text = "%SOURCE% wraps the wounds of %TARGET%.",\ ) @@ -166,7 +189,7 @@ * Tangle spiders can place down webbing in a quarter of the time that other species plus has an expanded arsenal of traps and web structures to place to benefit the nest. * Note that it can heal itself. */ -/mob/living/basic/giant_spider/tangle +/mob/living/basic/spider/giant/tangle name = "tangle spider" desc = "Furry and brown, it makes you shudder to look at it. This one has dim brown eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -188,7 +211,7 @@ web_type = /datum/action/cooldown/lay_web/sealer menu_description = "Support spider variant specializing in contruction to protect their brethren, but has very low amount of health and deals low damage." -/mob/living/basic/giant_spider/tangle/Initialize(mapload) +/mob/living/basic/spider/giant/tangle/Initialize(mapload) . = ..() var/datum/action/cooldown/lay_web/solid_web/web_solid = new(src) web_solid.Grant(src) @@ -210,14 +233,14 @@ heal_time = 3 SECONDS,\ self_targetting = HEALING_TOUCH_SELF_ONLY,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/tangle)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/growing/young/tangle, /mob/living/basic/spider/giant/tangle)),\ extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ action_text = "%SOURCE% begins mending themselves...",\ complete_text = "%SOURCE%'s wounds mend together.",\ ) /// Prevent you from healing other tangle spiders, or healing when on fire -/mob/living/basic/giant_spider/tangle/proc/can_mend(mob/living/source, mob/living/target) +/mob/living/basic/spider/giant/tangle/proc/can_mend(mob/living/source, mob/living/target) if (on_fire) balloon_alert(src, "on fire!") return FALSE @@ -229,7 +252,7 @@ * A subtype of the giant spider which specializes in pure strength and staying power. * Is slowed down when not on webbing, but can lunge to throw off attackers and possibly to stun them. */ -/mob/living/basic/giant_spider/tarantula +/mob/living/basic/spider/giant/tarantula name = "tarantula" desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -252,7 +275,7 @@ /// Charging ability var/datum/action/cooldown/mob_cooldown/charge/basic_charge/charge -/mob/living/basic/giant_spider/tarantula/Initialize(mapload) +/mob/living/basic/spider/giant/tarantula/Initialize(mapload) . = ..() var/datum/action/cooldown/lay_web/solid_web/web_solid = new(src) web_solid.Grant(src) @@ -266,12 +289,12 @@ AddElement(/datum/element/tear_wall) AddElement(/datum/element/web_walker, /datum/movespeed_modifier/slow_web) -/mob/living/basic/giant_spider/tarantula/Destroy() +/mob/living/basic/spider/giant/tarantula/Destroy() QDEL_NULL(charge) return ..() /// Lunge if you click something at range -/mob/living/basic/giant_spider/tarantula/ranged_secondary_attack(atom/atom_target, modifiers) +/mob/living/basic/spider/giant/tarantula/ranged_secondary_attack(atom/atom_target, modifiers) charge.Trigger(target = atom_target) /** @@ -280,7 +303,7 @@ * A subtype of the giant spider which specializes in speed and poison. * Injects a deadlier toxin than other spiders, moves extremely fast, but has a limited amount of health. */ -/mob/living/basic/giant_spider/viper +/mob/living/basic/spider/giant/viper name = "viper spider" desc = "Furry and black, it makes you shudder to look at it. This one has effervescent purple eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -298,7 +321,7 @@ gold_core_spawnable = NO_SPAWN menu_description = "Assassin spider variant with an unmatched speed and very deadly poison, but has very low amount of health and damage." -/mob/living/basic/giant_spider/viper/Initialize(mapload) +/mob/living/basic/spider/giant/viper/Initialize(mapload) . = ..() AddElement(/datum/element/bonus_damage) @@ -314,7 +337,7 @@ * After consuming human bodies can lay specialised eggs including more broodmothers. * They are also capable of sending messages to all living spiders and setting directives for their children. */ -/mob/living/basic/giant_spider/midwife +/mob/living/basic/spider/giant/midwife name = "broodmother spider" desc = "Furry and black, it makes you shudder to look at it. This one has scintillating green eyes. Might also be hiding a real knife somewhere." gender = FEMALE @@ -333,7 +356,7 @@ web_type = /datum/action/cooldown/lay_web/sealer menu_description = "Royal spider variant specializing in reproduction and leadership, deals low damage." -/mob/living/basic/giant_spider/midwife/Initialize(mapload) +/mob/living/basic/spider/giant/midwife/Initialize(mapload) . = ..() var/datum/action/cooldown/lay_web/solid_web/web_solid = new(src) web_solid.Grant(src) @@ -370,7 +393,7 @@ * A subtype of the giant spider which is immune to temperature damage, unlike its normal counterpart. * Currently unused in the game unless spawned by admins. */ -/mob/living/basic/giant_spider/ice +/mob/living/basic/spider/giant/ice name = "giant ice spider" habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minimum_survivable_temperature = 0 @@ -384,7 +407,7 @@ * * A temperature-proof nurse spider. Also unused. */ -/mob/living/basic/giant_spider/nurse/ice +/mob/living/basic/spider/giant/nurse/ice name = "giant ice spider" habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minimum_survivable_temperature = 0 @@ -398,7 +421,7 @@ * * A temperature-proof hunter with chilling venom. Also unused. */ -/mob/living/basic/giant_spider/hunter/ice +/mob/living/basic/spider/giant/hunter/ice name = "giant ice spider" habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minimum_survivable_temperature = 0 @@ -414,7 +437,7 @@ * A hunter spider that trades damage for health, unable to smash enviroments. * Used as a minor threat in abandoned places, such as areas in maintenance or a ruin. */ -/mob/living/basic/giant_spider/hunter/scrawny +/mob/living/basic/spider/giant/hunter/scrawny name = "scrawny spider" health = 60 maxHealth = 60 @@ -430,7 +453,7 @@ * A weaker version of the Tarantula, unable to smash enviroments. * Used as a moderately strong but slow threat in abandoned places, such as areas in maintenance or a ruin. */ -/mob/living/basic/giant_spider/tarantula/scrawny +/mob/living/basic/spider/giant/tarantula/scrawny name = "scrawny tarantula" health = 150 maxHealth = 150 @@ -447,7 +470,7 @@ * Mainly used as a weak threat in abandoned places, such as areas in maintenance or a ruin. * In the future we should give this AI so that it actually heals its teammates. */ -/mob/living/basic/giant_spider/nurse/scrawny +/mob/living/basic/spider/giant/nurse/scrawny name = "scrawny nurse spider" health = 30 maxHealth = 30 @@ -462,7 +485,7 @@ * Has the base stats of a hunter, but they can heal themselves and spin webs faster. * They also occasionally leave puddles of blood when they walk around. Flavorful! */ -/mob/living/basic/giant_spider/hunter/flesh +/mob/living/basic/spider/giant/hunter/flesh name = "flesh spider" desc = "A odd fleshy creature in the shape of a spider. Its eyes are pitch black and soulless." icon = 'icons/mob/simple/arachnoid.dmi' @@ -474,7 +497,7 @@ health = 90 menu_description = "Self-sufficient spider variant capable of healing themselves and producing webbbing fast." -/mob/living/basic/giant_spider/hunter/flesh/Initialize(mapload) +/mob/living/basic/spider/giant/hunter/flesh/Initialize(mapload) . = ..() AddComponent(/datum/component/blood_walk, \ blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ @@ -485,7 +508,7 @@ heal_burn = 45,\ self_targetting = HEALING_TOUCH_SELF_ONLY,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/hunter/flesh)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant/hunter/flesh)),\ extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ action_text = "%SOURCE% begins mending themselves...",\ complete_text = "%SOURCE%'s wounds mend together.",\ @@ -498,7 +521,7 @@ web_sticky.Grant(src) /// Prevent you from healing other flesh spiders, or healing when on fire -/mob/living/basic/giant_spider/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) +/mob/living/basic/spider/giant/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) if (on_fire) balloon_alert(src, "on fire!") return FALSE @@ -509,7 +532,7 @@ * * A spider form for wizards. Has the viper spider's extreme speed and strong venom, with additional health and vent crawling abilities. */ -/mob/living/basic/giant_spider/viper/wizard +/mob/living/basic/spider/giant/viper/wizard name = "water spider" desc = "Furry and black, it makes you shudder to look at it. This one has effervescent orange eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -525,7 +548,7 @@ menu_description = "Stronger assassin spider variant with an unmatched speed, high amount of health and very deadly poison, but deals very low amount of damage. It also has ability to ventcrawl." apply_spider_antag = FALSE -/mob/living/basic/giant_spider/viper/wizard/Initialize(mapload) +/mob/living/basic/spider/giant/viper/wizard/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) @@ -541,7 +564,7 @@ * * This friendly arachnid hangs out in the HoS office on some space stations. Better trained than an average officer and does not attack except in self-defence. */ -/mob/living/basic/giant_spider/sgt_araneus +/mob/living/basic/spider/giant/sgt_araneus name = "Sergeant Araneus" real_name = "Sergeant Araneus" desc = "A fierce companion of the Head of Security, this spider has been carefully trained by Nanotrasen specialists. Its beady, staring eyes send shivers down your spine." @@ -554,48 +577,8 @@ ai_controller = /datum/ai_controller/basic_controller/giant_spider/retaliate apply_spider_antag = FALSE -/mob/living/basic/giant_spider/sgt_araneus/Initialize(mapload) +/mob/living/basic/spider/giant/sgt_araneus/Initialize(mapload) . = ..() AddElement(/datum/element/pet_bonus, "chitters proudly!") AddElement(/datum/element/ai_retaliate) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/** - * ### Duct Spider - * - * A less giant spider which lives in the maintenance ducts and makes them annoying to traverse. - */ -/mob/living/basic/giant_spider/maintenance - name = "duct spider" - desc = "Nanotrasen's imported solution to mice, comes with its own problems." - icon = 'icons/mob/simple/arachnoid.dmi' - icon_state = "maint_spider" - icon_living = "maint_spider" - icon_dead = "maint_spider_dead" - can_be_held = TRUE - mob_size = MOB_SIZE_TINY - held_w_class = WEIGHT_CLASS_TINY - worn_slot_flags = ITEM_SLOT_HEAD - head_icon = 'icons/mob/clothing/head/pets_head.dmi' - density = FALSE - pass_flags = PASSTABLE|PASSGRILLE|PASSMOB - gold_core_spawnable = FRIENDLY_SPAWN - maxHealth = 10 - health = 10 - melee_damage_lower = 1 - melee_damage_upper = 1 - speed = 0 - player_speed_modifier = 0 - web_speed = 0.25 - menu_description = "Fragile spider variant which is not good for much other than laying webs." - response_harm_continuous = "splats" - response_harm_simple = "splat" - ai_controller = /datum/ai_controller/basic_controller/giant_spider/pest - apply_spider_antag = FALSE - -/mob/living/basic/giant_spider/maintenance/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) - AddElement(/datum/element/ai_retaliate) - AddElement(/datum/element/tiny_mob_hunter) diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider.dm b/code/modules/mob/living/basic/space_fauna/spider/spider.dm new file mode 100644 index 00000000000..c1d11d2cb10 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/spider/spider.dm @@ -0,0 +1,176 @@ +/** + * Base type of various spider life stages + */ +/mob/living/basic/spider + name = "abstract spider" + desc = "Furry and abstract, it makes you shudder to look at it. This one should not exist." + icon = 'icons/mob/simple/arachnoid.dmi' + mob_biotypes = MOB_ORGANIC|MOB_BUG + speak_emote = list("chitters") + butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + initial_language_holder = /datum/language_holder/spider + damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + basic_mob_flags = FLAMMABLE_MOB + status_flags = NONE + unsuitable_cold_damage = 4 + unsuitable_heat_damage = 4 + combat_mode = TRUE + faction = list(FACTION_SPIDER) + pass_flags = PASSTABLE + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + unique_name = TRUE + lighting_cutoff_red = 22 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 5 + /// Speed modifier to apply if controlled by a human player + var/player_speed_modifier = -4 + /// What reagent the mob injects targets with + var/poison_type = /datum/reagent/toxin/hunterspider + /// How much of a reagent the mob injects on attack + var/poison_per_bite = 0 + /// Multiplier to apply to web laying speed. Fractional numbers make it faster, because it's a multiplier. + var/web_speed = 1 + /// Type of webbing ability to learn. + var/web_type = /datum/action/cooldown/lay_web + /// The message that the mother spider left for this spider when the egg was layed. + var/directive = "" + /// Short description of what this mob is capable of, for radial menu uses + var/menu_description = "Tanky and strong for the defense of the nest and other spiders." + /// If true then you shouldn't be told that you're a spider antagonist as soon as you are placed into this mob + var/apply_spider_antag = TRUE + +/mob/living/basic/spider/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) + AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") + AddElement(/datum/element/cliff_walking) + + if(poison_per_bite) + AddElement(/datum/element/venomous, poison_type, poison_per_bite) + + var/datum/action/cooldown/lay_web/webbing = new web_type(src) + webbing.webbing_time *= web_speed + webbing.Grant(src) + ai_controller?.set_blackboard_key(BB_SPIDER_WEB_ACTION, webbing) + +/mob/living/basic/spider/Login() + . = ..() + if(!. || !client) + return FALSE + GLOB.spidermobs[src] = TRUE + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier, multiplicative_slowdown = player_speed_modifier) + +/mob/living/basic/spider/Logout() + . = ..() + remove_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier) + +/mob/living/basic/spider/Destroy() + GLOB.spidermobs -= src + return ..() + +/mob/living/basic/spider/mob_negates_gravity() + if(locate(/obj/structure/spider/stickyweb) in loc) + return TRUE + return ..() + +/mob/living/basic/spider/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) + . = ..() + for(var/datum/reagent/toxin/pestkiller/current_reagent in reagents) + apply_damage(50 * volume_modifier, STAMINA, BODY_ZONE_CHEST) + +/// Spider which turns into another spider over time +/mob/living/basic/spider/growing + /// The mob type we will grow into. + var/mob/living/basic/spider/grow_as = null + /// The time it takes for the spider to grow into the next stage + var/spider_growth_time = 1 MINUTES + +/mob/living/basic/spider/growing/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/growth_and_differentiation,\ + growth_time = spider_growth_time,\ + growth_path = grow_as,\ + growth_probability = 25,\ + lower_growth_value = 1,\ + upper_growth_value = 2,\ + optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ + optional_grow_behavior = CALLBACK(src, PROC_REF(grow_up))\ + ) + +/** + * Checks to see if we're ready to grow, primarily if we are on solid ground and not in a vent or something. + * The component will automagically grow us when we return TRUE and that threshold has been met. + */ +/mob/living/basic/spider/growing/proc/ready_to_grow() + if(isturf(loc)) + return TRUE + + return FALSE + +/// Actually grows the young spider into a giant spider. We have to do a bunch of unique behavior that really can't be genericized, so we have to override the component in this manner. +/** + * Actually move to our next stage of life. + */ +/mob/living/basic/spider/growing/proc/grow_up() + if(isnull(grow_as)) + if(prob(3)) + grow_as = pick(/mob/living/basic/spider/giant/tarantula, /mob/living/basic/spider/giant/viper, /mob/living/basic/spider/giant/midwife) + else + grow_as = pick(/mob/living/basic/spider/giant/guard, /mob/living/basic/spider/giant/ambush, /mob/living/basic/spider/giant/hunter, /mob/living/basic/spider/giant/scout, /mob/living/basic/spider/giant/nurse, /mob/living/basic/spider/giant/tangle) + + var/mob/living/basic/spider/giant/grown = change_mob_type(grow_as, get_turf(src), initial(grow_as.name)) + ADD_TRAIT(grown, TRAIT_WAS_EVOLVED, REF(src)) + grown.faction = faction.Copy() + grown.directive = directive + grown.set_name() + grown.setBruteLoss(getBruteLoss()) + grown.setFireLoss(getFireLoss()) + qdel(src) + +/** + * ### Duct Spider + * A less than giant spider which lives in the maintenance ducts and makes them annoying to traverse. + */ +/mob/living/basic/spider/maintenance + name = "duct spider" + desc = "Nanotrasen's imported solution to mice, comes with its own problems." + icon_state = "maint_spider" + icon_living = "maint_spider" + icon_dead = "maint_spider_dead" + can_be_held = TRUE + mob_size = MOB_SIZE_TINY + held_w_class = WEIGHT_CLASS_TINY + worn_slot_flags = ITEM_SLOT_HEAD + head_icon = 'icons/mob/clothing/head/pets_head.dmi' + density = FALSE + pass_flags = PASSTABLE|PASSGRILLE|PASSMOB + gold_core_spawnable = FRIENDLY_SPAWN + maxHealth = 10 + health = 10 + melee_damage_lower = 1 + melee_damage_upper = 1 + speed = 0 + player_speed_modifier = 0 + web_speed = 0.25 + menu_description = "Fragile spider variant which is not good for much other than laying webs." + response_harm_continuous = "splats" + response_harm_simple = "splat" + ai_controller = /datum/ai_controller/basic_controller/giant_spider/pest + apply_spider_antag = FALSE + +/mob/living/basic/spider/maintenance/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/tiny_mob_hunter) diff --git a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm index b8829015980..a09107aebf4 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm @@ -5,50 +5,28 @@ * Able to vent-crawl and eventually grow into a full fledged giant spider. * */ -/mob/living/basic/spiderling +/mob/living/basic/spider/growing/spiderling name = "spiderling" desc = "It never stays still for long." - icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "spiderling" icon_dead = "spiderling_dead" density = FALSE - faction = list(FACTION_SPIDER) speed = -0.75 move_resist = INFINITY // YOU CAN'T HANDLE ME LET ME BE FREE LET ME BE FREE LET ME BE FREE speak_emote = list("hisses") initial_language_holder = /datum/language_holder/spider basic_mob_flags = FLAMMABLE_MOB | DEL_ON_DEATH mob_size = MOB_SIZE_TINY - - unique_name = TRUE - - // we have _some_ bite melee_damage_lower = 1 melee_damage_upper = 2 - - health = 5 // very low. + health = 5 maxHealth = 5 - unsuitable_cold_damage = 4 - unsuitable_heat_damage = 4 death_message = "lets out a final hiss..." - + player_speed_modifier = 0 + spider_growth_time = 40 SECONDS ai_controller = /datum/ai_controller/basic_controller/spiderling - // VERY red, to fit the eyes - lighting_cutoff_red = 22 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 5 - - /// The mob we will grow into. - var/mob/living/basic/young_spider/grow_as = null - /// The message that the mother left for our big strong selves. - var/directive = "" - /// Simple boolean that determines if we should apply the spider antag to the player if they possess this mob. TRUE by default since we're always going to evolve into a spider that will have an antagonistic role. - var/apply_spider_antag = TRUE - /// The time it takes for the spider to grow into the next stage - var/spider_growth_time = 40 SECONDS - -/mob/living/basic/spiderling/Initialize(mapload) +/mob/living/basic/spider/growing/spiderling/Initialize(mapload) . = ..() // random placement since we're pretty small and to make the swarming component actually look like it's doing something when we have a buncha these fuckers pixel_x = rand(6,-6) @@ -56,36 +34,18 @@ add_overlay(image(icon = src.icon, icon_state = "spiderling_click_underlay", layer = BELOW_MOB_LAYER)) - // the proc that handles passtable is nice but we should always be able to pass through table since we're so small so we can eschew adding that here - pass_flags |= PASSTABLE - add_traits(list(TRAIT_PASSTABLE, TRAIT_VENTCRAWLER_ALWAYS, TRAIT_WEB_SURFER), INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) AddComponent(/datum/component/swarming) AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW, volume = 0.2) // they're small but you can hear 'em AddElement(/datum/element/web_walker, /datum/movespeed_modifier/spiderling_web) - // it's A-OKAY for grow_as to be null for the purposes of this component since we override that behavior anyhow. - AddComponent(\ - /datum/component/growth_and_differentiation,\ - growth_time = spider_growth_time,\ - growth_path = grow_as,\ - growth_probability = 25,\ - lower_growth_value = 1,\ - upper_growth_value = 2,\ - optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ - optional_grow_behavior = CALLBACK(src, PROC_REF(grow_into_young_spider))\ - ) - // keep in mind we have infinite range (the entire pipenet is our playground, it's just a matter of random choice as to where we end up) so lower and upper both have their gives and takes. // but, also remember the more time we aren't in a vent, the more susceptible we are to dying to anything and everything. // also remember we can't evolve if we're in a vent. lots to keep in mind when you set these variables. ai_controller.set_blackboard_key(BB_LOWER_VENT_TIME_LIMIT, rand(9, 11) SECONDS) ai_controller.set_blackboard_key(BB_UPPER_VENT_TIME_LIMIT, rand(12, 14) SECONDS) -/mob/living/basic/spiderling/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/basic/spiderling/death(gibbed) +/mob/living/basic/spider/growing/spiderling/death(gibbed) if(isturf(get_turf(loc)) && (basic_mob_flags & DEL_ON_DEATH || gibbed)) var/obj/item/food/spiderling/dead_spider = new(loc) // mmm yummy dead_spider.name = name @@ -93,48 +53,9 @@ return ..() -/mob/living/basic/spiderling/Login() // this is only really here for admins dragging and dropping players into spiderlings, player control of spiderlings is otherwise unimplemented - . = ..() - if(!. || isnull(client)) - return FALSE - basic_mob_flags &= ~DEL_ON_DEATH // we don't want to be deleted if we die while player controlled in case there's some revive schenanigans going on that can bring us back - GLOB.spidermobs[src] = TRUE - if (apply_spider_antag) - var/datum/antagonist/spider/spider_antag = new(directive) - mind.add_antag_datum(spider_antag) - -/mob/living/basic/spiderling/mob_negates_gravity() // in case our sisters want to give us a helping hand - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/mob/living/basic/spiderling/start_pulling(atom/movable/pulled_atom, state, force = move_force, supress_message = FALSE) // we're TOO FUCKING SMALL +/mob/living/basic/spider/growing/spiderling/start_pulling(atom/movable/pulled_atom, state, force = move_force, supress_message = FALSE) // we're TOO FUCKING SMALL return -/// Checks to see if we're ready to grow, primarily if we are on solid ground and not in a vent or something. -/// The component will automagically grow us when we return TRUE and that threshold has been met. -/mob/living/basic/spiderling/proc/ready_to_grow() - if(isturf(loc)) - return TRUE - - return FALSE - -/// Actually grows the spiderling into a young spider. We have to do a bunch of unique behavior that really can't be genericized, so we have to override the component in this manner. -/mob/living/basic/spiderling/proc/grow_into_young_spider() - if(isnull(grow_as)) - if(prob(3)) - grow_as = pick(/mob/living/basic/young_spider/tarantula, /mob/living/basic/young_spider/viper, /mob/living/basic/young_spider/midwife) - else - grow_as = pick(/mob/living/basic/young_spider/guard, /mob/living/basic/young_spider/ambush, /mob/living/basic/young_spider/hunter, /mob/living/basic/young_spider/scout, /mob/living/basic/young_spider/nurse, /mob/living/basic/young_spider/tangle) - - var/mob/living/basic/young_spider/grown = change_mob_type(grow_as, get_turf(src), initial(grow_as.name)) - ADD_TRAIT(grown, TRAIT_WAS_EVOLVED, REF(src)) - grown.faction = faction.Copy() - grown.directive = directive - grown.set_name() - - qdel(src) - /// Opportunistically hops in and out of vents, if it can find one. We aren't interested in attacking due to how weak we are, we gotta be quick and hidey. /datum/ai_controller/basic_controller/spiderling blackboard = list( diff --git a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm index 866a572453c..5d42ca5cb61 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm @@ -1,14 +1,14 @@ // This whole file is just a container for the spiderling subtypes that actually differentiate into different young spiders. None of them are particularly special as of now. /// Will differentiate into the base young spider (known colloquially as the "guard" spider). -/mob/living/basic/spiderling/guard - grow_as = /mob/living/basic/young_spider/guard +/mob/living/basic/spider/growing/spiderling/guard + grow_as = /mob/living/basic/spider/growing/young/guard name = "guard spiderling" desc = "Furry and brown, it looks defenseless. This one has sparkling red eyes." /// Will differentiate into the "ambush" young spider. -/mob/living/basic/spiderling/ambush - grow_as = /mob/living/basic/young_spider/ambush +/mob/living/basic/spider/growing/spiderling/ambush + grow_as = /mob/living/basic/spider/growing/young/ambush name = "ambush spiderling" desc = "Furry and white, it looks defenseless. This one has sparkling pink eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -16,8 +16,8 @@ icon_dead = "ambush_spiderling_dead" /// Will differentiate into the "scout" young spider. -/mob/living/basic/spiderling/scout - grow_as = /mob/living/basic/young_spider/scout +/mob/living/basic/spider/growing/spiderling/scout + grow_as = /mob/living/basic/spider/growing/young/scout name = "scout spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling blue eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -26,8 +26,8 @@ sight = SEE_SELF|SEE_MOBS /// Will differentiate into the "hunter" young spider. -/mob/living/basic/spiderling/hunter - grow_as = /mob/living/basic/young_spider/hunter +/mob/living/basic/spider/growing/spiderling/hunter + grow_as = /mob/living/basic/spider/growing/young/hunter name = "hunter spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling purple eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -35,8 +35,8 @@ icon_dead = "hunter_spiderling_dead" /// Will differentiate into the "nurse" young spider. -/mob/living/basic/spiderling/nurse - grow_as = /mob/living/basic/young_spider/nurse +/mob/living/basic/spider/growing/spiderling/nurse + grow_as = /mob/living/basic/spider/growing/young/nurse name = "nurse spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling green eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -44,8 +44,8 @@ icon_dead = "nurse_spiderling_dead" /// Will differentiate into the "tangle" young spider. -/mob/living/basic/spiderling/tangle - grow_as = /mob/living/basic/young_spider/tangle +/mob/living/basic/spider/growing/spiderling/tangle + grow_as = /mob/living/basic/spider/growing/young/tangle name = "tangle spiderling" desc = "Furry and brown, it looks defenseless. This one has dim brown eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -53,8 +53,8 @@ icon_dead = "tangle_spiderling_dead" /// Will differentiate into the "midwife" young spider. -/mob/living/basic/spiderling/midwife - grow_as = /mob/living/basic/young_spider/midwife +/mob/living/basic/spider/growing/spiderling/midwife + grow_as = /mob/living/basic/spider/growing/young/midwife name = "broodmother spiderling" desc = "Furry and black, it looks defenseless. This one has scintillating green eyes. Might also be hiding a real knife somewhere." icon = 'icons/mob/simple/arachnoid.dmi' @@ -62,8 +62,8 @@ icon_dead = "midwife_spiderling_dead" /// Will differentiate into the "viper" young spider. -/mob/living/basic/spiderling/viper - grow_as = /mob/living/basic/young_spider/viper +/mob/living/basic/spider/growing/spiderling/viper + grow_as = /mob/living/basic/spider/growing/young/viper name = "viper spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling magenta eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -71,20 +71,10 @@ icon_dead = "viper_spiderling_dead" /// Will differentiate into the "tarantula" young spider. -/mob/living/basic/spiderling/tarantula - grow_as = /mob/living/basic/young_spider/tarantula +/mob/living/basic/spider/growing/spiderling/tarantula + grow_as = /mob/living/basic/spider/growing/young/tarantula name = "tarantula spiderling" desc = "Furry and black, it looks defenseless. This one has abyssal red eyes." icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "tarantula_spiderling" icon_dead = "tarantula_spiderling_dead" - -/// Will differentiate into the "flesh" young spider. -/mob/living/basic/spiderling/hunter/flesh - grow_as = /mob/living/basic/young_spider/hunter/flesh - name = "flesh spiderling" - desc = "Fleshy and red, it looks defenseless. This one has sparkling grey eyes." - icon = 'icons/mob/simple/arachnoid.dmi' - icon_state = "flesh_spiderling" - icon_dead = "flesh_spiderling_dead" - spider_growth_time = 20 SECONDS diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm index 340ff11c7c2..57b9da542b7 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm @@ -5,149 +5,26 @@ * The basic type is the guard, which is slow but sturdy and outputs good damage. * All spiders can produce webbing. */ -/mob/living/basic/young_spider +/mob/living/basic/spider/growing/young name = "young spider" desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." - icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "young_guard" icon_living = "young_guard" icon_dead = "young_guard_dead" - mob_biotypes = MOB_ORGANIC|MOB_BUG - speak_emote = list("chitters") butcher_results = list(/obj/item/food/meat/slab/spider = 1) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - initial_language_holder = /datum/language_holder/spider speed = 1 maxHealth = 60 health = 60 - damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) - basic_mob_flags = FLAMMABLE_MOB - status_flags = NONE - unsuitable_cold_damage = 4 - unsuitable_heat_damage = 4 obj_damage = 10 melee_damage_lower = 8 melee_damage_upper = 12 - combat_mode = TRUE - faction = list(FACTION_SPIDER) - pass_flags = PASSTABLE - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - unique_name = TRUE - // VERY red, to fit the eyes - lighting_cutoff_red = 22 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 5 ai_controller = /datum/ai_controller/basic_controller/young_spider - /// The mob we will grow into. - var/mob/living/basic/giant_spider/grow_as = null - /// Speed modifier to apply if controlled by a human player - var/player_speed_modifier = -1 - /// What reagent the mob injects targets with - var/poison_type = /datum/reagent/toxin/hunterspider - /// How much of a reagent the mob injects on attack - var/poison_per_bite = 0 - /// Multiplier to apply to web laying speed. Fractional numbers make it faster, because it's a multiplier. - var/web_speed = 1 - /// Type of webbing ability to learn. - var/web_type = /datum/action/cooldown/lay_web - /// The message that the mother spider left for this spider when the egg was layed. - var/directive = "" - /// Short description of what this mob is capable of, for radial menu uses - var/menu_description = "Tanky and strong for the defense of the nest and other spiders." - /// If true then you shouldn't be told that you're a spider antagonist as soon as you are placed into this mob - var/apply_spider_antag = TRUE - /// The time it takes for the spider to grow into the next stage - var/spider_growth_time = 1 MINUTES + player_speed_modifier = -1 -/mob/living/basic/young_spider/Initialize(mapload) +/mob/living/basic/spider/growing/young/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT) AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured) - AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) - AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) - AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/young_web) - - if(poison_per_bite) - AddElement(/datum/element/venomous, poison_type, poison_per_bite) - - var/datum/action/cooldown/lay_web/webbing = new web_type(src) - webbing.webbing_time *= web_speed - webbing.Grant(src) - ai_controller.set_blackboard_key(BB_SPIDER_WEB_ACTION, webbing) - AddComponent(\ - /datum/component/growth_and_differentiation,\ - growth_time = spider_growth_time,\ - growth_path = grow_as,\ - growth_probability = 25,\ - lower_growth_value = 1,\ - upper_growth_value = 2,\ - optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ - optional_grow_behavior = CALLBACK(src, PROC_REF(grow_into_giant_spider))\ - ) - -/mob/living/basic/young_spider/Login() - . = ..() - if(!. || !client) - return FALSE - GLOB.spidermobs[src] = TRUE - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier, multiplicative_slowdown = player_speed_modifier) - if (apply_spider_antag) - var/datum/antagonist/spider/spider_antag = new(directive) - mind.add_antag_datum(spider_antag) - -/mob/living/basic/young_spider/Logout() - . = ..() - remove_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier) - -/mob/living/basic/young_spider/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/basic/young_spider/mob_negates_gravity() - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/mob/living/basic/young_spider/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) - . = ..() - for(var/datum/reagent/toxin/pestkiller/current_reagent in reagents) - apply_damage(50 * volume_modifier, STAMINA, BODY_ZONE_CHEST) - -/// Checks to see if we're ready to grow, primarily if we are on solid ground and not in a vent or something. -/// The component will automagically grow us when we return TRUE and that threshold has been met. -/mob/living/basic/young_spider/proc/ready_to_grow() - if(isturf(loc)) - return TRUE - - return FALSE - -/// Actually grows the young spider into a giant spider. We have to do a bunch of unique behavior that really can't be genericized, so we have to override the component in this manner. -/mob/living/basic/young_spider/proc/grow_into_giant_spider() - if(isnull(grow_as)) - if(prob(3)) - grow_as = pick(/mob/living/basic/giant_spider/tarantula, /mob/living/basic/giant_spider/viper, /mob/living/basic/giant_spider/midwife) - else - grow_as = pick(/mob/living/basic/giant_spider/guard, /mob/living/basic/giant_spider/ambush, /mob/living/basic/giant_spider/hunter, /mob/living/basic/giant_spider/scout, /mob/living/basic/giant_spider/nurse, /mob/living/basic/giant_spider/tangle) - - var/mob/living/basic/giant_spider/grown = change_mob_type(grow_as, get_turf(src), initial(grow_as.name)) - ADD_TRAIT(grown, TRAIT_WAS_EVOLVED, REF(src)) - grown.faction = faction.Copy() - grown.directive = directive - grown.set_name() - if(getBruteLoss() - 5 > 0) - grown.setBruteLoss(getBruteLoss() - 5) - if(getFireLoss() - 5 > 0) - grown.setFireLoss(getFireLoss() - 5) - - qdel(src) /// Used by all young spiders if they ever appear. /datum/ai_controller/basic_controller/young_spider diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm index 697ee5d0808..4027575ac01 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm @@ -1,8 +1,8 @@ // This whole file is just a container for the young spider subtypes that actually differentiate into different giant spiders. None of them are particularly special as of now. /// Will differentiate into the base giant spider (known colloquially as the "guard" spider). -/mob/living/basic/young_spider/guard - grow_as = /mob/living/basic/giant_spider/guard +/mob/living/basic/spider/growing/young/guard + grow_as = /mob/living/basic/spider/giant/guard name = "young guard spider" desc = "Furry and brown, it looks defenseless. This one has sparkling red eyes." maxHealth = 70 @@ -12,8 +12,8 @@ speed = 0.7 /// Will differentiate into the "ambush" giant spider. -/mob/living/basic/young_spider/ambush - grow_as = /mob/living/basic/giant_spider/ambush +/mob/living/basic/spider/growing/young/ambush + grow_as = /mob/living/basic/spider/giant/ambush name = "young ambush spider" desc = "Furry and white, it looks defenseless. This one has sparkling pink eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -25,14 +25,14 @@ melee_damage_upper = 18 speed = 1 -/mob/living/basic/young_spider/ambush/Initialize(mapload) +/mob/living/basic/spider/growing/young/ambush/Initialize(mapload) . = ..() var/datum/action/cooldown/sneak/spider/sneak_web = new(src) sneak_web.Grant(src) /// Will differentiate into the "scout" giant spider. -/mob/living/basic/young_spider/scout - grow_as = /mob/living/basic/giant_spider/scout +/mob/living/basic/spider/growing/young/scout + grow_as = /mob/living/basic/spider/giant/scout name = "young scout spider" desc = "Furry and black, it looks defenseless. This one has sparkling blue eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -47,13 +47,13 @@ poison_type = /datum/reagent/peaceborg/confuse sight = SEE_SELF|SEE_MOBS -/mob/living/basic/young_spider/scout/Initialize(mapload) +/mob/living/basic/spider/growing/young/scout/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) /// Will differentiate into the "hunter" giant spider. -/mob/living/basic/young_spider/hunter - grow_as = /mob/living/basic/giant_spider/hunter +/mob/living/basic/spider/growing/young/hunter + grow_as = /mob/living/basic/spider/giant/hunter name = "young hunter spider" desc = "Furry and black, it looks defenseless. This one has sparkling purple eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -67,8 +67,8 @@ poison_per_bite = 2 /// Will differentiate into the "nurse" giant spider. -/mob/living/basic/young_spider/nurse - grow_as = /mob/living/basic/giant_spider/nurse +/mob/living/basic/spider/growing/young/nurse + grow_as = /mob/living/basic/spider/giant/nurse name = "young nurse spider" desc = "Furry and black, it looks defenseless. This one has sparkling green eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -84,7 +84,7 @@ ///The health HUD applied to the mob. var/health_hud = DATA_HUD_MEDICAL_ADVANCED -/mob/living/basic/young_spider/nurse/Initialize(mapload) +/mob/living/basic/spider/growing/young/nurse/Initialize(mapload) . = ..() var/datum/atom_hud/datahud = GLOB.huds[health_hud] datahud.show_to(src) @@ -93,14 +93,14 @@ heal_brute = 15,\ heal_burn = 15,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant)),\ action_text = "%SOURCE% begins wrapping the wounds of %TARGET%.",\ complete_text = "%SOURCE% wraps the wounds of %TARGET%.",\ ) /// Will differentiate into the "tangle" giant spider. -/mob/living/basic/young_spider/tangle - grow_as = /mob/living/basic/giant_spider/tangle +/mob/living/basic/spider/growing/young/tangle + grow_as = /mob/living/basic/spider/giant/tangle name = "young tangle spider" desc = "Furry and brown, it looks defenseless. This one has dim brown eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -116,7 +116,7 @@ poison_per_bite = 2 poison_type = /datum/reagent/toxin/acid -/mob/living/basic/young_spider/tangle/Initialize(mapload) +/mob/living/basic/spider/growing/young/tangle/Initialize(mapload) . = ..() AddComponent(/datum/component/healing_touch,\ heal_brute = 10,\ @@ -124,22 +124,22 @@ heal_time = 3 SECONDS,\ self_targetting = HEALING_TOUCH_SELF_ONLY,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/tangle)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/growing/young/tangle, /mob/living/basic/spider/giant/tangle)),\ extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ action_text = "%SOURCE% begins mending themselves...",\ complete_text = "%SOURCE%'s wounds mend together.",\ ) /// Prevent you from healing other tangle spiders, or healing when on fire -/mob/living/basic/young_spider/tangle/proc/can_mend(mob/living/source, mob/living/target) +/mob/living/basic/spider/growing/young/tangle/proc/can_mend(mob/living/source, mob/living/target) if (on_fire) balloon_alert(src, "on fire!") return FALSE return TRUE /// Will differentiate into the "midwife" giant spider. -/mob/living/basic/young_spider/midwife - grow_as = /mob/living/basic/giant_spider/midwife +/mob/living/basic/spider/growing/young/midwife + grow_as = /mob/living/basic/spider/giant/midwife name = "young broodmother spider" desc = "Furry and black, it looks defenseless. This one has scintillating green eyes. Might also be hiding a real knife somewhere." icon = 'icons/mob/simple/arachnoid.dmi' @@ -154,8 +154,8 @@ web_type = /datum/action/cooldown/lay_web/sealer /// Will differentiate into the "viper" giant spider. -/mob/living/basic/young_spider/viper - grow_as = /mob/living/basic/giant_spider/viper +/mob/living/basic/spider/growing/young/viper + grow_as = /mob/living/basic/spider/giant/viper name = "young viper spider" desc = "Furry and black, it looks defenseless. This one has sparkling magenta eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -170,8 +170,8 @@ poison_per_bite = 2 /// Will differentiate into the "tarantula" giant spider. -/mob/living/basic/young_spider/tarantula - grow_as = /mob/living/basic/giant_spider/tarantula +/mob/living/basic/spider/growing/young/tarantula + grow_as = /mob/living/basic/spider/giant/tarantula name = "young tarantula spider" desc = "Furry and black, it looks defenseless. This one has abyssal red eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -183,40 +183,3 @@ melee_damage_upper = 25 speed = 1 obj_damage = 40 - -/// Will differentiate into the "flesh" giant spider. -/mob/living/basic/young_spider/hunter/flesh - grow_as = /mob/living/basic/giant_spider/hunter/flesh - name = "young flesh spider" - desc = "Furry and red, it looks defenseless. This one has sparkling grey eyes." - icon = 'icons/mob/simple/arachnoid.dmi' - icon_state = "young_flesh" - icon_dead = "young_flesh_dead" - maxHealth = 55 - health = 55 - web_speed = 0.7 - spider_growth_time = 30 SECONDS - -/mob/living/basic/young_spider/hunter/flesh/Initialize(mapload) - . = ..() - AddComponent(/datum/component/blood_walk, \ - blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ - blood_spawn_chance = 3) - // It might be easier and more fitting to just replace this with Regenerator - AddComponent(/datum/component/healing_touch,\ - heal_brute = 25,\ - heal_burn = 25,\ - self_targetting = HEALING_TOUCH_SELF_ONLY,\ - interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/hunter/flesh)),\ - extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ - action_text = "%SOURCE% begins mending themselves...",\ - complete_text = "%SOURCE%'s wounds mend together.",\ - ) - -/// Prevent you from healing other flesh spiders, or healing when on fire -/mob/living/basic/young_spider/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) - if (on_fire) - balloon_alert(src, "on fire!") - return FALSE - return TRUE diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3e7ed4249e7..e690c0d2996 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1417,8 +1417,8 @@ /mob/living/basic/chicken, /mob/living/basic/cow, /mob/living/basic/crab, - /mob/living/basic/giant_spider, - /mob/living/basic/giant_spider/hunter, + /mob/living/basic/spider/giant, + /mob/living/basic/spider/giant/hunter, /mob/living/basic/mining/goliath, /mob/living/basic/headslug, /mob/living/basic/killer_tomato, diff --git a/code/modules/mob_spawn/ghost_roles/spider_roles.dm b/code/modules/mob_spawn/ghost_roles/spider_roles.dm index 24bef0abfa3..e3dbea6b1ba 100644 --- a/code/modules/mob_spawn/ghost_roles/spider_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/spider_roles.dm @@ -23,7 +23,7 @@ /obj/structure/spider/eggcluster/examine_more(mob/user) . = ..() - if(istype(user, /mob/living/basic/giant_spider/midwife)) + 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.") @@ -74,12 +74,12 @@ var/obj/structure/spider/eggcluster/egg /// The types of spiders that the spawner can produce var/list/potentialspawns = list( - /mob/living/basic/spiderling/nurse, - /mob/living/basic/spiderling/hunter, - /mob/living/basic/spiderling/ambush, - /mob/living/basic/spiderling/tangle, - /mob/living/basic/spiderling/guard, - /mob/living/basic/spiderling/scout, + /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 @@ -122,11 +122,13 @@ 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/giant_spider/spawned_mob, mob/mob_possessor) +/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) - return ..() + 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" @@ -134,9 +136,9 @@ you_are_text = "You are an enriched spider." cluster_type = /obj/structure/spider/eggcluster/enriched potentialspawns = list( - /mob/living/basic/spiderling/tarantula, - /mob/living/basic/spiderling/viper, - /mob/living/basic/spiderling/midwife, + /mob/living/basic/spider/growing/spiderling/tarantula, + /mob/living/basic/spider/growing/spiderling/viper, + /mob/living/basic/spider/growing/spiderling/midwife, ) flash_window = TRUE @@ -148,7 +150,7 @@ 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/spiderling/hunter/flesh, + /mob/living/basic/spider/giant/hunter/flesh, ) flash_window = TRUE @@ -159,7 +161,7 @@ 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/spiderling/midwife, + /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 @@ -176,9 +178,9 @@ var/list/spider_list = list() var/list/display_spiders = list() for(var/choice in potentialspawns) - var/mob/living/basic/spiderling/chosen_spiderling = choice - var/mob/living/basic/young_spider/young_spider = initial(chosen_spiderling.grow_as) - var/mob/living/basic/giant_spider/spider = initial(young_spider.grow_as) + 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 diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 5dc9fed83ce..b39eee137c1 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -125,7 +125,7 @@ /datum/chemical_reaction/slime/slimemobspawn/spider/summon_mobs(datum/reagents/holder, turf/T) T.visible_message(span_danger("The slime extract begins to vibrate crikey-ingly!")) - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/basic/giant_spider/midwife, FACTION_NEUTRAL, FALSE), 50) + addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/basic/spider/giant/midwife, FACTION_NEUTRAL, FALSE), 50) //Silver diff --git a/code/modules/spells/spell_types/shapeshift/shapechange.dm b/code/modules/spells/spell_types/shapeshift/shapechange.dm index 3177191d49a..2e890eed632 100644 --- a/code/modules/spells/spell_types/shapeshift/shapechange.dm +++ b/code/modules/spells/spell_types/shapeshift/shapechange.dm @@ -16,6 +16,6 @@ /mob/living/basic/pet/dog/corgi, /mob/living/basic/carp/magic/chaos, /mob/living/simple_animal/bot/secbot/ed209, - /mob/living/basic/giant_spider/viper/wizard, + /mob/living/basic/spider/giant/viper/wizard, /mob/living/simple_animal/hostile/construct/juggernaut/mystic, ) diff --git a/icons/mob/simple/arachnoid.dmi b/icons/mob/simple/arachnoid.dmi index 976005f6b5ebb9578d74b3a1c83abefd43c524db..fca53195d4c06f62e5c617a9e2db53549e0cb858 100644 GIT binary patch delta 10035 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 Zw3a-hUaIj^CFl@gVq|`@z|isb{{aM7dYS+L delta 10010 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 diff --git a/tgstation.dme b/tgstation.dme index 90f0f6492cc..d34551e7579 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4192,10 +4192,10 @@ #include "code\modules\mob\living\basic\space_fauna\netherworld\migo.dm" #include "code\modules\mob\living\basic\space_fauna\paper_wizard\paper_abilities.dm" #include "code\modules\mob\living\basic\space_fauna\paper_wizard\paper_wizard.dm" -#include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider.dm" +#include "code\modules\mob\living\basic\space_fauna\spider\spider.dm" #include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_ai.dm" #include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_subtrees.dm" -#include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_variants.dm" +#include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spiders.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\hivemind.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\lay_eggs.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\web.dm" diff --git a/tools/UpdatePaths/Scripts/77523_giant_spider_repath.txt b/tools/UpdatePaths/Scripts/77523_giant_spider_repath.txt new file mode 100644 index 00000000000..1fb03473be8 --- /dev/null +++ b/tools/UpdatePaths/Scripts/77523_giant_spider_repath.txt @@ -0,0 +1,4 @@ +/mob/living/basic/spiderling/@SUBTYPES : /mob/living/basic/spider/growing/spiderling/@SUBTYPES{@OLD} +/mob/living/basic/spider_young/@SUBTYPES : /mob/living/basic/spider/growing/young/@SUBTYPES{@OLD} +/mob/living/basic/giant_spider/maintenance : /mob/living/basic/spider/maintenance{@OLD} +/mob/living/basic/giant_spider/@SUBTYPES : /mob/living/basic/spider/giant/@SUBTYPES{@OLD}