Merge pull request #2626 from CHOMPStationBot/upstream-merge-11197

[MIRROR] Expands spider features
This commit is contained in:
Nadyr
2021-07-22 18:26:01 -04:00
committed by GitHub
7 changed files with 388 additions and 5 deletions

View File

@@ -93,6 +93,7 @@
var/spiders_min = 6
var/spiders_max = 24
var/spider_type = /obj/effect/spider/spiderling
var/faction = "spiders"
/obj/effect/spider/eggcluster/Initialize()
pixel_x = rand(3,-3)
@@ -121,9 +122,10 @@
O = loc
for(var/i=0, i<num, i++)
var/spiderling = new spider_type(src.loc, src)
var/obj/effect/spider/spiderling/spiderling = new spider_type(src.loc, src)
if(O)
O.implants += spiderling
spiderling.faction = faction
qdel(src)
/obj/effect/spider/eggcluster/small
@@ -133,6 +135,11 @@
/obj/effect/spider/eggcluster/small/frost
spider_type = /obj/effect/spider/spiderling/frost
/obj/effect/spider/eggcluster/royal
spiders_min = 2
spiders_max = 5
spider_type = /obj/effect/spider/spiderling/varied
/obj/effect/spider/spiderling
name = "spiderling"
desc = "It never stays still for long."
@@ -145,12 +152,20 @@
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
var/travelling_in_vent = 0
var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter)
var/faction = "spiders"
var/stunted = FALSE
/obj/effect/spider/spiderling/frost
grow_as = list(/mob/living/simple_mob/animal/giant_spider/frost)
/obj/effect/spider/spiderling/varied
grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter,
/mob/living/simple_mob/animal/giant_spider/frost, /mob/living/simple_mob/animal/giant_spider/electric, /mob/living/simple_mob/animal/giant_spider/lurker,
/mob/living/simple_mob/animal/giant_spider/pepper, /mob/living/simple_mob/animal/giant_spider/thermic, /mob/living/simple_mob/animal/giant_spider/tunneler,
/mob/living/simple_mob/animal/giant_spider/webslinger, /mob/living/simple_mob/animal/giant_spider/phorogenic, /mob/living/simple_mob/animal/giant_spider/carrier,
/mob/living/simple_mob/animal/giant_spider/ion)
/obj/effect/spider/spiderling/New(var/location, var/atom/parent)
pixel_x = rand(6,-6)
pixel_y = rand(6,-6)
@@ -260,6 +275,7 @@
if(amount_grown >= 100)
var/spawn_type = pick(grow_as)
var/mob/living/simple_mob/animal/giant_spider/GS = new spawn_type(src.loc, src)
GS.faction = faction
if(stunted)
spawn(2)
GS.make_spiderling()
@@ -273,6 +289,15 @@
/obj/effect/spider/spiderling/non_growing
amount_grown = -1
/obj/effect/spider/spiderling/princess
name = "royal spiderling"
desc = "There's a special aura about this one."
grow_as = list(/mob/living/simple_mob/animal/giant_spider/nurse/queen)
/obj/effect/spider/spiderling/princess/New(var/location, var/atom/parent)
..()
amount_grown = 50
/obj/effect/decal/cleanable/spiderling_remains
name = "spiderling remains"
desc = "Green squishy mess."

View File

@@ -0,0 +1,189 @@
/mob/living/simple_mob/animal/giant_spider/broodmother
name = "giant spider broodmother"
desc = "Absolutely gigantic, this creature is horror itself. This one seems to have weaponized childbirth!"
tt_desc = "X Atrax robustus gigantus maximus"
icon = 'icons/mob/64x64.dmi'
vis_height = 64
icon_state = "spider_queen"
icon_living = "spider_queen"
icon_dead = "spider_queen_dead"
maxHealth = 800
health = 800
melee_damage_lower = 25
melee_damage_upper = 40
attack_armor_pen = 15
pixel_x = -16
pixel_y = 0
default_pixel_x = -16
old_x = -16
old_y = 0
projectiletype = /obj/item/projectile/energy/spidertoxin
projectilesound = 'sound/weapons/pierce.ogg'
var/list/possible_brood_types = list(
/mob/living/simple_mob/animal/giant_spider/frost/broodling,
/mob/living/simple_mob/animal/giant_spider/electric/broodling,
/mob/living/simple_mob/animal/giant_spider/hunter/broodling,
/mob/living/simple_mob/animal/giant_spider/lurker/broodling,
/mob/living/simple_mob/animal/giant_spider/nurse/broodling,
/mob/living/simple_mob/animal/giant_spider/pepper/broodling,
/mob/living/simple_mob/animal/giant_spider/thermic/broodling,
/mob/living/simple_mob/animal/giant_spider/tunneler/broodling,
/mob/living/simple_mob/animal/giant_spider/webslinger/broodling,
/mob/living/simple_mob/animal/giant_spider/broodling)
var/list/possible_death_brood_types = list(
/mob/living/simple_mob/animal/giant_spider/frost,
/mob/living/simple_mob/animal/giant_spider/electric,
/mob/living/simple_mob/animal/giant_spider/hunter,
/mob/living/simple_mob/animal/giant_spider/lurker,
/mob/living/simple_mob/animal/giant_spider/pepper,
/mob/living/simple_mob/animal/giant_spider/thermic,
/mob/living/simple_mob/animal/giant_spider/tunneler,
/mob/living/simple_mob/animal/giant_spider/webslinger,
/mob/living/simple_mob/animal/giant_spider/phorogenic,
/mob/living/simple_mob/animal/giant_spider/carrier,
/mob/living/simple_mob/animal/giant_spider)
var/max_brood = 8
var/death_brood = 8
var/brood_per_spawn = 4
var/brood_per_launch = 2
special_attack_min_range = 0
special_attack_max_range = 10
special_attack_cooldown = 6 SECONDS
ai_holder_type = /datum/ai_holder/simple_mob/intentional/giant_spider_broodmother
poison_per_bite = 2
poison_type = "cyanide"
/obj/item/projectile/energy/spidertoxin
name = "concentrated spidertoxin"
icon_state = "neurotoxin"
damage = 35
damage_type = BIOACID
agony = 15
check_armour = "bio"
armor_penetration = 40
combustion = FALSE
/mob/living/simple_mob/animal/giant_spider/broodmother/death()
..()
new /obj/item/royal_spider_egg(src.loc)
var/count = 0
while(count < death_brood)
var/broodling_type = pick(possible_death_brood_types)
var/mob/living/simple_mob/animal/giant_spider/broodling = new broodling_type(src.loc)
broodling.faction = faction
step_away(broodling, src)
count++
visible_message(span("critical", "\The [src]'s birthing sack bursts!"))
/mob/living/simple_mob/animal/giant_spider/broodmother/proc/spawn_brood(atom/A)
set waitfor = FALSE
var/count = 0
while(count < brood_per_spawn)
var/broodling_type = pick(possible_brood_types)
var/mob/living/simple_mob/animal/giant_spider/broodling = new broodling_type(src.loc)
broodling.faction = faction
step_away(broodling, src)
count++
visible_message(span("danger", "\The [src] releases brood from its birthing sack!"))
/mob/living/simple_mob/animal/giant_spider/broodmother/proc/launch_brood(atom/A)
set waitfor = FALSE
var/count = 0
while(count < brood_per_launch)
var/broodling_type = pick(possible_brood_types)
var/mob/living/simple_mob/animal/giant_spider/broodling = new broodling_type(src.loc)
broodling.faction = faction
step_away(broodling, src)
broodling.throw_at(A, 10)
count++
visible_message(span("danger", "\The [src] launches brood from the distance!"))
/mob/living/simple_mob/animal/giant_spider/broodmother/proc/can_spawn_brood()
var/brood_amount = 0
for(var/mob/living/simple_mob/mob in view(7, src))
if(mob.type in possible_brood_types)
brood_amount++
if(brood_amount >= max_brood)
return FALSE
return TRUE
/mob/living/simple_mob/animal/giant_spider/broodmother/should_special_attack(atom/A)
if(!can_spawn_brood())
return FALSE
return TRUE
/mob/living/simple_mob/animal/giant_spider/broodmother/do_special_attack(atom/A)
. = TRUE
switch(a_intent)
if(I_DISARM)
spawn_brood(A)
if(I_HURT)
launch_brood(A)
/datum/ai_holder/simple_mob/intentional/giant_spider_broodmother
wander = TRUE
intelligence_level = AI_SMART
pointblank = FALSE
firing_lanes = TRUE
vision_range = 8
/datum/ai_holder/simple_mob/intentional/giant_spider_broodmother/pre_special_attack(atom/A)
if(isliving(A))
var/mob/living/target = A
var/tally = 0
var/list/potential_targets = list_targets() // Returns list of mobs and certain objects like mechs and turrets.
for(var/atom/movable/AM in potential_targets)
if(get_dist(holder, AM) > 4)
continue
if(!can_attack(AM))
continue
tally++
if(tally > 1)
holder.a_intent = I_DISARM
else if(get_dist(holder, target) > 4)
holder.a_intent = I_HURT
else
holder.a_intent = I_DISARM
else
holder.a_intent = I_DISARM
/obj/item/royal_spider_egg
name = "royal spider egg"
desc = "This one is yet to be imprinted!"
icon = 'icons/obj/egg_new_vr.dmi' //VOREStation Edit
icon_state = "egg_slimeglob"
origin_tech = list(TECH_BIO = 10)
/obj/item/royal_spider_egg/attack_self(mob/user as mob)
var/response = tgui_alert(user, "Are you sure you want to release the royal spiderling right now? It appears ready to imprint the moment its born.", "Royal Spider Egg", list("Yes", "No"))
if(response == "Yes")
var/turf/drop_loc = user.loc
if(istype(drop_loc))
var/obj/effect/spider/spiderling/princess/royalty = new(drop_loc)
royalty.faction = user.faction
qdel(src)
else
to_chat(user, "You need more space to release the egg!")

View File

@@ -0,0 +1,164 @@
/mob/living/simple_mob/animal/giant_spider/frost/broodling
maxHealth = 40
health = 40
melee_damage_lower = 10
melee_damage_upper = 15
movement_cooldown = 4
/mob/living/simple_mob/animal/giant_spider/frost/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/frost/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/mob/living/simple_mob/animal/giant_spider/electric/broodling
maxHealth = 30
health = 30
taser_kill = TRUE
base_attack_cooldown = 20
movement_cooldown = 5
/mob/living/simple_mob/animal/giant_spider/electric/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/electric/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/mob/living/simple_mob/animal/giant_spider/hunter/broodling
maxHealth = 40
health = 40
movement_cooldown = 3
/mob/living/simple_mob/animal/giant_spider/hunter/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/hunter/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/mob/living/simple_mob/animal/giant_spider/lurker/broodling
maxHealth = 40
health = 40
movement_cooldown = 3
/mob/living/simple_mob/animal/giant_spider/lurker/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/lurker/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/mob/living/simple_mob/animal/giant_spider/nurse/broodling
maxHealth = 60
health = 60
movement_cooldown = 8
ai_holder_type = /datum/ai_holder/simple_mob/melee
/mob/living/simple_mob/animal/giant_spider/nurse/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/nurse/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/mob/living/simple_mob/animal/giant_spider/pepper/broodling
maxHealth = 40
health = 40
movement_cooldown = 4
/mob/living/simple_mob/animal/giant_spider/pepper/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/pepper/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/mob/living/simple_mob/animal/giant_spider/thermic/broodling
maxHealth = 40
health = 40
melee_damage_lower = 10
melee_damage_upper = 15
movement_cooldown = 4
/mob/living/simple_mob/animal/giant_spider/thermic/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/thermic/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/mob/living/simple_mob/animal/giant_spider/tunneler/broodling
maxHealth = 40
health = 40
movement_cooldown = 4
/mob/living/simple_mob/animal/giant_spider/tunneler/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/tunneler/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/mob/living/simple_mob/animal/giant_spider/webslinger/broodling
maxHealth = 30
health = 30
base_attack_cooldown = 20
movement_cooldown = 5
/mob/living/simple_mob/animal/giant_spider/webslinger/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/webslinger/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)
/mob/living/simple_mob/animal/giant_spider/broodling
maxHealth = 60
health = 60
melee_damage_lower = 10
melee_damage_upper = 20
movement_cooldown = 8
/mob/living/simple_mob/animal/giant_spider/broodling/Initialize()
. = ..()
adjust_scale(0.75)
addtimer(CALLBACK(src, .proc/death), 2 MINUTES)
/mob/living/simple_mob/animal/giant_spider/broodling/death()
new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
qdel(src)

View File

@@ -37,7 +37,6 @@
var/spiderling_count = 0
var/spiderling_type = /obj/effect/spider/spiderling
var/swarmling_type = /mob/living/simple_mob/animal/giant_spider/hunter
var/swarmling_faction = "spiders"
var/swarmling_prob = 10 // Odds that a spiderling will be a swarmling instead.
/mob/living/simple_mob/animal/giant_spider/carrier/Initialize()
@@ -60,7 +59,7 @@
swarmling.health = swarm_health
swarmling.melee_damage_lower = swarm_dam_lower
swarmling.melee_damage_upper = swarm_dam_upper
swarmling.faction = swarmling_faction
swarmling.faction = faction
swarmling.adjust_scale(0.75)
new_spiders += swarmling
else if(src)

View File

@@ -52,6 +52,8 @@
old_x = -16
old_y = 0
egg_type = /obj/effect/spider/eggcluster/royal
/mob/living/simple_mob/animal/giant_spider/webslinger/event // YW CHANGE
ai_holder_type = /datum/ai_holder/simple_mob/event

View File

@@ -65,8 +65,9 @@
for(var/obj/effect/spider/eggcluster/E in O.implants)
eggcount++
if(!eggcount)
var/eggs = new egg_type(O, src)
var/obj/effect/spider/eggcluster/eggs = new egg_type(O, src)
O.implants += eggs
eggs.faction = faction
to_chat(H, span("critical", "\The [src] injects something into your [O.name]!") ) // Oh god its laying eggs in me!
// Webs target in a web if able to.
@@ -205,7 +206,8 @@
return FALSE // Spamclick protection.
set_AI_busy(FALSE)
new egg_type(T)
var/obj/effect/spider/eggcluster/eggs = new egg_type(T)
eggs.faction = faction
fed--
laying_eggs = FALSE
return TRUE

View File

@@ -3100,6 +3100,8 @@
#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\cow.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\goat.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\_giant_spider.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\broodmother.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\broodmother_spawn.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\carrier.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\electric.dm"
#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\frost.dm"