adds floor cluwnes from yog

This commit is contained in:
keronshb
2021-05-24 22:46:59 -04:00
parent f4ba3aa688
commit 9e3c1ff860
24 changed files with 744 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
/datum/mutation/human/cluwne
name = "Cluwne"
quality = NEGATIVE
locked = TRUE
text_gain_indication = "<span class='danger'>You feel like your brain is tearing itself apart.</span>"
/datum/mutation/human/cluwne/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
owner.dna.add_mutation(CLOWNMUT)
owner.dna.add_mutation(EPILEPSY)
owner.setBrainLoss(200)
var/mob/living/carbon/human/H = owner
if(!istype(H.wear_mask, /obj/item/clothing/mask/bee/cluwne))
if(!H.doUnEquip(H.wear_mask))
qdel(H.wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/bee/cluwne(H), SLOT_WEAR_MASK)
if(!istype(H.w_uniform, /obj/item/clothing/under/bee/cluwne))
if(!H.doUnEquip(H.w_uniform))
qdel(H.w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/under/bee/cluwne(H), SLOT_W_UNIFORM)
if(!istype(H.shoes, /obj/item/clothing/shoes/bee/cluwne))
if(!H.doUnEquip(H.shoes))
qdel(H.shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/bee/cluwne(H), SLOT_SHOES)
owner.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(owner), SLOT_GLOVES) // this is purely for cosmetic purposes incase they aren't wearing anything in that slot
owner.equip_to_slot_or_del(new /obj/item/storage/backpack/clown(owner), SLOT_BACK) // ditto
/datum/mutation/human/cluwne/on_life(mob/living/carbon/human/owner)
if((prob(15) && owner.IsUnconscious()))
owner.setBrainLoss(200) // there I changed it to setBrainLoss
switch(rand(1, 6))
if(1)
owner.say("HONK")
if(2 to 5)
owner.emote("scream")
if(6)
owner.Stun(1)
owner.Knockdown(20)
owner.Jitter(500)
/datum/mutation/human/cluwne/on_losing(mob/living/carbon/human/owner)
owner.adjust_fire_stacks(1)
owner.IgniteMob()
owner.dna.add_mutation(CLUWNEMUT)
/mob/living/carbon/human/proc/cluwneify()
dna.add_mutation(CLUWNEMUT)
emote("scream")
regenerate_icons()
visible_message("<span class='danger'>[src]'s body glows green, the glow dissipating only to leave behind a cluwne formerly known as [src]!</span>", \
"<span class='danger'>Your brain feels like it's being torn apart, there is only the honkmother now.</span>")
flash_act()
@@ -0,0 +1,19 @@
/client/proc/spawn_floor_cluwne()
set category = "Fun"
set name = "Unleash Floor Cluwne"
set desc = "Pick a specific target or just let it select randomly and spawn the floor cluwne mob on the station. Be warned: spawning more than one may cause issues!"
var/target
if(!check_rights(R_FUN))
return
var/turf/T = get_turf(usr)
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in GLOB.player_list
if(target && ishuman(target))
var/mob/living/carbon/human/H = target
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T)
FC.Acquire_Victim(H)
else
new /mob/living/simple_animal/hostile/floor_cluwne(T)
log_admin("[key_name(usr)] spawned floor cluwne.")
message_admins("[key_name(usr)] spawned floor cluwne.")
+104
View File
@@ -0,0 +1,104 @@
/obj/item/clothing/mask/bee/cluwne
name = "clown wig and mask"
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
flags_cover = MASKCOVERSEYES
icon_state = "cluwne"
item_state = "cluwne"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags_1 = MASKINTERNALS
item_flags = ABSTRACT | DROPDEL
flags_inv = HIDEEARS|HIDEEYES
var/voicechange = TRUE
var/last_sound = 0
var/delay = 15
/obj/item/clothing/mask/bee/cluwne/Initialize()
.=..()
add_trait(TRAIT_NODROP, CURSED_ITEM_TRAIT)
/obj/item/clothing/mask/bee/cluwne/proc/play_laugh1()
if(world.time - delay > last_sound)
playsound (src, 'beestation/sound/voice/cluwnelaugh1.ogg', 30, 1)
last_sound = world.time
/obj/item/clothing/mask/bee/cluwne/proc/play_laugh2()
if(world.time - delay > last_sound)
playsound (src, 'beestation/sound/voice/cluwnelaugh2.ogg', 30, 1)
last_sound = world.time
/obj/item/clothing/mask/bee/cluwne/proc/play_laugh3()
if(world.time - delay > last_sound)
playsound (src, 'beestation/sound/voice/cluwnelaugh3.ogg', 30, 1)
last_sound = world.time
/obj/item/clothing/mask/bee/cluwne/equipped(mob/user, slot) //when you put it on
var/mob/living/carbon/C = user
if((C.wear_mask == src) && (voicechange))
play_laugh1()
return ..()
/obj/item/clothing/mask/bee/cluwne/speechModification(message) //whenever you speak
if(voicechange)
if(prob(5)) //the brain isnt fully gone yet...
message = pick("HELP ME!!","PLEASE KILL ME!!","I WANT TO DIE!!", "END MY SUFFERING", "I CANT TAKE THIS ANYMORE!!" ,"SOMEBODY STOP ME!!")
play_laugh2()
if(prob(3))
message = pick("HOOOOINKKKKKKK!!", "HOINK HOINK HOINK HOINK!!","HOINK HOINK!!","HOOOOOOIIINKKKK!!") //but most of the time they cant speak,
play_laugh3()
else
message = pick("HEEEENKKKKKK!!", "HONK HONK HONK HONK!!","HONK HONK!!","HOOOOOONKKKK!!") //More sounds,
play_laugh1()
return message
/obj/item/clothing/mask/bee/cluwne/equipped(mob/user, slot)
if(!ishuman(user))
return
if(slot == SLOT_WEAR_MASK)
var/mob/living/carbon/human/H = user
H.dna.add_mutation(CLUWNEMUT)
return
/obj/item/clothing/mask/bee/cluwne/happy_cluwne
name = "Happy Cluwne Mask"
desc = "The mask of a poor cluwne that has been scrubbed of its curse by the Nanotrasen supernatural machinations division. Guaranteed to be %99 curse free and %99.9 not haunted. "
flags_1 = MASKINTERNALS
item_flags = ABSTRACT
var/can_cluwne = FALSE
var/is_cursed = FALSE //i don't care that this is *slightly* memory wasteful, it's just one more byte and it's not like some madman is going to spawn thousands of these
var/is_very_cursed = FALSE
/obj/item/clothing/mask/bee/cluwne/happy_cluwne/Initialize()
.=..()
if(prob(1)) //this function pre-determines the logic of the cluwne mask. applying and reapplying the mask does not alter or change anything
is_cursed = TRUE
is_very_cursed = FALSE
else if(prob(0.1))
is_cursed = FALSE
is_very_cursed = TRUE
/obj/item/clothing/mask/bee/cluwne/happy_cluwne/attack_self(mob/user)
voicechange = !voicechange
to_chat(user, "<span class='notice'>You turn the voice box [voicechange ? "on" : "off"]!</span>")
if(voicechange)
play_laugh1()
/obj/item/clothing/mask/bee/cluwne/happy_cluwne/equipped(mob/user, slot)
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
if(slot == SLOT_WEAR_MASK)
if(is_cursed && can_cluwne) //logic predetermined
log_admin("[key_name(H)] was made into a cluwne by [src]")
message_admins("[key_name(H)] got cluwned by [src]")
to_chat(H, "<span class='userdanger'>The masks straps suddenly tighten to your face and your thoughts are erased by a horrible green light!</span>")
H.dropItemToGround(src)
H.cluwneify()
qdel(src)
else if(is_very_cursed && can_cluwne)
var/turf/T = get_turf(src)
var/mob/living/simple_animal/hostile/floor_cluwne/S = new(T)
S.Acquire_Victim(user)
log_admin("[key_name(user)] summoned a floor cluwne using the [src]")
message_admins("[key_name(user)] summoned a floor cluwne using the [src]")
to_chat(H, "<span class='warning'>The mask suddenly slips off your face and... slides under the floor?</span>")
to_chat(H, "<i>...dneirf uoy ot gnoleb ton seod tahT</i>")
+30
View File
@@ -0,0 +1,30 @@
/obj/item/clothing/shoes/bee/cluwne
desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!"
name = "clown shoes"
icon_state = "cluwne"
item_state = "cluwne"
item_color = "cluwne"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
item_flags = DROPDEL
slowdown = SHOES_SLOWDOWN+1
var/footstep = 1
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown
/obj/item/clothing/shoes/bee/cluwne/Initialize()
.=..()
add_trait(TRAIT_NODROP, CURSED_ITEM_TRAIT)
/obj/item/clothing/shoes/bee/cluwne/step_action()
if(footstep > 1)
playsound(src, "clownstep", 50, 1)
footstep = 0
else
footstep++
/obj/item/clothing/shoes/bee/cluwne/equipped(mob/user, slot)
if(!ishuman(user))
return
if(slot == SLOT_SHOES)
var/mob/living/carbon/human/H = user
H.dna.add_mutation(CLUWNEMUT)
return
+21
View File
@@ -0,0 +1,21 @@
/obj/item/clothing/under/bee/cluwne
name = "clown suit"
desc = "<i>'HONK!'</i>"
icon_state = "cluwne"
item_state = "cluwne"
item_color = "cluwne"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
item_flags = DROPDEL
can_adjust = 0
/obj/item/clothing/under/bee/cluwne/Initialize()
.=..()
add_trait(TRAIT_NODROP, CURSED_ITEM_TRAIT)
/obj/item/clothing/under/bee/cluwne/equipped(mob/living/carbon/user, slot)
if(!ishuman(user))
return
if(slot == SLOT_W_UNIFORM)
var/mob/living/carbon/human/H = user
H.dna.add_mutation(CLUWNEMUT)
return ..()
@@ -0,0 +1,22 @@
/datum/round_event_control/floor_cluwne
name = "Floor Cluwne"
typepath = /datum/round_event/floor_cluwne
max_occurrences = 1
min_players = 20
/datum/round_event/floor_cluwne/start()
var/list/spawn_locs = list()
for(var/X in GLOB.xeno_spawn)
spawn_locs += X
if(!spawn_locs.len)
message_admins("No valid spawn locations found, aborting...")
return MAP_ERROR
var/turf/T = get_turf(pick(spawn_locs))
var/mob/living/simple_animal/hostile/floor_cluwne/S = new(T)
playsound(S, 'beestation/sound/misc/bikehorn_creepy.ogg', 50, 1, -1)
message_admins("A floor cluwne has been spawned at [COORD(T)][ADMIN_JMP(T)]")
log_game("A floor cluwne has been spawned at [COORD(T)]")
return SUCCESSFUL_SPAWN
@@ -0,0 +1,448 @@
GLOBAL_VAR_INIT(floor_cluwnes, 0)
#define STAGE_HAUNT 1
#define STAGE_SPOOK 2
#define STAGE_TORMENT 3
#define STAGE_ATTACK 4
#define MANIFEST_DELAY 9
/mob/living/simple_animal/hostile/floor_cluwne
name = "???"
desc = "...."
icon = 'beestation/icons/obj/clothing/masks.dmi'
icon_state = "cluwne"
icon_living = "cluwne"
icon_gib = "clown_gib"
maxHealth = 250
health = 250
speed = -1
attacktext = "attacks"
attack_sound = 'sound/items/bikehorn.ogg'
del_on_death = TRUE
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB | LETPASSTHROW | PASSGLASS | PASSBLOB//it's practically a ghost when unmanifested (under the floor)
loot = list(/obj/item/clothing/mask/bee/cluwne)
wander = FALSE
minimum_distance = 2
move_to_delay = 1
environment_smash = FALSE
lose_patience_timeout = FALSE
pixel_y = 8
pressure_resistance = 200
minbodytemp = 0
maxbodytemp = 1500
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
var/mob/living/carbon/human/current_victim
var/manifested = FALSE
var/switch_stage = 60
var/stage = STAGE_HAUNT
var/interest = 0
var/target_area
var/invalid_area_typecache = list(/area/space, /area/lavaland, /area/centcom, /area/reebe, /area/shuttle/syndicate)
var/eating = FALSE
var/obj/effect/dummy/floorcluwne_orbit/poi
var/obj/effect/temp_visual/fcluwne_manifest/cluwnehole
move_resist = INFINITY
hud_type = /datum/hud/ghost
hud_possible = list(ANTAG_HUD)
/mob/living/simple_animal/hostile/floor_cluwne/Initialize()
. = ..()
access_card = new /obj/item/card/id(src)
access_card.access = get_all_accesses()//THERE IS NO ESCAPE
access_card.add_trait(TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
invalid_area_typecache = typecacheof(invalid_area_typecache)
Manifest()
if(!current_victim)
Acquire_Victim()
poi = new(src)
/mob/living/simple_animal/hostile/floor_cluwne/med_hud_set_health()
return //we use a different hud
/mob/living/simple_animal/hostile/floor_cluwne/med_hud_set_status()
return //we use a different hud
/mob/living/simple_animal/hostile/floor_cluwne/Destroy()
QDEL_NULL(poi)
return ..()
/mob/living/simple_animal/hostile/floor_cluwne/attack_hand(mob/living/carbon/human/M)
..()
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
/mob/living/simple_animal/hostile/floor_cluwne/CanPass(atom/A, turf/target)
return TRUE
/mob/living/simple_animal/hostile/floor_cluwne/Life()
do_jitter_animation(1000)
pixel_y = 8
if(is_type_in_typecache(get_area(src.loc), invalid_area_typecache) || !is_station_level(z))
var/area = pick(GLOB.teleportlocs)
var/area/tp = GLOB.teleportlocs[area]
forceMove(pick(get_area_turfs(tp.type)))
if(!current_victim)
Acquire_Victim()
if(stage && !manifested)
On_Stage()
if(stage == STAGE_ATTACK)
playsound(src, 'beestation/sound/misc/cluwne_breathing.ogg', 75, 1)
if(eating)
return
var/turf/T = get_turf(current_victim)
if(prob(5))//checks roughly every 20 ticks
if(current_victim.stat == DEAD || current_victim.dna.check_mutation(CLUWNEMUT) || is_type_in_typecache(get_area(T), invalid_area_typecache) || !is_station_level(current_victim.z))
if(!Found_You())
Acquire_Victim()
if(get_dist(src, current_victim) > 9 && !manifested && !is_type_in_typecache(get_area(T), invalid_area_typecache))//if cluwne gets stuck he just teleports
do_teleport(src, T)
interest++
if(interest >= switch_stage * 4)
stage = STAGE_ATTACK
else if(interest >= switch_stage * 2)
stage = STAGE_TORMENT
else if(interest >= switch_stage)
stage = STAGE_SPOOK
else if(interest < switch_stage)
stage = STAGE_HAUNT
..()
/mob/living/simple_animal/hostile/floor_cluwne/Goto(target, delay, minimum_distance)
if(!manifested && !is_type_in_typecache(get_area(current_victim.loc), invalid_area_typecache) && is_station_level(current_victim.z))
walk_to(src, target, minimum_distance, delay)
else
walk_to(src,0)
/mob/living/simple_animal/hostile/floor_cluwne/FindTarget()
return current_victim
/mob/living/simple_animal/hostile/floor_cluwne/CanAttack(atom/the_target)//you will not escape
return TRUE
/mob/living/simple_animal/hostile/floor_cluwne/AttackingTarget()
return
/mob/living/simple_animal/hostile/floor_cluwne/LoseTarget()
return
/mob/living/simple_animal/hostile/floor_cluwne/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)//prevents runtimes with machine fuckery
return FALSE
/mob/living/simple_animal/hostile/floor_cluwne/proc/Found_You()
for(var/obj/structure/closet/hiding_spot in orange(7,src))
if(current_victim.loc == hiding_spot)
hiding_spot.bust_open()
current_victim.Paralyze(40)
to_chat(current_victim, "<span class='warning'>...edih t'nac uoY</span>")
return TRUE
return FALSE
/mob/living/simple_animal/hostile/floor_cluwne/proc/Acquire_Victim(specific)
for(var/I in GLOB.player_list)//better than a potential recursive loop
var/mob/living/carbon/human/H = pick(GLOB.player_list)//so the check is fair
if(specific)
H = specific
if(H.stat != DEAD && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(get_area(H.loc), invalid_area_typecache) && is_station_level(H.z))
return target = current_victim
if(H && ishuman(H) && H.stat != DEAD && H != current_victim && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(get_area(H.loc), invalid_area_typecache) && is_station_level(H.z))
current_victim = H
interest = 0
stage = STAGE_HAUNT
return target = current_victim
message_admins("Floor Cluwne was deleted due to a lack of valid targets, if this was a manually targeted instance please re-evaluate your choice.")
qdel(src)
/mob/living/simple_animal/hostile/floor_cluwne/proc/Manifest()//handles disappearing and appearance anim
if(manifested)
mobility_flags &= ~MOBILITY_MOVE
update_mobility()
cluwnehole = new(src.loc)
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Appear), MANIFEST_DELAY)
else
layer = GAME_PLANE
invisibility = INVISIBILITY_OBSERVER
density = FALSE
mobility_flags |= MOBILITY_MOVE
update_mobility()
if(cluwnehole)
qdel(cluwnehole)
/mob/living/simple_animal/hostile/floor_cluwne/proc/Appear()//handled in a seperate proc so floor cluwne doesn't appear before the animation finishes
layer = LYING_MOB_LAYER
invisibility = FALSE
density = TRUE
/mob/living/simple_animal/hostile/floor_cluwne/proc/Reset_View(screens, colour, mob/living/carbon/human/H)
if(screens)
for(var/whole_screen in screens)
animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING)
if(colour && H)
H.client.color = colour
/mob/living/simple_animal/hostile/floor_cluwne/proc/On_Stage()
var/mob/living/carbon/human/H = current_victim
switch(stage)
if(STAGE_HAUNT)
if(prob(5))
H.blur_eyes(1)
if(prob(5))
H.playsound_local(src,'beestation/sound/voice/cluwnelaugh2_reversed.ogg', 1)
if(prob(5))
H.playsound_local(src,'beestation/sound/misc/bikehorn_creepy.ogg', 5)
if(prob(3))
var/obj/item/I = locate() in orange(H, 8)
if(I && !I.anchored)
I.throw_at(H, 4, 3)
to_chat(H, "<span class='warning'>What threw that?</span>")
if(STAGE_SPOOK)
if(prob(4))
var/turf/T = get_turf(H)
T.handle_slip(H, 20)
to_chat(H, "<span class='warning'>The floor shifts underneath you!</span>")
if(prob(5))
H.playsound_local(src,'beestation/sound/voice/cluwnelaugh2.ogg', 2)
if(prob(5))
H.playsound_local(src,'beestation/sound/voice/cluwnelaugh2_reversed.ogg', 2)
if(prob(5))
H.playsound_local(src,'beestation/sound/misc/bikehorn_creepy.ogg', 10)
to_chat(H, "<i>knoh</i>")
if(prob(5))
var/obj/item/I = locate() in orange(H, 8)
if(I && !I.anchored)
I.throw_at(H, 4, 3)
to_chat(H, "<span class='warning'>What threw that?</span>")
if(prob(2))
to_chat(H, "<i>yalp ot tnaw I</i>")
Appear()
manifested = FALSE
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Manifest), 1)
if(current_victim.hud_used)//yay skewium
var/list/screens = list(current_victim.hud_used.plane_masters["[GAME_PLANE]"], current_victim.hud_used.plane_masters["[LIGHTING_PLANE]"])
var/matrix/skew = matrix()
var/intensity = 8
skew.set_skew(rand(-intensity,intensity), rand(-intensity,intensity))
var/matrix/newmatrix = skew
for(var/whole_screen in screens)
animate(whole_screen, transform = newmatrix, time = 5, easing = QUAD_EASING, loop = -1)
animate(transform = -newmatrix, time = 5, easing = QUAD_EASING)
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Reset_View, screens), 10)
if(STAGE_TORMENT)
if(prob(5))
var/turf/T = get_turf(H)
T.handle_slip(H, 20)
to_chat(H, "<span class='warning'>The floor shifts underneath you!</span>")
if(prob(3))
playsound(src,pick('sound/spookoween/scary_horn.ogg', 'sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 30, 1)
if(prob(3))
playsound(src,'beestation/sound/voice/cluwnelaugh1.ogg', 30, 1)
if(prob(3))
playsound(src,'beestation/sound/voice/cluwnelaugh2_reversed.ogg', 30, 1)
if(prob(5))
playsound(src,'beestation/sound/misc/bikehorn_creepy.ogg', 30, 1)
if(prob(4))
for(var/obj/item/I in orange(H, 8))
if(I && !I.anchored)
I.throw_at(H, 4, 3)
to_chat(H, "<span class='warning'>What the hell?!</span>")
if(prob(2))
to_chat(H, "<span class='warning'>Something feels very wrong...</span>")
H.playsound_local(src,'sound/hallucinations/behind_you1.ogg', 25)
H.flash_act()
if(prob(2))
to_chat(H, "<i>!?REHTOMKNOH eht esiarp uoy oD</i>")
to_chat(H, "<span class='warning'>Something grabs your foot!</span>")
H.playsound_local(src,'sound/hallucinations/i_see_you1.ogg', 25)
H.Stun(20)
if(prob(3))
to_chat(H, "<i>KNOH ?od nottub siht seod tahW</i>")
for(var/turf/open/O in range(src, 6))
O.MakeSlippery(TURF_WET_WATER, 10)
playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1)
if(prob(1))
to_chat(H, "<span class='userdanger'>WHAT THE FUCK IS THAT?!</span>")
to_chat(H, "<i>.KNOH !nuf hcum os si uoy htiw gniyalP .KNOH KNOH KNOH</i>")
H.playsound_local(src,'sound/hallucinations/im_here1.ogg', 25)
H.reagents.add_reagent("mindbreaker", 3)
H.reagents.add_reagent("laughter", 5)
H.reagents.add_reagent("mercury", 3)
Appear()
manifested = FALSE
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Manifest), 2)
for(var/obj/machinery/light/L in range(H, 8))
L.flicker()
if(STAGE_ATTACK)
if(!eating)
Found_You()
for(var/I in getline(src,H))
var/turf/T = I
if(T.density)
forceMove(H.loc)
for(var/obj/structure/O in T)
if(O.density || istype(O, /obj/machinery/door/airlock))
forceMove(H.loc)
to_chat(H, "<span class='userdanger'>You feel the floor closing in on your feet!</span>")
H.Paralyze(300)
H.emote("scream")
H.adjustBruteLoss(10)
manifested = TRUE
Manifest()
if(!eating)
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Grab, H), 50, TIMER_OVERRIDE|TIMER_UNIQUE)
for(var/turf/open/O in range(src, 6))
O.MakeSlippery(TURF_WET_LUBE, 20)
playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1)
eating = TRUE
/mob/living/simple_animal/hostile/floor_cluwne/proc/Grab(mob/living/carbon/human/H)
to_chat(H, "<span class='userdanger'>You feel a cold, gloved hand clamp down on your ankle!</span>")
for(var/I in 1 to get_dist(src, H))
if(do_after(src, 5, target = H))
step_towards(H, src)
playsound(H, pick('beestation/sound/effects/bodyscrape-01.ogg', 'beestation/sound/effects/bodyscrape-02.ogg'), 20, 1, -4)
if(prob(40))
H.emote("scream")
else if(prob(25))
H.say(pick("HELP ME!!","IT'S GOT ME!!","DON'T LET IT TAKE ME!!",";SOMETHING'S KILLING ME!!","HOLY FUCK!!"))
playsound(src, pick('beestation/sound/voice/cluwnelaugh1.ogg', 'beestation/sound/voice/cluwnelaugh2.ogg', 'beestation/sound/voice/cluwnelaugh3.ogg'), 50, 1)
if(get_dist(src,H) <= 1)
visible_message("<span class='danger'>[src] begins dragging [H] under the floor!</span>")
if(do_after(src, 50, target = H) && eating)
H.become_blind()
H.layer = GAME_PLANE
H.invisibility = INVISIBILITY_OBSERVER
H.density = FALSE
H.anchored = TRUE
addtimer(CALLBACK(src, /mob/living/simple_animal/hostile/floor_cluwne/.proc/Kill, H), 100, TIMER_OVERRIDE|TIMER_UNIQUE)
visible_message("<span class='danger'>[src] pulls [H] under!</span>")
to_chat(H, "<span class='userdanger'>[src] drags you underneath the floor!</span>")
else
eating = FALSE
else
eating = FALSE
manifested = FALSE
Manifest()
/mob/living/simple_animal/hostile/floor_cluwne/proc/Kill(mob/living/carbon/human/H)
if(!istype(H) || !H.client)
Acquire_Victim()
return
playsound(H, 'beestation/sound/effects/cluwne_feast.ogg', 100, 0, -4)
var/old_color = H.client.color
var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0)
var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
H.client.color = pure_red
animate(H.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT)
for(var/turf/T in orange(H, 4))
H.add_splatter_floor(T)
if(do_after(src, 50, target = H))
H.unequip_everything()//more runtime prevention
if(prob(75))
H.gib(FALSE)
else
H.cluwneify()
H.adjustBruteLoss(30)
H.adjustBrainLoss(100)
H.cure_blind()
H.layer = initial(H.layer)
H.invisibility = initial(H.invisibility)
H.density = initial(H.density)
H.anchored = initial(H.anchored)
H.blur_eyes(10)
animate(H.client,color = old_color, time = 20)
eating = FALSE
switch_stage = switch_stage * 0.75 //he gets faster after each feast
for(var/mob/M in GLOB.player_list)
M.playsound_local(get_turf(M), 'beestation/sound/misc/honk_echo_distant.ogg', 50, 1, pressure_affected = FALSE)
interest = 0
stage = STAGE_HAUNT
Acquire_Victim()
//manifestation animation
/obj/effect/temp_visual/fcluwne_manifest
icon = 'beestation/icons/turf/floors.dmi'
icon_state = "fcluwne_open"
layer = TURF_LAYER
duration = 600
randomdir = FALSE
/obj/effect/temp_visual/fcluwne_manifest/Initialize()
. = ..()
playsound(src, 'beestation/sound/misc/floor_cluwne_emerge.ogg', 100, 1)
flick("fcluwne_manifest",src)
/obj/effect/dummy/floorcluwne_orbit
name = "floor cluwne"
desc = "If you have this, tell a coder or admin!"
/obj/effect/dummy/floorcluwne_orbit/Initialize()
. = ..()
GLOB.floor_cluwnes++
name += " ([GLOB.floor_cluwnes])"
GLOB.poi_list += src
/obj/effect/dummy/floorcluwne_orbit/Destroy()
. = ..()
GLOB.poi_list -= src
#undef STAGE_HAUNT
#undef STAGE_SPOOK
#undef STAGE_TORMENT
#undef STAGE_ATTACK
#undef MANIFEST_DELAY
@@ -0,0 +1,40 @@
/obj/effect/proc_holder/spell/targeted/cluwnecurse
name = "Curse of the Cluwne"
desc = "This spell dooms the fate of any unlucky soul to the live of a pitiful cluwne, a terrible creature that is hunted for fun."
school = "transmutation"
charge_type = "recharge"
charge_max = 600
charge_counter = 0
clothes_req = 1
stat_allowed = 0
invocation = "CLU WO'NIS CA'TE'BEST'IS MAXIMUS!"
invocation_type = "shout"
range = 3
cooldown_min = 75
selection_type = "range"
var/list/compatible_mobs = list(/mob/living/carbon/human)
action_icon = 'beestation/icons/mob/actions.dmi'
action_icon_state = "cluwne"
/obj/effect/proc_holder/spell/targeted/cluwnecurse/cast(list/targets, mob/user = usr)
if(!targets.len)
to_chat(user, "<span class='notice'>No target found in range.</span>")
return
var/mob/living/carbon/target = targets[1]
if(!(target.type in compatible_mobs))
to_chat(user, "<span class='notice'>You are unable to curse [target]!</span>")
return
if(!(target in oview(range)))
to_chat(user, "<span class='notice'>They are too far away!</span>")
return
var/mob/living/carbon/human/H = target
H.cluwneify()
/datum/spellbook_entry/cluwnecurse
name = "Cluwne Curse"
spell_type = /obj/effect/proc_holder/spell/targeted/cluwnecurse
/datum/action/spell_action/New(Target)
..()
var/obj/effect/proc_holder/spell/S = Target
icon_icon = S.action_icon
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -53,6 +53,7 @@
#define GELADIKINESIS /datum/mutation/human/geladikinesis
#define CRYOKINESIS /datum/mutation/human/cryokinesis
#define SPIDER_WEB /datum/mutation/human/webbing
#define CLUWNEMUT /datum/mutation/human/cluwne
#define UI_CHANGED "ui changed"
#define UE_CHANGED "ue changed"
+2
View File
@@ -118,6 +118,8 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/admin_away,
/client/proc/cmd_admin_toggle_fov, //CIT CHANGE - FOV
/client/proc/roll_dices //CIT CHANGE - Adds dice verb
/client/proc/healall,
/client/proc/spawn_floor_cluwne
))
GLOBAL_PROTECT(admin_verbs_fun)
GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character))