mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 16:47:13 +01:00
213 lines
6.6 KiB
Plaintext
213 lines
6.6 KiB
Plaintext
#define NEST_FACTION "nest spawned"
|
|
|
|
/obj/structure/mob_spawner
|
|
name = "nest"
|
|
desc = "A nasty looking pile of sticks and debris."
|
|
icon = 'modular_skyrat/modules/decay_subsystem/icons/nests.dmi'
|
|
icon_state = "nest"
|
|
density = FALSE
|
|
anchored = TRUE
|
|
layer = TABLE_LAYER
|
|
max_integrity = 100
|
|
light_range = 2
|
|
light_power = 1
|
|
light_color = LIGHT_COLOR_LAVA
|
|
var/spawn_delay = 0
|
|
/// What mob to spawn
|
|
var/list/var/monster_types = list(/mob/living/simple_animal/hostile/blackmesa/xen/headcrab)
|
|
/// How many mobs can we spawn?
|
|
var/max_mobs = 3
|
|
var/list/faction = list(NEST_FACTION)
|
|
var/spawned_mobs = 0
|
|
/// How long it takes for a new mob to emerge after being triggered.
|
|
var/spawn_cooldown = 30 SECONDS
|
|
/// How long it takes to regenerate mobs to spawn again
|
|
var/regenerate_time = 20 MINUTES
|
|
var/retaliated = FALSE
|
|
/// How long it takes for us to retaliate again.
|
|
var/retaliate_cooldown = 20 SECONDS
|
|
var/list/registered_turfs = list()
|
|
/// What loot do we spawn upon death?
|
|
var/list/loot = list()
|
|
|
|
/obj/structure/mob_spawner/Initialize()
|
|
. = ..()
|
|
for(var/turf/open/seen_turf in view(5, src))
|
|
registered_turfs += seen_turf
|
|
RegisterSignal(seen_turf, COMSIG_ATOM_ENTERED, .proc/proximity_trigger)
|
|
|
|
/obj/structure/mob_spawner/obj_destruction(damage_flag)
|
|
if(loot)
|
|
for(var/path in loot)
|
|
var/number = loot[path]
|
|
if(!isnum(number))//Default to 1
|
|
number = 1
|
|
for(var/i in 1 to number)
|
|
new path (loc)
|
|
playsound(src, 'sound/effects/blobattack.ogg', 100)
|
|
return ..()
|
|
|
|
|
|
/obj/structure/mob_spawner/Destroy()
|
|
for(var/t in registered_turfs)
|
|
UnregisterSignal(t, COMSIG_ATOM_ENTERED)
|
|
registered_turfs = null
|
|
return ..()
|
|
|
|
/obj/structure/mob_spawner/proc/proximity_trigger(datum/source, atom/movable/AM)
|
|
SIGNAL_HANDLER
|
|
if(spawned_mobs >= max_mobs)
|
|
return
|
|
if(spawn_delay > world.time)
|
|
return
|
|
spawn_delay = world.time + spawn_cooldown
|
|
|
|
if(!isliving(AM))
|
|
return
|
|
|
|
var/mob/living/entered_mob = AM
|
|
|
|
if((NEST_FACTION in entered_mob.faction))
|
|
return
|
|
|
|
var/sound/sound_to_play = pick('modular_skyrat/master_files/sound/effects/rustle1.ogg', 'modular_skyrat/master_files/sound/effects/rustle2.ogg')
|
|
|
|
playsound(src, sound_to_play, 100)
|
|
|
|
do_squish(0.8, 1.2)
|
|
|
|
spawned_mobs++
|
|
|
|
var/chosen_mob_type = pick(monster_types)
|
|
var/mob/living/simple_animal/L = new chosen_mob_type(loc)
|
|
L.flags_1 |= (flags_1 & ADMIN_SPAWNED_1)
|
|
|
|
L.faction = faction
|
|
|
|
visible_message(span_danger("[L] emerges from [src]."))
|
|
|
|
if(spawned_mobs >= max_mobs)
|
|
addtimer(CALLBACK(src, .proc/regenerate_mobs), regenerate_time)
|
|
|
|
/obj/structure/mob_spawner/proc/regenerate_mobs()
|
|
visible_message(span_danger("[src] contorts and wriggles!"))
|
|
spawned_mobs = 0
|
|
|
|
/obj/structure/mob_spawner/attacked_by(obj/item/I, mob/living/user)
|
|
. = ..()
|
|
do_jiggle()
|
|
if(!retaliated)
|
|
visible_message(span_danger("[src] grubbles angrily!"))
|
|
var/chosen_mob_type = pick(monster_types)
|
|
var/mob/living/simple_animal/L = new chosen_mob_type(loc)
|
|
visible_message(span_danger("[L] emerges from [src]."))
|
|
retaliated = TRUE
|
|
addtimer(CALLBACK(src, .proc/ready_retaliate), retaliate_cooldown)
|
|
|
|
/obj/structure/mob_spawner/proc/ready_retaliate()
|
|
retaliated = FALSE
|
|
visible_message(span_danger("[src] calms down."))
|
|
|
|
///////////// CUSTOM SPAWNERS
|
|
|
|
/obj/structure/mob_spawner/spiders
|
|
name = "sticky cobwebs"
|
|
desc = "A mush of sticky cobwebs and nasty looking eggs..."
|
|
icon_state = "nest_spider"
|
|
light_color = LIGHT_COLOR_BLOOD_MAGIC
|
|
monster_types = list(/mob/living/simple_animal/hostile/giant_spider/hunter, /mob/living/simple_animal/hostile/giant_spider)
|
|
loot = list(/obj/item/spider_egg = 4)
|
|
|
|
/obj/item/spider_egg
|
|
name = "spider egg"
|
|
desc = "A white egg with something crawling around inside. Looks... fragile."
|
|
icon = 'modular_skyrat/modules/decay_subsystem/icons/loot.dmi'
|
|
icon_state = "spider_egg"
|
|
|
|
/obj/item/spider_egg/attack_self(mob/user, modifiers)
|
|
. = ..()
|
|
to_chat(user, span_danger("You begin to crack open [src]..."))
|
|
if(do_after(user, 3 SECONDS, src))
|
|
to_chat(user, span_userdanger("You crack [src] open, something monsterous crawls out!"))
|
|
playsound(src, 'sound/effects/blobattack.ogg', 100)
|
|
new /mob/living/simple_animal/hostile/giant_spider (user.loc)
|
|
qdel(src)
|
|
|
|
/obj/structure/mob_spawner/bush
|
|
name = "bloody bush"
|
|
desc = "A bush... oozing blood?"
|
|
icon_state = "nest_grass"
|
|
light_color = LIGHT_COLOR_GREEN
|
|
monster_types = list(/mob/living/simple_animal/hostile/killertomato)
|
|
loot = list(/obj/item/seeds/random = 3)
|
|
max_mobs = 6
|
|
|
|
/obj/structure/mob_spawner/beehive
|
|
name = "beehive"
|
|
desc = "Filled with little beings that exist only to make your life a living hell."
|
|
icon_state = "nest_bee"
|
|
light_color = LIGHT_COLOR_YELLOW
|
|
monster_types = list(/mob/living/simple_animal/hostile/bee)
|
|
max_mobs = 15
|
|
spawn_cooldown = 5 SECONDS
|
|
loot = list(/obj/item/reagent_containers/honeycomb = 5, /obj/item/queen_bee)
|
|
var/swarmed = FALSE
|
|
|
|
/obj/structure/mob_spawner/beehive/attacked_by(obj/item/I, mob/living/user)
|
|
. = ..()
|
|
if(!swarmed)
|
|
playsound(src, 'sound/creatures/bee.ogg', 100)
|
|
visible_message(span_userdanger("[src] buzzes violently as bees pour out!"))
|
|
for(var/i=1, i<max_mobs, ++i)
|
|
new /mob/living/simple_animal/hostile/bee (loc)
|
|
swarmed = TRUE
|
|
|
|
/obj/structure/mob_spawner/beehive/toxic
|
|
name = "oozing beehive"
|
|
desc = "A beehive... it looks off however, it's oozing some kind of green glowing goop."
|
|
icon_state = "nest_bee_toxic"
|
|
monster_types = list(/mob/living/simple_animal/hostile/bee/toxin)
|
|
max_mobs = 6
|
|
color = LIGHT_COLOR_ELECTRIC_GREEN
|
|
|
|
/obj/structure/mob_spawner/snake
|
|
name = "disgusting eggs"
|
|
desc = "These pulsating eggs are oozing out a puss like substance..."
|
|
icon_state = "nest_eggs"
|
|
light_color = LIGHT_COLOR_YELLOW
|
|
monster_types = list(/mob/living/simple_animal/hostile/retaliate/snake)
|
|
max_mobs = 8
|
|
spawn_cooldown = 5 SECONDS
|
|
|
|
/obj/structure/mob_spawner/rats
|
|
name = "nasty nest"
|
|
desc = "A nest crawling with... something!"
|
|
icon_state = "nest_rats"
|
|
light_color = LIGHT_COLOR_GREEN
|
|
max_mobs = 8
|
|
spawn_cooldown = 15 SECONDS
|
|
monster_types = list(/mob/living/simple_animal/hostile/rat)
|
|
loot = list(/obj/item/seeds/replicapod = 2)
|
|
|
|
/obj/structure/mob_spawner/grapes
|
|
name = "grapevine"
|
|
desc = "A grapevine... with... eggs?"
|
|
icon_state = "nest_grapes"
|
|
light_color = LIGHT_COLOR_PURPLE
|
|
monster_types = list(/mob/living/simple_animal/hostile/ooze/grapes)
|
|
loot = list(/obj/item/resurrection_crystal)
|
|
|
|
/obj/structure/mob_spawner/grapes/obj_destruction(damage_flag)
|
|
if(loot)
|
|
for(var/path in loot)
|
|
var/number = loot[path]
|
|
if(!isnum(number))//Default to 1
|
|
number = 1
|
|
for(var/i in 1 to number)
|
|
new path (loc)
|
|
playsound(src, 'sound/effects/blobattack.ogg', 100)
|
|
new /mob/living/simple_animal/hostile/vatbeast(loc)
|
|
return ..()
|
|
|
|
|