Files
Bubberstation/code/datums/components/tameable.dm
Ben10Omintrix 028244ef03 u can now hand-feed animals. like cats and raptors (#88173)
## About The Pull Request
this PR does 2 things, firstly it allows u to directly feed animals from
ur hand instead of having to drop it on the floor and relying on their
AI to go eat it. So you can now directly feed ore to raptors or wheat to
cows by simply clicking on them with the item. secondly, it links the
tameable component and the eating element together, as now the former
relies on signals sent by the latter.

## Why It's Good For The Game
Small QOL for pet owners when it comes to feeding their animals.

## Changelog
🆑
qol: u can now directly feed animals from ur hands, like raptors or
cats, by clicking on them with their preferred food.
balance: u can now heal ur raptors mid or post battles by hand feeding
them ores
/🆑
2024-12-06 23:43:56 +01:00

81 lines
3.0 KiB
Plaintext

///This component lets you make specific mobs tameable by feeding them
/datum/component/tameable
///If true, this atom can only be domesticated by one person
var/unique
///Starting success chance for taming.
var/tame_chance
///Added success chance after every failed tame attempt.
var/bonus_tame_chance
///Current chance to tame on interaction
var/current_tame_chance
/datum/component/tameable/Initialize(food_types, tame_chance, bonus_tame_chance, unique = TRUE)
if(!isatom(parent)) //yes, you could make a tameable toolbox.
return COMPONENT_INCOMPATIBLE
if(tame_chance)
src.tame_chance = tame_chance
src.current_tame_chance = tame_chance
if(bonus_tame_chance)
src.bonus_tame_chance = bonus_tame_chance
src.unique = unique
if(food_types && !HAS_TRAIT(parent, TRAIT_MOB_EATER))
parent.AddElement(/datum/element/basic_eating, food_types = food_types)
RegisterSignal(parent, COMSIG_MOB_ATE, PROC_REF(try_tame))
RegisterSignal(parent, COMSIG_SIMPLEMOB_SENTIENCEPOTION, PROC_REF(on_tame)) //Instantly succeeds
RegisterSignal(parent, COMSIG_SIMPLEMOB_TRANSFERPOTION, PROC_REF(on_tame)) //Instantly succeeds
/datum/component/tameable/proc/try_tame(atom/source, obj/item/food, mob/living/attacker)
SIGNAL_HANDLER
if(isnull(attacker) || already_friends(attacker))
return
var/inform_tamer = FALSE
var/modified_tame_chance = current_tame_chance
if(HAS_TRAIT(attacker, TRAIT_BEAST_EMPATHY))
modified_tame_chance += 50
inform_tamer = TRUE
source.balloon_alert(attacker, "eats from your hand")
if(prob(modified_tame_chance)) //note: lack of feedback message is deliberate, keep them guessing unless they're an expert!
on_tame(source, attacker, food, inform_tamer)
else
current_tame_chance += bonus_tame_chance
/// Check if the passed mob is already considered one of our friends
/datum/component/tameable/proc/already_friends(mob/living/potential_friend)
if(!isliving(parent))
return FALSE // Figure this out when we actually need it
var/mob/living/living_parent = parent
return living_parent.faction.Find(REF(potential_friend))
///Ran once taming succeeds
/datum/component/tameable/proc/on_tame(atom/source, mob/living/tamer, obj/item/food, inform_tamer = FALSE)
SIGNAL_HANDLER
source.tamed(tamer, food)//Run custom behavior if needed
if(isliving(parent) && isliving(tamer))
INVOKE_ASYNC(source, TYPE_PROC_REF(/mob/living, befriend), tamer)
if(inform_tamer)
source.balloon_alert(tamer, "tamed")
if(HAS_TRAIT(tamer, TRAIT_BEAST_EMPATHY))
INVOKE_ASYNC(src, PROC_REF(rename_pet), source, tamer)
if(unique)
qdel(src)
else
current_tame_chance = tame_chance
/datum/component/tameable/proc/rename_pet(mob/living/animal, mob/living/tamer)
var/chosen_name = sanitize_name(tgui_input_text(tamer, "Choose your pet's name!", "Name pet", animal.name, MAX_NAME_LEN), allow_numbers = TRUE)
if(QDELETED(animal) || chosen_name == animal.name)
return
if(!chosen_name)
to_chat(tamer, span_warning("Please enter a valid name."))
rename_pet(animal, tamer)
return
animal.fully_replace_character_name(animal.name, chosen_name)