diff --git a/code/modules/ai/ai_holder.dm b/code/modules/ai/ai_holder.dm index 307d3870b26..bed9e540388 100644 --- a/code/modules/ai/ai_holder.dm +++ b/code/modules/ai/ai_holder.dm @@ -447,7 +447,7 @@ if(speak_chance) // In the long loop since otherwise it wont shut up. handle_idle_speaking() - if(hostile) + if(hostile || vore_hostile) ai_log("handle_stance_strategical() : STANCE_IDLE, going to find_target().", AI_LOG_TRACE) find_target() diff --git a/code/modules/ai/ai_holder_targeting.dm b/code/modules/ai/ai_holder_targeting.dm index ef301ccf71f..af8268b31cf 100644 --- a/code/modules/ai/ai_holder_targeting.dm +++ b/code/modules/ai/ai_holder_targeting.dm @@ -6,6 +6,9 @@ var/mauling = FALSE // Attacks unconscious mobs var/unconscious_vore = FALSE //VOREStation Add - allows a mob to go for unconcious targets IF their vore prefs align var/handle_corpse = FALSE // Allows AI to acknowledge corpses (e.g. nurse spiders) + var/vore_hostile = FALSE // The same as hostile, but with vore pref checks + var/micro_hunt = FALSE // Will target mobs at or under the micro_hunt_size size, requires vore_hostile to be true + var/micro_hunt_size = 0.25 var/atom/movable/target = null // The thing (mob or object) we're trying to kill. var/atom/movable/preferred_target = null// If set, and if given the chance, we will always prefer to target this over other options. @@ -312,3 +315,16 @@ /datum/ai_holder/proc/lose_taunt() ai_log("lose_taunt() : Resetting preferred_target.", AI_LOG_INFO) preferred_target = null + +/datum/ai_holder/proc/vore_check(mob/living/L) + if(!holder.vore_selected) //We probably don't have a belly so don't even try + return FALSE + if(!isliving(L)) //We only want mob/living + return FALSE + if(!L.devourable || !L.allowmobvore) //Check their prefs + return FALSE + if(micro_hunt && !(L.get_effective_size(TRUE) <= micro_hunt_size)) //Are they small enough to get? + to_world("[holder]'s micro hunt failed against [L]: micro_hunt = [micro_hunt]: [L] effective_size = [L.get_effective_size(TRUE)]: Hunting sizes under [micro_hunt_size]") + return FALSE + to_world("micro hunt passed") + return TRUE // Let's go! diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/macrobacteria.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/macrobacteria.dm index 314175e9f3c..c7b2fb1323e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/macrobacteria.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/macrobacteria.dm @@ -1,21 +1,9 @@ /datum/category_item/catalogue/fauna/abyss_lurker - name = "Alien Wildlife - Teppi" - desc = "Teppi are large omnivorous quadrupeds with long fur.\ - Unlike many horned mammals, Teppi have developed paws with four toes rather than hooves.\ - This coupled with a thick, powerful tail makes them quite capable and balanced on many\ - kinds of terrain. A recently discovered species, their origins are something of a\ - mystery, but they have been discovered in more different regions of space with no apparent\ - connection to one another. Teppi are known to reproduce and grow rather quickly, which if\ - left unchecked can lead to serious problems for local ecology.\ - Teppi are very hardy, engaging them in combat is not recommended.\ - Teppi can be a good source of protein and materials for crafts and clothing in emergency\ - situations. They are not especially picky eaters, and have a rather mild temperament.\ - A pair of well fed Teppi can rather quickly become a small horde, so it is generally\ - advised to keep an eye on their numbers." + name = "Alien Wildlife - Abyss Lurker" + desc = "REPLACE ME" value = CATALOGUER_REWARD_MEDIUM - -/mob/living/simple_mob/vore/alienanimals/abyss_lurker +/mob/living/simple_mob/vore/vore_hostile/abyss_lurker name = "abyss lurker" desc = "A pale mass of heaving flesh that gropes around in the gloom. It doesn't appear to have any eyes." icon = 'icons/mob/alienanimals_x64.dmi' @@ -23,6 +11,7 @@ icon_living = "abyss_lurker" icon_dead = "abyss_lurker-dead" icon_rest = "abyss_lurker" + vore_icons = 0 faction = "macrobacteria" maxHealth = 600 @@ -37,11 +26,16 @@ pixel_x = -16 default_pixel_x = -16 + mob_bump_flag = HEAVY + mob_swap_flags = HEAVY + mob_push_flags = HEAVY + mob_size = MOB_LARGE + attacktext = list("flashes", "slaps", "smothers", "grapples") attack_sound = 'sound/effects/attackblob.ogg' - ai_holder_type = /datum/ai_holder/simple_mob/say_hostile + ai_holder_type = /datum/ai_holder/simple_mob/say_aggro mob_size = MOB_LARGE @@ -62,7 +56,7 @@ vore_pounce_maxhealth = 100 vore_standing_too = TRUE -/mob/living/simple_mob/vore/alienanimals/abyss_lurker/init_vore() +/mob/living/simple_mob/vore/vore_hostile/abyss_lurker/init_vore() ..() var/obj/belly/B = vore_selected B.name = "interior" @@ -75,11 +69,53 @@ B.absorbchance = 0 B.escapechance = 25 -/datum/ai_holder/simple_mob/say_hostile +/mob/living/simple_mob/vore/vore_hostile + name = "peeb" + desc = "REPLACE ME" + ai_holder_type = /datum/ai_holder/simple_mob/vore + +/datum/ai_holder/simple_mob/vore hostile = FALSE retaliate = TRUE + vore_hostile = TRUE + forgive_resting = TRUE -/datum/ai_holder/simple_mob/say_hostile/on_hear_say(mob/living/speaker, message) +/datum/ai_holder/simple_mob/vore/micro_hunter + micro_hunt = TRUE + micro_hunt_size = 0.8 + +/datum/ai_holder/simple_mob/vore/hostile + hostile = TRUE + +/datum/ai_holder/simple_mob/vore/find_target(list/possible_targets, has_targets_list) + if(!vore_hostile) + return ..() + ai_log("find_target() : Entered.", AI_LOG_TRACE) + + . = list() + if(!has_targets_list) + possible_targets = list_targets() + var/list/valid_mobs = list() + for(var/mob/living/possible_target in possible_targets) + if(!can_attack(possible_target)) + continue + . |= possible_target + if(!isliving(possible_target)) + continue + if(vore_check(possible_target)) + valid_mobs |= possible_target + + var/new_target + if(valid_mobs.len) + new_target = pick(valid_mobs) + else if(hostile) + new_target = pick(.) + if(!new_target) + return null + give_target(new_target) + return new_target + +/datum/ai_holder/simple_mob/say_aggro/on_hear_say(mob/living/speaker, message) . = ..() if(holder.client || !speaker.client) return diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm index 1880218bd38..c0bfe3ffb28 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm @@ -651,7 +651,7 @@ semirandom_group_min = 1 semirandom_group_max = 3 mob_intent = "retaliate" - valid_mobs = list(list(/mob/living/simple_mob/vore/alienanimals/abyss_lurker = 100)) + valid_mobs = list(list(/mob/living/simple_mob/vore/vore_hostile/abyss_lurker = 100)) var/mob_chance = 10 var/treasure_chance = 50 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm index d1613829e32..a1ebe4c2146 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm @@ -124,7 +124,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? attack_sound = 'sound/voice/teppi/roar.ogg' // make a better one idiot friendly = list("snoofs", "nuzzles", "nibbles", "smooshes on") - ai_holder_type = /datum/ai_holder/simple_mob/teppi + ai_holder_type = /datum/ai_holder/simple_mob/vore/micro_hunter mob_size = MOB_LARGE @@ -160,6 +160,10 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? vore_default_contamination_flavor = "Wet" vore_default_contamination_color = "grey" vore_default_item_mode = IM_DIGEST + vore_bump_chance = 5 + vore_pounce_chance = 35 + vore_pounce_falloff = 0 + vore_standing_too = TRUE /mob/living/simple_mob/vore/alienanimals/teppi/init_vore() ..() diff --git a/icons/mob/alienanimals_x64.dmi b/icons/mob/alienanimals_x64.dmi index 6cf1e85ddc8..fefb608bb9c 100644 Binary files a/icons/mob/alienanimals_x64.dmi and b/icons/mob/alienanimals_x64.dmi differ