mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 17:52:36 +00:00
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:
@@ -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"
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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)
|
||||
|
||||
26
code/game/objects/effects/spawners/random/death_drops.dm
Normal file
26
code/game/objects/effects/spawners/random/death_drops.dm
Normal 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,
|
||||
)
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 |
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user