diff --git a/beestation/code/modules/admin/verbs/spawnfloorcluwne.dm b/beestation/code/modules/admin/verbs/spawnfloorcluwne.dm deleted file mode 100644 index 92f574fb49..0000000000 --- a/beestation/code/modules/admin/verbs/spawnfloorcluwne.dm +++ /dev/null @@ -1,19 +0,0 @@ -/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.") \ No newline at end of file diff --git a/beestation/code/modules/clothing/mask.dm b/beestation/code/modules/clothing/mask.dm deleted file mode 100644 index c0464eade6..0000000000 --- a/beestation/code/modules/clothing/mask.dm +++ /dev/null @@ -1,104 +0,0 @@ -/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, "You turn the voice box [voicechange ? "on" : "off"]!") - 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, "The masks straps suddenly tighten to your face and your thoughts are erased by a horrible green light!") - 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, "The mask suddenly slips off your face and... slides under the floor?") - to_chat(H, "...dneirf uoy ot gnoleb ton seod tahT") \ No newline at end of file diff --git a/beestation/code/modules/clothing/under.dm b/beestation/code/modules/clothing/under.dm deleted file mode 100644 index 4e41b2ddad..0000000000 --- a/beestation/code/modules/clothing/under.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/item/clothing/under/bee/cluwne - name = "clown suit" - desc = "'HONK!'" - 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 ..() \ No newline at end of file diff --git a/beestation/icons/mob/actions.dmi b/beestation/icons/mob/actions.dmi deleted file mode 100644 index 95f5ec7d29..0000000000 Binary files a/beestation/icons/mob/actions.dmi and /dev/null differ diff --git a/beestation/icons/obj/clothing/masks.dmi b/beestation/icons/obj/clothing/masks.dmi deleted file mode 100644 index dcc3d2a4ea..0000000000 Binary files a/beestation/icons/obj/clothing/masks.dmi and /dev/null differ diff --git a/beestation/icons/turf/floors.dmi b/beestation/icons/turf/floors.dmi deleted file mode 100644 index 076ee749a1..0000000000 Binary files a/beestation/icons/turf/floors.dmi and /dev/null differ diff --git a/beestation/code/datums/mutations.dm b/code/datums/mutations/cluwne.dm similarity index 69% rename from beestation/code/datums/mutations.dm rename to code/datums/mutations/cluwne.dm index 3ac942aa80..4bd555f8fd 100644 --- a/beestation/code/datums/mutations.dm +++ b/code/datums/mutations/cluwne.dm @@ -10,29 +10,29 @@ return owner.dna.add_mutation(CLOWNMUT) owner.dna.add_mutation(EPILEPSY) - owner.setBrainLoss(200) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 200, 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)) + if(!istype(H.wear_mask, /obj/item/clothing/mask/gas/cluwne)) + if(!H.dropItemToGround(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)) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/cluwne(H), SLOT_WEAR_MASK) + if(!istype(H.w_uniform, /obj/item/clothing/under/cluwne)) + if(!H.dropItemToGround(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)) + H.equip_to_slot_or_del(new /obj/item/clothing/under/cluwne(H), SLOT_W_UNIFORM) + if(!istype(H.shoes, /obj/item/clothing/shoes/clown_shoes/cluwne)) + if(!H.dropItemToGround(H.shoes)) qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/bee/cluwne(H), SLOT_SHOES) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes/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 + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 200, 200) // there I changed it to setBrainLoss switch(rand(1, 6)) if(1) owner.say("HONK") @@ -54,4 +54,4 @@ regenerate_icons() visible_message("[src]'s body glows green, the glow dissipating only to leave behind a cluwne formerly known as [src]!", \ "Your brain feels like it's being torn apart, there is only the honkmother now.") - flash_act() \ No newline at end of file + flash_act() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ab3e85434b..89fd7036a2 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -116,10 +116,9 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/show_tip, /client/proc/smite, /client/proc/admin_away, + /client/proc/spawn_floor_cluwne, /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)) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 59eee83b35..3fb4f2e73d 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1691,3 +1691,23 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!source) return REMOVE_TRAIT(D,chosen_trait,source) + +/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.") diff --git a/code/modules/clothing/masks/cluwne.dm b/code/modules/clothing/masks/cluwne.dm new file mode 100644 index 0000000000..a1177e2b47 --- /dev/null +++ b/code/modules/clothing/masks/cluwne.dm @@ -0,0 +1,106 @@ +/obj/item/clothing/mask/gas/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 + clothing_flags = ALLOWINTERNALS + item_flags = ABSTRACT | DROPDEL + flags_inv = HIDEEARS|HIDEEYES + var/voicechange = TRUE + var/last_sound = 0 + var/delay = 15 + +/obj/item/clothing/mask/gas/cluwne/Initialize() + .=..() + ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) + ADD_TRAIT(src, CURSED_ITEM_TRAIT, CLOTHING_TRAIT) + +/obj/item/clothing/mask/gas/cluwne/proc/play_laugh1() + if(world.time - delay > last_sound) + playsound (src, 'sound/voice/cluwnelaugh1.ogg', 30, 1) + last_sound = world.time + +/obj/item/clothing/mask/gas/cluwne/proc/play_laugh2() + if(world.time - delay > last_sound) + playsound (src, 'sound/voice/cluwnelaugh2.ogg', 30, 1) + last_sound = world.time + +/obj/item/clothing/mask/gas/cluwne/proc/play_laugh3() + if(world.time - delay > last_sound) + playsound (src, 'sound/voice/cluwnelaugh3.ogg', 30, 1) + last_sound = world.time + +/obj/item/clothing/mask/gas/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/gas/cluwne/handle_speech(datum/source, list/speech_args) + if(voicechange) + if(prob(5)) //the brain isn't fully gone yet... + speech_args[SPEECH_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)) + speech_args[SPEECH_MESSAGE] = pick("HOOOOINKKKKKKK!!", "HOINK HOINK HOINK HOINK!!","HOINK HOINK!!","HOOOOOOIIINKKKK!!") //but most of the time they cant speak, + play_laugh3() + else + speech_args[SPEECH_MESSAGE] = pick("HEEEENKKKKKK!!", "HONK HONK HONK HONK!!","HONK HONK!!","HOOOOOONKKKK!!") //More sounds, + play_laugh1() + return SPEECH_MESSAGE + +/obj/item/clothing/mask/gas/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/gas/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. " + 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/gas/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/gas/cluwne/happy_cluwne/attack_self(mob/user) + voicechange = !voicechange + to_chat(user, "You turn the voice box [voicechange ? "on" : "off"]!") + if(voicechange) + play_laugh1() + +/obj/item/clothing/mask/gas/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, "The masks straps suddenly tighten to your face and your thoughts are erased by a horrible green light!") + 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, "The mask suddenly slips off your face and... slides under the floor?") + to_chat(H, "...dneirf uoy ot gnoleb ton seod tahT") diff --git a/beestation/code/modules/clothing/shoes.dm b/code/modules/clothing/shoes/cluwne.dm similarity index 56% rename from beestation/code/modules/clothing/shoes.dm rename to code/modules/clothing/shoes/cluwne.dm index c0bfb38f8b..fbe1ba624b 100644 --- a/beestation/code/modules/clothing/shoes.dm +++ b/code/modules/clothing/shoes/cluwne.dm @@ -1,30 +1,29 @@ -/obj/item/clothing/shoes/bee/cluwne +/obj/item/clothing/shoes/clown_shoes/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() +/obj/item/clothing/shoes/clown_shoes/cluwne/Initialize() .=..() - add_trait(TRAIT_NODROP, CURSED_ITEM_TRAIT) + ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) + ADD_TRAIT(src, CURSED_ITEM_TRAIT, CLOTHING_TRAIT) -/obj/item/clothing/shoes/bee/cluwne/step_action() +/obj/item/clothing/shoes/clown_shoes/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) +/obj/item/clothing/shoes/clown_shoes/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 \ No newline at end of file + return diff --git a/code/modules/clothing/under/cluwne.dm b/code/modules/clothing/under/cluwne.dm new file mode 100644 index 0000000000..5a908c5663 --- /dev/null +++ b/code/modules/clothing/under/cluwne.dm @@ -0,0 +1,22 @@ +/obj/item/clothing/under/cluwne + name = "clown suit" + desc = "'HONK!'" + icon_state = "greenclown" + item_state = "greenclown" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + item_flags = DROPDEL + can_adjust = 0 + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + +/obj/item/clothing/under/cluwne/Initialize() + .=..() + ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) + ADD_TRAIT(src, CURSED_ITEM_TRAIT, CLOTHING_TRAIT) + +/obj/item/clothing/under/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 ..() diff --git a/beestation/code/modules/events/floorcluwne.dm b/code/modules/events/floorcluwne.dm similarity index 86% rename from beestation/code/modules/events/floorcluwne.dm rename to code/modules/events/floorcluwne.dm index 1105d2af0f..47ae322a9c 100644 --- a/beestation/code/modules/events/floorcluwne.dm +++ b/code/modules/events/floorcluwne.dm @@ -16,7 +16,7 @@ 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) + playsound(S, '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 \ No newline at end of file + return SUCCESSFUL_SPAWN diff --git a/beestation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm b/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm similarity index 77% rename from beestation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm rename to code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm index 432b14dafd..11a272393f 100644 --- a/beestation/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm +++ b/code/modules/mob/living/simple_animal/hostile/floor_cluwne.dm @@ -9,18 +9,19 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) /mob/living/simple_animal/hostile/floor_cluwne name = "???" desc = "...." - icon = 'beestation/icons/obj/clothing/masks.dmi' + icon = 'icons/obj/clothing/masks.dmi' icon_state = "cluwne" icon_living = "cluwne" icon_gib = "clown_gib" maxHealth = 250 health = 250 speed = -1 - attacktext = "attacks" + attack_verb_continuous = "attacks" + attack_verb_simple = "attack" 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) + loot = list(/obj/item/clothing/mask/gas/cluwne) wander = FALSE minimum_distance = 2 move_to_delay = 1 @@ -39,6 +40,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) var/target_area var/invalid_area_typecache = list(/area/space, /area/lavaland, /area/centcom, /area/reebe, /area/shuttle/syndicate) var/eating = FALSE + var/dontkill = FALSE //for if we just wanna curse a fucker var/obj/effect/dummy/floorcluwne_orbit/poi var/obj/effect/temp_visual/fcluwne_manifest/cluwnehole move_resist = INFINITY @@ -49,8 +51,8 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) /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) + var/datum/job/captain/C = new /datum/job/captain + access_card.access = C.get_access() invalid_area_typecache = typecacheof(invalid_area_typecache) Manifest() if(!current_victim) @@ -81,7 +83,8 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) 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/A = get_area(src.loc) + if(is_type_in_typecache(A, 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))) @@ -93,22 +96,23 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) On_Stage() if(stage == STAGE_ATTACK) - playsound(src, 'beestation/sound/misc/cluwne_breathing.ogg', 75, 1) + playsound(src, 'sound/misc/cluwne_breathing.ogg', 75, 1) if(eating) return var/turf/T = get_turf(current_victim) + A = get_area(T) 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(current_victim.stat == DEAD || current_victim.dna.check_mutation(CLUWNEMUT) || is_type_in_typecache(A, 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 + if(get_dist(src, current_victim) > 9 && !manifested && !is_type_in_typecache(A, invalid_area_typecache))//if cluwne gets stuck he just teleports do_teleport(src, T) interest++ - if(interest >= switch_stage * 4) + if(interest >= switch_stage * 4 && !dontkill) stage = STAGE_ATTACK else if(interest >= switch_stage * 2) @@ -123,7 +127,8 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) ..() /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)) + var/area/A = get_area(current_victim.loc) + if(!manifested && !is_type_in_typecache(A, invalid_area_typecache) && is_station_level(current_victim.z)) walk_to(src, target, minimum_distance, delay) else walk_to(src,0) @@ -145,7 +150,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) 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 +/mob/living/simple_animal/hostile/floor_cluwne/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)//prevents runtimes with machine fuckery return FALSE /mob/living/simple_animal/hostile/floor_cluwne/proc/Found_You() @@ -160,13 +165,16 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) /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 + var/area/A 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)) + A = get_area(H.loc) + if(H.stat != DEAD && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(A, 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)) + A = get_area(H.loc) + if(H && ishuman(H) && H.stat != DEAD && H != current_victim && H.has_dna() && !H.dna.check_mutation(CLUWNEMUT) && !is_type_in_typecache(A, invalid_area_typecache) && is_station_level(H.z)) current_victim = H interest = 0 stage = STAGE_HAUNT @@ -215,10 +223,10 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) H.blur_eyes(1) if(prob(5)) - H.playsound_local(src,'beestation/sound/voice/cluwnelaugh2_reversed.ogg', 1) + H.playsound_local(src,'sound/voice/cluwnelaugh2_reversed.ogg', 1) if(prob(5)) - H.playsound_local(src,'beestation/sound/misc/bikehorn_creepy.ogg', 5) + H.playsound_local(src,'sound/misc/bikehorn_creepy.ogg', 5) if(prob(3)) var/obj/item/I = locate() in orange(H, 8) @@ -234,13 +242,13 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) to_chat(H, "The floor shifts underneath you!") if(prob(5)) - H.playsound_local(src,'beestation/sound/voice/cluwnelaugh2.ogg', 2) + H.playsound_local(src,'sound/voice/cluwnelaugh2.ogg', 2) if(prob(5)) - H.playsound_local(src,'beestation/sound/voice/cluwnelaugh2_reversed.ogg', 2) + H.playsound_local(src,'sound/voice/cluwnelaugh2_reversed.ogg', 2) if(prob(5)) - H.playsound_local(src,'beestation/sound/misc/bikehorn_creepy.ogg', 10) + H.playsound_local(src,'sound/misc/bikehorn_creepy.ogg', 10) to_chat(H, "knoh") if(prob(5)) @@ -254,18 +262,6 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) 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) @@ -278,17 +274,17 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) 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) + playsound(src,'sound/voice/cluwnelaugh1.ogg', 30, 1) if(prob(3)) - playsound(src,'beestation/sound/voice/cluwnelaugh2_reversed.ogg', 30, 1) + playsound(src,'sound/voice/cluwnelaugh2_reversed.ogg', 30, 1) if(prob(5)) - playsound(src,'beestation/sound/misc/bikehorn_creepy.ogg', 30, 1) + playsound(src,'sound/misc/bikehorn_creepy.ogg', 30, 1) if(prob(4)) - for(var/obj/item/I in orange(H, 8)) - if(I && !I.anchored) + for(var/obj/item/I in orange(8, H)) + if(!I.anchored) I.throw_at(H, 4, 3) to_chat(H, "What the hell?!") @@ -305,7 +301,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) if(prob(3)) to_chat(H, "KNOH ?od nottub siht seod tahW") - for(var/turf/open/O in range(src, 6)) + for(var/turf/open/O in RANGE_TURFS(6, src)) O.MakeSlippery(TURF_WET_WATER, 10) playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1) @@ -313,16 +309,20 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) to_chat(H, "WHAT THE FUCK IS THAT?!") to_chat(H, ".KNOH !nuf hcum os si uoy htiw gniyalP .KNOH KNOH KNOH") 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) + H.reagents.add_reagent(/datum/reagent/toxin/mindbreaker, 3) + H.reagents.add_reagent(/datum/reagent/consumable/laughter, 5) + H.reagents.add_reagent(/datum/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)) + for(var/obj/machinery/light/L in range(8, H)) L.flicker() + if(STAGE_ATTACK) + if(dontkill) + stage = STAGE_TORMENT + return if(!eating) Found_You() for(var/I in getline(src,H)) @@ -334,13 +334,13 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) forceMove(H.loc) to_chat(H, "You feel the floor closing in on your feet!") H.Paralyze(300) - H.emote("scream") + INVOKE_ASYNC(H, /mob.proc/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)) + for(var/turf/open/O in RANGE_TURFS(6, src)) O.MakeSlippery(TURF_WET_LUBE, 20) playsound(src, 'sound/effects/meteorimpact.ogg', 30, 1) eating = TRUE @@ -351,12 +351,12 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) 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) + playsound(H, pick('sound/effects/bodyscrape-01.ogg', '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) + playsound(src, pick('sound/voice/cluwnelaugh1.ogg', 'sound/voice/cluwnelaugh2.ogg', 'sound/voice/cluwnelaugh3.ogg'), 50, 1) if(get_dist(src,H) <= 1) visible_message("[src] begins dragging [H] under the floor!") @@ -381,7 +381,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) if(!istype(H) || !H.client) Acquire_Victim() return - playsound(H, 'beestation/sound/effects/cluwne_feast.ogg', 100, 0, -4) + playsound(H, '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) @@ -396,7 +396,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) else H.cluwneify() H.adjustBruteLoss(30) - H.adjustBrainLoss(100) + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100, 100) H.cure_blind() H.layer = initial(H.layer) H.invisibility = initial(H.invisibility) @@ -408,7 +408,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) 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) + M.playsound_local(get_turf(M), 'sound/misc/honk_echo_distant.ogg', 50, 1, pressure_affected = FALSE) interest = 0 stage = STAGE_HAUNT @@ -416,7 +416,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) //manifestation animation /obj/effect/temp_visual/fcluwne_manifest - icon = 'beestation/icons/turf/floors.dmi' + icon = 'icons/turf/floors.dmi' icon_state = "fcluwne_open" layer = TURF_LAYER duration = 600 @@ -424,7 +424,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0) /obj/effect/temp_visual/fcluwne_manifest/Initialize() . = ..() - playsound(src, 'beestation/sound/misc/floor_cluwne_emerge.ogg', 100, 1) + playsound(src, 'sound/misc/floor_cluwne_emerge.ogg', 100, 1) flick("fcluwne_manifest",src) /obj/effect/dummy/floorcluwne_orbit diff --git a/beestation/code/modules/spells/cluwnecurse.dm b/code/modules/spells/spell_types/cluwnecurse.dm similarity index 94% rename from beestation/code/modules/spells/cluwnecurse.dm rename to code/modules/spells/spell_types/cluwnecurse.dm index 1c2ef66cb4..1c93d8a598 100644 --- a/beestation/code/modules/spells/cluwnecurse.dm +++ b/code/modules/spells/spell_types/cluwnecurse.dm @@ -13,7 +13,7 @@ cooldown_min = 75 selection_type = "range" var/list/compatible_mobs = list(/mob/living/carbon/human) - action_icon = 'beestation/icons/mob/actions.dmi' + action_icon = '/icons/mob/actions_spells.dmi' action_icon_state = "cluwne" /obj/effect/proc_holder/spell/targeted/cluwnecurse/cast(list/targets, mob/user = usr) @@ -37,4 +37,4 @@ /datum/action/spell_action/New(Target) ..() var/obj/effect/proc_holder/spell/S = Target - icon_icon = S.action_icon \ No newline at end of file + icon_icon = S.action_icon diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi index 72e72ad6f3..9c2a30031e 100644 Binary files a/icons/mob/actions/actions_spells.dmi and b/icons/mob/actions/actions_spells.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index d93543805b..5712f05165 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi index 43244e99b9..5b4d733879 100644 Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index d06f9cf899..60c2e34b39 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/clothing/mask_muzzled.dmi b/icons/mob/clothing/mask_muzzled.dmi index 807d944172..9da3545c65 100644 Binary files a/icons/mob/clothing/mask_muzzled.dmi and b/icons/mob/clothing/mask_muzzled.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 9f1c0cbd2a..532d4f5df7 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index aee67da199..d277ebf970 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 19d4dca13d..e1b128e10b 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/beestation/sound/effects/bodyscrape-01.ogg b/sound/effects/bodyscrape-01.ogg similarity index 100% rename from beestation/sound/effects/bodyscrape-01.ogg rename to sound/effects/bodyscrape-01.ogg diff --git a/beestation/sound/effects/bodyscrape-02.ogg b/sound/effects/bodyscrape-02.ogg similarity index 100% rename from beestation/sound/effects/bodyscrape-02.ogg rename to sound/effects/bodyscrape-02.ogg diff --git a/beestation/sound/effects/cluwne_feast.ogg b/sound/effects/cluwne_feast.ogg similarity index 100% rename from beestation/sound/effects/cluwne_feast.ogg rename to sound/effects/cluwne_feast.ogg diff --git a/beestation/sound/misc/bikehorn_creepy.ogg b/sound/misc/bikehorn_creepy.ogg similarity index 100% rename from beestation/sound/misc/bikehorn_creepy.ogg rename to sound/misc/bikehorn_creepy.ogg diff --git a/beestation/sound/misc/cluwne_breathing.ogg b/sound/misc/cluwne_breathing.ogg similarity index 100% rename from beestation/sound/misc/cluwne_breathing.ogg rename to sound/misc/cluwne_breathing.ogg diff --git a/beestation/sound/misc/floor_cluwne_emerge.ogg b/sound/misc/floor_cluwne_emerge.ogg similarity index 100% rename from beestation/sound/misc/floor_cluwne_emerge.ogg rename to sound/misc/floor_cluwne_emerge.ogg diff --git a/beestation/sound/misc/honk_echo_distant.ogg b/sound/misc/honk_echo_distant.ogg similarity index 100% rename from beestation/sound/misc/honk_echo_distant.ogg rename to sound/misc/honk_echo_distant.ogg diff --git a/beestation/sound/voice/cluwnelaugh1.ogg b/sound/voice/cluwnelaugh1.ogg similarity index 100% rename from beestation/sound/voice/cluwnelaugh1.ogg rename to sound/voice/cluwnelaugh1.ogg diff --git a/beestation/sound/voice/cluwnelaugh2.ogg b/sound/voice/cluwnelaugh2.ogg similarity index 100% rename from beestation/sound/voice/cluwnelaugh2.ogg rename to sound/voice/cluwnelaugh2.ogg diff --git a/beestation/sound/voice/cluwnelaugh2_reversed.ogg b/sound/voice/cluwnelaugh2_reversed.ogg similarity index 100% rename from beestation/sound/voice/cluwnelaugh2_reversed.ogg rename to sound/voice/cluwnelaugh2_reversed.ogg diff --git a/beestation/sound/voice/cluwnelaugh3.ogg b/sound/voice/cluwnelaugh3.ogg similarity index 100% rename from beestation/sound/voice/cluwnelaugh3.ogg rename to sound/voice/cluwnelaugh3.ogg diff --git a/tgstation.dme b/tgstation.dme index 2e5bd87e51..436572f623 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -681,6 +681,7 @@ #include "code\datums\mutations\antenna.dm" #include "code\datums\mutations\body.dm" #include "code\datums\mutations\chameleon.dm" +#include "code\datums\mutations\cluwne.dm" #include "code\datums\mutations\cold.dm" #include "code\datums\mutations\combined.dm" #include "code\datums\mutations\hulk.dm" @@ -1985,6 +1986,7 @@ #include "code\modules\clothing\masks\_masks.dm" #include "code\modules\clothing\masks\boxing.dm" #include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\cluwne.dm" #include "code\modules\clothing\masks\gasmask.dm" #include "code\modules\clothing\masks\hailer.dm" #include "code\modules\clothing\masks\miscellaneous.dm" @@ -1997,6 +1999,7 @@ #include "code\modules\clothing\outfits\vv_outfit.dm" #include "code\modules\clothing\shoes\_shoes.dm" #include "code\modules\clothing\shoes\bananashoes.dm" +#include "code\modules\clothing\shoes\cluwne.dm" #include "code\modules\clothing\shoes\colour.dm" #include "code\modules\clothing\shoes\magboots.dm" #include "code\modules\clothing\shoes\miscellaneous.dm" @@ -2020,6 +2023,7 @@ #include "code\modules\clothing\suits\wiz_robe.dm" #include "code\modules\clothing\under\_under.dm" #include "code\modules\clothing\under\accessories.dm" +#include "code\modules\clothing\under\cluwne.dm" #include "code\modules\clothing\under\color.dm" #include "code\modules\clothing\under\costume.dm" #include "code\modules\clothing\under\miscellaneous.dm" @@ -2076,6 +2080,7 @@ #include "code\modules\events\electrical_storm.dm" #include "code\modules\events\fake_virus.dm" #include "code\modules\events\false_alarm.dm" +#include "code\modules\events\floorcluwne.dm" #include "code\modules\events\fugitive_spawning.dm" #include "code\modules\events\ghost_role.dm" #include "code\modules\events\grid_check.dm" @@ -2782,6 +2787,7 @@ #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" #include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" #include "code\modules\mob\living\simple_animal\hostile\faithless.dm" +#include "code\modules\mob\living\simple_animal\hostile\floor_cluwne.dm" #include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" #include "code\modules\mob\living\simple_animal\hostile\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"