mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-13 09:05:11 +01:00
250 lines
7.7 KiB
Plaintext
250 lines
7.7 KiB
Plaintext
/mob/living/basic/pet/cat
|
|
name = "cat"
|
|
desc = "Kitty!!"
|
|
icon = 'icons/mob/simple/pets.dmi'
|
|
icon_state = "cat2"
|
|
icon_living = "cat2"
|
|
icon_dead = "cat2_dead"
|
|
speak_emote = list("purrs", "meows")
|
|
pass_flags = PASSTABLE
|
|
mob_size = MOB_SIZE_SMALL
|
|
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
|
unsuitable_atmos_damage = 0.5
|
|
butcher_results = list(
|
|
/obj/item/food/meat/slab = 1,
|
|
/obj/item/organ/ears/cat = 1,
|
|
/obj/item/organ/tail/cat = 1,
|
|
/obj/item/stack/sheet/animalhide/cat = 1
|
|
)
|
|
response_help_continuous = "pets"
|
|
response_help_simple = "pet"
|
|
response_disarm_continuous = "gently pushes aside"
|
|
response_disarm_simple = "gently push aside"
|
|
response_harm_continuous = "kicks"
|
|
response_harm_simple = "kick"
|
|
mobility_flags = MOBILITY_FLAGS_REST_CAPABLE_DEFAULT
|
|
gold_core_spawnable = FRIENDLY_SPAWN
|
|
can_be_held = TRUE
|
|
ai_controller = /datum/ai_controller/basic_controller/cat
|
|
held_state = "cat2"
|
|
attack_verb_continuous = "claws"
|
|
attack_verb_simple = "claw"
|
|
attack_sound = 'sound/items/weapons/slash.ogg'
|
|
attack_vis_effect = ATTACK_EFFECT_CLAW
|
|
///icon of the collar we can wear
|
|
var/collar_icon_state = "cat"
|
|
///can this cat breed?
|
|
var/can_breed = TRUE
|
|
///can hold items?
|
|
var/can_hold_item = TRUE
|
|
///can this cat interact with stoves?
|
|
var/can_interact_with_stove = FALSE
|
|
///list of items we can carry
|
|
var/static/list/huntable_items = list(
|
|
/obj/item/fish,
|
|
/obj/item/food/deadmouse,
|
|
/obj/item/food/fishmeat,
|
|
)
|
|
///list of pet commands we follow
|
|
var/static/list/pet_commands = list(
|
|
/datum/pet_command/idle,
|
|
/datum/pet_command/free,
|
|
/datum/pet_command/follow/start_active,
|
|
/datum/pet_command/perform_trick_sequence,
|
|
)
|
|
|
|
///item we are currently holding
|
|
var/obj/item/held_food
|
|
///mutable appearance for held item
|
|
var/mutable_appearance/held_item_overlay
|
|
///icon state of our cult icon
|
|
var/cult_icon_state = "cat_cult"
|
|
///callback for after a kitten is born
|
|
var/datum/callback/post_birth_callback
|
|
|
|
/datum/emote/cat
|
|
abstract_type = /datum/emote/cat
|
|
mob_type_allowed_typecache = /mob/living/basic/pet/cat
|
|
mob_type_blacklist_typecache = list()
|
|
|
|
/datum/emote/living/petmeow // BUBBER EDIT CHANGE - Original: /datum/emote/cat/meow
|
|
key = "petmeow" // BUBBER EDIT CHANGE - 'meow' used by /datum/emote/living/meow
|
|
key_third_person = null // BUBBER EDIT CHANGE - 'purr' used by /datum/emote/living/purr
|
|
message = "meows!"
|
|
emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE
|
|
vary = TRUE
|
|
sound = SFX_CAT_MEOW
|
|
|
|
/datum/emote/living/petpurr // BUBBER EDIT CHANGE - Original: /datum/emote/cat/purr
|
|
key = "petpurr" // BUBBER EDIT CHANGE - 'purr' used by /datum/emote/living/purr
|
|
key_third_person = null // BUBBER EDIT CHANGE - 'purr' used by /datum/emote/living/purr
|
|
message = "purrs."
|
|
emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE
|
|
vary = TRUE
|
|
sound = SFX_CAT_PURR
|
|
|
|
/mob/living/basic/pet/cat/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/obeys_commands, pet_commands)
|
|
AddElement(/datum/element/cultist_pet, pet_cult_icon_state = cult_icon_state)
|
|
AddElement(/datum/element/wears_collar, collar_icon_state = collar_icon_state, collar_resting_icon_state = TRUE)
|
|
AddElement(/datum/element/ai_retaliate)
|
|
AddElement(/datum/element/pet_bonus, "purr", /datum/mood_event/pet_animal)
|
|
AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW)
|
|
add_cell_sample()
|
|
add_verb(src, /mob/living/proc/toggle_resting)
|
|
add_traits(list(TRAIT_CATLIKE_GRACE, TRAIT_VENTCRAWLER_ALWAYS, TRAIT_WOUND_LICKER, TRAIT_COLORBLIND), INNATE_TRAIT)
|
|
ai_controller.set_blackboard_key(BB_HUNTABLE_PREY, typecacheof(huntable_items))
|
|
if(can_breed)
|
|
add_breeding_component()
|
|
|
|
/mob/living/basic/pet/cat/proc/add_cell_sample()
|
|
AddElement(/datum/element/swabable, CELL_LINE_TABLE_CAT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
|
|
|
|
/mob/living/basic/pet/cat/early_melee_attack(atom/target, list/modifiers, ignore_cooldown)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
|
|
if(istype(target, /obj/machinery/oven/range) && can_interact_with_stove)
|
|
target.attack_hand(src)
|
|
return BASIC_MOB_END_ATTACK_CHAIN_COOLDOWN
|
|
|
|
if(!can_hold_item)
|
|
return BASIC_MOB_CONTINUE_ATTACK_CHAIN
|
|
|
|
if(!is_type_in_list(target, huntable_items) || held_food)
|
|
return BASIC_MOB_CONTINUE_ATTACK_CHAIN
|
|
var/atom/movable/movable_target = target
|
|
movable_target.forceMove(src)
|
|
return BASIC_MOB_END_ATTACK_CHAIN_COOLDOWN
|
|
|
|
/mob/living/basic/pet/cat/Exited(atom/movable/gone, direction)
|
|
. = ..()
|
|
if(gone != held_food)
|
|
return
|
|
held_food = null
|
|
update_appearance(UPDATE_OVERLAYS)
|
|
|
|
/mob/living/basic/pet/cat/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
|
|
if(is_type_in_list(arrived, huntable_items))
|
|
held_food = arrived
|
|
update_appearance(UPDATE_OVERLAYS)
|
|
return ..()
|
|
|
|
/mob/living/basic/pet/cat/update_overlays()
|
|
. = ..()
|
|
if(stat == DEAD || resting || !held_food)
|
|
return
|
|
if(istype(held_food, /obj/item/fish))
|
|
held_item_overlay = mutable_appearance(icon, "cat_fish_overlay")
|
|
if(istype(held_food, /obj/item/food/deadmouse))
|
|
held_item_overlay = mutable_appearance(icon, "cat_mouse_overlay")
|
|
. += held_item_overlay
|
|
|
|
/mob/living/basic/pet/cat/update_resting()
|
|
. = ..()
|
|
if(stat == DEAD)
|
|
return
|
|
update_appearance(UPDATE_ICON_STATE)
|
|
|
|
/mob/living/basic/pet/cat/update_icon_state()
|
|
. = ..()
|
|
if (resting)
|
|
icon_state = "[icon_living]_rest"
|
|
return
|
|
icon_state = "[icon_living]"
|
|
|
|
/mob/living/basic/pet/cat/proc/add_breeding_component()
|
|
var/static/list/partner_types = typecacheof(list(/mob/living/basic/pet/cat))
|
|
var/static/list/baby_types = list(
|
|
/mob/living/basic/pet/cat/kitten = 1,
|
|
)
|
|
AddComponent(\
|
|
/datum/component/breed,\
|
|
can_breed_with = typecacheof(list(/mob/living/basic/pet/cat)),\
|
|
baby_paths = baby_types,\
|
|
post_birth = post_birth_callback,\
|
|
)
|
|
|
|
/mob/living/basic/pet/cat/space
|
|
name = "space cat"
|
|
desc = "They're a cat... in space!"
|
|
icon_state = "spacecat"
|
|
icon_living = "spacecat"
|
|
icon_dead = "spacecat_dead"
|
|
unsuitable_atmos_damage = 0
|
|
minimum_survivable_temperature = TCMB
|
|
maximum_survivable_temperature = T0C + 40
|
|
held_state = "spacecat"
|
|
|
|
/mob/living/basic/pet/cat/breadcat
|
|
name = "bread cat"
|
|
desc = "They're a cat... with a bread!"
|
|
icon_state = "breadcat"
|
|
icon_living = "breadcat"
|
|
icon_dead = "breadcat_dead"
|
|
ai_controller = /datum/ai_controller/basic_controller/cat/bread
|
|
held_state = "breadcat"
|
|
can_interact_with_stove = TRUE
|
|
butcher_results = list(
|
|
/obj/item/food/meat/slab = 2,
|
|
/obj/item/organ/ears/cat = 1,
|
|
/obj/item/organ/tail/cat = 1,
|
|
/obj/item/food/breadslice/plain = 1
|
|
)
|
|
collar_icon_state = null
|
|
//just ensuring the mats contained by the cat when spawned are the same of when crafted
|
|
custom_materials = list(/datum/material/meat = MEATSLAB_MATERIAL_AMOUNT * 3)
|
|
|
|
/mob/living/basic/pet/cat/breadcat/add_cell_sample()
|
|
return
|
|
|
|
/mob/living/basic/pet/cat/original
|
|
name = "Batsy"
|
|
desc = "The product of alien DNA and bored geneticists."
|
|
gender = FEMALE
|
|
icon_state = "original"
|
|
icon_living = "original"
|
|
icon_dead = "original_dead"
|
|
unique_pet = TRUE
|
|
held_state = "original"
|
|
|
|
/mob/living/basic/pet/cat/original/add_cell_sample()
|
|
return
|
|
|
|
/mob/living/basic/pet/cat/kitten
|
|
name = "kitten"
|
|
desc = "D'aaawwww."
|
|
icon_state = "kitten"
|
|
icon_living = "kitten"
|
|
icon_dead = "kitten_dead"
|
|
density = FALSE
|
|
pass_flags = PASSMOB
|
|
mob_size = MOB_SIZE_SMALL
|
|
can_breed = FALSE
|
|
ai_controller = /datum/ai_controller/basic_controller/cat/kitten
|
|
can_hold_item = FALSE
|
|
collar_icon_state = "kitten"
|
|
|
|
/mob/living/basic/pet/cat/kitten/Initialize(mapload)
|
|
. = ..()
|
|
AddElement(/datum/element/basic_eating, food_types = huntable_items)
|
|
|
|
/mob/living/basic/pet/cat/_proc
|
|
name = "Proc"
|
|
gender = MALE
|
|
gold_core_spawnable = NO_SPAWN
|
|
unique_pet = TRUE
|
|
|
|
/mob/living/basic/pet/cat/jerry //Holy shit we left jerry on donut ~ Arcane ~Fikou
|
|
name = "Jerry"
|
|
desc = "Tom is VERY amused."
|
|
gender = MALE
|
|
|
|
/mob/living/basic/pet/cat/tabby
|
|
icon_state = "cat"
|
|
icon_living = "cat"
|
|
icon_dead = "cat_dead"
|
|
held_state = "cat"
|