From cbbf7b36130e27ee55b907df3aea77f280e1f5cb Mon Sep 17 00:00:00 2001 From: Jacquerel Date: Mon, 13 Feb 2023 05:22:26 +0000 Subject: [PATCH] Basic Mob Spiders III: Sgt. Araneus is no longer a bat (#73350) ## About The Pull Request This PR converts giant spiders into basic mobs and resultingly fixes #37793 They _should_ have the same behaviour as their simple mob versions although I can't verify that their movement speeds are _exactly_ the same. It should at least be pretty close. A quirk of spiders is that they had a pretty large `move_to_delay` which made them slow in the hands of AI (because it would just pause for ages between taking steps) and faster in the hands of players, and they often appear in both forms so I had to implement this as a speed modifier based on player control. Additionally this is the first basic mob which can be set on fire. This is currently implemented as a var on `mob/living/basic` but I know there was some annoyance at adding the environment tolerances as vars on there so if desired I can try and extract it out, I'm just not sure how easy it will be. Something else I noticed is that spiders seem to take stamina damage from bug spray... but stamina damage does nothing to either simple _or_ basic mobs. I have left it in for now in case I am missing something, and rebalancing it to do something else would be more like a balance change. Oh also I killed the `mob/basic/retaliate` folder because that isn't a classification that needs to exist or makes sense. ## Why It's Good For The Game We don't want to use simple mobs any more. Sergeant Araneus can finally actually be a spider, instead of being a bat. ## Changelog :cl: refactor: Spider code has been refactored and AI-controlled spiders may have slightly different movement or reaction times. fix: Basic mobs can now be slowed when they take stamina damage, however currently only spiders actually _can_ take stamina damage. fix: Spiders should now more reliably disable their AI when controlled by a player. fix: Araneus is no longer considered to be a bat and so cannot fly. fix: Araneus is no longer considered to be a bat and so is no longer frightening to people who are scared of the supernatural. /:cl: --- _maps/RandomRuins/SpaceRuins/crashedship.dmm | 2 +- _maps/RandomZLevels/caves.dmm | 14 +- _maps/RandomZLevels/snowdin.dmm | 10 +- _maps/map_files/KiloStation/KiloStation.dmm | 8 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- _maps/shuttles/whiteship_delta.dmm | 8 +- code/__DEFINES/is_helpers.dm | 2 +- code/_globalvars/phobias.dm | 2 +- .../basic_subtrees/speech_subtree.dm | 2 +- .../elements/prevent_attacking_of_types.dm | 2 +- code/datums/memory/_memory.dm | 4 +- .../status_effects/debuffs/fire_stacks.dm | 6 +- code/game/objects/effects/spiderwebs.dm | 18 +- code/game/objects/items/weaponry.dm | 2 +- .../traitor/objectives/kill_pet.dm | 2 +- code/modules/events/scrubber_clog.dm | 2 +- .../events/shuttle_loan/shuttle_loan_datum.dm | 8 +- code/modules/mob/living/basic/basic.dm | 25 +- .../space_fauna/{faithless => }/faithless.dm | 0 .../garden_gnome.dm | 0 .../basic/{retaliate => space_fauna}/ghost.dm | 0 .../space_fauna/giant_spider/giant_spider.dm | 101 +++++ .../giant_spider/giant_spider_ai.dm | 46 ++ .../giant_spider/spider_abilities/hivemind.dm | 2 +- .../giant_spider/spider_variants.dm | 329 ++++++++++++++ .../basic/space_fauna/netherworld/creature.dm | 8 +- .../basic/space_fauna/netherworld/migo.dm | 8 +- .../mob/living/basic/vermin/cockroach.dm | 10 +- code/modules/mob/living/living.dm | 4 +- .../simple_animal/hostile/giant_spider.dm | 421 ------------------ .../simple_animal/hostile/retaliate/bat.dm | 24 - .../mob_spawn/ghost_roles/spider_roles.dm | 20 +- code/modules/movespeed/modifiers/mobs.dm | 6 + .../chemistry/recipes/slime_extracts.dm | 2 +- .../spell_types/shapeshift/shapechange.dm | 2 +- .../unit_tests/simple_animal_freeze.dm | 15 - tgstation.dme | 10 +- .../Scripts/73350_simple_spiders_to_basic.txt | 4 + 38 files changed, 591 insertions(+), 540 deletions(-) rename code/modules/mob/living/basic/space_fauna/{faithless => }/faithless.dm (100%) rename code/modules/mob/living/basic/{retaliate => space_fauna}/garden_gnome.dm (100%) rename code/modules/mob/living/basic/{retaliate => space_fauna}/ghost.dm (100%) create mode 100644 code/modules/mob/living/basic/space_fauna/giant_spider/giant_spider.dm create mode 100644 code/modules/mob/living/basic/space_fauna/giant_spider/giant_spider_ai.dm create mode 100644 code/modules/mob/living/basic/space_fauna/giant_spider/spider_variants.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/giant_spider.dm create mode 100644 tools/UpdatePaths/Scripts/73350_simple_spiders_to_basic.txt diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index 583c4d40329..e983ab3153d 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -382,7 +382,7 @@ "pP" = ( /obj/machinery/porta_turret{ dir = 8; - installation = /obj/item/gun/energy/lasercannon; + installation = /obj/item/gun/energy/lasercannon }, /obj/effect/mapping_helpers/atom_injector/obj_flag{ inject_flags = 1; diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 798a345a3cf..a4c071a17d0 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -1310,7 +1310,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "kE" = ( -/mob/living/simple_animal/hostile/giant_spider/hunter, +/mob/living/basic/giant_spider/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "kL" = ( @@ -1382,7 +1382,7 @@ /area/awaymission/caves/northblock) "pC" = ( /obj/item/mjollnir, -/mob/living/simple_animal/hostile/giant_spider/nurse, +/mob/living/basic/giant_spider/nurse, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1477,7 +1477,7 @@ /obj/machinery/sleeper{ dir = 8 }, -/mob/living/simple_animal/hostile/giant_spider/hunter, +/mob/living/basic/giant_spider/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "uO" = ( @@ -1635,7 +1635,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "Bz" = ( -/mob/living/simple_animal/hostile/giant_spider/nurse, +/mob/living/basic/giant_spider/nurse, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1726,7 +1726,7 @@ "FS" = ( /obj/machinery/light/small/built/directional/north, /obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/giant_spider/hunter, +/mob/living/basic/giant_spider/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "FV" = ( @@ -1982,7 +1982,7 @@ /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "Xs" = ( -/mob/living/simple_animal/hostile/giant_spider/hunter, +/mob/living/basic/giant_spider/hunter, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -2004,7 +2004,7 @@ /area/awaymission/caves/bmp_asteroid/level_two) "XR" = ( /obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/giant_spider/hunter, +/mob/living/basic/giant_spider/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 34e271eb0e6..fa899659a7c 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -5517,7 +5517,7 @@ /area/awaymission/snowdin/post/cavern2) "pc" = ( /obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/giant_spider/hunter/ice, +/mob/living/basic/giant_spider/hunter/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "pd" = ( @@ -11798,7 +11798,7 @@ dir = 5 }, /obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/giant_spider/hunter/ice, +/mob/living/basic/giant_spider/hunter/ice, /turf/open/floor/iron/freezer, /area/awaymission/snowdin/post/kitchen) "Ps" = ( @@ -12052,7 +12052,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/research) "QM" = ( -/mob/living/simple_animal/hostile/giant_spider/nurse/ice, +/mob/living/basic/giant_spider/nurse/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "QN" = ( @@ -12296,7 +12296,7 @@ /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/cave) "Si" = ( -/mob/living/simple_animal/hostile/giant_spider/hunter/ice, +/mob/living/basic/giant_spider/hunter/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "Sj" = ( @@ -12879,7 +12879,7 @@ }, /area/awaymission/snowdin/outside) "Vo" = ( -/mob/living/simple_animal/hostile/giant_spider/ice, +/mob/living/basic/giant_spider/ice, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "Vp" = ( diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 7bf38f8c442..1fc59ab28ad 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -23475,7 +23475,7 @@ "gLm" = ( /obj/machinery/status_display/ai/directional/south, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/giant_spider/hunter/scrawny, +/mob/living/basic/giant_spider/hunter/scrawny, /turf/open/floor/plating, /area/station/maintenance/department/electrical) "gLn" = ( @@ -38930,7 +38930,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/mob/living/simple_animal/hostile/giant_spider/tarantula/scrawny, +/mob/living/basic/giant_spider/tarantula/scrawny, /turf/open/floor/iron/dark, /area/station/maintenance/port/greater) "kZK" = ( @@ -42963,7 +42963,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/giant_spider/hunter/scrawny, +/mob/living/basic/giant_spider/hunter/scrawny, /turf/open/floor/iron/dark, /area/station/maintenance/port/greater) "mii" = ( @@ -62741,7 +62741,7 @@ "rSL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/simple_animal/hostile/giant_spider/hunter/scrawny, +/mob/living/basic/giant_spider/hunter/scrawny, /turf/open/floor/plating, /area/station/maintenance/department/electrical) "rSN" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index dedbeb32140..0447df99975 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -28751,7 +28751,7 @@ "kms" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus, +/mob/living/basic/giant_spider/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 4120bd9ef8e..575db94e7f7 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -494,7 +494,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/mob/living/simple_animal/hostile/giant_spider/hunter/scrawny, +/mob/living/basic/giant_spider/hunter/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "bd" = ( @@ -1026,7 +1026,7 @@ dir = 8 }, /obj/structure/cable, -/mob/living/simple_animal/hostile/giant_spider/tarantula/scrawny, +/mob/living/basic/giant_spider/tarantula/scrawny, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cg" = ( @@ -1609,7 +1609,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/giant_spider/nurse/scrawny, +/mob/living/basic/giant_spider/nurse/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "dx" = ( @@ -1685,7 +1685,7 @@ "dG" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, -/mob/living/simple_animal/hostile/giant_spider/hunter/scrawny, +/mob/living/basic/giant_spider/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 16aaf019de9..144054efbaa 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -165,7 +165,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/simple_animal/hostile/giant_spider)) +#define isspider(A) (istype(A, /mob/living/basic/giant_spider)) //Misc mobs diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 35b738867f4..d440f6ebb28 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(phobia_regexes, list( )) GLOBAL_LIST_INIT(phobia_mobs, list( - "spiders" = typecacheof(list(/mob/living/simple_animal/hostile/giant_spider)), + "spiders" = typecacheof(list(/mob/living/basic/giant_spider)), "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)), "lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)), "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm index bfabe1cb8b7..1407f1d40a2 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -34,7 +34,7 @@ else controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak)) -/datum/ai_planning_subtree/random_speech/cockroach +/datum/ai_planning_subtree/random_speech/insect speech_chance = 5 emote_hear = list("chitters.") diff --git a/code/datums/elements/prevent_attacking_of_types.dm b/code/datums/elements/prevent_attacking_of_types.dm index a7f961800a9..ff08c05dbb3 100644 --- a/code/datums/elements/prevent_attacking_of_types.dm +++ b/code/datums/elements/prevent_attacking_of_types.dm @@ -13,7 +13,7 @@ /datum/element/prevent_attacking_of_types/Attach(datum/target, list/typecache, alert_message) . = ..() - if (!ishostile(target)) + if (!isanimal_or_basicmob(target)) return ELEMENT_INCOMPATIBLE src.alert_message = alert_message diff --git a/code/datums/memory/_memory.dm b/code/datums/memory/_memory.dm index 506542a3bbd..f6f51888fba 100644 --- a/code/datums/memory/_memory.dm +++ b/code/datums/memory/_memory.dm @@ -248,8 +248,8 @@ /mob/living/simple_animal/hostile/asteroid/goliath/beast, /mob/living/simple_animal/hostile/bear, /mob/living/simple_animal/hostile/blob/blobbernaut/independent, - /mob/living/simple_animal/hostile/giant_spider, - /mob/living/simple_animal/hostile/giant_spider/hunter, + /mob/living/basic/giant_spider, + /mob/living/basic/giant_spider/hunter, /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/hostile/headcrab, /mob/living/simple_animal/hostile/killertomato, diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 4db2a1adaa1..6951ae2c4d8 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -27,8 +27,10 @@ . = ..() if(isbasicmob(owner)) - qdel(src) - return + var/mob/living/basic/basic_owner = owner + if(!basic_owner.flammable) + qdel(src) + return if(isanimal(owner)) var/mob/living/simple_animal/animal_owner = owner diff --git a/code/game/objects/effects/spiderwebs.dm b/code/game/objects/effects/spiderwebs.dm index eb7d5fc7b91..718ed2f0b2d 100644 --- a/code/game/objects/effects/spiderwebs.dm +++ b/code/game/objects/effects/spiderwebs.dm @@ -65,7 +65,7 @@ if(isspider(mover)) return TRUE else if(isliving(mover)) - if(istype(mover.pulledby, /mob/living/simple_animal/hostile/giant_spider)) + if(istype(mover.pulledby, /mob/living/basic/giant_spider)) return TRUE if(prob(50)) balloon_alert(mover, "stuck in web!") @@ -127,19 +127,19 @@ AddComponent(/datum/component/swarming) /obj/structure/spider/spiderling/hunter - grow_as = /mob/living/simple_animal/hostile/giant_spider/hunter + grow_as = /mob/living/basic/giant_spider/hunter /obj/structure/spider/spiderling/nurse - grow_as = /mob/living/simple_animal/hostile/giant_spider/nurse + grow_as = /mob/living/basic/giant_spider/nurse /obj/structure/spider/spiderling/midwife - grow_as = /mob/living/simple_animal/hostile/giant_spider/midwife + grow_as = /mob/living/basic/giant_spider/midwife /obj/structure/spider/spiderling/viper - grow_as = /mob/living/simple_animal/hostile/giant_spider/viper + grow_as = /mob/living/basic/giant_spider/viper /obj/structure/spider/spiderling/tarantula - grow_as = /mob/living/simple_animal/hostile/giant_spider/tarantula + grow_as = /mob/living/basic/giant_spider/tarantula /obj/structure/spider/spiderling/Bump(atom/user) if(istype(user, /obj/structure/table)) @@ -219,10 +219,10 @@ if(amount_grown >= 100) if(!grow_as) if(prob(3)) - grow_as = pick(/mob/living/simple_animal/hostile/giant_spider/tarantula, /mob/living/simple_animal/hostile/giant_spider/viper, /mob/living/simple_animal/hostile/giant_spider/midwife) + 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/simple_animal/hostile/giant_spider, /mob/living/simple_animal/hostile/giant_spider/hunter, /mob/living/simple_animal/hostile/giant_spider/nurse) - var/mob/living/simple_animal/hostile/giant_spider/S = new grow_as(src.loc) + grow_as = pick(/mob/living/basic/giant_spider, /mob/living/basic/giant_spider/hunter, /mob/living/basic/giant_spider/nurse) + var/mob/living/basic/giant_spider/S = new grow_as(src.loc) S.faction = faction.Copy() S.directive = directive qdel(src) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 2d1a656a042..0c4aabd891f 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -880,7 +880,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/effect/decal/cleanable/ants, )) strong_against = typecacheof(list( - /mob/living/simple_animal/hostile/giant_spider, + /mob/living/basic/giant_spider, )) diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm index 2d3c1c7f3c8..87f35c1417f 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/simple_animal/hostile/retaliate/bat/sgt_araneus + /mob/living/basic/giant_spider/sgt_araneus, ), JOB_WARDEN = list( /mob/living/basic/pet/dog/pug/mcgriff diff --git a/code/modules/events/scrubber_clog.dm b/code/modules/events/scrubber_clog.dm index 01a8219cb8f..4e982ff05b5 100644 --- a/code/modules/events/scrubber_clog.dm +++ b/code/modules/events/scrubber_clog.dm @@ -151,7 +151,7 @@ var/static/list/mob_list = list( /mob/living/basic/mouse/rat, /mob/living/simple_animal/hostile/bee, - /mob/living/simple_animal/hostile/giant_spider, + /mob/living/basic/giant_spider, ) return pick(mob_list) diff --git a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm index ba85a41132a..a5eb95cf67c 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/emergency/specialops] pack.generate(pick_n_take(empty_shuttle_turfs)) - spawn_list.Add(/mob/living/simple_animal/hostile/giant_spider) - spawn_list.Add(/mob/living/simple_animal/hostile/giant_spider) - spawn_list.Add(/mob/living/simple_animal/hostile/giant_spider/nurse) + 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) if(prob(50)) - spawn_list.Add(/mob/living/simple_animal/hostile/giant_spider/hunter) + spawn_list.Add(/mob/living/basic/giant_spider/hunter) var/turf/victim_turf = pick_n_take(empty_shuttle_turfs) diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index f7a386e9ba9..283206387b6 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -97,6 +97,9 @@ ///This damage is taken when the body temp is too hot. Set both this and unsuitable_cold_damage to 0 to avoid adding the basic_body_temp_sensitive element. var/unsuitable_heat_damage = 1 + ///Whether or not this mob can catch on fire + var/flammable = FALSE + /mob/living/basic/Initialize(mapload) . = ..() @@ -124,9 +127,8 @@ /mob/living/basic/Life(delta_time = SSMOBS_DT, times_fired) . = ..() - ///Automatic stamina re-gain if(staminaloss > 0) - adjustStaminaLoss(-stamina_recovery * delta_time, FALSE, TRUE) + adjustStaminaLoss(-stamina_recovery * delta_time, forced = TRUE) /mob/living/basic/say_mod(input, list/message_mods = list()) if(length(speak_emote)) @@ -205,3 +207,22 @@ /mob/living/basic/compare_sentience_type(compare_type) return sentience_type == compare_type + +/// Updates movement speed based on stamina loss +/mob/living/basic/update_stamina() + set_varspeed(initial(speed) + (staminaloss * 0.06)) + +/mob/living/basic/on_fire_stack(delta_time, times_fired, datum/status_effect/fire_handler/fire_stacks/fire_handler) + adjust_bodytemperature((maximum_survivable_temperature + (fire_handler.stacks * 12)) * 0.5 * delta_time) + +/mob/living/basic/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") + var/mutable_appearance/fire_overlay = mutable_appearance('icons/mob/effects/onfire.dmi', "generic_fire") + if(on_fire && isnull(last_icon_state)) + add_overlay(fire_overlay) + return fire_overlay + else if(!on_fire && !isnull(last_icon_state)) + cut_overlay(fire_overlay) + return null + else if(on_fire && !isnull(last_icon_state)) + return last_icon_state + return null diff --git a/code/modules/mob/living/basic/space_fauna/faithless/faithless.dm b/code/modules/mob/living/basic/space_fauna/faithless.dm similarity index 100% rename from code/modules/mob/living/basic/space_fauna/faithless/faithless.dm rename to code/modules/mob/living/basic/space_fauna/faithless.dm diff --git a/code/modules/mob/living/basic/retaliate/garden_gnome.dm b/code/modules/mob/living/basic/space_fauna/garden_gnome.dm similarity index 100% rename from code/modules/mob/living/basic/retaliate/garden_gnome.dm rename to code/modules/mob/living/basic/space_fauna/garden_gnome.dm diff --git a/code/modules/mob/living/basic/retaliate/ghost.dm b/code/modules/mob/living/basic/space_fauna/ghost.dm similarity index 100% rename from code/modules/mob/living/basic/retaliate/ghost.dm rename to code/modules/mob/living/basic/space_fauna/ghost.dm diff --git a/code/modules/mob/living/basic/space_fauna/giant_spider/giant_spider.dm b/code/modules/mob/living/basic/space_fauna/giant_spider/giant_spider.dm new file mode 100644 index 00000000000..6fd4e3b4e9b --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/giant_spider/giant_spider.dm @@ -0,0 +1,101 @@ +/** + * # 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_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 = 4 + maxHealth = 80 + health = 80 + damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + 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("spiders") + 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 = 1 + gold_core_spawnable = HOSTILE_SPAWN + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + see_in_dark = NIGHTVISION_FOV_RANGE + flammable = TRUE + 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 = "Versatile spider variant for frontline combat with high health and damage." + /// 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) + . = ..() + 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!") + + 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) + +/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/giant_spider/giant_spider_ai.dm b/code/modules/mob/living/basic/space_fauna/giant_spider/giant_spider_ai.dm new file mode 100644 index 00000000000..826982e491d --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/giant_spider/giant_spider_ai.dm @@ -0,0 +1,46 @@ +#define SPIDER_ATTACK_COOLDOWN (2 SECONDS) + +/// For now, essentially just a Simple Hostile but room for expansion +/datum/ai_controller/basic_controller/giant_spider + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking + + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path/giant_spider, + /datum/ai_planning_subtree/basic_melee_attack_subtree/giant_spider, + /datum/ai_planning_subtree/random_speech/insect, // Space spiders are taxonomically insects not arachnids, don't DM me + ) + + +/// Used by Araneus, who only attacks those who attack first +/datum/ai_controller/basic_controller/giant_spider/retaliate + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), + ) + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/attack_obstacle_in_path/giant_spider, + /datum/ai_planning_subtree/basic_melee_attack_subtree/giant_spider, + /datum/ai_planning_subtree/random_speech/insect, + ) + +/datum/ai_planning_subtree/attack_obstacle_in_path/giant_spider + attack_behaviour = /datum/ai_behavior/attack_obstructions/giant_spider + +/datum/ai_behavior/attack_obstructions/giant_spider + action_cooldown = SPIDER_ATTACK_COOLDOWN + +/datum/ai_planning_subtree/basic_melee_attack_subtree/giant_spider + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/giant_spider + +/datum/ai_behavior/basic_melee_attack/giant_spider + action_cooldown = SPIDER_ATTACK_COOLDOWN + +#undef SPIDER_ATTACK_COOLDOWN diff --git a/code/modules/mob/living/basic/space_fauna/giant_spider/spider_abilities/hivemind.dm b/code/modules/mob/living/basic/space_fauna/giant_spider/spider_abilities/hivemind.dm index 96f29f99171..08a688c3d0b 100644 --- a/code/modules/mob/living/basic/space_fauna/giant_spider/spider_abilities/hivemind.dm +++ b/code/modules/mob/living/basic/space_fauna/giant_spider/spider_abilities/hivemind.dm @@ -62,7 +62,7 @@ if(!message) return var/my_message = span_spider("Command from [user]: [message]") - for(var/mob/living/simple_animal/hostile/giant_spider/spider as anything in GLOB.spidermobs) + for(var/mob/living/basic/giant_spider/spider as anything in GLOB.spidermobs) to_chat(spider, my_message) for(var/ghost in GLOB.dead_mob_list) var/link = FOLLOW_LINK(ghost, user) diff --git a/code/modules/mob/living/basic/space_fauna/giant_spider/spider_variants.dm b/code/modules/mob/living/basic/space_fauna/giant_spider/spider_variants.dm new file mode 100644 index 00000000000..2eacd437ecf --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/giant_spider/spider_variants.dm @@ -0,0 +1,329 @@ +/** + * # Spider Hunter + * 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 + name = "hunter spider" + desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes." + icon_state = "hunter" + icon_living = "hunter" + icon_dead = "hunter_dead" + maxHealth = 50 + health = 50 + melee_damage_lower = 15 + melee_damage_upper = 20 + poison_per_bite = 5 + speed = 3 + player_speed_modifier = -3.1 + menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less health and damage." + +/** + * # Spider Nurse + * + * 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 + name = "nurse spider" + desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes." + icon_state = "nurse" + icon_living = "nurse" + icon_dead = "nurse_dead" + gender = FEMALE + butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8, /obj/item/food/spidereggs = 4) + maxHealth = 40 + health = 40 + melee_damage_lower = 5 + melee_damage_upper = 10 + web_speed = 0.25 + web_type = /datum/action/cooldown/lay_web/sealer + menu_description = "Support spider variant specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage." + ///The health HUD applied to the mob. + var/health_hud = DATA_HUD_MEDICAL_ADVANCED + +/mob/living/basic/giant_spider/nurse/Initialize(mapload) + . = ..() + var/datum/atom_hud/datahud = GLOB.huds[health_hud] + datahud.show_to(src) + + AddComponent(/datum/component/healing_touch,\ + interaction_key = DOAFTER_SOURCE_SPIDER,\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider)),\ + action_text = "%SOURCE% begins wrapping the wounds of %TARGET%.",\ + complete_text = "%SOURCE% wraps the wounds of %TARGET%.",\ + ) + +/** + * # Tarantula + * + * 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 + name = "tarantula" + desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes." + icon_state = "tarantula" + icon_living = "tarantula" + icon_dead = "tarantula_dead" + maxHealth = 300 // woah nelly + health = 300 + melee_damage_lower = 35 + melee_damage_upper = 40 + obj_damage = 100 + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + speed = 6 + player_speed_modifier = -5.5 // Doesn't seem that slow but it gets a debuff off web + mob_size = MOB_SIZE_LARGE + gold_core_spawnable = NO_SPAWN + menu_description = "Tank spider variant with an enormous amount of health and damage, but is very slow when not on webbing. It also has a charge ability to close distance with a target after a small windup." + /// Charging ability + var/datum/action/cooldown/mob_cooldown/charge/basic_charge/charge + +/mob/living/basic/giant_spider/tarantula/Initialize(mapload) + . = ..() + charge = new /datum/action/cooldown/mob_cooldown/charge/basic_charge() + charge.Grant(src) + + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/tarantula_web) + +/mob/living/basic/giant_spider/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) + charge.Trigger(target = atom_target) + +/** + * # Spider Viper + * + * 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 + name = "viper spider" + desc = "Furry and black, it makes you shudder to look at it. This one has effervescent purple eyes." + icon_state = "viper" + icon_living = "viper" + icon_dead = "viper_dead" + maxHealth = 40 + health = 40 + melee_damage_lower = 5 + melee_damage_upper = 5 + poison_per_bite = 5 + poison_type = /datum/reagent/toxin/viperspider + speed = 2 + player_speed_modifier = -2.5 + 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." + +/** + * # Spider Broodmother + * + * A subtype of the giant spider which is the crux of a spider horde, and the way which it grows. + * Has very little offensive capabilities but can lay eggs at any time to create more basic spiders. + * 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 + 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 + icon_state = "midwife" + icon_living = "midwife" + icon_dead = "midwife_dead" + maxHealth = 60 + health = 60 + melee_damage_lower = 10 + melee_damage_upper = 15 + gold_core_spawnable = NO_SPAWN + web_speed = 0.5 + web_type = /datum/action/cooldown/lay_web/sealer + menu_description = "Royal spider variant specializing in reproduction and leadership, but has very low amount of health and deals low damage." + +/mob/living/basic/giant_spider/midwife/Initialize(mapload) + . = ..() + var/datum/action/cooldown/wrap/wrapping = new(src) + wrapping.Grant(src) + + var/datum/action/lay_eggs/make_eggs = new(src) + make_eggs.Grant(src) + + var/datum/action/lay_eggs/enriched/make_better_eggs = new(src) + make_better_eggs.Grant(src) + + var/datum/action/set_spider_directive/give_orders = new(src) + give_orders.Grant(src) + + var/datum/action/command_spiders/not_hivemind_talk = new(src) + not_hivemind_talk.Grant(src) + +/** + * # Giant Ice Spider + * + * 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 + 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 + maximum_survivable_temperature = 1500 + color = rgb(114,228,250) + gold_core_spawnable = NO_SPAWN + menu_description = "Versatile ice spider variant for frontline combat with high health and damage. Immune to temperature damage." + +/** + * # Ice Nurse Spider + * + * A temperature-proof nurse spider. Also unused. + */ +/mob/living/basic/giant_spider/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 + maximum_survivable_temperature = 1500 + poison_type = /datum/reagent/consumable/frostoil + color = rgb(114,228,250) + menu_description = "Support ice spider variant specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage. Immune to temperature damage." + +/** + * # Ice Hunter Spider + * + * A temperature-proof hunter with chilling venom. Also unused. + */ +/mob/living/basic/giant_spider/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 + maximum_survivable_temperature = 1500 + poison_type = /datum/reagent/consumable/frostoil + color = rgb(114,228,250) + gold_core_spawnable = NO_SPAWN + menu_description = "Fast ice spider variant specializing in catching running prey and frost oil injection, but has less health and damage. Immune to temperature damage." + +/** + * # Scrawny Hunter Spider + * + * 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 + name = "scrawny spider" + environment_smash = ENVIRONMENT_SMASH_NONE + health = 60 + maxHealth = 60 + melee_damage_lower = 5 + melee_damage_upper = 10 + desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes, and looks abnormally thin and frail." + menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less damage than a normal hunter spider at the cost of a little more health." + +/** + * # Scrawny Tarantula + * + * 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 + name = "scrawny tarantula" + environment_smash = ENVIRONMENT_SMASH_NONE + health = 150 + maxHealth = 150 + melee_damage_lower = 20 + melee_damage_upper = 25 + desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes, and looks abnormally thin and frail." + menu_description = "A weaker variant of the tarantula with reduced amount of health and damage, very slow when not on webbing. It also has a charge ability to close distance with a target after a small windup." + +/** + * # Scrawny Nurse Spider + * + * A weaker version of the nurse spider with reduced health, unable to smash enviroments. + * 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 + name = "scrawny nurse spider" + environment_smash = ENVIRONMENT_SMASH_NONE + health = 30 + maxHealth = 30 + desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes, and looks abnormally thin and frail." + menu_description = "Weaker version of the nurse spider, specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage." + +/** + * # Flesh Spider + * + * A subtype of giant spider which only occurs from changelings. + * 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 + desc = "A odd fleshy creature in the shape of a spider. Its eyes are pitch black and soulless." + icon_state = "flesh_spider" + icon_living = "flesh_spider" + icon_dead = "flesh_spider_dead" + web_speed = 0.7 + menu_description = "Self-sufficient spider variant capable of healing themselves and producing webbbing fast, but has less health and damage." + +/mob/living/basic/giant_spider/hunter/flesh/Initialize(mapload) + . = ..() + AddComponent(/datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ + blood_spawn_chance = 5) + // It might be easier and more fitting to just replace this with Regenerator + AddComponent(/datum/component/healing_touch,\ + heal_brute = maxHealth * 0.5,\ + heal_burn = maxHealth * 0.5,\ + 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/giant_spider/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) + if (on_fire) + balloon_alert(src, "on fire!") + return FALSE + return TRUE + +/** + * # Viper Spider (Wizard) + * + * 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 + maxHealth = 80 + health = 80 + 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) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/** + * # Sergeant Araneus + * + * 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 + 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." + faction = list("spiders") + maxHealth = 250 + health = 250 + melee_damage_lower = 15 + melee_damage_upper = 20 + ai_controller = /datum/ai_controller/basic_controller/giant_spider/retaliate + apply_spider_antag = FALSE + +/mob/living/basic/giant_spider/sgt_araneus/Initialize(mapload) + . = ..() + AddElement(/datum/element/pet_bonus, "chitters proudly!") + AddElement(/datum/element/ai_retaliate) + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm index 0eb46d8b95a..2d33b5eda95 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm @@ -50,22 +50,22 @@ /mob/living/basic/creature/proc/health_full_behaviour() melee_damage_lower = 20 melee_damage_upper = 30 - set_varspeed(2) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/netherworld_enrage, multiplicative_slowdown = 0) /mob/living/basic/creature/proc/health_high_behaviour() melee_damage_lower = 25 melee_damage_upper = 40 - set_varspeed(1.5) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/netherworld_enrage, multiplicative_slowdown = -0.5) /mob/living/basic/creature/proc/health_medium_behaviour() melee_damage_lower = 30 melee_damage_upper = 50 - set_varspeed(1) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/netherworld_enrage, multiplicative_slowdown = -1) /mob/living/basic/creature/proc/health_low_behaviour() melee_damage_lower = 35 melee_damage_upper = 60 - set_varspeed(0.5) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/netherworld_enrage, multiplicative_slowdown = -1.5) /mob/living/basic/creature/proc/can_be_seen(turf/location) // Check for darkness diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm index 62d5d233851..ec347654d46 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm @@ -49,19 +49,19 @@ health_full_behaviour() /mob/living/basic/migo/proc/health_full_behaviour() - set_varspeed(1) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/netherworld_enrage, multiplicative_slowdown = 0) dodge_prob = 10 /mob/living/basic/migo/proc/health_high_behaviour() - set_varspeed(0.5) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/netherworld_enrage, multiplicative_slowdown = -0.5) dodge_prob = 20 /mob/living/basic/migo/proc/health_medium_behaviour() - set_varspeed(0) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/netherworld_enrage, multiplicative_slowdown = -1) dodge_prob = 30 /mob/living/basic/migo/proc/health_low_behaviour() - set_varspeed(-0.5) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/netherworld_enrage, multiplicative_slowdown = -1.5) dodge_prob = 50 /mob/living/basic/migo/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index 2abca82218c..604f10e76df 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -61,7 +61,7 @@ ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk planning_subtrees = list( - /datum/ai_planning_subtree/random_speech/cockroach, + /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/find_and_hunt_target/roach, ) @@ -94,7 +94,7 @@ /datum/ai_controller/basic_controller/cockroach/glockroach planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, - /datum/ai_planning_subtree/random_speech/cockroach, + /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/basic_ranged_attack_subtree/glockroach, //If we are attacking someone, this will prevent us from hunting /datum/ai_planning_subtree/find_and_hunt_target/roach, @@ -140,7 +140,7 @@ /datum/ai_controller/basic_controller/cockroach/hauberoach planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, - /datum/ai_planning_subtree/random_speech/cockroach, + /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/basic_melee_attack_subtree/hauberoach, //If we are attacking someone, this will prevent us from hunting /datum/ai_planning_subtree/find_and_hunt_target/roach, @@ -155,7 +155,7 @@ /datum/ai_controller/basic_controller/cockroach/sewer planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, - /datum/ai_planning_subtree/random_speech/cockroach, + /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/basic_melee_attack_subtree/sewer, /datum/ai_planning_subtree/find_and_hunt_target/roach, @@ -176,7 +176,7 @@ /datum/ai_controller/basic_controller/cockroach/mobroach planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, - /datum/ai_planning_subtree/random_speech/cockroach, + /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/basic_ranged_attack_subtree/mobroach, //If we are attacking someone, this will prevent us from hunting /datum/ai_planning_subtree/find_and_hunt_target/roach, diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6c919e66804..172efdca851 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1349,8 +1349,8 @@ /mob/living/simple_animal/hostile/retaliate/bat, /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/hostile/killertomato, - /mob/living/simple_animal/hostile/giant_spider, - /mob/living/simple_animal/hostile/giant_spider/hunter, + /mob/living/basic/giant_spider, + /mob/living/basic/giant_spider/hunter, /mob/living/simple_animal/hostile/blob/blobbernaut/independent, /mob/living/basic/carp/magic, /mob/living/basic/carp/magic/chaos, diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm deleted file mode 100644 index 5512880978d..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ /dev/null @@ -1,421 +0,0 @@ -/** - * # Giant Spider - * - * A versatile mob which can occur from a variety of sources. - * - * A mob which can be created by botany or xenobiology. The basic type is the guard, which is slower but sturdy and outputs good damage. - * All spiders can produce webbing. Currently does not inject toxin into its target. - */ -/mob/living/simple_animal/hostile/giant_spider - 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" - mob_biotypes = MOB_ORGANIC|MOB_BUG - speak_emote = list("chitters") - emote_hear = list("chitters") - speak_chance = 5 - speed = 0 - turns_per_move = 5 - 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 - maxHealth = 80 - health = 80 - damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) - flammable = TRUE - 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("spiders") - pass_flags = PASSTABLE - move_to_delay = 6 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - unique_name = 1 - gold_core_spawnable = HOSTILE_SPAWN - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - see_in_dark = NIGHTVISION_FOV_RANGE - footstep_type = FOOTSTEP_MOB_CLAW - ///How much of a reagent the mob injects on attack - var/poison_per_bite = 0 - ///What reagent the mob injects targets with - var/poison_type = /datum/reagent/toxin/hunterspider - ///How quickly the spider can place down webbing. One is base speed, larger numbers are slower. - var/web_speed = 1 - ///What action is used to lay webs, some spiders have a version which can turn webs into walls. - 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 = "Versatile spider variant for frontline combat with high health and damage." - -/mob/living/simple_animal/hostile/giant_spider/Initialize(mapload) - . = ..() - var/datum/action/cooldown/lay_web/webbing = new web_type(src) - webbing.webbing_time *= web_speed - webbing.Grant(src) - - if(poison_per_bite) - AddElement(/datum/element/venomous, poison_type, poison_per_bite) - 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!") - -/mob/living/simple_animal/hostile/giant_spider/Login() - . = ..() - if(!. || !client) - return FALSE - var/datum/antagonist/spider/spider_antag = new(directive) - mind.add_antag_datum(spider_antag) - GLOB.spidermobs[src] = TRUE - -/mob/living/simple_animal/hostile/giant_spider/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/simple_animal/hostile/giant_spider/mob_negates_gravity() - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/mob/living/simple_animal/hostile/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) - -/** - * # Spider Hunter - * - * A subtype of the giant spider with purple eyes and toxin injection. - * - * 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/simple_animal/hostile/giant_spider/hunter - name = "hunter spider" - desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes." - icon_state = "hunter" - icon_living = "hunter" - icon_dead = "hunter_dead" - maxHealth = 50 - health = 50 - melee_damage_lower = 15 - melee_damage_upper = 20 - poison_per_bite = 5 - move_to_delay = 5 - speed = -0.1 - menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less health and damage." - -/** - * # Spider Nurse - * - * A subtype of the giant spider with green eyes that specializes in support. - * - * 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/simple_animal/hostile/giant_spider/nurse - name = "nurse spider" - desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes." - icon_state = "nurse" - icon_living = "nurse" - icon_dead = "nurse_dead" - gender = FEMALE - butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8, /obj/item/food/spidereggs = 4) - maxHealth = 40 - health = 40 - melee_damage_lower = 5 - melee_damage_upper = 10 - web_speed = 0.25 - web_type = /datum/action/cooldown/lay_web/sealer - menu_description = "Support spider variant specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage." - ///The health HUD applied to the mob. - var/health_hud = DATA_HUD_MEDICAL_ADVANCED - -/mob/living/simple_animal/hostile/giant_spider/nurse/Initialize(mapload) - . = ..() - var/datum/atom_hud/datahud = GLOB.huds[health_hud] - datahud.show_to(src) - AddComponent(\ - /datum/component/healing_touch,\ - interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/simple_animal/hostile/giant_spider)),\ - action_text = "%SOURCE% begins wrapping the wounds of %TARGET%.",\ - complete_text = "%SOURCE% wraps the wounds of %TARGET%.",\ - ) - -/** - * # Tarantula - * - * The tank of spider subtypes. Is incredibly slow when not on webbing, but has a lunge and the highest health and damage of any spider type. - * - * A subtype of the giant spider which specializes in pure strength and staying power. Is slowed down greatly when not on webbing, but can lunge - * to throw off attackers and possibly to stun them, allowing the tarantula to net an easy kill. - */ -/mob/living/simple_animal/hostile/giant_spider/tarantula - name = "tarantula" - desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes." - icon_state = "tarantula" - icon_living = "tarantula" - icon_dead = "tarantula_dead" - maxHealth = 300 // woah nelly - health = 300 - melee_damage_lower = 35 - melee_damage_upper = 40 - obj_damage = 100 - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - move_to_delay = 8 - speed = 1 - mob_size = MOB_SIZE_LARGE - gold_core_spawnable = NO_SPAWN - menu_description = "Tank spider variant with an enormous amount of health and damage, but is very slow when not on webbing. It also has a charge ability to close distance with a target after a small windup." - /// Charging ability - var/datum/action/cooldown/mob_cooldown/charge/basic_charge/charge - -/mob/living/simple_animal/hostile/giant_spider/tarantula/Initialize(mapload) - . = ..() - charge = new /datum/action/cooldown/mob_cooldown/charge/basic_charge() - charge.Grant(src) - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/tarantula_web) - -/mob/living/simple_animal/hostile/giant_spider/tarantula/Destroy() - QDEL_NULL(charge) - return ..() - -/mob/living/simple_animal/hostile/giant_spider/tarantula/OpenFire() - if(client) - return - charge.Trigger(target = target) - -/** - * # Spider Viper - * - * The assassin of spider subtypes. Essentially a juiced up version of the hunter. - * - * A subtype of the giant spider which specializes in speed and poison. Injects a deadlier toxin than other spiders, moves extremely fast, - * but like the hunter has a limited amount of health. - */ -/mob/living/simple_animal/hostile/giant_spider/viper - name = "viper spider" - desc = "Furry and black, it makes you shudder to look at it. This one has effervescent purple eyes." - icon_state = "viper" - icon_living = "viper" - icon_dead = "viper_dead" - maxHealth = 40 - health = 40 - melee_damage_lower = 5 - melee_damage_upper = 5 - poison_per_bite = 5 - move_to_delay = 4 - poison_type = /datum/reagent/toxin/viperspider - speed = -0.5 - 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." - -/** - * # Spider Broodmother - * - * The reproductive line of spider subtypes. Is the only subtype to lay eggs, which is the only way for spiders to reproduce. - * - * A subtype of the giant spider which is the crux of a spider horde. Can lay normal eggs at any time which become normal spider types, - * but by consuming human bodies can lay special eggs which can become one of the more specialized subtypes, including possibly another broodmother. - * However, this spider subtype has no offensive capability and can be quickly dispatched without assistance from other spiders. They are also capable - * of sending messages to all living spiders, being a communication line for the rest of the horde. - */ -/mob/living/simple_animal/hostile/giant_spider/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 - icon_state = "midwife" - icon_living = "midwife" - icon_dead = "midwife_dead" - maxHealth = 60 - health = 60 - melee_damage_lower = 10 - melee_damage_upper = 15 - gold_core_spawnable = NO_SPAWN - web_speed = 0.5 - web_type = /datum/action/cooldown/lay_web/sealer - menu_description = "Royal spider variant specializing in reproduction and leadership, but has very low amount of health and deals low damage." - -/mob/living/simple_animal/hostile/giant_spider/midwife/Initialize(mapload) - . = ..() - var/datum/action/cooldown/wrap/wrapping = new(src) - wrapping.Grant(src) - - var/datum/action/lay_eggs/make_eggs = new(src) - make_eggs.Grant(src) - - var/datum/action/lay_eggs/enriched/make_better_eggs = new(src) - make_better_eggs.Grant(src) - - var/datum/action/set_spider_directive/give_orders = new(src) - give_orders.Grant(src) - - var/datum/action/command_spiders/not_hivemind_talk = new(src) - not_hivemind_talk.Grant(src) - -/** - * # Giant Ice Spider - * - * A giant spider immune to temperature damage. Injects frost oil. - * - * 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/simple_animal/hostile/giant_spider/ice - name = "giant ice spider" - atmos_requirements = 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) - minbodytemp = 0 - maxbodytemp = 1500 - poison_type = /datum/reagent/consumable/frostoil - color = rgb(114,228,250) - gold_core_spawnable = NO_SPAWN - menu_description = "Versatile ice spider variant for frontline combat with high health and damage. Immune to temperature damage." - -/** - * # Ice Nurse Spider - * - * A nurse spider immune to temperature damage. Injects frost oil. - * - * Same thing as the giant ice spider but mirrors the nurse subtype. Also unused. - */ -/mob/living/simple_animal/hostile/giant_spider/nurse/ice - name = "giant ice spider" - atmos_requirements = 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) - minbodytemp = 0 - maxbodytemp = 1500 - poison_type = /datum/reagent/consumable/frostoil - color = rgb(114,228,250) - menu_description = "Support ice spider variant specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage. Immune to temperature damage." - -/** - * # Ice Hunter Spider - * - * A hunter spider immune to temperature damage. Injects frost oil. - * - * Same thing as the giant ice spider but mirrors the hunter subtype. Also unused. - */ -/mob/living/simple_animal/hostile/giant_spider/hunter/ice - name = "giant ice spider" - atmos_requirements = 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) - minbodytemp = 0 - maxbodytemp = 1500 - poison_type = /datum/reagent/consumable/frostoil - color = rgb(114,228,250) - gold_core_spawnable = NO_SPAWN - menu_description = "Fast ice spider variant specializing in catching running prey and frost oil injection, but has less health and damage. Immune to temperature damage." - -/** - * # Scrawny Hunter Spider - * - * A hunter spider that trades damage for health, unable to smash enviroments. - * - * Mainly used as a minor threat in abandoned places, such as areas in maintenance or a ruin. - */ -/mob/living/simple_animal/hostile/giant_spider/hunter/scrawny - name = "scrawny spider" - environment_smash = ENVIRONMENT_SMASH_NONE - health = 60 - maxHealth = 60 - melee_damage_lower = 5 - melee_damage_upper = 10 - desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes, and looks abnormally thin and frail." - menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less damage than a normal hunter spider at the cost of a little more health." - -/** - * # Scrawny Tarantula - * - * A weaker version of the Tarantula, unable to smash enviroments. - * - * Mainly used as a moderately strong but slow threat in abandoned places, such as areas in maintenance or a ruin. - */ -/mob/living/simple_animal/hostile/giant_spider/tarantula/scrawny - name = "scrawny tarantula" - environment_smash = ENVIRONMENT_SMASH_NONE - health = 150 - maxHealth = 150 - melee_damage_lower = 20 - melee_damage_upper = 25 - desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes, and looks abnormally thin and frail." - menu_description = "A weaker variant of the tarantula with reduced amount of health and damage, very slow when not on webbing. It also has a charge ability to close distance with a target after a small windup." - -/** - * # Scrawny Nurse Spider - * - * A weaker version of the nurse spider with reduced health, unable to smash enviroments. - * - * Mainly used as a weak threat in abandoned places, such as areas in maintenance or a ruin. - */ -/mob/living/simple_animal/hostile/giant_spider/nurse/scrawny - name = "scrawny nurse spider" - environment_smash = ENVIRONMENT_SMASH_NONE - health = 30 - maxHealth = 30 - desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes, and looks abnormally thin and frail." - menu_description = "Weaker version of the nurse spider, specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage." - -/** - * # Flesh Spider - * - * A giant spider subtype specifically created by changelings. Built to be self-sufficient, unlike other spider types. - * - * A subtype of giant spider which only occurs from changelings. Has the base stats of a hunter, but they can heal themselves. - * They also produce web in 70% of the time of the base spider. They also occasionally leave puddles of blood when they walk around. Flavorful! - */ -/mob/living/simple_animal/hostile/giant_spider/hunter/flesh - desc = "A odd fleshy creature in the shape of a spider. Its eyes are pitch black and soulless." - icon_state = "flesh_spider" - icon_living = "flesh_spider" - icon_dead = "flesh_spider_dead" - web_speed = 0.7 - menu_description = "Self-sufficient spider variant capable of healing themselves and producing webbbing fast, but has less health and damage." - -/mob/living/simple_animal/hostile/giant_spider/hunter/flesh/Initialize(mapload) - . = ..() - AddComponent(/datum/component/blood_walk, \ - blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ - blood_spawn_chance = 5) - AddComponent(\ - /datum/component/healing_touch,\ - heal_brute = maxHealth * 0.5,\ - heal_burn = maxHealth * 0.5,\ - self_targetting = HEALING_TOUCH_SELF_ONLY,\ - interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/simple_animal/hostile/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/simple_animal/hostile/giant_spider/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) - if (on_fire) - balloon_alert(src, "on fire!") - return FALSE - return TRUE - -/** - * # Viper Spider (Wizard) - * - * A viper spider buffed slightly so I don't need to hear anyone complain about me nerfing an already useless wizard ability. - * - * A viper spider with buffed attributes. All I changed was its health value and gave it the ability to ventcrawl. The crux of the wizard meta. - */ -/mob/living/simple_animal/hostile/giant_spider/viper/wizard - maxHealth = 80 - health = 80 - 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." - -/mob/living/simple_animal/hostile/giant_spider/viper/wizard/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index 4d1dac06918..0edc1f31420 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -38,27 +38,3 @@ AddElement(/datum/element/simple_flying) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus //Despite being a bat for... reasons, this is now a spider, and is one of the HoS' pets. - 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." - emote_hear = list("chitters") - faction = list("spiders") - harm_intent_damage = 3 - icon_dead = "guard_dead" - icon_gib = "guard_dead" - icon_living = "guard" - icon_state = "guard" - maxHealth = 250 - health = 250 - melee_damage_lower = 15 - melee_damage_upper = 20 - movement_type = GROUND - response_help_continuous = "pets" - response_help_simple = "pet" - turns_per_move = 10 - -/mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus/Initialize(mapload) - . = ..() - AddElement(/datum/element/pet_bonus, "chitters proudly!") diff --git a/code/modules/mob_spawn/ghost_roles/spider_roles.dm b/code/modules/mob_spawn/ghost_roles/spider_roles.dm index 13415939035..83f8fb537a7 100644 --- a/code/modules/mob_spawn/ghost_roles/spider_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/spider_roles.dm @@ -59,9 +59,9 @@ var/obj/structure/spider/eggcluster/egg /// The types of spiders that the spawner can produce var/list/potentialspawns = list( - /mob/living/simple_animal/hostile/giant_spider, - /mob/living/simple_animal/hostile/giant_spider/hunter, - /mob/living/simple_animal/hostile/giant_spider/nurse, + /mob/living/basic/giant_spider, + /mob/living/basic/giant_spider/hunter, + /mob/living/basic/giant_spider/nurse, ) /obj/effect/mob_spawn/ghost_role/spider/Initialize(mapload) @@ -102,7 +102,7 @@ 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/simple_animal/hostile/giant_spider/spawned_mob, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/giant_spider/spawned_mob, mob/mob_possessor) spawned_mob.directive = directive egg.spawner = null QDEL_NULL(egg) @@ -114,9 +114,9 @@ you_are_text = "You are an enriched spider." cluster_type = /obj/structure/spider/eggcluster/enriched potentialspawns = list( - /mob/living/simple_animal/hostile/giant_spider/tarantula, - /mob/living/simple_animal/hostile/giant_spider/viper, - /mob/living/simple_animal/hostile/giant_spider/midwife, + /mob/living/basic/giant_spider/tarantula, + /mob/living/basic/giant_spider/viper, + /mob/living/basic/giant_spider/midwife, ) /obj/effect/mob_spawn/ghost_role/spider/bloody @@ -127,7 +127,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/simple_animal/hostile/giant_spider/hunter/flesh, + /mob/living/basic/giant_spider/hunter/flesh, ) /obj/effect/mob_spawn/ghost_role/spider/midwife @@ -137,7 +137,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/simple_animal/hostile/giant_spider/midwife, + /mob/living/basic/giant_spider/midwife, ) /** @@ -153,7 +153,7 @@ var/list/spider_list = list() var/list/display_spiders = list() for(var/choice in potentialspawns) - var/mob/living/simple_animal/hostile/giant_spider/spider = choice + var/mob/living/basic/giant_spider/spider = choice spider_list[initial(spider.name)] = choice var/datum/radial_menu_choice/option = new diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 03e51a533d5..675e01f1e53 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -131,3 +131,9 @@ /datum/movespeed_modifier/auto_wash multiplicative_slowdown = 3 + +/datum/movespeed_modifier/player_spider_modifier + variable = TRUE + +/datum/movespeed_modifier/netherworld_enrage + variable = TRUE diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 0c788f4a0d7..2934306b3c6 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -126,7 +126,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/simple_animal/hostile/giant_spider/midwife, FACTION_NEUTRAL, FALSE), 50) + addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/basic/giant_spider/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 3079a7d5b86..95ca1a81dab 100644 --- a/code/modules/spells/spell_types/shapeshift/shapechange.dm +++ b/code/modules/spells/spell_types/shapeshift/shapechange.dm @@ -15,6 +15,6 @@ /mob/living/basic/pet/dog/corgi, /mob/living/basic/carp/magic/chaos, /mob/living/simple_animal/bot/secbot/ed209, - /mob/living/simple_animal/hostile/giant_spider/viper/wizard, + /mob/living/basic/giant_spider/viper/wizard, /mob/living/simple_animal/hostile/construct/juggernaut/mystic, ) diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 3e4f7f0cf51..823483f7251 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -149,20 +149,6 @@ /mob/living/simple_animal/hostile/construct/wraith/noncult, /mob/living/simple_animal/hostile/dark_wizard, /mob/living/simple_animal/hostile/eyeball, - /mob/living/simple_animal/hostile/giant_spider, - /mob/living/simple_animal/hostile/giant_spider/hunter, - /mob/living/simple_animal/hostile/giant_spider/hunter/flesh, - /mob/living/simple_animal/hostile/giant_spider/hunter/ice, - /mob/living/simple_animal/hostile/giant_spider/hunter/scrawny, - /mob/living/simple_animal/hostile/giant_spider/ice, - /mob/living/simple_animal/hostile/giant_spider/midwife, - /mob/living/simple_animal/hostile/giant_spider/nurse, - /mob/living/simple_animal/hostile/giant_spider/nurse/ice, - /mob/living/simple_animal/hostile/giant_spider/nurse/scrawny, - /mob/living/simple_animal/hostile/giant_spider/tarantula, - /mob/living/simple_animal/hostile/giant_spider/tarantula/scrawny, - /mob/living/simple_animal/hostile/giant_spider/viper, - /mob/living/simple_animal/hostile/giant_spider/viper/wizard, /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/hostile/gorilla/cargo_domestic, /mob/living/simple_animal/hostile/guardian, @@ -256,7 +242,6 @@ /mob/living/simple_animal/hostile/regalrat/controlled, /mob/living/simple_animal/hostile/retaliate, /mob/living/simple_animal/hostile/retaliate/bat, - /mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus, /mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, diff --git a/tgstation.dme b/tgstation.dme index 3c4307df1b4..d8e35cb977b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3764,9 +3764,10 @@ #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_vileworm.dm" #include "code\modules\mob\living\basic\pets\dog.dm" #include "code\modules\mob\living\basic\pets\pet.dm" -#include "code\modules\mob\living\basic\retaliate\garden_gnome.dm" -#include "code\modules\mob\living\basic\retaliate\ghost.dm" #include "code\modules\mob\living\basic\ruin_defender\stickman.dm" +#include "code\modules\mob\living\basic\space_fauna\faithless.dm" +#include "code\modules\mob\living\basic\space_fauna\garden_gnome.dm" +#include "code\modules\mob\living\basic\space_fauna\ghost.dm" #include "code\modules\mob\living\basic\space_fauna\carp\carp.dm" #include "code\modules\mob\living\basic\space_fauna\carp\carp_abilities.dm" #include "code\modules\mob\living\basic\space_fauna\carp\carp_ai_actions.dm" @@ -3775,7 +3776,9 @@ #include "code\modules\mob\living\basic\space_fauna\carp\carp_controllers.dm" #include "code\modules\mob\living\basic\space_fauna\carp\magicarp.dm" #include "code\modules\mob\living\basic\space_fauna\carp\megacarp.dm" -#include "code\modules\mob\living\basic\space_fauna\faithless\faithless.dm" +#include "code\modules\mob\living\basic\space_fauna\giant_spider\giant_spider.dm" +#include "code\modules\mob\living\basic\space_fauna\giant_spider\giant_spider_ai.dm" +#include "code\modules\mob\living\basic\space_fauna\giant_spider\spider_variants.dm" #include "code\modules\mob\living\basic\space_fauna\giant_spider\spider_abilities\hivemind.dm" #include "code\modules\mob\living\basic\space_fauna\giant_spider\spider_abilities\lay_eggs.dm" #include "code\modules\mob\living\basic\space_fauna\giant_spider\spider_abilities\web.dm" @@ -3996,7 +3999,6 @@ #include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" #include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" -#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" #include "code\modules\mob\living\simple_animal\hostile\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" #include "code\modules\mob\living\simple_animal\hostile\heretic_monsters.dm" diff --git a/tools/UpdatePaths/Scripts/73350_simple_spiders_to_basic.txt b/tools/UpdatePaths/Scripts/73350_simple_spiders_to_basic.txt new file mode 100644 index 00000000000..090a8ef6340 --- /dev/null +++ b/tools/UpdatePaths/Scripts/73350_simple_spiders_to_basic.txt @@ -0,0 +1,4 @@ +# transforms simple spiders to the new basic spiders + +/mob/living/simple_animal/hostile/giant_spider/@SUBTYPES : /mob/living/basic/giant_spider/@SUBTYPES{@OLD} +/mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus : /mob/living/basic/giant_spider/sgt_araneus{@OLD}