//spooky halloween stuff. only tick on halloween!!! //uses super seekrit double proc definition stuffs. remember to call ..()! /*/mob/dead/observer/say(var/message) //this doesn't actually work vOv ..() for(var/mob/M in hearers(src, 1)) if(!M.stat) if(M.job == "Chaplain") if (prob (49)) M.show_message("You hear muffled speech... but nothing is there...", 2) if(prob(20)) playsound(loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1) else M.show_message("You hear muffled speech... you can almost make out some words...", 2) // M.show_message("[stutter(message)]", 2) if(prob(30)) playsound(loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1) else if(prob(50)) return else if(prob (95)) M.show_message("You hear muffled speech... but nothing is there...", 2) if(prob(20)) playsound(loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1) else M.show_message("You hear muffled speech... you can almost make out some words...", 2) // M.show_message("[stutter(message)]", 2) playsound(loc, pick('sound/effects/ghost.ogg','sound/effects/ghost2.ogg'), 10, 1)*/ /////////////////////////////////////// ///////////HALLOWEEN CONTENT/////////// /////////////////////////////////////// //spooky recipes /datum/recipe/sugarcookie/spookyskull reagents = list("flour" = 5, "sugar" = 5, "milk" = 5) items = list( /obj/item/weapon/reagent_containers/food/snacks/egg, ) result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie/spookyskull /datum/recipe/sugarcookie/spookycoffin reagents = list("flour" = 5, "sugar" = 5, "coffee" = 5) items = list( /obj/item/weapon/reagent_containers/food/snacks/egg, ) result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie/spookycoffin ////////////////////////////// //Spookoween trapped closets// ////////////////////////////// #define SPOOKY_SKELETON 1 #define ANGRY_FAITHLESS 2 #define SCARY_BATS 3 #define INSANE_CLOWN 4 #define HOWLING_GHOST 5 //Spookoween variables /obj/structure/closet var/trapped = 0 var/mob/trapped_mob /obj/structure/closet/initialize() ..() if(prob(30)) set_spooky_trap() /obj/structure/closet/dump_contents() ..() trigger_spooky_trap() /obj/structure/closet/proc/set_spooky_trap() if(prob(0.1)) trapped = INSANE_CLOWN return if(prob(1)) trapped = ANGRY_FAITHLESS return if(prob(15)) trapped = SCARY_BATS return if(prob(20)) trapped = HOWLING_GHOST return else var/mob/living/carbon/human/H = new(loc) H.makeSkeleton() H.health = 1e5 insert(H) trapped_mob = H trapped = SPOOKY_SKELETON return /obj/structure/closet/proc/trigger_spooky_trap() if(!trapped) return else if(trapped == SPOOKY_SKELETON) visible_message("BOO!") playsound(loc, pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg','sound/spookoween/girlscream.ogg'), 300, 1) trapped = 0 spawn(90) if(trapped_mob && trapped_mob.loc) var/datum/effect/effect/system/harmless_smoke_spread/smoke = new() smoke.set_up(1, 0, trapped_mob.loc, 0) smoke.start() qdel(trapped_mob) else if(trapped == HOWLING_GHOST) visible_message("[pick("OooOOooooOOOoOoOOooooOOOOO", "BooOOooOooooOOOO", "BOO!", "WoOOoOoooOooo")]") playsound(loc, 'sound/spookoween/ghosty_wind.ogg', 300, 1) new /mob/living/simple_animal/shade/howling_ghost(loc) trapped = 0 else if(trapped == SCARY_BATS) visible_message("Protect your hair!") playsound(loc, 'sound/spookoween/bats.ogg', 300, 1) var/number = rand(1,3) for(var/i=0,i < number,i++) new /mob/living/simple_animal/hostile/retaliate/bat(loc) trapped = 0 else if(trapped == ANGRY_FAITHLESS) visible_message("The closet bursts open!") visible_message("THIS BEING RADIATES PURE EVIL! YOU BETTER RUN!!!") playsound(loc, 'sound/hallucinations/wail.ogg', 300, 1) var/mob/living/simple_animal/hostile/faithless/F = new(loc) F.stance = HOSTILE_STANCE_ATTACK F.GiveTarget(usr) trapped = 0 spawn(120) if(F && F.loc) var/datum/effect/effect/system/harmless_smoke_spread/smoke = new smoke.set_up(1,0, F.loc, 0) smoke.start() qdel(F) else if(trapped == INSANE_CLOWN) visible_message("...") playsound(loc, 'sound/spookoween/scary_clown_appear.ogg', 300, 1) var/mob/living/simple_animal/hostile/retaliate/clown/insane/IC = new (loc) IC.GiveTarget(usr) trapped = 0 //don't spawn in crates /obj/structure/closet/crate/trigger_spooky_trap() return /obj/structure/closet/crate/set_spooky_trap() return //////////////////// //Spookoween Ghost// //////////////////// /mob/living/simple_animal/shade/howling_ghost name = "ghost" real_name = "ghost" icon = 'icons/mob/mob.dmi' maxHealth = 1e6 health = 1e6 speak_emote = list("howls") emote_hear = list("wails","screeches") density = 0 anchored = 1 incorporeal_move = 1 layer = 4 var/timer = 0 /mob/living/simple_animal/shade/howling_ghost/New() ..() icon_state = pick("ghost","ghostian","ghostian2","ghostking","ghost1","ghost2") icon_living = icon_state status_flags |= GODMODE timer = rand(1,15) /mob/living/simple_animal/shade/howling_ghost/Life() ..() timer-- if(prob(20)) roam() if(timer == 0) spooky_ghosty() timer = rand(1,15) /mob/living/simple_animal/shade/howling_ghost/proc/EtherealMove(direction) loc = get_step(src, direction) dir = direction /mob/living/simple_animal/shade/howling_ghost/proc/roam() if(prob(80)) var/direction = pick(NORTH,SOUTH,EAST,WEST,NORTHEAST,NORTHWEST,SOUTHEAST,SOUTHWEST) EtherealMove(direction) /mob/living/simple_animal/shade/howling_ghost/proc/spooky_ghosty() if(prob(20)) //haunt playsound(loc, pick('sound/spookoween/ghosty_wind.ogg','sound/spookoween/ghost_whisper.ogg','sound/spookoween/chain_rattling.ogg'), 300, 1) if(prob(10)) //flickers var/obj/machinery/light/L = locate(/obj/machinery/light) in view(5, src) if(L) L.flicker() if(prob(5)) //poltergeist var/obj/item/I = locate(/obj/item) in view(3, src) if(I) var/direction = pick(NORTH,SOUTH,EAST,WEST,NORTHEAST,NORTHWEST,SOUTHEAST,SOUTHWEST) step(I,direction) return /mob/living/simple_animal/shade/howling_ghost/adjustHealth() . = 0 /mob/living/simple_animal/shade/howling_ghost/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return 1 /////////////////////////// //Spookoween Insane Clown// /////////////////////////// /mob/living/simple_animal/hostile/retaliate/clown/insane name = "insane clown" desc = "Some clowns do not manage to be accepted, and go insane. This is one of them." icon_state = "scary_clown" icon_living = "scary_clown" icon_dead = "scary_clown" icon_gib = "scary_clown" speak = list("...", ". . .") maxHealth = 1e6 health = 1e6 emote_see = list("silently stares") unsuitable_atmos_damage = 0 var/timer /mob/living/simple_animal/hostile/retaliate/clown/insane/New() ..() timer = rand(5,15) status_flags = (status_flags | GODMODE) return /mob/living/simple_animal/hostile/retaliate/clown/insane/Retaliate() return /mob/living/simple_animal/hostile/retaliate/clown/insane/ex_act() return /mob/living/simple_animal/hostile/retaliate/clown/insane/Life() timer-- if(target) stalk() return /mob/living/simple_animal/hostile/retaliate/clown/insane/proc/stalk() var/mob/living/M = target if(M.stat == DEAD) playsound(M.loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1) qdel(src) if(timer == 0) timer = rand(5,15) playsound(M.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 300, 1) spawn(12) loc = M.loc /mob/living/simple_animal/hostile/retaliate/clown/insane/MoveToTarget() return /mob/living/simple_animal/hostile/retaliate/clown/insane/AttackTarget() return /mob/living/simple_animal/hostile/retaliate/clown/insane/adjustHealth() . = 0 if(prob(5)) playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1) /mob/living/simple_animal/hostile/retaliate/clown/insane/attackby(obj/item/O, mob/user) if(istype(O,/obj/item/weapon/nullrod)) if(prob(5)) visible_message("[src] finally found the peace it deserves. You hear honks echoing off into the distance.") playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1) qdel(src) else visible_message("[src] seems to be resisting the effect!") else ..() /mob/living/simple_animal/hostile/retaliate/clown/insane/handle_temperature_damage() return