mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-20 19:49:39 +01:00
## About The Pull Request
Fixes the issue of usr pointing to admins by making Trigger pass down
clicker, as usr is fucky and can be passed down by other unrelated
procs. Fun.
Added the clicker arg to all usages of Trigger as well
Also changes isobserver check in antagonist ui_act code that prevents
observers from clicking UI's instead to check if the ui.user is
owner.current
## Why It's Good For The Game
Fixes admins giving heretic to people opening the heretic UI for the
admin instead
(cherry picked from commit 0bc42d6940)
651 lines
22 KiB
Plaintext
651 lines
22 KiB
Plaintext
/mob/living/basic/clown
|
|
name = "Clown"
|
|
desc = "A denizen of clown planet."
|
|
icon = 'icons/mob/simple/clown_mobs.dmi'
|
|
icon_state = "clown"
|
|
icon_living = "clown"
|
|
icon_dead = "clown_dead"
|
|
icon_gib = "clown_gib"
|
|
health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this
|
|
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
|
response_disarm_continuous = "gently pushes aside"
|
|
response_disarm_simple = "gently push aside"
|
|
response_harm_continuous = "robusts"
|
|
response_harm_simple = "robust"
|
|
combat_mode = TRUE
|
|
maxHealth = 75
|
|
health = 75
|
|
melee_damage_lower = 10
|
|
melee_damage_upper = 10
|
|
attack_sound = 'sound/items/bikehorn.ogg'
|
|
attacked_sound = 'sound/items/bikehorn.ogg'
|
|
environment_smash = ENVIRONMENT_SMASH_NONE
|
|
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 - 10)
|
|
maximum_survivable_temperature = (T0C + 100)
|
|
blood_volume = BLOOD_VOLUME_NORMAL
|
|
faction = list(FACTION_CLOWN)
|
|
ai_controller = /datum/ai_controller/basic_controller/clown
|
|
///list of stuff we drop on death
|
|
var/list/loot = list(/obj/effect/mob_spawn/corpse/human/clown)
|
|
///blackboard emote list
|
|
var/list/emotes = list(
|
|
BB_EMOTE_SAY = list("HONK", "Honk!", "Welcome to clown planet!"),
|
|
BB_EMOTE_HEAR = list("honks", "squeaks"),
|
|
BB_EMOTE_SOUND = list('sound/items/bikehorn.ogg'), //WE LOVE TO PARTY
|
|
BB_SPEAK_CHANCE = 5,
|
|
)
|
|
///do we waddle (honk)
|
|
var/waddles = TRUE
|
|
|
|
/mob/living/basic/clown/Initialize(mapload)
|
|
. = ..()
|
|
AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE)
|
|
AddComponent(/datum/component/ai_retaliate_advanced, CALLBACK(src, PROC_REF(retaliate_callback)))
|
|
ai_controller.set_blackboard_key(BB_BASIC_MOB_SPEAK_LINES, emotes)
|
|
//im not putting dynamic humans or whatever its called here because this is the base path of nonhuman clownstrosities
|
|
if(waddles)
|
|
AddElementTrait(TRAIT_WADDLING, INNATE_TRAIT, /datum/element/waddling)
|
|
if(length(loot))
|
|
loot = string_list(loot)
|
|
AddElement(/datum/element/death_drops, loot)
|
|
|
|
/mob/living/basic/clown/proc/retaliate_callback(mob/living/attacker)
|
|
if (!istype(attacker))
|
|
return
|
|
for (var/mob/living/basic/clown/harbringer in oview(src, 7))
|
|
harbringer.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker)
|
|
|
|
/mob/living/basic/clown/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE)
|
|
if(!istype(target, /obj/item/food/grown/banana/bunch))
|
|
return ..()
|
|
var/obj/item/food/grown/banana/bunch/unripe_bunch = target
|
|
unripe_bunch.start_ripening()
|
|
log_combat(src, target, "explosively ripened")
|
|
|
|
/mob/living/basic/clown/get_bloodtype()
|
|
if (check_holidays(APRIL_FOOLS))
|
|
return get_blood_type(BLOOD_TYPE_CLOWN)
|
|
return ..()
|
|
|
|
/mob/living/basic/clown/lube
|
|
name = "Living Lube"
|
|
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"),
|
|
)
|
|
waddles = FALSE
|
|
loot = list(
|
|
/obj/effect/spawner/foam_starter/small,
|
|
/obj/item/clothing/mask/gas/clown_hat,
|
|
)
|
|
|
|
/mob/living/basic/clown/lube/Initialize(mapload)
|
|
. = ..()
|
|
AddElement(/datum/element/lube_walking)
|
|
|
|
/mob/living/basic/clown/honkling
|
|
name = "Honkling"
|
|
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 = -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/grown/bananapeel/bluespace,
|
|
)
|
|
|
|
/mob/living/basic/clown/honkling/Initialize(mapload)
|
|
. = ..()
|
|
var/static/list/injection_range
|
|
if(!injection_range)
|
|
injection_range = string_numbers_list(list(1, 5))
|
|
AddElement(\
|
|
/datum/element/venomous,\
|
|
/datum/reagent/consumable/laughter,\
|
|
injection_range,\
|
|
injection_flags = INJECT_CHECK_PENETRATE_THICK | INJECT_CHECK_IGNORE_SPECIES,\
|
|
)
|
|
|
|
/mob/living/basic/clown/fleshclown
|
|
name = "Fleshclown"
|
|
desc = "A being forged out of the pure essence of pranking, cursed into existence by a cruel maker."
|
|
icon_state = "fleshclown"
|
|
icon_living = "fleshclown"
|
|
response_help_continuous = "reluctantly pokes"
|
|
response_help_simple = "reluctantly poke"
|
|
response_disarm_continuous = "sinks his hands into the spongy flesh of"
|
|
response_disarm_simple = "sink your hands into the spongy flesh of"
|
|
response_harm_continuous = "cleanses the world of"
|
|
response_harm_simple = "cleanse the world of"
|
|
maxHealth = 140
|
|
health = 140
|
|
speed = -0.5
|
|
melee_damage_upper = 15
|
|
attack_verb_continuous = "limply slaps"
|
|
attack_verb_simple = "limply slap"
|
|
obj_damage = 5
|
|
loot = list(
|
|
/obj/effect/gibspawner/human,
|
|
/obj/item/clothing/mask/gas/clown_hat,
|
|
/obj/item/food/meatclown,
|
|
/obj/item/stack/sheet/animalhide/human,
|
|
)
|
|
emotes = list(
|
|
BB_EMOTE_SAY = list(
|
|
"HONK",
|
|
"Honk!",
|
|
"I didn't ask for this",
|
|
"I feel constant and horrible pain",
|
|
"I was born out of mirthful pranking but I live in suffering",
|
|
"This body is a merciless and unforgiving prison",
|
|
"YA-HONK!!!",
|
|
),
|
|
BB_EMOTE_HEAR = list("honks", "contemplates its existence"),
|
|
BB_EMOTE_SEE = list("sweats", "jiggles"),
|
|
BB_SPEAK_CHANCE = 5,
|
|
)
|
|
|
|
/mob/living/basic/clown/fleshclown/Initialize(mapload)
|
|
. = ..()
|
|
ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
|
|
|
|
/mob/living/basic/clown/longface
|
|
name = "Longface"
|
|
desc = "Often found walking into the bar."
|
|
icon_state = "long face"
|
|
icon_living = "long face"
|
|
move_resist = INFINITY
|
|
response_help_continuous = "tries to awkwardly hug"
|
|
response_help_simple = "try to awkwardly hug"
|
|
response_disarm_continuous = "pushes the unwieldy frame of"
|
|
response_disarm_simple = "push the unwieldy frame of"
|
|
response_harm_continuous = "tries to shut up"
|
|
response_harm_simple = "try to shut up"
|
|
maxHealth = 150
|
|
health = 150
|
|
pixel_x = -16
|
|
base_pixel_x = -16
|
|
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/grown/bananapeel,
|
|
/obj/item/clothing/mask/gas/clown_hat,
|
|
)
|
|
emotes = list(
|
|
BB_EMOTE_SAY = list("YA-HONK!!!"),
|
|
BB_EMOTE_HEAR = list("honks", "squeaks"),
|
|
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."
|
|
icon_state = "honkhulk"
|
|
icon_living = "honkhulk"
|
|
move_resist = INFINITY
|
|
gender = MALE
|
|
response_help_continuous = "tries desperately to appease"
|
|
response_help_simple = "try desperately to appease"
|
|
response_disarm_continuous = "foolishly pushes"
|
|
response_disarm_simple = "foolishly push"
|
|
response_harm_continuous = "angers"
|
|
response_harm_simple = "anger"
|
|
maxHealth = 400
|
|
health = 400
|
|
pixel_x = -16
|
|
base_pixel_x = -16
|
|
speed = 1.5
|
|
melee_damage_lower = 15
|
|
melee_damage_upper = 20
|
|
attack_verb_continuous = "pummels"
|
|
attack_verb_simple = "pummel"
|
|
obj_damage = 30
|
|
environment_smash = ENVIRONMENT_SMASH_WALLS
|
|
loot = list(
|
|
/obj/effect/gibspawner/human,
|
|
/obj/item/soap,
|
|
/obj/item/clothing/mask/gas/clown_hat,
|
|
)
|
|
emotes = list(
|
|
BB_EMOTE_SAY = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!"),
|
|
BB_EMOTE_HEAR = list("honks", "grunts"),
|
|
BB_EMOTE_SEE = list("sweats"),
|
|
BB_SPEAK_CHANCE = 5,
|
|
)
|
|
|
|
/mob/living/basic/clown/clownhulk/chlown
|
|
name = "Chlown"
|
|
desc = "A real lunkhead who somehow gets all the girls."
|
|
icon_state = "chlown"
|
|
icon_living = "chlown"
|
|
gender = MALE
|
|
response_help_continuous = "submits to"
|
|
response_help_simple = "submit to"
|
|
response_disarm_continuous = "tries to assert dominance over"
|
|
response_disarm_simple = "try to assert dominance over"
|
|
response_harm_continuous = "makes a weak beta attack at"
|
|
response_harm_simple = "make a weak beta attack at"
|
|
maxHealth = 500
|
|
health = 500
|
|
armour_penetration = 20
|
|
attack_verb_continuous = "steals the girlfriend of"
|
|
attack_verb_simple = "steal the girlfriend of"
|
|
attack_sound = 'sound/items/airhorn/airhorn2.ogg'
|
|
loot = list(
|
|
/obj/effect/gibspawner/human,
|
|
/obj/effect/spawner/foam_starter/small,
|
|
/obj/item/grown/bananapeel,
|
|
/obj/item/clothing/mask/gas/clown_hat,
|
|
)
|
|
emotes = list(
|
|
BB_EMOTE_SAY = list("HONK", "Honk!", "Bruh", "cheeaaaahhh?"),
|
|
BB_EMOTE_SEE = list("asserts his dominance", "emasculates everyone implicitly"),
|
|
BB_SPEAK_CHANCE = 5,
|
|
)
|
|
|
|
/mob/living/basic/clown/clownhulk/honkmunculus
|
|
name = "Honkmunculus"
|
|
desc = "A slender wiry figure of alchemical origin."
|
|
icon_state = "honkmunculus"
|
|
icon_living = "honkmunculus"
|
|
response_help_continuous = "skeptically pokes"
|
|
response_help_simple = "skeptically poke"
|
|
response_disarm_continuous = "pushes the unwieldy frame of"
|
|
response_disarm_simple = "push the unwieldy frame of"
|
|
maxHealth = 200
|
|
health = 200
|
|
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/grown/bananapeel/mimanapeel,
|
|
/obj/item/clothing/mask/gas/clown_hat,
|
|
)
|
|
emotes = list(
|
|
BB_EMOTE_SAY = list("honk"),
|
|
BB_EMOTE_SEE = list("squirms", "writhes"),
|
|
)
|
|
|
|
/mob/living/basic/clown/clownhulk/honkmunculus/Initialize(mapload)
|
|
. = ..()
|
|
var/static/list/injection_range
|
|
if(!injection_range)
|
|
injection_range = string_numbers_list(list(1, 5))
|
|
AddElement(\
|
|
/datum/element/venomous,\
|
|
/datum/reagent/peaceborg/confuse,\
|
|
injection_range,\
|
|
injection_flags = INJECT_CHECK_PENETRATE_THICK | INJECT_CHECK_IGNORE_SPECIES,\
|
|
) // I don't really know what a clown is using to inject people but let's assume it doesn't need to penetrate at all
|
|
|
|
/mob/living/basic/clown/clownhulk/destroyer
|
|
name = "The Destroyer"
|
|
desc = "An ancient being born of arcane honking."
|
|
icon_state = "destroyer"
|
|
icon_living = "destroyer"
|
|
response_disarm_continuous = "bounces off of"
|
|
response_harm_continuous = "bounces off of"
|
|
maxHealth = 400
|
|
health = 400
|
|
speed = 1.5
|
|
melee_damage_lower = 20
|
|
melee_damage_upper = 40
|
|
armour_penetration = 30
|
|
attack_verb_continuous = "acts out divine vengeance on"
|
|
attack_verb_simple = "act out divine vengeance on"
|
|
obj_damage = 50
|
|
environment_smash = ENVIRONMENT_SMASH_RWALLS
|
|
ai_controller = /datum/ai_controller/basic_controller/clown/murder
|
|
loot = list(
|
|
/obj/effect/gibspawner/human,
|
|
/obj/effect/spawner/foam_starter/small,
|
|
/obj/item/grown/bananapeel,
|
|
/obj/item/clothing/mask/gas/clown_hat,
|
|
)
|
|
emotes = list(
|
|
BB_EMOTE_SAY = list("HONK!!!", "The Honkmother is merciful, so I must act out her wrath.", "parce mihi ad beatus honkmother placet mihi ut peccata committere,", "DIE!!!"),
|
|
BB_EMOTE_HEAR = list("honks", "grunts"),
|
|
BB_EMOTE_SEE = list("sweats"),
|
|
BB_SPEAK_CHANCE = 5,
|
|
)
|
|
|
|
/mob/living/basic/clown/mutant
|
|
name = "Unknown"
|
|
desc = "Kill it for its own sake."
|
|
icon_state = "mutant"
|
|
icon_living = "mutant"
|
|
move_resist = INFINITY
|
|
response_help_continuous = "reluctantly sinks a finger into"
|
|
response_help_simple = "reluctantly sink a finger into"
|
|
response_disarm_continuous = "squishes into"
|
|
response_disarm_simple = "squish into"
|
|
response_harm_continuous = "squishes into"
|
|
response_harm_simple = "squish into"
|
|
maxHealth = 130
|
|
health = 130
|
|
pixel_x = -16
|
|
base_pixel_x = -16
|
|
speed = 1.5
|
|
melee_damage_lower = 10
|
|
melee_damage_upper = 20
|
|
attack_verb_continuous = "awkwardly flails at"
|
|
attack_verb_simple = "awkwardly flail at"
|
|
loot = list(
|
|
/obj/effect/gibspawner/generic,
|
|
/obj/effect/gibspawner/generic/animal,
|
|
/obj/effect/gibspawner/human,
|
|
/obj/effect/gibspawner/human/bodypartless,
|
|
/obj/effect/gibspawner/xeno/bodypartless,
|
|
/obj/item/grown/bananapeel/gros_michel,
|
|
/obj/item/clothing/mask/gas/clown_hat,
|
|
)
|
|
emotes = list(
|
|
BB_EMOTE_SAY = list("aaaaaahhhhuuhhhuhhhaaaaa", "AAAaaauuuaaAAAaauuhhh", "huuuuuh... hhhhuuuooooonnnnkk", "HuaUAAAnKKKK"),
|
|
BB_EMOTE_SEE = list("squirms", "writhes", "pulsates", "froths", "oozes"),
|
|
BB_SPEAK_CHANCE = 10,
|
|
)
|
|
|
|
|
|
/mob/living/basic/clown/mutant/glutton
|
|
name = "banana glutton"
|
|
desc = "Something that was once a clown"
|
|
icon_state = "glutton"
|
|
icon_living = "glutton"
|
|
health = 200
|
|
mob_size = MOB_SIZE_LARGE
|
|
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!!!"),
|
|
BB_EMOTE_SEE = list("jiggles", "wobbles"),
|
|
)
|
|
death_sound = 'sound/misc/sadtrombone.ogg'
|
|
waddles = FALSE
|
|
///This is the list of items we are ready to regurgitate,
|
|
var/list/prank_pouch = list()
|
|
|
|
/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,
|
|
/obj/item/food/cornchips,
|
|
)
|
|
AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 30, bonus_tame_chance = 0)
|
|
AddElement(/datum/element/damage_threshold, 10) //lots of fat to cushion blows.
|
|
|
|
/mob/living/basic/clown/mutant/glutton/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
|
|
if(!check_edible(tool))
|
|
return NONE
|
|
eat_atom(tool)
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
/mob/living/basic/clown/mutant/glutton/resolve_unarmed_attack(atom/attack_target, list/modifiers)
|
|
if(!check_edible(attack_target))
|
|
return ..()
|
|
eat_atom(attack_target)
|
|
|
|
///Returns whether or not the supplied movable atom is edible.
|
|
/mob/living/basic/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, span_warning("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/basic/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,
|
|
/obj/item/food/ink_sac,
|
|
)
|
|
|
|
visible_message(span_warning("[src] eats [eaten_atom]!"), span_notice("You eat [eaten_atom]."))
|
|
if(is_type_in_list(eaten_atom, funny_items))
|
|
eaten_atom.forceMove(src)
|
|
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 / 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)
|
|
flick("glutton_mouth", src)
|
|
|
|
/mob/living/basic/clown/mutant/glutton/tamed(mob/living/tamer, atom/food)
|
|
buckle_lying = 0
|
|
AddElement(/datum/element/ridable, /datum/component/riding/creature/glutton)
|
|
|
|
/mob/living/basic/clown/mutant/glutton/Exited(atom/movable/gone, direction)
|
|
. = ..()
|
|
prank_pouch -= gone
|
|
|
|
///This ability will let you fire one random item from your pouch,
|
|
/datum/action/cooldown/regurgitate
|
|
name = "Regurgitate"
|
|
desc = "Regurgitates a single item from the depths of your pouch."
|
|
background_icon_state = "bg_changeling"
|
|
overlay_icon_state = "bg_changeling_border"
|
|
button_icon = 'icons/mob/actions/actions_animal.dmi'
|
|
button_icon_state = "regurgitate"
|
|
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED
|
|
click_to_activate = TRUE
|
|
|
|
/datum/action/cooldown/regurgitate/set_click_ability(mob/on_who)
|
|
. = ..()
|
|
if(!.)
|
|
return
|
|
|
|
to_chat(on_who, span_notice("Your throat muscles tense up. <B>Left-click to regurgitate a funny morsel!</B>"))
|
|
on_who.icon_state = "glutton_tongue"
|
|
on_who.update_appearance(UPDATE_ICON)
|
|
|
|
/datum/action/cooldown/regurgitate/unset_click_ability(mob/on_who, refund_cooldown = TRUE)
|
|
. = ..()
|
|
if(!.)
|
|
return
|
|
|
|
if(refund_cooldown)
|
|
to_chat(on_who, span_notice("Your throat muscles relax."))
|
|
on_who.icon_state = initial(on_who.icon_state)
|
|
on_who.update_appearance(UPDATE_ICON)
|
|
|
|
/datum/action/cooldown/regurgitate/IsAvailable(feedback = FALSE)
|
|
. = ..()
|
|
if(!.)
|
|
return FALSE
|
|
|
|
// Hardcoded to only work with gluttons. Come back next year
|
|
return istype(owner, /mob/living/basic/clown/mutant/glutton)
|
|
|
|
/datum/action/cooldown/regurgitate/Activate(atom/spit_at)
|
|
StartCooldown(cooldown_time / 4)
|
|
|
|
var/mob/living/basic/clown/mutant/glutton/pouch_owner = owner
|
|
if(!length(pouch_owner.prank_pouch))
|
|
pouch_owner.icon_state = initial(pouch_owner.icon_state)
|
|
to_chat(pouch_owner, span_notice("Your prank pouch is empty."))
|
|
return TRUE
|
|
|
|
var/obj/item/projected_morsel = pick(pouch_owner.prank_pouch)
|
|
projected_morsel.forceMove(pouch_owner.loc)
|
|
projected_morsel.throw_at(spit_at, 8, 2, pouch_owner)
|
|
flick("glutton_mouth", pouch_owner)
|
|
playsound(pouch_owner, 'sound/misc/soggy.ogg', 75)
|
|
|
|
StartCooldown()
|
|
return TRUE
|
|
|
|
/mob/living/basic/clown/banana
|
|
name = "Clownana"
|
|
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"
|
|
response_harm_simple = "peel"
|
|
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/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!!!"),
|
|
BB_EMOTE_SEE = list("bites into the banana", "plucks a banana off its head", "photosynthesizes"),
|
|
BB_EMOTE_SOUND = list('sound/items/bikehorn.ogg'),
|
|
)
|
|
|
|
/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"
|
|
desc = "Shake loose a few banana peels."
|
|
cooldown_time = 8 SECONDS
|
|
button_icon_state = "rustle"
|
|
button_icon = 'icons/mob/actions/actions_clown.dmi'
|
|
background_icon_state = "bg_nature"
|
|
overlay_icon_state = "bg_nature_border"
|
|
///which type of peel to spawn
|
|
var/banana_type = /obj/item/grown/bananapeel
|
|
///How many peels to spawn
|
|
var/peel_amount = 3
|
|
|
|
/datum/action/cooldown/rustle/Activate(atom/target)
|
|
. = ..()
|
|
var/list/reachable_turfs = list()
|
|
for(var/turf/adjacent_turf in RANGE_TURFS(1, owner.loc))
|
|
if(adjacent_turf == owner.loc || !owner.CanReach(adjacent_turf) || !isopenturf(adjacent_turf))
|
|
continue
|
|
reachable_turfs += adjacent_turf
|
|
|
|
var/peels_to_spawn = min(peel_amount, reachable_turfs.len)
|
|
for(var/i in 1 to peels_to_spawn)
|
|
new banana_type(pick_n_take(reachable_turfs))
|
|
playsound(owner, 'sound/mobs/non-humanoids/clown/clownana_rustle.ogg', 60)
|
|
animate(owner, time = 0.1 SECONDS, pixel_w = 6, easing = CUBIC_EASING | EASE_OUT, flags = ANIMATION_PARALLEL|ANIMATION_RELATIVE)
|
|
animate(time = 0.2 SECONDS, pixel_w = -8, easing = CUBIC_EASING, flags = ANIMATION_RELATIVE)
|
|
animate(time = 0.1 SECONDS, pixel_w = 2, easing = CUBIC_EASING | EASE_IN, flags = ANIMATION_RELATIVE)
|
|
StartCooldown()
|
|
|
|
///spawns a plumb bunch of bananas imbued with mystical power.
|
|
/datum/action/cooldown/exquisite_bunch
|
|
name = "Exquisite Bunch"
|
|
desc = "Pluck your finest bunch of bananas from your head. This bunch is especially nutrious to monkeykind. A gentle tap will trigger an explosive ripening process."
|
|
button_icon = 'icons/obj/service/hydroponics/harvest.dmi'
|
|
cooldown_time = 60 SECONDS
|
|
button_icon_state = "banana_bunch"
|
|
background_icon_state = "bg_nature"
|
|
overlay_icon_state = "bg_nature_border"
|
|
///If we are currently activating our ability.
|
|
var/activating = FALSE
|
|
|
|
/datum/action/cooldown/exquisite_bunch/Trigger(mob/clicker, trigger_flags, atom/target)
|
|
if(activating)
|
|
return
|
|
var/bunch_turf = get_step(owner.loc, owner.dir)
|
|
if(!bunch_turf)
|
|
return
|
|
if(!owner.CanReach(bunch_turf) || !isopenturf(bunch_turf))
|
|
owner.balloon_alert(owner, "can't do that here!")
|
|
return
|
|
activating = TRUE
|
|
if(!do_after(owner, 1 SECONDS))
|
|
activating = FALSE
|
|
return
|
|
playsound(owner, 'sound/mobs/non-humanoids/clown/hehe.ogg', 100)
|
|
if(!do_after(owner, 1 SECONDS))
|
|
activating = FALSE
|
|
return
|
|
activating = FALSE
|
|
return ..()
|
|
|
|
/datum/action/cooldown/exquisite_bunch/Activate(atom/target)
|
|
. = ..()
|
|
new /obj/item/food/grown/banana/bunch(get_step(owner.loc, owner.dir))
|
|
playsound(owner, 'sound/items/bikehorn.ogg', 60)
|
|
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), owner, 'sound/mobs/non-humanoids/clown/hohoho.ogg', 100, 1), 1 SECONDS)
|
|
StartCooldown()
|