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

🆑
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.
/🆑
This commit is contained in:
Jacquerel
2023-02-13 05:22:26 +00:00
committed by GitHub
parent d7d4a8d753
commit cbbf7b3613
38 changed files with 591 additions and 540 deletions
+1 -1
View File
@@ -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;
+7 -7
View File
@@ -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"
},
+5 -5
View File
@@ -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" = (
+4 -4
View File
@@ -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" = (
+1 -1
View File
@@ -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" = (
+4 -4
View File
@@ -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" = (
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)),
@@ -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.")
@@ -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
+2 -2
View File
@@ -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,
@@ -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
+9 -9
View File
@@ -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)
+1 -1
View File
@@ -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,
))
@@ -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
+1 -1
View File
@@ -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)
@@ -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)
+23 -2
View File
@@ -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
@@ -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)
@@ -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
@@ -62,7 +62,7 @@
if(!message)
return
var/my_message = span_spider("<b>Command from [user]:</b> [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)
@@ -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)
@@ -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
@@ -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)
@@ -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,
+2 -2
View File
@@ -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,
@@ -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)
@@ -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!")
@@ -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
+6
View File
@@ -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
@@ -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
@@ -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,
)
@@ -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,
+6 -4
View File
@@ -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"
@@ -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}