diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 5eb2ad4ecd6..5de4666f647 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -9,7 +9,7 @@ /obj/item/weapon/antag_spawner/proc/equip_antag(mob/target as mob) return - + /obj/item/weapon/antag_spawner/borg_tele name = "Syndicate Cyborg Teleporter" @@ -49,16 +49,16 @@ checking = 0 spawn_antag(possibleborg, get_turf(src.loc), "syndieborg") else - possiblecandidates -= possibleborg + possiblecandidates -= possibleborg get_candidate_answer(user, possiblecandidates) return - + sleep(300) if(checking) - possiblecandidates -= possibleborg + possiblecandidates -= possibleborg get_candidate_answer(user, possiblecandidates) - return - + return + /obj/item/weapon/antag_spawner/borg_tele/spawn_antag(var/client/C, var/turf/T, var/type = "") var/datum/effect/effect/system/spark_spread/S = new /datum/effect/effect/system/spark_spread @@ -70,3 +70,80 @@ ticker.mode.update_synd_icons_added(R.mind) R.mind.special_role = "syndicate" R.faction = list("syndicate") + +/obj/item/weapon/antag_spawner/slaughter_demon //Warning edgiest item in the game + name = "vial of blood" + desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures." + icon = 'icons/obj/wizard.dmi' + icon_state = "vial" + var/checking = 0 + + +/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob) + //var/list/demon_candidates = get_candidates(BE_ALIEN) + if(user.z != 1) + user << "You should probably wait until you reach the station." + return + if(!checking) + user << "You ready yourself to shatter the bottle..." + get_candidate_answer(user, get_candidates(BE_ALIEN)) + else + user << "You are already thinking about shattering the bottle." + return + + +/obj/item/weapon/antag_spawner/slaughter_demon/proc/get_candidate_answer(mob/user as mob, var/list/possiblecandidates = list()) + var/time_passed = world.time + if(possiblecandidates.len <= 0) + checking = 0 + user << "You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.." + return + else + var/demon_candidates = pick(possiblecandidates) + spawn(0) + var/input = alert(demon_candidates,"Do you want to spawn in as a Slaughter Demon?","Please answer in thirty seconds!","Yes","No") + if(input == "Yes" && used == 0) + if((world.time-time_passed)>300) + return + possiblecandidates -= demon_candidates + used = 1 + checking = 0 + spawn_antag(demon_candidates, get_turf(src.loc), "Slaughter Demon") + user << "You shatter the bottle, no turning back now!" + user << "You sense a dark presence lurking just beyond the veil..." + playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1) + playsound(user.loc,'sound/hallucinations/im_here1.ogg', 50, -1)//Paradise Port:THIS IS OVERKILL -AB + qdel(src) + else + possiblecandidates -= demon_candidates + get_candidate_answer(user, possiblecandidates) + return + + sleep(300) + if(checking) + possiblecandidates -= demon_candidates + get_candidate_answer(user, possiblecandidates) + return + + +/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(var/client/C, var/turf/T, var/type = "") + + var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) + var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder) + S.vialspawned = TRUE + S.phased = TRUE + S.key = C.key + S.mind.assigned_role = "Slaughter Demon" + S.mind.special_role = "Slaughter Demon" + ticker.mode.traitors += S.mind + var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate + KillDaWiz.owner = S:mind + KillDaWiz:target = usr:mind + KillDaWiz.explanation_text = "Kill [usr.real_name], the one who was foolish enough to summon you." + S.mind.objectives += KillDaWiz + var/datum/objective/slaughter/objective = new + objective.owner = S:mind + //Paradise port:i changed ther verbage..might want to do so on the above kill objective. Maybe save the wizard for last... + S.mind.objectives += objective + S << "Objective #[1]: [KillDaWiz.explanation_text]" + S << "Objective #[2]: [objective.explanation_text]" \ No newline at end of file diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 80b7aa10e81..03fe4b4f4bb 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -181,6 +181,79 @@ del src return ..() +//Why did i add this....-Fethas +/obj/item/weapon/veilrender/honkrender //HONK!! + name = "honk render" + desc = "A wicked curved 'blade' of honk origin, recovered from the ruins of a vast circus." + icon_state = "clownrender" + +/obj/item/weapon/veilrender/honkrender/attack_self(mob/user as mob) + if(charged) + new /obj/effect/rend/honk(get_turf(usr)) + charged = 0 + visible_message("\red [src] hums with power as [usr] deals a blow to depression itself!") + playsound(get_turf(usr),"sound/items/bikehorn.ogg",50,10,1) + else + user << "\red The honk energies that powered the blade are now dormant." + +/obj/effect/rend/honk + desc = "Gently wafting with the sounds of endless laughter." + var/honkleft = 10 + +/obj/effect/rend/honk/New() + processing_objects.Add(src) + return + +/obj/effect/rend/honk/process() + if(locate(/mob) in loc) return + new /mob/living/simple_animal/hostile/retaliate/clown(loc) + honkleft-- + if(honkleft <= 0) + del src + +/obj/effect/rend/honk/attackby(obj/item/I as obj, mob/user as mob, params) + if(istype(I, /obj/item/weapon/nullrod)) + visible_message("\red [I] strikes a blow against \the [src], banishing it!") + spawn(1) + del src + return + ..() + +/obj/item/weapon/veilrender/crabrender //HONK!! + name = "crab render" + desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast aquarium." + + +/obj/item/weapon/veilrender/crabrender/attack_self(mob/user as mob) + if(charged) + new /obj/effect/rend/crab(get_turf(usr)) + charged = 0 + visible_message("\red [src] hums with power as [usr] deals a blow to reality itself!") + else + user << "\red The energies that powered the blade are now dormant." + +/obj/effect/rend/crab + desc = "Gently wafting with the sounds of endless clacking." + var/crableft = 10 + +/obj/effect/rend/crab/New() + processing_objects.Add(src) + return + +/obj/effect/rend/crab/process() + if(locate(/mob) in loc) return + new /mob/living/simple_animal/crab(loc) + crableft-- + if(crableft <= 0) + del src + +///obj/effect/rend/crab/attackby(obj/item/I as obj, mob/user as mob, params) +// if(istype(I, /obj/item/weapon/nullrod)) +// visible_message("\red [I] strikes a blow against \the [src], banishing it!") +// spawn(1) +// del src +// return +// ..() /////////////////////////////////////////Scrying/////////////////// diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index d126c6c164e..78afaadd621 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -249,6 +249,12 @@ item_path = /obj/item/weapon/scrying log_name = "SO" +/datum/spellbook_entry/item/bloodbottle + name = "Bottle of Blood" + desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim." + item_path = /obj/item/weapon/antag_spawner/slaughter_demon + log_name = "BB" + /datum/spellbook_entry/item/scryingorb/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) if(..()) if (!(XRAY in user.mutations)) @@ -386,6 +392,11 @@ src.uses++ qdel(O) + if(istype(O, /obj/item/weapon/antag_spawner/slaughter_demon)) + user << "On second thought, maybe summoning a demon is a bad idea. You refund your points." + src.uses++ + qdel(O) + /obj/item/weapon/spellbook/proc/GetCategoryHeader(var/category) var/dat = "" switch(category) @@ -555,8 +566,8 @@ /obj/item/weapon/spellbook/oneuse/fireball/recoil(mob/user as mob) ..() - explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) - qdel(src) + explosion(user.loc, -1, 0, 2, 3, 0) + del(src) /obj/item/weapon/spellbook/oneuse/smoke spell = /obj/effect/proc_holder/spell/wizard/targeted/smoke diff --git a/code/modules/events/slaughterevent.dm b/code/modules/events/slaughterevent.dm new file mode 100644 index 00000000000..34b2fe0b6d2 --- /dev/null +++ b/code/modules/events/slaughterevent.dm @@ -0,0 +1,70 @@ + +/datum/event/spawn_slaughter//Paradise port:Changed from round_event to event, i was getting errors + var/key_of_slaughter + + + +/datum/event/spawn_slaughter/proc/get_slaughter(var/end_if_fail = 0) + var/time_passed = world.time + key_of_slaughter = null + if(!key_of_slaughter)//Paradise port change:I added in the whole do you want to be this question + var/list/candidates = get_candidates(BE_ALIEN) + if(!candidates.len) + if(end_if_fail) + return 0 + return find_slaughter() + var/client/C = pick(candidates) + var/input = alert(C,"Do you want to spawn in as a Slaughter Demon?","Please answer in thirty seconds!","Yes","No") + if(input == "Yes") + if((world.time-time_passed)>300) + return + key_of_slaughter = C.key + if(!key_of_slaughter) + if(end_if_fail) + return 0 + return find_slaughter() + var/datum/mind/player_mind = new /datum/mind(key_of_slaughter) + player_mind.active = 1 + var/list/spawn_locs = list() + for(var/obj/effect/landmark/L in landmarks_list) + if(isturf(L.loc)) + switch(L.name) + if("revenantspawn") + spawn_locs += L.loc + if(!spawn_locs) //If we can't find any revenant spawns, try the carp spawns + for(var/obj/effect/landmark/L in landmarks_list) + if(isturf(L.loc)) + switch(L.name) + if("carpspawn") + spawn_locs += L.loc + if(!spawn_locs) //If we can't find either, just spawn the revenant at the player's location + spawn_locs += get_turf(player_mind.current) + if(!spawn_locs) //If we can't find THAT, then just retry + return find_slaughter() + var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(pick(spawn_locs)) + var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder) + S.phased = TRUE + player_mind.transfer_to(S) + player_mind.assigned_role = "Slaughter Demon" + player_mind.special_role = "Slaughter Demon" + message_admins("[key_of_slaughter] has been made into a Slaughter Demon by an event.") + log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.") + return 1 + + + +/datum/event/spawn_slaughter/start() + get_slaughter() + + + +/datum/event/spawn_slaughter/proc/find_slaughter() + message_admins("Attempted to spawn a Slaughter Demon but there was no players available. Will try again momentarily.") + spawn(50) + if(get_slaughter(1)) + message_admins("Situation has been resolved, [key_of_slaughter] has been spawned as a Slaughter Demon.") + log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.") + return 0 + message_admins("Unfortunately, no candidates were available for becoming a Slaugter Demon. Shutting down.") + kill() + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm new file mode 100644 index 00000000000..1932187e856 --- /dev/null +++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm @@ -0,0 +1,413 @@ +///The following mini-antag was coded by KorPhaeron for TG Station +//Credits: Concept: KorPhaeron, Sprite:Ausops, Sounds:Cuboos +///Ported for paradise by Aurorablade/Fethas +///Things added for port: +//Various tweeks +//Blood... +/// Made the message tell you waht the demon is sinking into(gibs/blood etc) +///Alot of blood...Alot..Of blood.. + +//////////////////The Monster + +/mob/living/simple_animal/slaughter + name = "Slaughter Demon" + real_name = "Slaughter Demon" + desc = "You should run." + speak_emote = list("gurgles") + emote_hear = list("wails","screeches") + response_help = "thinks better of touching" + response_disarm = "flails at" + response_harm = "punches" + icon = 'icons/mob/mob.dmi' + icon_state = "daemon" + speed = 0 + a_intent = "harm" + stop_automated_movement = 1 + status_flags = CANPUSH + attack_sound = 'sound/misc/demon_attack1.ogg' + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + faction = list("slaughter") + attacktext = "wildly tears into" + maxHealth = 250 + health = 250 + environment_smash = 1 + universal_understand = 1 + melee_damage_lower = 30 + melee_damage_upper = 30 + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + + + var/devoured = 0 + var/phased = FALSE + var/holder = null + var/eating = FALSE + var/mob/living/kidnapped = null + var/list/nearby_mortals = list() + var/cooldown = 0 + var/gorecooldown = 0 + var/vialspawned = FALSE + var/playstyle_string = "You are the Slaughter Demon, a terible creature from another existence. You have a single desire: To kill. \ + You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \ + Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. " + //Paradise todo:change to altclick,add objectives. need ideas as i want people to be creative, not just RAWR KILL + + +/mob/living/simple_animal/slaughter/New() + ..() + spawn() + if(src.mind) + src.mind.current.verbs += /mob/living/simple_animal/slaughter/proc/bloodPull + src.mind.current.verbs += /mob/living/simple_animal/slaughter/proc/slaughterWhisper + src << src.playstyle_string + src << "You are not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest." + if(!(vialspawned)) + var/datum/objective/slaughter/objective = new + var/datum/objective/demonFluff/fluffObjective = new + ticker.mode.traitors |= src.mind + objective.owner = src.mind + fluffObjective.owner = src.mind + //Paradise Port:I added the objective for one spawned like this + src.mind.objectives += objective + src.mind.objectives += fluffObjective + src << "Objective #[1]: [objective.explanation_text]" + src << "Objective #[2]: [fluffObjective.explanation_text]" + + +/mob/living/simple_animal/slaughter/death() + ..(1) + new /obj/effect/decal/cleanable/blood (src.loc) + new /obj/effect/gibspawner/generic(get_turf(src)) + new /obj/effect/gibspawner/generic(get_turf(src)) + playsound(get_turf(src),'sound/misc/demon_dies.ogg', 200, 1) + new /obj/item/weapon/demonheart (src.loc) + visible_message("The [src] screams in anger as its form collapes into a pool of viscera.") + ghostize() + qdel(src) + return + + + +////////////////////The Powers + +/mob/living/simple_animal/slaughter/proc/phaseout(var/obj/effect/decal/cleanable/B) + var/turf/mobloc = get_turf(src.loc) + var/turf/bloodloc = get_turf(B.loc) + if(Adjacent(bloodloc)) + src.notransform = TRUE + spawn(0) + src.visible_message("The [src] sinks into [B].") + playsound(get_turf(src), 'sound/misc/enter_blood.ogg', 100, 1, -1) + var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter( mobloc ) + var/atom/movable/overlay/animation = new /atom/movable/overlay( mobloc ) + animation.name = "odd blood" + animation.density = 0 + animation.anchored = 1 + animation.icon = 'icons/mob/mob.dmi' + animation.icon_state = "jaunt" + animation.layer = 5 + animation.master = holder + animation.dir = src.dir + src.ExtinguishMob() + if(src.buckled) + src.buckled.unbuckle() + if(src.pulling) + if(istype(src.pulling, /mob/living/)) + var/mob/living/victim = src.pulling + if(victim.stat == CONSCIOUS) + src.visible_message("[victim] kicks free of the [src] at the last second!") + else + victim.loc = holder///holder + src.visible_message("The [src] drags [victim] into [B]!") + src.kidnapped = victim + flick("jaunt",animation) + src.loc = holder + src.phased = TRUE + src.holder = holder + + if(src.kidnapped) + src << "You begin to feast on [kidnapped]. You can not move while you are doing this." + src.visible_message("Loud eating sounds come from the blood...") + src.eating = TRUE + sleep(6) + qdel(animation) + src.GibEat() + playsound(get_turf(src),'sound/misc/Demon_consume.ogg', 100, 1) + sleep(30) + src.GibEat() + playsound(get_turf(src),'sound/misc/Demon_consume.ogg', 100, 1) + sleep(30) + src.GibEat() + playsound(get_turf(src),'sound/misc/Demon_consume.ogg', 100, 1) + sleep(30) + src << "You devour [kidnapped]. Your health is fully restored." + src.adjustBruteLoss(-1000) + kidnapped.ghostize() + qdel(kidnapped) + src.devoured++ + //src << " [src.devoured] [src.kidnapped] [src.eating]"//Debug for tracking how many is devoured, use in objective? + src.kidnapped = null + src.eating = FALSE + src.pulling = FALSE + if (src.devoured == 5) + src.mind.current.verbs += /mob/living/simple_animal/slaughter/proc/goreThrow + src << " You have consumed enough to be able to throw Excess Gore." + src.notransform = 0 + if(!(src.eating)) + new /obj/effect/gibspawner/human(get_turf(src))///Somewhere a janitor weeps.. + sleep(6) + qdel(animation) + +/mob/living/simple_animal/slaughter/proc/phasein(var/obj/effect/decal/cleanable/B) + var/atom/movable/overlay/animation = new /atom/movable/overlay( B.loc ) + animation.name = "odd blood" + animation.density = 0 + animation.anchored = 1 + animation.icon = 'icons/mob/mob.dmi' + animation.icon_state = "jauntup" //Paradise Port:I reversed the jaunt animation so it looks like its rising up + animation.layer = 5 + animation.master = B.loc + animation.dir = src.dir + if(src.eating) + src << "Finish eating first!" + else + flick("jauntup",animation) + src.client.eye = src + src.loc = B.loc + src.phased = FALSE + //Paradise port:The hallucination sounds removed from the demon as of a recent commit..i liked it though.. + if (prob(25)) + var/list/voice = list('sound/hallucinations/behind_you1.ogg','sound/hallucinations/im_here1.ogg','sound/hallucinations/turn_around1.ogg','sound/hallucinations/i_see_you1.ogg') + playsound(get_turf(src), pick(voice),50, 1, -1) + src.visible_message("The [src] rises out of [B]!") + new /obj/effect/gibspawner/human(get_turf(src)) + playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1) + sleep(6) + qdel(src.holder) + qdel(animation) + +/obj/effect/decal/cleanable/blood/CtrlClick(var/mob/user) + ..() + if(istype(user, /mob/living/simple_animal/slaughter)) + var/mob/living/simple_animal/slaughter/S = user + if(S.phased) + S.phasein(src) + else + S.phaseout(src) + + +/obj/effect/decal/cleanable/trail_holder/CtrlClick(var/mob/user) + ..() + if(istype(user, /mob/living/simple_animal/slaughter)) + var/mob/living/simple_animal/slaughter/S = user + //5 second cooldown + if(S.phased) + S.phasein(src) + else + S.phaseout(src) + + + +/turf/CtrlClick(var/mob/user) + ..() + if(istype(user, /mob/living/simple_animal/slaughter)) + var/mob/living/simple_animal/slaughter/S = user + for(var/obj/effect/decal/cleanable/B in src.contents) + if((istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/trail_holder))&& !istype(B,/obj/effect/decal/cleanable/blood/gibs/robot)) + if(S.phased) + S.phasein(B) + break + else + S.phaseout(B) + break + +/obj/effect/dummy/slaughter //Can't use the wizard one, blocked by jaunt/slow + name = "odd blood" + icon = 'icons/effects/effects.dmi' + icon_state = "nothing" + var/canmove = 1 + density = 0 + anchored = 1 + +/obj/effect/dummy/slaughter/relaymove(var/mob/user, direction) + if (!src.canmove || !direction) return + var/turf/newLoc = get_step(src,direction) + loc = newLoc + src.canmove = 0 + spawn(1) + src.canmove = 1 + +/obj/effect/dummy/slaughter/ex_act(severity) + return 1 + +/obj/effect/dummy/slaughter/bullet_act(blah) + return + +/obj/effect/dummy/slaughter/singularity_act(blah) + return + + +//Paradise Port:I added this cuase..SPOOPY DEMON IN YOUR BRAIN + + +/mob/living/simple_animal/slaughter/proc/slaughterWhisper() + set name = "Whisper" + set desc = "Whisper to a mortal" + set category = "Daemon" + + var/list/choices = list() + for(var/mob/living/carbon/C in living_mob_list) + if(C.stat != 2 && C.mind) + choices += C + + var/mob/living/carbon/M = input(src,"Who do you wish to talk to?") in null|choices + spawn(0) + var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "") + if(!(msg)) + return + usr << "You whisper to [M]: [msg]" + M << "Suddenly a strange,demonic,voice resonates in your head... [msg]" + + +/mob/living/simple_animal/slaughter/proc/bloodPull() + set name = "Exsanguinate" + set desc = "Cuase blood to be torn our of mortals to help acess the plane.." + set category = "Daemon" + + for(var/mob/living/carbon/human/H in view(10,(src.holder || src.loc))) + nearby_mortals.Add(H) + + if (cooldown == 0 || world.time - cooldown > 1800) + for(var/mob/living/carbon/human/H in view(7,(src.holder || src.loc))) + nearby_mortals.Add(H) + //var/mob/living/carbon/human/M = pop(nearby_mortals) + if(nearby_mortals.len) + playsound(src.loc, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3) + new /datum/artifact_effect/badfeeling/DoEffectPulse() + for (var/mob/living/carbon/human/portal in nearby_mortals) + var/targetPart = pick("chest","groin","head","l_arm","r_arm","r_leg","l_leg","l_hand","r_hand","l_foot","r_foot") + portal.apply_damage(rand(5, 10), BRUTE, targetPart) + portal << "\red The skin on your [parse_zone(targetPart)] feels like it's ripping apart, and a stream of blood flies out." + var/obj/effect/decal/cleanable/blood/splatter/animated/aniBlood = new(portal.loc) + aniBlood.target_turf = pick(range(1, src)) + aniBlood.blood_DNA = list() + aniBlood.blood_DNA[portal.dna.unique_enzymes] = portal.dna.b_type + portal.vessel.remove_reagent("blood",rand(25,50)) + cooldown = world.time + else + usr << "You cannot Exsanguinate mortals yet!" + +/mob/living/simple_animal/slaughter/proc/goreThrow(mob/target as mob in oview()) + set name = "Gore Throw" + set desc = "Launch blood at some poor unsuspecting person..." + set category = "Daemon" + + if (!(src.phased)) + if (gorecooldown == 0 || world.time - gorecooldown > 600) + var/obj/effect/decal/cleanable/blood/gibs/gore = new(src.loc) + gore.throw_at(target,10,5,src) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + //src << "[target]"//debug + src.visible_message("[src] throws gore at [target]!") + H.bloody_body(target) + H.bloody_hands(target) + gorecooldown = world.time + + else + usr << "You need more time to do that again!" + else + usr << " you can only do that from the material plane!" + + + +//////////The Loot + +/obj/item/weapon/demonheart + name = "demon's heart" + desc = "It's still faintly beating with rage" + icon = 'icons/obj/surgery.dmi' + icon_state = "heart-on" + origin_tech = "combat=5;biotech=8" + +/obj/item/weapon/guts + name = "guts" + desc = "Ewwwwwwwwwwww" + icon = 'icons/obj/surgery.dmi' + icon_state = "innards" + +//Event +//Gib helperfunc +/mob/living/simple_animal/slaughter/proc/GibEat() + + //at some point we may eat a robot..and its gonna throw out gibs.. + //don't question...When a demon drags you into a blood portal you have no idea whos gibs you are actually seeing + //...Or we can just blame bluespace. + var/atom/throwtarget = get_edge_target_turf(src.holder, get_dir(src.holder, get_step_away(src.holder, src.holder))) + + if(istype(src.kidnapped,/mob/living/carbon/human)) + var/mob/living/carbon/human/victimType = src.kidnapped + + var/obj/effect/decal/cleanable/blood/gibs/gore = new victimType.species.single_gib_type(get_turf(src)) + src << "[victimType.species]"//debug + if(victimType.species.flesh_color) + gore.fleshcolor = victimType.species.flesh_color + if(victimType.species.blood_color) + gore.basecolor = victimType.species.blood_color + gore.update_icon() + spawn()//Wait for itt.... + gore.throw_at(get_edge_target_turf(throwtarget,pick(alldirs)),rand(10,20),10) + + else//in case we eat ian. + new /obj/effect/gibspawner/human(get_turf(src)) + + var/obj/tossGuts = new /obj/item/weapon/guts (get_turf(src.holder)) + tossGuts.throw_at(get_edge_target_turf(throwtarget,pick(alldirs)),rand(10,20),5) + + +//Objective info, Based on Reverent mini Atang +/datum/objective/slaughter + var/targetKill = 10 + +/datum/objective/slaughter/New() + targetKill = rand(10,20) + explanation_text = "Devour [targetKill] mortals." + ..() + +/datum/objective/slaughter/check_completion() + if(!istype(owner.current, /mob/living/simple_animal/slaughter) || !owner.current) + return 0 + var/mob/living/simple_animal/slaughter/R = owner.current + if(!R || R.stat == DEAD) + return 0 + var/deathCount = R.devoured + if(deathCount < targetKill) + return 0 + return 1 + +/datum/objective/demonFluff + + +/datum/objective/demonFluff/New() + find_target() + var/targetname = "someone" + if(target && target.current) + targetname = target.current.real_name + var/list/explanationTexts = list("Attempt to make your presence unknown to the crew.", \ + "Kill or Dystroy all Janitors or Sanitation bots.", \ + "Drive [targetname] insane." + ) + + explanation_text = pick(explanationTexts) + ..() + +/datum/objective/demonFluff/check_completion() + return 1 \ No newline at end of file diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 6ef7e6484e5..8c7131ec6a6 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 52bbd89fe86..60168f993eb 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/sound/misc/Demon_consume.ogg b/sound/misc/Demon_consume.ogg new file mode 100644 index 00000000000..ef9276e74c0 Binary files /dev/null and b/sound/misc/Demon_consume.ogg differ diff --git a/sound/misc/demon_attack1.ogg b/sound/misc/demon_attack1.ogg new file mode 100644 index 00000000000..e3c765afd0c Binary files /dev/null and b/sound/misc/demon_attack1.ogg differ diff --git a/sound/misc/demon_dies.ogg b/sound/misc/demon_dies.ogg new file mode 100644 index 00000000000..ad2a95f397d Binary files /dev/null and b/sound/misc/demon_dies.ogg differ diff --git a/sound/misc/enter_blood.ogg b/sound/misc/enter_blood.ogg new file mode 100644 index 00000000000..4deba11b465 Binary files /dev/null and b/sound/misc/enter_blood.ogg differ diff --git a/sound/misc/exit_blood.ogg b/sound/misc/exit_blood.ogg new file mode 100644 index 00000000000..c4399a2ecc6 Binary files /dev/null and b/sound/misc/exit_blood.ogg differ