diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 4c8a2654fa..62a5b8c80e 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(ai_list) GLOBAL_LIST_EMPTY(pai_list) GLOBAL_LIST_EMPTY(available_ai_shells) GLOBAL_LIST_EMPTY(simple_animals) +GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs GLOBAL_LIST_EMPTY(language_datum_instances) GLOBAL_LIST_EMPTY(all_languages) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 84c75270f9..400cd0478e 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -103,6 +103,15 @@ /obj/structure/spider/spiderling/nurse grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse +/obj/structure/spider/spiderling/midwife + grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife + +/obj/structure/spider/spiderling/viper + grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper + +/obj/structure/spider/spiderling/tarantula + grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/tarantula + /obj/structure/spider/spiderling/Collide(atom/user) if(istype(user, /obj/structure/table)) src.loc = user.loc @@ -171,7 +180,10 @@ amount_grown += rand(0,2) if(amount_grown >= 100) if(!grow_as) - grow_as = pick(/mob/living/simple_animal/hostile/poison/giant_spider, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /mob/living/simple_animal/hostile/poison/giant_spider/nurse) + if(prob(3)) + grow_as = pick(/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife) + else + grow_as = pick(/mob/living/simple_animal/hostile/poison/giant_spider, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /mob/living/simple_animal/hostile/poison/giant_spider/nurse) var/mob/living/simple_animal/hostile/poison/giant_spider/S = new grow_as(src.loc) S.poison_per_bite = poison_per_bite S.poison_type = poison_type diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 564280df02..7e8bd6d2c8 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -15,8 +15,6 @@ if(L.reagents) L.reagents.add_reagent(poison_type, poison_per_bite) - - //basic spider mob, these generally guard nests /mob/living/simple_animal/hostile/poison/giant_spider name = "giant spider" @@ -104,6 +102,64 @@ poison_per_bite = 5 move_to_delay = 5 +//vipers are the rare variant of the hunter, no IMMEDIATE damage but so much poison medical care will be needed fast. +/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper + name = "viper" + 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 = 1 + melee_damage_upper = 1 + poison_per_bite = 12 + move_to_delay = 4 + poison_type = "venom" //all in venom, glass cannon. you bite 5 times and they are DEFINITELY dead, but 40 health and you are extremely obvious. Ambush, maybe? + speed = 1 + +//tarantulas are really tanky, regenerating (maybe), hulky monster but are also extremely slow, so. +/mob/living/simple_animal/hostile/poison/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 + poison_per_bite = 0 + move_to_delay = 8 + speed = 7 + status_flags = NONE + mob_size = MOB_SIZE_LARGE + +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula/movement_delay() + var/turf/T = get_turf(src) + if(locate(/obj/structure/spider/stickyweb) in T) + speed = 2 + else + speed = 7 + . = ..() + +//midwives are the queen of the spiders, can send messages to all them and web faster. That rare round where you get a queen spider and turn your 'for honor' players into 'r6siege' players will be a fun one. +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife + name = "midwife" + desc = "Furry and black, it makes you shudder to look at it. This one has scintillating green eyes." + icon_state = "midwife" + icon_living = "midwife" + icon_dead = "midwife_dead" + maxHealth = 40 + health = 40 + var/datum/action/innate/spider/comm/letmetalkpls + +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize() + . = ..() + letmetalkpls = new + letmetalkpls.Grant(src) + + /mob/living/simple_animal/hostile/poison/giant_spider/ice //spiders dont usually like tempatures of 140 kelvin who knew name = "giant ice spider" atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -296,6 +352,39 @@ busy = SPIDER_IDLE stop_automated_movement = FALSE +/mob/living/simple_animal/hostile/poison/giant_spider/Login() + . = ..() + GLOB.spidermobs[src] = TRUE + +/mob/living/simple_animal/hostile/poison/giant_spider/Destroy() + GLOB.spidermobs -= src + return ..() + +/datum/action/innate/spider/comm + name = "Command" + button_icon_state = "cult_comms" + +/datum/action/innate/spider/comm/IsAvailable() + if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife)) + return FALSE + return TRUE + +/datum/action/innate/spider/comm/Trigger() + var/input = stripped_input(usr, "Input a message for your legions to follow.", "Command", "") + if(QDELETED(src) || !input || !IsAvailable()) + return FALSE + spider_command(usr, input) + return TRUE + +/datum/action/innate/spider/comm/proc/spider_command(mob/living/user, message) + if(!message) + return + var/my_message + my_message = "COMMAND FROM SPIDER QUEEN: [message]" + for(var/mob/living/simple_animal/hostile/poison/giant_spider/M in GLOB.spidermobs) + to_chat(M, my_message) + log_talk(user, "SPIDERCOMMAND: [key_name(user)] : [message]",LOGSAY) + /mob/living/simple_animal/hostile/poison/giant_spider/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(20) diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 8dbe11a55d..038514d22a 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ