Files
Bubberstation/code/datums/components/breeding.dm
Ben10Omintrix 7a44f10993 basic gutlunchers and ashwalker ranching (#79508)
## About The Pull Request
this pr transforms gutlunchers into basic mobs and gives them a small
ranch that ashwalkers can manage. gutlunches come in various colors and
sizes! female gutlunches will come in different shades of red and males
will come in shades of blue. the child born will have a mix of his
parent's colors.
![the
farm](https://github.com/tgstation/tgstation/assets/138636438/41fdb1ed-e567-4c8d-bb83-b296f878c862)
female gutlunches can make various healing milk and medicine from its
udder. but it will need to consume ores before it can start making milk,
u can either feed it by hand or u can put ores in the wooden trough and
they will go eat from it whenever they get hungry. feeding it gold or
bluespace ore will improve the healing quality of the milk for a short
while

![trough](https://github.com/tgstation/tgstation/assets/138636438/b9c84d18-fdd8-476b-b779-bdfe49dd7e88)
the male gutlunchers are obedient pets. their stats vary from one
another in speed, attack and health. a male gutlunchers stats will
depend on the stats of his parents, the higher his parent's stats are
the better chances he has at rolling higher stats. so u can selectively
breed them to make sure they have the best stats possible. they will
listen to all ur commands and can mine walls or attack enemies if given
the command. also i wanted the farm to have wood fences so i added them
to the game, they cost 5 wood planks to make



## Why It's Good For The Game
refactors gutlunches into basic mobs. also i turned breeding into a
component so it can be applied to all animals and created a breed
command, pets that have this command and the component will go breed
with a partner u point at.

## Changelog
🆑
refactor: gutlunches have been refactored into basic mobs. please report
any bugs
add: ashwalkers have a small ranch they can manage
fix: wall tearer compnent wont runtime when interacting with mineral
walls
/🆑
2023-11-13 01:20:19 -07:00

77 lines
2.3 KiB
Plaintext

/*
* A component to allow us to breed
*/
/datum/component/breed
/// additional mobs we can breed with
var/list/can_breed_with
///path of the baby
var/baby_path
///time to wait after breeding
var/breed_timer
///AI key we set when we're ready to breed
var/breed_key = BB_BREED_READY
///are we ready to breed?
var/ready_to_breed = TRUE
///callback after we give birth to the child
var/datum/callback/post_birth
/datum/component/breed/Initialize(list/can_breed_with = list(), breed_timer = 40 SECONDS, baby_path, post_birth)
if(!isliving(parent))
return COMPONENT_INCOMPATIBLE
if(ishuman(parent)) //sin detected
return COMPONENT_INCOMPATIBLE
if(!ispath(baby_path))
stack_trace("attempted to add a breeding component with invalid baby path!")
return
src.can_breed_with = can_breed_with
src.breed_timer = breed_timer
src.baby_path = baby_path
src.post_birth = post_birth
ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type)
/datum/component/breed/RegisterWithParent()
RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(breed_with_partner))
ADD_TRAIT(parent, TRAIT_MOB_BREEDER, REF(src))
var/mob/living/parent_mob = parent
parent_mob.ai_controller?.set_blackboard_key(breed_key, TRUE)
/datum/component/breed/UnregisterFromParent()
UnregisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)
REMOVE_TRAIT(parent, TRAIT_MOB_BREEDER, REF(src))
post_birth = null
/datum/component/breed/proc/breed_with_partner(mob/living/source, mob/living/target)
SIGNAL_HANDLER
if(source.combat_mode)
return
if(!is_type_in_typecache(target, can_breed_with))
return
if(!HAS_TRAIT(target, TRAIT_MOB_BREEDER) || target.gender == source.gender)
return
if(!ready_to_breed)
source.balloon_alert(source, "not ready!")
return COMPONENT_HOSTILE_NO_ATTACK
var/turf/delivery_destination = get_turf(source)
var/mob/living/baby = new baby_path(delivery_destination)
new /obj/effect/temp_visual/heart(delivery_destination)
toggle_status(source)
addtimer(CALLBACK(src, PROC_REF(toggle_status), source), breed_timer)
post_birth?.Invoke(baby, target)
return COMPONENT_HOSTILE_NO_ATTACK
/datum/component/breed/proc/toggle_status(mob/living/source)
ready_to_breed = !ready_to_breed
source.ai_controller?.set_blackboard_key(BB_BREED_READY, ready_to_breed)