diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm
new file mode 100644
index 00000000000..c0336b26149
--- /dev/null
+++ b/code/datums/spells/cluwne.dm
@@ -0,0 +1,86 @@
+/obj/effect/proc_holder/spell/targeted/touch/cluwne
+ name = "Curse of the Cluwne"
+ desc = "Turns the target into a fat and cursed monstrosity of a clown."
+ hand_path = /obj/item/weapon/melee/touch_attack/cluwne
+
+ school = "transmutation"
+
+ charge_max = 600
+ clothes_req = 1
+ cooldown_min = 200 //100 deciseconds reduction per rank
+
+ action_icon_state = "clown"
+
+/mob/living/carbon/human/proc/makeCluwne()
+ to_chat(src, "You feel funny.")
+ adjustBrainLoss(80)
+ nutrition = 9000
+ confused = 120
+ if(mind)
+ mind.assigned_role = "Cluwne"
+
+ var/obj/item/organ/internal/honktumor/cursed/tumor = new
+ tumor.insert(src)
+ mutations.Add(NERVOUS)
+ dna.SetSEState(NERVOUSBLOCK, 1, 1)
+ genemutcheck(src, NERVOUSBLOCK, null, MUTCHK_FORCED)
+
+ animate_clownspell(src)
+
+ unEquip(w_uniform, 1)
+ unEquip(shoes, 1)
+ unEquip(gloves, 1)
+ if(!istype(wear_mask, /obj/item/clothing/mask/cursedclown)) //Infinite loops otherwise
+ unEquip(wear_mask, 1)
+ equip_to_slot_if_possible(new /obj/item/clothing/under/cursedclown, slot_w_uniform, 1, 1, 1)
+ equip_to_slot_if_possible(new /obj/item/clothing/gloves/cursedclown, slot_gloves, 1, 1, 1)
+ equip_to_slot_if_possible(new /obj/item/clothing/mask/cursedclown, slot_wear_mask, 1, 1, 1)
+ equip_to_slot_if_possible(new /obj/item/clothing/shoes/cursedclown, slot_shoes, 1, 1, 1)
+ real_name = "cluwne"
+
+/mob/living/carbon/human/proc/makeAntiCluwne()
+ to_chat(src, "You don't feel very funny.")
+ adjustBrainLoss(-120)
+ nutrition = NUTRITION_LEVEL_STARVING
+ confused = 0
+ jitteriness = 0
+ if(mind)
+ mind.assigned_role = "Lawyer"
+
+ var/obj/item/organ/internal/honktumor/cursed/tumor = get_int_organ(/obj/item/organ/internal/honktumor/cursed)
+ if(tumor)
+ tumor.remove(src, clean_remove = 1)
+ qdel(tumor)
+ else
+ mutations.Remove(CLUMSY)
+ mutations.Remove(COMICBLOCK)
+ dna.SetSEState(CLUMSYBLOCK,0)
+ dna.SetSEState(COMICBLOCK,0)
+ genemutcheck(src, CLUMSYBLOCK, null, MUTCHK_FORCED)
+ genemutcheck(src, COMICBLOCK, null, MUTCHK_FORCED)
+ mutations.Remove(NERVOUS)
+ dna.SetSEState(NERVOUSBLOCK, 0)
+ genemutcheck(src, NERVOUSBLOCK, null, MUTCHK_FORCED)
+
+ animate_clownspell(src)
+
+ var/obj/item/clothing/under/U = w_uniform
+ unEquip(w_uniform, 1)
+ if(U)
+ qdel(U)
+
+ var/obj/item/clothing/shoes/S = shoes
+ unEquip(shoes, 1)
+ if(S)
+ qdel(S)
+
+ if(istype(wear_mask, /obj/item/clothing/mask/cursedclown))
+ unEquip(wear_mask, 1)
+
+ if(istype(gloves, /obj/item/clothing/gloves/cursedclown))
+ var/obj/item/clothing/gloves/G = gloves
+ unEquip(gloves, 1)
+ qdel(G)
+
+ equip_to_slot_if_possible(new /obj/item/clothing/under/lawyer/black, slot_w_uniform, 1, 1, 1)
+ equip_to_slot_if_possible(new /obj/item/clothing/shoes/black, slot_shoes, 1, 1, 1)
diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm
index 1262730fd45..6f659e5e98d 100644
--- a/code/datums/spells/touch_attacks.dm
+++ b/code/datums/spells/touch_attacks.dm
@@ -1,5 +1,5 @@
-/obj/effect/proc_holder/spell/targeted/touch/
- var/hand_path = "/obj/item/weapon/melee/touch_attack"
+/obj/effect/proc_holder/spell/targeted/touch
+ var/hand_path = /obj/item/weapon/melee/touch_attack
var/obj/item/weapon/melee/touch_attack/attached_hand = null
invocation_type = "none" //you scream on connecting, not summoning
include_user = 1
@@ -47,7 +47,7 @@
/obj/effect/proc_holder/spell/targeted/touch/disintegrate
name = "Disintegrate"
desc = "This spell charges your hand with vile energy that can be used to violently explode victims."
- hand_path = "/obj/item/weapon/melee/touch_attack/disintegrate"
+ hand_path = /obj/item/weapon/melee/touch_attack/disintegrate
school = "evocation"
charge_max = 600
@@ -59,11 +59,11 @@
/obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone
name = "Flesh to Stone"
desc = "This spell charges your hand with the power to turn victims into inert statues for a long period of time."
- hand_path = "/obj/item/weapon/melee/touch_attack/fleshtostone"
+ hand_path = /obj/item/weapon/melee/touch_attack/fleshtostone
school = "transmutation"
charge_max = 600
clothes_req = 1
cooldown_min = 200 //100 deciseconds reduction per rank
- action_icon_state = "statue"
\ No newline at end of file
+ action_icon_state = "statue"
diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm
index 8a5ba06f36f..ab5ba426106 100644
--- a/code/game/gamemodes/wizard/godhand.dm
+++ b/code/game/gamemodes/wizard/godhand.dm
@@ -33,7 +33,7 @@
qdel(src)
/obj/item/weapon/melee/touch_attack/disintegrate
- name = "\improper disintegrating touch"
+ name = "disintegrating touch"
desc = "This hand of mine glows with an awesome power!"
catchphrase = "EI NATH!!"
on_use_sound = "sound/magic/Disintegrate.ogg"
@@ -51,7 +51,7 @@
..()
/obj/item/weapon/melee/touch_attack/fleshtostone
- name = "\improper petrifying touch"
+ name = "petrifying touch"
desc = "That's the bottom line, because flesh to stone said so!"
catchphrase = "STAUN EI!!"
on_use_sound = "sound/magic/FleshToStone.ogg"
@@ -78,10 +78,38 @@
item_state = "disintegrate"
/obj/item/weapon/melee/touch_attack/fake_disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad
+ if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //not exploding after touching yourself would be bad
return
var/datum/effect/system/spark_spread/sparks = new
sparks.set_up(4, 0, target.loc) //no idea what the 0 is
sparks.start()
playsound(target.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
- ..()
\ No newline at end of file
+ ..()
+
+/obj/item/weapon/melee/touch_attack/cluwne
+ name = "cluwne touch"
+ desc = "It's time to start clowning around."
+ catchphrase = "NWOLC EGNEVER"
+ on_use_sound = "sound/misc/sadtrombone.ogg"
+ icon_state = "cluwnecurse"
+ item_state = "cluwnecurse"
+
+/obj/item/weapon/melee/touch_attack/cluwne/afterattack(atom/target, mob/living/carbon/user, proximity)
+ if(!proximity || target == user || !ishuman(target) || !iscarbon(user) || user.lying || user.handcuffed) //clowning around after touching yourself would unsurprisingly, be bad
+ return
+
+ if(iswizard(target))
+ to_chat(user, "The spell has no effect on [target].")
+ return
+
+ var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread
+ s.set_up(5, 0, target)
+ s.start()
+
+ var/mob/living/carbon/human/H = target
+ if(H.mind)
+ if(H.mind.assigned_role != "Cluwne")
+ H.makeCluwne()
+ else
+ H.makeAntiCluwne()
+ ..()
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index ac487a8e703..65c50382532 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -233,6 +233,11 @@
category = "Assistance"
cost = 1
+/datum/spellbook_entry/cluwne
+ name = "Curse of the Cluwne"
+ spell_type = /obj/effect/proc_holder/spell/targeted/touch/cluwne
+ log_name = "CC"
+
/datum/spellbook_entry/item
name = "Buy Item"
refundable = 0
@@ -857,4 +862,4 @@
spell = /obj/effect/proc_holder/spell/targeted/touch/fake_disintegrate
spellname = "disintegrate"
icon_state ="bookfireball"
- desc = "This book feels like it will rip stuff apart."
\ No newline at end of file
+ desc = "This book feels like it will rip stuff apart."
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 060dd1ca47c..d98ee1d0154 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -47,4 +47,11 @@
name = "batgloves"
icon_state = "bmgloves"
item_state = "bmgloves"
- item_color="bmgloves"
\ No newline at end of file
+ item_color="bmgloves"
+
+/obj/item/clothing/gloves/cursedclown
+ name = "cursed white gloves"
+ desc = "These things smell terrible, and they're all lumpy. Gross."
+ icon_state = "latex"
+ item_state = "lgloves"
+ flags = NODROP
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 3e99b277db3..ca5a267c6a4 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -275,3 +275,28 @@ obj/item/clothing/mask/bandana/purple
icon_state = "bandblack"
item_color = "black"
desc = "It's a black bandana."
+
+/obj/item/clothing/mask/cursedclown
+ name = "cursed clown mask"
+ desc = "This is a very, very odd looking mask."
+ icon = 'icons/goonstation/objects/clothing/mask.dmi'
+ icon_state = "cursedclown"
+ item_state = "cclown_hat"
+ icon_override = 'icons/goonstation/mob/clothing/mask.dmi'
+ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
+ righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
+ flags = NODROP
+
+/obj/item/clothing/mask/cursedclown/equipped(mob/user, slot)
+ ..()
+ var/mob/living/carbon/human/H = user
+ if(istype(H) && slot == slot_wear_mask)
+ to_chat(H, "[src] grips your face!")
+ if(H.mind && H.mind.assigned_role != "Cluwne")
+ H.makeCluwne()
+
+/obj/item/clothing/mask/cursedclown/suicide_act(mob/user)
+ user.visible_message("[user] gazes into the eyes of [src]. [src] gazes back!")
+ spawn(10)
+ user.gib()
+ return BRUTELOSS
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index af361951f3d..bc62c5d71d4 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -207,3 +207,13 @@
item_color = "fancysandal"
species_restricted = null
+/obj/item/clothing/shoes/cursedclown
+ name = "cursed clown shoes"
+ desc = "Moldering clown flip flops. They're neon green for some reason."
+ icon = 'icons/goonstation/objects/clothing/feet.dmi'
+ icon_state = "cursedclown"
+ item_state = "cclown_shoes"
+ icon_override = 'icons/goonstation/mob/clothing/feet.dmi'
+ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
+ righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
+ flags = NODROP
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index a88fdd6f970..badf323d804 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -657,4 +657,4 @@
if(user.reagents.get_reagent_amount("syndicate_nanites") < 15)
user.reagents.add_reagent("syndicate_nanites", 15)
else
- processing_objects.Remove(src)
\ No newline at end of file
+ processing_objects.Remove(src)
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 769e388f546..d912a2e289d 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -709,3 +709,15 @@
to_chat(user,"You can't fit inside while wearing that \the [user.get_item_by_slot(slot_id)].")
return 0
return 1
+
+/obj/item/clothing/under/cursedclown
+ name = "cursed clown suit"
+ desc = "It wasn't already?"
+ icon = 'icons/goonstation/objects/clothing/uniform.dmi'
+ icon_state = "cursedclown"
+ item_state = "cclown_uniform"
+ item_color = "cursedclown"
+ icon_override = 'icons/goonstation/mob/clothing/uniform.dmi'
+ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
+ righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
+ flags = NODROP
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index f4a47c595cb..27b7120b63a 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -476,13 +476,21 @@
var/mob/living/carbon/human/H = owner
if(isobj(H.shoes))
var/thingy = H.shoes
- H.unEquip(H.shoes)
- walk_away(thingy,H,15,2)
- spawn(20)
- if(thingy)
- walk(thingy,0)
+ if(H.unEquip(H.shoes))
+ walk_away(thingy,H,15,2)
+ spawn(20)
+ if(thingy)
+ walk(thingy,0)
..()
+/obj/item/organ/internal/honktumor/cursed
+
+/obj/item/organ/internal/honktumor/cursed/remove(mob/living/carbon/M, special = 0, clean_remove = 0)
+ ..()
+ if(!clean_remove)
+ insert(M) //You're not getting away that easily!
+ else
+ qdel(src)
/obj/item/organ/internal/beard
name = "beard organ"
@@ -493,7 +501,6 @@
parent_organ = "head"
slot = "hair_organ"
-
/obj/item/organ/internal/beard/on_life()
if(!owner)
@@ -516,4 +523,4 @@
head_organ.r_facial = 216
head_organ.g_facial = 192
head_organ.b_facial = 120
- H.update_fhair()
\ No newline at end of file
+ H.update_fhair()
diff --git a/icons/goonstation/mob/clothing/feet.dmi b/icons/goonstation/mob/clothing/feet.dmi
new file mode 100644
index 00000000000..73549581095
Binary files /dev/null and b/icons/goonstation/mob/clothing/feet.dmi differ
diff --git a/icons/goonstation/mob/clothing/mask.dmi b/icons/goonstation/mob/clothing/mask.dmi
new file mode 100644
index 00000000000..c4392fb8de7
Binary files /dev/null and b/icons/goonstation/mob/clothing/mask.dmi differ
diff --git a/icons/goonstation/mob/clothing/uniform.dmi b/icons/goonstation/mob/clothing/uniform.dmi
new file mode 100644
index 00000000000..522e83854ec
Binary files /dev/null and b/icons/goonstation/mob/clothing/uniform.dmi differ
diff --git a/icons/goonstation/mob/inhands/clothing_lefthand.dmi b/icons/goonstation/mob/inhands/clothing_lefthand.dmi
new file mode 100644
index 00000000000..363c616d3f8
Binary files /dev/null and b/icons/goonstation/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/goonstation/mob/inhands/clothing_righthand.dmi b/icons/goonstation/mob/inhands/clothing_righthand.dmi
new file mode 100644
index 00000000000..0903e0d2055
Binary files /dev/null and b/icons/goonstation/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/goonstation/objects/clothing/feet.dmi b/icons/goonstation/objects/clothing/feet.dmi
new file mode 100644
index 00000000000..e6d37e10132
Binary files /dev/null and b/icons/goonstation/objects/clothing/feet.dmi differ
diff --git a/icons/goonstation/objects/clothing/mask.dmi b/icons/goonstation/objects/clothing/mask.dmi
new file mode 100644
index 00000000000..f5c4f97c255
Binary files /dev/null and b/icons/goonstation/objects/clothing/mask.dmi differ
diff --git a/icons/goonstation/objects/clothing/uniform.dmi b/icons/goonstation/objects/clothing/uniform.dmi
new file mode 100644
index 00000000000..a602f0cdce5
Binary files /dev/null and b/icons/goonstation/objects/clothing/uniform.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 5adc3ed1509..127b63a154a 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 61c176bd08a..27168c30865 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 652996f8d8c..2f7154777fd 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 01609b50824..7867fac04b4 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 3f06e7152d2..7f315ddd7c0 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -274,6 +274,7 @@
#include "code\datums\spells\area_teleport.dm"
#include "code\datums\spells\bloodcrawl.dm"
#include "code\datums\spells\charge.dm"
+#include "code\datums\spells\cluwne.dm"
#include "code\datums\spells\conjure.dm"
#include "code\datums\spells\construct_spells.dm"
#include "code\datums\spells\dumbfire.dm"