mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 02:09:41 +00:00
Merge pull request #2626 from CHOMPStationBot/upstream-merge-11197
[MIRROR] Expands spider features
This commit is contained in:
@@ -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."
|
||||
|
||||
@@ -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!")
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -51,6 +51,8 @@
|
||||
default_pixel_x = -16
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user