Clown Abomination Rebalance! #Cytology2025 (#91000)

## About The Pull Request

This PR includes a number of fixes, buffs and improvements to the clown
mobs to make them more playable and worthwhile.

### Atmos tolerance buffs
This PR removes the insane unsuitable atmos and temperature damage clown
mobs used to take and bring it in line with other mobs.

In addition, clownanas can tolerate lower oxygen levels and are immune
to carbon dioxide due to their half plant biology.

### Movement speed changes

A lot of these mobs were previously unviable due to their slow speed,
one of the most important stats.

This problem will only get worse for basic mobs if the proposed basic
mob stamina changes get implemented.

Most of them are still slower than humans but now have some chance to
corner a human in some circumstances.

(I plan to add more ways to modify basic mob run speed in the future to
help with this.)

The flesh clown and honkling are now fast again, I remember the original
speed nerf of fleshclown upset the very few fleshclown enjoyers once i
PR'd in the initial balance pass years back.

### Glutton buffs

The banana glutton is now given a mechanical incentive to eat lots of
foods to nudge them into good RP.

They heal for every item and gain max health every 5 items eaten!

The banana glutton can now smash doors.

They can now prank the crew with ink sacs should they find them.

### Biotype update

Clownana has gained the plant biotype.

Living lube has gained the slime biotype.

### cell lines & samples

clownana and longface; the two other clown cell lines now have samples
associated with them and can be biopsied to create pure samples of each
cell line.

The clownana banana bunch can also be swabbed for the pure clownana cell
line!

### death drop changes

The death drop element now spreads the items out slightly instead of
stacking lots of drops in the center of the tile.

Clown mobs now drop less soap and more peels, with some of the rarer
ones dropping mimana, bluespace or gros michel peels.

The clownana now has a chance to drop full bananas or even a full banana
bunch.

The banana glutton has a chance to drop a heart of freedom. 

The flesh clown now drops a meatclown instead of soap, and a piece of
human skin instead of a bloated human suit.


### other stat changes

living lube is now highly resistant to brute damage

longface can now acutally fight a little bit, still kinda terrible
though.

## Why It's Good For The Game

These mobs are quite beloved but their level of playability is low due
to poor balance.

The main problem is atmos.

Even a whiff of bad atmos would gib these mobs before they could get to
safety.

Many of them had their speed set way too high or way too low when they
were first added, even after i adjusted their speeds years ago I was
being too conservative.

Their loot tables were too similar, this helps with that a little bit. A
couple of them might even be worthwhile farming for their drops in
certain niche situations!

The banana glutton has such a cool sprite but has been neglected
mechanically, this helps make him a little more worthwhile and the extra
obj damage helps him not be in that sucky place where he is too large to
vent crawl and not powerful enough to break down doors.

Ideally in the future we should probably be more restrictive with
allowing mobs to smash airlocks and give them another way of opening
doors via armblade -like prying or ID implants.

## Changelog

🆑
add: banana gluttons gain max health and heal by eating foods! And they
can smash doors.
balance: clown mobs no longer get nuked by bad atmos.
balance: blown mobs have new death drops.
balance: most clown more are now faster!
balance: clownanas are now plants and are immune to carbon dioxide.
balance: living lube is now a slime and highly brute resistant.
balance: longfaces now hit decently hard.
fix: clownanas and longfaces can now be biopsied.
/🆑

---------

Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
This commit is contained in:
Krysonism
2025-05-17 18:36:04 +02:00
committed by GitHub
parent ae84153b14
commit b3580b8a8d
9 changed files with 88 additions and 36 deletions

View File

@@ -46,6 +46,8 @@
#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"
#define CELL_LINE_TABLE_CLOWNANA "cell_line_clownana_table"
#define CELL_LINE_TABLE_LONGFACE "cell_line_longface_table"
#define CELL_LINE_TABLE_FROG "cell_line_frog_table"
#define CELL_LINE_TABLE_AXOLOTL "cell_line_axolotl_table"
#define CELL_LINE_TABLE_WALKING_MUSHROOM "cell_line_walking_mushroom_table"

View File

@@ -68,6 +68,8 @@ GLOBAL_LIST_INIT_TYPED(cell_line_tables, /list, list(
),
CELL_LINE_TABLE_GLUTTON = list(/datum/micro_organism/cell_line/clown/glutton = 1),
CELL_LINE_TABLE_CLOWNANA = list(/datum/micro_organism/cell_line/clown/bananaclown = 1),
CELL_LINE_TABLE_LONGFACE = list(/datum/micro_organism/cell_line/clown/longclown = 1),
CELL_LINE_TABLE_FROG = list(/datum/micro_organism/cell_line/frog = 1),
CELL_LINE_TABLE_AXOLOTL = list(/datum/micro_organism/cell_line/axolotl = 1),
CELL_LINE_TABLE_WALKING_MUSHROOM = list(/datum/micro_organism/cell_line/walking_mushroom = 1),

View File

@@ -28,15 +28,20 @@
var/atom/loot_loc = target.drop_location()
for(var/thing_to_spawn in loot)
for(var/i in 1 to (loot[thing_to_spawn] || 1))
create_loot(thing_to_spawn, loot_loc, target, gibbed)
create_loot(thing_to_spawn, loot_loc, target, gibbed, spread_px = loot.len * 3)
/// Handles creating the loots
/datum/element/death_drops/proc/create_loot(typepath, atom/loot_loc, mob/living/dead, gibbed)
/datum/element/death_drops/proc/create_loot(typepath, atom/loot_loc, mob/living/dead, gibbed, spread_px = 4)
if(ispath(typepath, /obj/effect/mob_spawn/corpse))
handle_corpse(typepath, loot_loc, dead, gibbed)
return
new typepath(loot_loc)
var/drop = new typepath(loot_loc)
if(isitem(drop) && spread_px)
var/obj/item/dropped_item = drop
var/clamped_px = clamp(spread_px, 0, 16)
dropped_item.pixel_x = rand(-clamped_px, clamped_px)
dropped_item.pixel_y = rand(-clamped_px, clamped_px)
/// Handles snowflake case of mob corpses
/datum/element/death_drops/proc/handle_corpse(typepath, atom/loot_loc, mob/living/dead, gibbed)

View File

@@ -0,0 +1,26 @@
/obj/effect/spawner/random/peel_or_nana
name = "peel or banana spawner"
icon_state = "peel"
spawn_random_offset = TRUE
loot = list(
/obj/item/grown/bananapeel = 3,
/obj/item/food/grown/banana = 2,
)
/obj/effect/spawner/random/bananas_or_nothing
name = "bananas or nothing spawner"
icon_state = "bunch"
spawn_random_offset = TRUE
spawn_loot_chance = 66
loot = list(
/obj/item/food/grown/banana/bunch = 6,
/obj/item/food/grown/banana = 4,
)
/obj/effect/spawner/random/chance_for_freedom
name = "freedom heart or nothing spawner"
icon_state = "cap"
spawn_loot_chance = 40
loot = list(
/obj/item/organ/heart/freedom = 1,
)

View File

@@ -171,6 +171,7 @@
reagents.clear_reagents()
reagents.add_reagent(/datum/reagent/consumable/monkey_energy, 10)
reagents.add_reagent(/datum/reagent/consumable/banana, 10)
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWNANA, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/obj/item/food/grown/banana/bunch/proc/start_ripening()
if(is_ripening)

View File

@@ -23,13 +23,10 @@
basic_mob_flags = DEL_ON_DEATH
initial_language_holder = /datum/language_holder/clown
habitable_atmos = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
minimum_survivable_temperature = T0C
minimum_survivable_temperature = (T0C - 10)
maximum_survivable_temperature = (T0C + 100)
unsuitable_atmos_damage = 10
unsuitable_heat_damage = 15
faction = list(FACTION_CLOWN)
ai_controller = /datum/ai_controller/basic_controller/clown
speed = 1.4 //roughly close to simpleanimal clowns
///list of stuff we drop on death
var/list/loot = list(/obj/effect/mob_spawn/corpse/human/clown)
///blackboard emote list
@@ -72,10 +69,14 @@
desc = "A puddle of lube brought to life by the honkmother."
icon_state = "lube"
icon_living = "lube"
maxHealth = 50
health = 50
response_help_continuous = "dips a finger into"
response_help_simple = "dip a finger into"
response_disarm_continuous = "gently scoops and pours aside"
response_disarm_simple = "gently scoop and pour aside"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_SLIME
damage_coeff = list(BRUTE = 0.25, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1)
emotes = list(
BB_EMOTE_SAY = list("HONK", "Honk!", "Welcome to clown planet!"),
BB_EMOTE_HEAR = list("bubbles", "oozes"),
@@ -95,16 +96,16 @@
desc = "A divine being sent by the Honkmother to spread joy. It's not dangerous, but it's a bit of a nuisance."
icon_state = "honkling"
icon_living = "honkling"
speed = 1.1
speed = -0.5
melee_damage_lower = 1
melee_damage_upper = 1
attack_verb_continuous = "cheers up"
attack_verb_simple = "cheer up"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
loot = list(
/obj/item/clothing/mask/gas/clown_hat,
/obj/effect/gibspawner/human,
/obj/item/soap,
/obj/item/seeds/banana/bluespace,
/obj/item/grown/bananapeel/bluespace,
)
/mob/living/basic/clown/honkling/Initialize(mapload)
@@ -132,7 +133,7 @@
response_harm_simple = "cleanse the world of"
maxHealth = 140
health = 140
speed = 1
speed = -0.5
melee_damage_upper = 15
attack_verb_continuous = "limply slaps"
attack_verb_simple = "limply slap"
@@ -140,8 +141,8 @@
loot = list(
/obj/effect/gibspawner/human,
/obj/item/clothing/mask/gas/clown_hat,
/obj/item/soap,
/obj/item/clothing/suit/hooded/bloated_human,
/obj/item/food/meatclown,
/obj/item/stack/sheet/animalhide/human,
)
emotes = list(
BB_EMOTE_SAY = list(
@@ -178,13 +179,13 @@
health = 150
pixel_x = -16
base_pixel_x = -16
speed = 3
melee_damage_lower = 5
speed = 1.5
melee_damage_upper = 20
attack_verb_continuous = "YA-HONKs"
attack_verb_simple = "YA-HONK"
loot = list(
/obj/effect/gibspawner/human,
/obj/item/soap,
/obj/item/grown/bananapeel,
/obj/item/clothing/mask/gas/clown_hat,
)
emotes = list(
@@ -193,6 +194,10 @@
BB_SPEAK_CHANCE = 60,
)
/mob/living/basic/clown/longface/Initialize(mapload)
. = ..()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_LONGFACE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/basic/clown/clownhulk
name = "Honk Hulk"
desc = "A cruel and fearsome clown. Don't make him angry."
@@ -210,7 +215,7 @@
health = 400
pixel_x = -16
base_pixel_x = -16
speed = 2
speed = 1.5
melee_damage_lower = 15
melee_damage_upper = 20
attack_verb_continuous = "pummels"
@@ -243,7 +248,6 @@
response_harm_simple = "make a weak beta attack at"
maxHealth = 500
health = 500
speed = -2 //ridicilously fast but i dont even know what this is used for
armour_penetration = 20
attack_verb_continuous = "steals the girlfriend of"
attack_verb_simple = "steal the girlfriend of"
@@ -251,7 +255,7 @@
loot = list(
/obj/effect/gibspawner/human,
/obj/effect/spawner/foam_starter/small,
/obj/item/soap,
/obj/item/grown/bananapeel,
/obj/item/clothing/mask/gas/clown_hat,
)
emotes = list(
@@ -271,16 +275,14 @@
response_disarm_simple = "push the unwieldy frame of"
maxHealth = 200
health = 200
speed = 1
melee_damage_lower = 5
melee_damage_upper = 10
melee_damage_upper = 15
attack_verb_continuous = "ferociously mauls"
attack_verb_simple = "ferociously maul"
environment_smash = ENVIRONMENT_SMASH_NONE
loot = list(
/obj/effect/gibspawner/xeno/bodypartless,
/obj/effect/spawner/foam_starter/small,
/obj/item/soap,
/obj/item/grown/bananapeel/mimanapeel,
/obj/item/clothing/mask/gas/clown_hat,
)
emotes = list(
@@ -309,7 +311,7 @@
response_harm_continuous = "bounces off of"
maxHealth = 400
health = 400
speed = 5
speed = 1.5
melee_damage_lower = 20
melee_damage_upper = 40
armour_penetration = 30
@@ -321,7 +323,7 @@
loot = list(
/obj/effect/gibspawner/human,
/obj/effect/spawner/foam_starter/small,
/obj/item/soap,
/obj/item/grown/bananapeel,
/obj/item/clothing/mask/gas/clown_hat,
)
emotes = list(
@@ -347,7 +349,7 @@
health = 130
pixel_x = -16
base_pixel_x = -16
speed = -5
speed = 1.5
melee_damage_lower = 10
melee_damage_upper = 20
attack_verb_continuous = "awkwardly flails at"
@@ -358,7 +360,7 @@
/obj/effect/gibspawner/human,
/obj/effect/gibspawner/human/bodypartless,
/obj/effect/gibspawner/xeno/bodypartless,
/obj/item/soap,
/obj/item/grown/bananapeel/gros_michel,
/obj/item/clothing/mask/gas/clown_hat,
)
emotes = list(
@@ -367,8 +369,6 @@
BB_SPEAK_CHANCE = 10,
)
/mob/living/basic/clown/mutant/slow
speed = 20
/mob/living/basic/clown/mutant/glutton
name = "banana glutton"
@@ -380,14 +380,19 @@
speed = 1
melee_damage_lower = 10
melee_damage_upper = 15
obj_damage = 50
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 1, OXY = 1)
attack_verb_continuous = "slams"
attack_verb_simple = "slam"
///Tracks how many total foods we have eaten, used for calculating when we should gain max health.
var/foods_eaten = 0
loot = list(
/obj/effect/gibspawner/generic,
/obj/effect/gibspawner/generic/animal,
/obj/effect/gibspawner/human/bodypartless,
/obj/effect/gibspawner/xeno/bodypartless,
/obj/effect/spawner/random/chance_for_freedom,
)
emotes = list(
BB_EMOTE_SAY = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!"),
@@ -401,7 +406,6 @@
/mob/living/basic/clown/mutant/glutton/Initialize(mapload)
. = ..()
GRANT_ACTION(/datum/action/cooldown/regurgitate)
AddElement(/datum/element/swabable, CELL_LINE_TABLE_GLUTTON, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
var/static/list/food_types = list(
/obj/item/food/cheesiehonkers,
@@ -447,6 +451,7 @@
/obj/item/food/pie/cream,
/obj/item/food/grown/tomato,
/obj/item/food/meatclown,
/obj/item/food/ink_sac,
)
visible_message(span_warning("[src] eats [eaten_atom]!"), span_notice("You eat [eaten_atom]."))
@@ -455,11 +460,18 @@
prank_pouch += eaten_atom
else
//Encourage gluttony RP by giving a litle bonus for each obj eaten.
foods_eaten++
if(!(foods_eaten % 5) && foods_eaten <= 100)
balloon_alert(src, "weight gained!")
maxHealth += 10
health += 10
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)
adjustBruteLoss(-(banana_morsel.seed.potency / 100 ) * maxHealth * 0.2)
prank_pouch += banana_morsel.generate_trash(src)
else
adjustBruteLoss(-maxHealth * 0.1)
qdel(eaten_atom)
playsound(loc,'sound/items/eatfood.ogg', rand(30,50), TRUE)
@@ -534,6 +546,7 @@
desc = "A fusion of clown and banana DNA birthed from a botany experiment gone wrong."
icon_state = "banana tree"
icon_living = "banana tree"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_PLANT
response_disarm_continuous = "peels"
response_disarm_simple = "peel"
response_harm_continuous = "peels"
@@ -541,11 +554,12 @@
maxHealth = 120
health = 120
speed = -1
habitable_atmos = list("min_oxy" = 1, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
loot = list(
/obj/effect/gibspawner/human,
/obj/item/seeds/banana,
/obj/item/soap,
/obj/item/clothing/mask/gas/clown_hat,
/obj/effect/spawner/random/bananas_or_nothing,
/obj/effect/spawner/random/peel_or_nana,
)
emotes = list(
BB_EMOTE_SAY = list("HONK", "Honk!", "YA-HONK!!!"),
@@ -555,13 +569,14 @@
/mob/living/basic/clown/banana/Initialize(mapload)
. = ..()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWNANA, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
var/static/list/innate_actions = list(
/datum/action/cooldown/exquisite_bunch,
/datum/action/cooldown/rustle,
)
grant_actions_by_list(innate_actions)
///drops peels around the mob when activated
/datum/action/cooldown/rustle
name = "Rustle"

View File

@@ -483,7 +483,7 @@
/datum/micro_organism/cell_line/clown/fuck_up_growing(obj/machinery/vatgrower/vat)
vat.visible_message(span_warning("The biological sample in [vat] seems to have created something horrific!"))
var/mob/selected_mob = pick(list(/mob/living/basic/clown/mutant/slow, /mob/living/basic/clown/fleshclown))
var/mob/selected_mob = pick(list(/mob/living/basic/clown/mutant, /mob/living/basic/clown/fleshclown))
new selected_mob(get_turf(vat))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 95 KiB

View File

@@ -2398,6 +2398,7 @@
#include "code\game\objects\effects\spawners\random\bureaucracy.dm"
#include "code\game\objects\effects\spawners\random\clothing.dm"
#include "code\game\objects\effects\spawners\random\contraband.dm"
#include "code\game\objects\effects\spawners\random\death_drops.dm"
#include "code\game\objects\effects\spawners\random\decoration.dm"
#include "code\game\objects\effects\spawners\random\engineering.dm"
#include "code\game\objects\effects\spawners\random\entertainment.dm"