mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-01 04:21:42 +00:00
## About The Pull Request Wow we're finally here. This turns carp into Basic Mobs instead of Simple Animals. They use a variety of behaviours added in previous PRs to act in a marginally more interesting way than they used to. But don't worry there's still 2 or 3 PRs to follow this one until I'm done with space fish. Changes in this PR: Carp will try to run away if they get below 50% health, to make use of their "regenerate if not attacked" component. Magicarp have different targetting behaviour for spells depending on their spell; - Ressurecting Carp will try to ressurect allied mobs. - Animating Carp will try to animate nearby objects. - Door-creating Carp will try to turn nearby walls into doors. You can order Magicarp to cast their spell on something if you happen to manage to tame one. The eating element now has support for "getting hurt" when you eat something. Carp eating can rings and hating it was too soulful not to continue supporting. ## Why It's Good For The Game Carp are iconic beasts and I think they should be more interesting. Also we just want to turn mobs into basic mobs anyway. ## Changelog 🆑 add: Carp will now run away if their health gets low, meaning they may have a chance to regenerate. add: Lia will now fight back if attacked instead of letting herself get killed, watch out! balance: Magicarp will now aim their spells more intelligently. add: Tame Magicarp can be ordered to use their spells on things. refactor: Carp are now "Basic Mobs" instead of "Simple Mobs" fix: Dehydrated carp no longer give you a bad feeling when they're your friend and a good feeling when they're going to attack you. balance: Tamed carp are now friendly only to their tamer rather than their whole faction, which should make dehydrated carp more active. Order them to stay or follow you if you want them to behave around your friends. /🆑
71 lines
2.4 KiB
Plaintext
71 lines
2.4 KiB
Plaintext
/**
|
|
* ## basic eating element!
|
|
*
|
|
* Small behavior for non-carbons to eat certain stuff they interact with
|
|
*/
|
|
/datum/element/basic_eating
|
|
element_flags = ELEMENT_BESPOKE
|
|
argument_hash_start_idx = 2
|
|
/// Amount to heal
|
|
var/heal_amt
|
|
/// Amount to hurt
|
|
var/damage_amount
|
|
/// Type of hurt to apply
|
|
var/damage_type
|
|
/// Types the animal can eat.
|
|
var/list/food_types
|
|
|
|
/datum/element/basic_eating/Attach(datum/target, heal_amt = 0, damage_amount = 0, damage_type = null, food_types = list())
|
|
. = ..()
|
|
|
|
if(!isliving(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
|
|
src.heal_amt = heal_amt
|
|
src.damage_amount = damage_amount
|
|
src.damage_type = damage_type
|
|
src.food_types = food_types
|
|
|
|
//this lets players eat
|
|
RegisterSignal(target, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarm_attack))
|
|
//this lets ai eat. yes, i'm serious
|
|
RegisterSignal(target, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_pre_attackingtarget))
|
|
|
|
/datum/element/basic_eating/Detach(datum/target)
|
|
UnregisterSignal(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET))
|
|
return ..()
|
|
|
|
/datum/element/basic_eating/proc/on_unarm_attack(mob/living/eater, atom/target, proximity, modifiers)
|
|
SIGNAL_HANDLER
|
|
try_eating(eater, target)
|
|
|
|
/datum/element/basic_eating/proc/on_pre_attackingtarget(mob/living/eater, atom/target)
|
|
SIGNAL_HANDLER
|
|
try_eating(eater, target)
|
|
|
|
/datum/element/basic_eating/proc/try_eating(mob/living/eater, atom/target)
|
|
if(!is_type_in_list(target, food_types))
|
|
return
|
|
var/eat_verb = pick("bite","chew","nibble","gnaw","gobble","chomp")
|
|
|
|
if (heal_amt > 0)
|
|
var/healed = heal_amt && eater.health < eater.maxHealth
|
|
if(heal_amt)
|
|
eater.heal_overall_damage(heal_amt)
|
|
eater.visible_message(span_notice("[eater] [eat_verb]s [target]."), span_notice("You [eat_verb] [target][healed ? ", restoring some health" : ""]."))
|
|
finish_eating(eater, target)
|
|
return
|
|
|
|
if (damage_amount > 0 && damage_type)
|
|
eater.apply_damage(damage_amount, damage_type)
|
|
eater.visible_message(span_notice("[eater] [eat_verb]s [target], and seems to hurt itself."), span_notice("You [eat_verb] [target], hurting yourself in the process."))
|
|
finish_eating(eater, target)
|
|
return
|
|
|
|
eater.visible_message(span_notice("[eater] [eat_verb]s [target]."), span_notice("You [eat_verb] [target]."))
|
|
finish_eating(eater, target)
|
|
|
|
/datum/element/basic_eating/proc/finish_eating(mob/living/eater, atom/target)
|
|
playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
|
|
qdel(target)
|