///////////////////// Simple Animal ///////////////////// /mob/living/simple_mob var/swallowTime = (3 SECONDS) //How long it takes to eat its prey in 1/10 of a second. The default is 3 seconds. var/list/prey_excludes = list() //For excluding people from being eaten. /mob/living/simple_mob/insidePanel() //CHOMPedit: On-demand belly loading. if(vore_active && !voremob_loaded) voremob_loaded = TRUE init_vore() ..() // // Simple nom proc for if you get ckey'd into a simple_mob mob! Avoids grabs. // /mob/living/simple_mob/proc/animal_nom(mob/living/T in living_mobs(1)) set name = "Animal Nom" set category = "IC" set desc = "Since you can't grab, you get a verb!" if(vore_active && !voremob_loaded) //CHOMPedit: On-demand belly loading. voremob_loaded = TRUE init_vore() if(stat != CONSCIOUS) return // Verbs are horrifying. They don't call overrides. So we're stuck with this. if(istype(src, /mob/living/simple_mob/animal/passive/mouse) && !T.ckey) // Mice can't eat logged out players! return /*if(client && IsAdvancedToolUser()) //CHOMPedit: Mob QOL, not everything can be grabbed and nobody wants wiseguy gotchas for trying. to_chat(src, "Put your hands to good use instead!") return */ feed_grabbed_to_self(src,T) update_icon() //CHOMPedit: On-demand belly loading. /mob/living/simple_mob/perform_the_nom(mob/living/user, mob/living/prey, mob/living/pred, obj/belly/belly, delay) if(vore_active && !voremob_loaded && pred == src) //Only init your own bellies. voremob_loaded = TRUE init_vore() belly = vore_selected ..() // // Simple proc for animals to have their digestion toggled on/off externally // Added as a verb in /mob/living/simple_mob/init_vore() if vore is enabled for this mob. // /mob/living/simple_mob/proc/toggle_digestion() set name = "Toggle Animal's Digestion" set desc = "Enables digestion on this mob for 20 minutes." set category = "OOC" set src in oview(1) var/mob/living/carbon/human/user = usr if(!istype(user) || user.stat) return if(!vore_selected) to_chat(user, "[src] isn't planning on eating anything much less digesting it.") return /*ChompStation edit: This prevented some flexibility with mob vore and the returned message was highly unprofessional. if(ai_holder.retaliate || (ai_holder.hostile && faction != user.faction)) to_chat(user, "This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.") return */ if(vore_selected.digest_mode == DM_HOLD) var/confirm = tgui_alert(user, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will reset after 20 minutes.", "Enabling [name]'s Digestion", list("Enable", "Cancel")) if(confirm == "Enable") vore_selected.digest_mode = DM_DIGEST addtimer(VARSET_CALLBACK(vore_selected, digest_mode, vore_default_mode), 20 MINUTES) else var/confirm = tgui_alert(user, "This mob is currently set to process all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", list("Disable", "Cancel")) if(confirm == "Disable") vore_selected.digest_mode = DM_HOLD // Added as a verb in /mob/living/simple_mob/init_vore() if vore is enabled for this mob. /mob/living/simple_mob/proc/toggle_fancygurgle() set name = "Toggle Animal's Gurgle sounds" set desc = "Switches between Fancy and Classic sounds on this mob." set category = "OOC" set src in oview(1) var/mob/living/user = usr //I mean, At least ghosts won't use it. if(!istype(user) || user.stat) return if(!vore_selected) to_chat(user, "[src] isn't vore capable.") return vore_selected.fancy_vore = !vore_selected.fancy_vore to_chat(user, "[src] is now using [vore_selected.fancy_vore ? "Fancy" : "Classic"] vore sounds.") /mob/living/simple_mob/attackby(var/obj/item/O, var/mob/user) if(istype(O, /obj/item/weapon/newspaper) && !(ckey || (ai_holder.hostile && faction != user.faction)) && isturf(user.loc)) if(ai_holder.retaliate && prob(vore_pounce_chance/2)) // This is a gamble! user.Weaken(5) //They get tackled anyway whether they're edible or not. user.visible_message("[user] swats [src] with [O] and promptly gets tackled!!") if(will_eat(user)) set_AI_busy(TRUE) animal_nom(user) update_icon() set_AI_busy(FALSE) else if(!ai_holder.target) // no using this to clear a retaliate mob's target ai_holder.target = user //just because you're not tasty doesn't mean you get off the hook. A swat for a swat. //AttackTarget() //VOREStation AI Temporary Removal //LoseTarget() // only make one attempt at an attack rather than going into full rage mode else user.visible_message("[user] swats [src] with [O]!") release_vore_contents() for(var/mob/living/L in living_mobs(0)) //add everyone on the tile to the do-not-eat list for a while if(!(L in prey_excludes)) // Unless they're already on it, just to avoid fuckery. prey_excludes += L addtimer(CALLBACK(src, .proc/removeMobFromPreyExcludes, weakref(L)), 5 MINUTES) else if(istype(O, /obj/item/device/healthanalyzer)) var/healthpercent = health/maxHealth*100 to_chat(user, "[src] seems to be [healthpercent]% healthy.") else ..() /mob/living/simple_mob/proc/removeMobFromPreyExcludes(weakref/target) if(isweakref(target)) var/mob/living/L = target.resolve() if(L) LAZYREMOVE(prey_excludes, L) /mob/living/simple_mob/proc/nutrition_heal() set name = "Nutrition Heal" set category = "Abilities" set desc = "Slowly regenerate health using nutrition." if(nutrition < 10) to_chat(src, "You are too hungry to regenerate health.") return var/heal_amount = input(src, "Input the amount of health to regenerate at the rate of 10 nutrition per second per hitpoint. Current health: [health] / [maxHealth]", "Regenerate health.") as num|null if(!heal_amount) return heal_amount = CLAMP(heal_amount, 1, maxHealth - health) heal_amount = CLAMP(heal_amount, 1, nutrition / 10) if(do_after (src, 10 * heal_amount)) nutrition -= 10 * heal_amount if(heal_amount < getBruteLoss()) adjustBruteLoss(-heal_amount) return heal_amount = heal_amount - getBruteLoss() adjustBruteLoss(-getBruteLoss()) if(heal_amount < getFireLoss()) adjustFireLoss(-heal_amount) return heal_amount = heal_amount - getFireLoss() adjustFireLoss(-getFireLoss()) if(heal_amount < getOxyLoss()) adjustOxyLoss(-heal_amount) return heal_amount = heal_amount - getOxyLoss() adjustOxyLoss(-getOxyLoss()) if(heal_amount < getToxLoss()) adjustToxLoss(-heal_amount) return heal_amount = heal_amount - getToxLoss() adjustToxLoss(-getToxLoss()) if(heal_amount < getCloneLoss()) adjustCloneLoss(-heal_amount) return adjustCloneLoss(-getCloneLoss())