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 976005f6b5e..fca53195d4c 100644 Binary files a/icons/mob/simple/arachnoid.dmi and b/icons/mob/simple/arachnoid.dmi differ 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}