diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm
index a492acf92af..f7e3bcbaf47 100644
--- a/code/__DEFINES/research.dm
+++ b/code/__DEFINES/research.dm
@@ -105,6 +105,7 @@
#define CELL_LINE_TABLE_SNAKE "cell_line_snake_table"
#define CELL_LINE_TABLE_VATBEAST "cell_line_vatbeast_table"
#define CELL_LINE_TABLE_NETHER "cell_line_nether_table"
+#define CELL_LINE_TABLE_GLUTTON "cell_line_glutton_table"
//! All cell virus types
#define CELL_VIRUS_TABLE_GENERIC "cell_virus_generic_table"
diff --git a/code/_globalvars/lists/xenobiology.dm b/code/_globalvars/lists/xenobiology.dm
index 49fd7be9405..656837e1b1e 100644
--- a/code/_globalvars/lists/xenobiology.dm
+++ b/code/_globalvars/lists/xenobiology.dm
@@ -25,8 +25,10 @@ GLOBAL_LIST_INIT_TYPED(cell_line_tables, /list, list(
CELL_LINE_TABLE_SNAKE = list(/datum/micro_organism/cell_line/snake = 1),
CELL_LINE_TABLE_VATBEAST = list(/datum/micro_organism/cell_line/vat_beast = 1),
CELL_LINE_TABLE_NETHER = list(/datum/micro_organism/cell_line/netherworld = 1)/*,
- CELL_LINE_TABLE_CLOWN = list(/datum/micro_organism/cell_line/clown/bananaclown = 1, /datum/micro_organism/cell_line/clown/fleshclown = 1, /datum/micro_organism/cell_line/clown/longclown = 1)*/
- )) //SKYRAT EDIT CHANGE - removed clown stuff
+ CELL_LINE_TABLE_CLOWN = list(/datum/micro_organism/cell_line/clown/bananaclown = 1, /datum/micro_organism/cell_line/clown/glutton = 1, /datum/micro_organism/cell_line/clown/longclown = 1),
+ CELL_LINE_TABLE_GLUTTON = list(/datum/micro_organism/cell_line/clown/glutton = 1)
+ */
+ )) //SKYRAT EDIT REMOVAL - removed clown stuff - Skyrat-SS13/Skyrat-tg#2405
///Assoc list of cell virus define | assoc list of datum | cell_virus
GLOBAL_LIST_INIT(cell_virus_tables, list(
diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm
index 6c9ca46ef59..02528ee8158 100644
--- a/code/game/objects/items/grenades/spawnergrenade.dm
+++ b/code/game/objects/items/grenades/spawnergrenade.dm
@@ -52,7 +52,7 @@
desc = "A sleek device often given to clowns on their 10th birthdays for protection. You can hear faint scratching coming from within."
icon_state = "clown_ball"
inhand_icon_state = "clown_ball"
- spawner_type = list(/mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube)
+ spawner_type = list(/mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube)
deliveryamt = 1
/obj/item/grenade/spawnergrenade/clown_broken
diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm
index 06b19db1bf5..370f765167c 100644
--- a/code/game/objects/structures/spawner.dm
+++ b/code/game/objects/structures/spawner.dm
@@ -53,7 +53,7 @@
max_integrity = 200
max_mobs = 15
spawn_time = 150
- mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube)
+ mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube)
spawn_text = "climbs out of"
faction = list("clown")
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index f653821d4a1..12cdda9cf32 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -299,21 +299,158 @@
speed = 20
move_to_delay = 60
-/mob/living/simple_animal/hostile/retaliate/clown/mutant/blob
- name = "Something that was once a clown"
- desc = "A grotesque bulging figure far mutated from it's original state."
- icon_state = "blob"
- icon_living = "blob"
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton
+ name = "banana glutton"
+ desc = "Something that was once a clown"
+ icon_state = "glutton"
+ icon_living = "glutton"
speak = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!")
emote_see = list("jiggles", "wobbles")
- health = 130
+ health = 200
mob_size = MOB_SIZE_LARGE
- speed = 20
- attack_verb_continuous = "bounces off of"
- attack_verb_simple = "bounce off of"
- loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human)
- attack_reagent = /datum/reagent/toxin/mindbreaker
+ speed = 1
+ melee_damage_lower = 10
+ melee_damage_upper = 15
+ force_threshold = 10 //lots of fat to cushion blows.
+ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 2, STAMINA = 0, OXY = 1)
+ attack_verb_continuous = "slams"
+ attack_verb_simple = "slam"
+ loot = list(/obj/effect/gibspawner/xeno/bodypartless, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless)
+ deathsound = 'sound/misc/sadtrombone.ogg'
+ food_type = list(/obj/item/food/cheesiehonkers, /obj/item/food/cornchips)
+ tame_chance = 30
+ ///This is the list of items we are ready to regurgitate,
+ var/list/prank_pouch = list()
+ ///This ability lets you fire a single random item from your pouch.
+ var/obj/effect/proc_holder/regurgitate/my_regurgitate
+
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/Initialize()
+ . = ..()
+ my_regurgitate = new
+ AddAbility(my_regurgitate)
+ add_cell_sample()
+
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/attacked_by(obj/item/I, mob/living/user)
+ if(!check_edible(I))
+ return ..()
+ eat_atom(I)
+
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/AttackingTarget(atom/attacked_target)
+ if(!check_edible(attacked_target))
+ return ..()
+ eat_atom(attacked_target)
+
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/UnarmedAttack(atom/A)
+ if(!check_edible(A))
+ return ..()
+ eat_atom(A)
+
+///Returns whether or not the supplied movable atom is edible.
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/check_edible(atom/movable/potential_food)
+ if(isliving(potential_food))
+ var/mob/living/living_morsel = potential_food
+ if(living_morsel.mob_size > MOB_SIZE_SMALL)
+ return FALSE
+ else
+ return TRUE
+
+ if(IS_EDIBLE(potential_food))
+ if(prank_pouch.len >= 8)
+ to_chat(src, "Your prank pouch is filled to the brim! You don't think you can swallow any more morsels right now.")
+ return FALSE
+ return TRUE
+
+///This proc eats the atom, certain funny items are stored directly in the prank pouch while bananas grant a heal based on their potency and the peels are retained in the pouch.
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/eat_atom(atom/movable/eaten_atom)
+
+ var/static/funny_items = list(/obj/item/food/pie/cream,
+ /obj/item/food/grown/tomato,
+ /obj/item/food/meatclown)
+
+ visible_message("You eat [eaten_atom].")
+ if(is_type_in_list(eaten_atom, funny_items))
+ eaten_atom.forceMove(src)
+ prank_pouch += eaten_atom
+
+ else if(istype(eaten_atom, /obj/item/food/grown/banana))
+ var/obj/item/food/grown/banana/banana_morsel = eaten_atom
+ adjustBruteLoss(-banana_morsel.seed.potency * 0.25)
+ prank_pouch += banana_morsel.generate_trash(src)
+ qdel(eaten_atom)
+ else
+ qdel(eaten_atom)
+ playsound(loc,'sound/items/eatfood.ogg', rand(30,50), TRUE)
+ flick("glutton_mouth", src)
+
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/tamed()
+ . = ..()
+ can_buckle = TRUE
+ buckle_lying = 0
+ var/datum/component/riding/riding = LoadComponent(/datum/component/riding)
+ riding.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 24), TEXT_SOUTH = list(0, 24), TEXT_EAST = list(-16, 24), TEXT_WEST = list(16, 24)))
+ riding.set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER)
+ riding.set_vehicle_dir_layer(NORTH, OBJ_LAYER)
+ riding.set_vehicle_dir_layer(EAST, ABOVE_MOB_LAYER)
+ riding.set_vehicle_dir_layer(WEST, ABOVE_MOB_LAYER)
+
+ //these 0 offsets are needed for the riding component to work properly with base pixel offset mobs for some cursed reason.
+ riding.set_vehicle_dir_offsets(SOUTH, 0, 0)
+ riding.set_vehicle_dir_offsets(NORTH, 0, 0)
+ riding.set_vehicle_dir_offsets(EAST, 0, 0)
+ riding.set_vehicle_dir_offsets(WEST, 0, 0)
+
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/add_cell_sample()
+ AddElement(/datum/element/swabable, CELL_LINE_TABLE_GLUTTON, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
+
+/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/Exited(atom/movable/AM, atom/newLoc)
+ . = ..()
+ prank_pouch -= AM
+
+///This ability will let you fire one random item from your pouch,
+/obj/effect/proc_holder/regurgitate
+ name = "Regurgitate"
+ desc = "Regurgitates a single item from the depths of your pouch."
+ action_background_icon_state = "bg_changeling"
+ action_icon = 'icons/mob/actions/actions_animal.dmi'
+ action_icon_state = "regurgitate"
+ active = FALSE
+
+/obj/effect/proc_holder/regurgitate/Click(location, control, params)
+ . = ..()
+ if(!isliving(usr))
+ return TRUE
+ var/mob/living/user = usr
+ fire(user)
+
+/obj/effect/proc_holder/regurgitate/fire(mob/living/carbon/user)
+ if(active)
+ user.icon_state = initial(user.icon_state)
+ remove_ranged_ability("Your throat muscles relax.")
+ else
+ user.icon_state = "glutton_tongue"
+ add_ranged_ability(user, "Your throat muscles tense up. Left-click to regurgitate a funny morsel!", TRUE)
+
+/obj/effect/proc_holder/regurgitate/InterceptClickOn(mob/living/caller, params, atom/target)
+ . = ..()
+
+ if(.)
+ return
+
+ if(!istype(ranged_ability_user, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton) || ranged_ability_user.stat)
+ remove_ranged_ability()
+ return
+
+ var/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/pouch_owner = ranged_ability_user
+ if(!pouch_owner.prank_pouch.len)
+ //active = FALSE
+ pouch_owner.icon_state = "glutton"
+ remove_ranged_ability("Your prank pouch is empty,.")
+ return
+
+ var/obj/item/projected_morsel = pick(pouch_owner.prank_pouch)
+ projected_morsel.forceMove(pouch_owner.loc)
+ projected_morsel.throw_at(target, 8, 2, pouch_owner)
+ flick("glutton_mouth", pouch_owner)
+ playsound(pouch_owner, 'sound/misc/soggy.ogg', 75)
+
-/mob/living/simple_animal/hostile/retaliate/clown/mutant/blob/slow
- speed = 50
- move_to_delay = 120
diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm
index 920239161b5..cdd2dfdb48f 100644
--- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm
+++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm
@@ -418,31 +418,82 @@
vat.visible_message("The biological sample in [vat] seems to have created something horrific!")
QDEL_NULL(vat.biological_sample) //Kill off the sample, we're done
- var/mob/selected_mob = pick(list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/slow, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob/slow))
+ var/mob/selected_mob = pick(list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/slow, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown))
new selected_mob(get_turf(vat))
/datum/micro_organism/cell_line/clown/bananaclown
desc = "Clown bits with banana chunks"
- required_reagents = list(/datum/reagent/consumable/banana)
- supplementary_reagents = list(/datum/reagent/medicine/coagulant/banana_peel = 4)
+ required_reagents = list(
+ /datum/reagent/consumable/nutriment/protein,
+ /datum/reagent/consumable/banana)
+
+ supplementary_reagents = list(
+ /datum/reagent/saltpetre = 4,
+ /datum/reagent/ammonia = 3,
+ /datum/reagent/carbondioxide = 3,
+ /datum/reagent/medicine/coagulant/banana_peel = 2,
+ /datum/reagent/plantnutriment/robustharvestnutriment = 1)
+
+ suppressive_reagents = list(
+ /datum/reagent/consumable/clownstears = -8,
+ /datum/reagent/toxin/plantbgone = -4,
+ /datum/reagent/consumable/ethanol/silencer = -3,
+ /datum/reagent/consumable/nothing = -2,
+ /datum/reagent/fuel/oil = -1)
+
resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/banana = 1)
-/datum/micro_organism/cell_line/clown/fleshclown
- desc = "Overly fleshy clown bits"
+/datum/micro_organism/cell_line/clown/glutton
+ desc = "hyperadipogenic clown stem cells"
- required_reagents = list(/datum/reagent/consumable/banana)
- supplementary_reagents = list(/datum/reagent/consumable/nutriment/protein = 4)
+ required_reagents = list(
+ /datum/reagent/consumable/nutriment/protein,
+ /datum/reagent/consumable/banana,
+ /datum/reagent/medicine/c2/synthflesh)
+ //r/chonkers
+ supplementary_reagents = list(
+ /datum/reagent/consumable/vanillapudding = 8,
+ /datum/reagent/growthserum = 6,
+ /datum/reagent/consumable/nutriment/peptides = 4,
+ /datum/reagent/consumable/cornoil = 3,
+ /datum/reagent/consumable/cooking_oil = 1,
+ /datum/reagent/consumable/space_cola = 1)
- resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/fleshclown = 1)
+ suppressive_reagents = list(
+ /datum/reagent/consumable/clownstears = -8,
+ /datum/reagent/toxin/minttoxin = -6,
+ /datum/reagent/consumable/ethanol/silencer = -3,
+ /datum/reagent/consumable/ethanol/fernet = -3,
+ /datum/reagent/toxin/lipolicide = -3,
+ /datum/reagent/consumable/nothing = -2,
+ /datum/reagent/toxin/bad_food = -1)
+
+
+ resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton = 1)
/datum/micro_organism/cell_line/clown/longclown
desc = "long clown bits"
- required_reagents = list(/datum/reagent/consumable/banana)
- supplementary_reagents = list(/datum/reagent/consumable/laughter = 4)
+ required_reagents = list(
+ /datum/reagent/consumable/nutriment/protein,
+ /datum/reagent/consumable/banana)
+
+ supplementary_reagents = list(
+ /datum/reagent/drug/happiness = 5,
+ /datum/reagent/toxin/mimesbane = 4,
+ /datum/reagent/consumable/laughter = 3,
+ /datum/reagent/nitrous_oxide = 2)
+
+ suppressive_reagents = list(
+ /datum/reagent/consumable/clownstears = -8,
+ /datum/reagent/consumable/ethanol/beepsky_smash = -3,
+ /datum/reagent/consumable/ethanol/silencer = -3,
+ /datum/reagent/toxin/mutetoxin = -3,
+ /datum/reagent/consumable/nothing = -2,
+ /datum/reagent/sulfur = -1)
resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/longface = 1)
*/
diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi
index cc8fe36c05a..0b139f2ae62 100644
Binary files a/icons/mob/actions/actions_animal.dmi and b/icons/mob/actions/actions_animal.dmi differ
diff --git a/icons/mob/clown_mobs.dmi b/icons/mob/clown_mobs.dmi
index 803a99cd7ae..d40519980d0 100644
Binary files a/icons/mob/clown_mobs.dmi and b/icons/mob/clown_mobs.dmi differ