mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-08-24 05:36:57 +01:00
Added burrowing, foraging and scavenging interactions for simple_mob animals.
This commit is contained in:
@@ -1640,4 +1640,25 @@
|
||||
/mob/living/carbon/human/get_sound_volume_multiplier()
|
||||
. = ..()
|
||||
for(var/obj/item/clothing/C in list(l_ear, r_ear, head))
|
||||
. = min(., C.volume_multiplier)
|
||||
. = min(., C.volume_multiplier)
|
||||
|
||||
/mob/living/carbon/human/rip_out_internal_organ(var/zone, var/skip_wounding = FALSE, var/damage_descriptor)
|
||||
|
||||
var/obj/item/organ/organ
|
||||
var/obj/item/organ/external/limb
|
||||
if(zone)
|
||||
limb = organs_by_name[zone]
|
||||
if(limb && length(limb.internal_organs))
|
||||
organ = pick_n_take(limb.internal_organs)
|
||||
if(!organ)
|
||||
organ = ..(skip_wounding = TRUE)
|
||||
|
||||
if(organ)
|
||||
organ.removed()
|
||||
if(organ.parent_organ && !limb)
|
||||
limb = organs_by_name[organ.parent_organ]
|
||||
if(limb)
|
||||
limb.take_damage(rand(10,20), 0, TRUE, TRUE, damage_descriptor)
|
||||
else
|
||||
take_damage(rand(10, 20))
|
||||
return organ
|
||||
|
||||
@@ -99,4 +99,4 @@
|
||||
/datum/unarmed_attack/stomp/weak/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||
user.visible_message("<span class='warning'>[user] jumped up and down on \the [target]'s [affecting.name]!</span>")
|
||||
playsound(user, attack_sound, 25, 1, -1)
|
||||
playsound(user, attack_sound, 25, 1, -1)
|
||||
|
||||
@@ -1143,7 +1143,7 @@
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/effect/overmap/visitable/M = get_overmap_sector(T.z)
|
||||
|
||||
|
||||
if(istype(M))
|
||||
if(M.in_space)
|
||||
if(T.z in using_map.station_levels)
|
||||
@@ -1156,3 +1156,10 @@
|
||||
var/datum/map_z_level/zlevel = using_map.zlevels["[T.z]"]
|
||||
if(istype(zlevel))
|
||||
. |= zlevel.event_regions
|
||||
|
||||
// kali maaaaa
|
||||
/mob/living/proc/rip_out_internal_organ(var/zone, var/skip_wounding = FALSE, var/damage_descriptor)
|
||||
if(length(internal_organs))
|
||||
. = pick_n_take(internal_organs)
|
||||
if(!skip_wounding)
|
||||
take_damage(rand(10,20))
|
||||
|
||||
@@ -11,32 +11,7 @@
|
||||
var/obj/O = A
|
||||
return O.attack_hand(src)
|
||||
|
||||
switch(a_intent)
|
||||
if(I_HELP)
|
||||
if(isliving(A))
|
||||
custom_emote(1,"[pick(friendly)] \the [A]!")
|
||||
|
||||
if(I_HURT)
|
||||
if(can_special_attack(A) && special_attack_target(A))
|
||||
return
|
||||
|
||||
else if(melee_damage_upper == 0 && istype(A,/mob/living))
|
||||
custom_emote(1,"[pick(friendly)] \the [A]!")
|
||||
|
||||
else
|
||||
attack_target(A)
|
||||
|
||||
if(I_GRAB)
|
||||
if(has_hands)
|
||||
A.attack_hand(src)
|
||||
else
|
||||
attack_target(A)
|
||||
|
||||
if(I_DISARM)
|
||||
if(has_hands)
|
||||
A.attack_hand(src)
|
||||
else
|
||||
attack_target(A)
|
||||
return do_interaction(A)
|
||||
|
||||
/mob/living/simple_mob/RangedAttack(var/atom/A)
|
||||
// setClickCooldown(get_attack_speed())
|
||||
@@ -45,4 +20,40 @@
|
||||
return
|
||||
|
||||
if(projectiletype)
|
||||
shoot_target(A)
|
||||
shoot_target(A)
|
||||
|
||||
/mob/living/simple_mob/proc/do_interaction(var/atom/A)
|
||||
switch(a_intent)
|
||||
if(I_HURT)
|
||||
return do_hurt_interaction(A)
|
||||
if(I_GRAB)
|
||||
return do_grab_interaction(A)
|
||||
if(I_DISARM)
|
||||
return do_disarm_interaction(A)
|
||||
return do_help_interaction(A)
|
||||
|
||||
/mob/living/simple_mob/proc/do_help_interaction(var/atom/A)
|
||||
if(isliving(A))
|
||||
custom_emote(1,"[pick(friendly)] \the [A]!")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_mob/proc/do_hurt_interaction(var/atom/A)
|
||||
if(can_special_attack(A) && special_attack_target(A))
|
||||
return
|
||||
else if(melee_damage_upper == 0 && istype(A,/mob/living))
|
||||
custom_emote(1,"[pick(friendly)] \the [A]!")
|
||||
else
|
||||
attack_target(A)
|
||||
|
||||
/mob/living/simple_mob/proc/do_disarm_interaction(var/atom/A)
|
||||
if(has_hands)
|
||||
A.attack_hand(src)
|
||||
else
|
||||
attack_target(A)
|
||||
|
||||
/mob/living/simple_mob/proc/do_grab_interaction(var/atom/A)
|
||||
if(has_hands)
|
||||
A.attack_hand(src)
|
||||
else
|
||||
attack_target(A)
|
||||
|
||||
@@ -23,5 +23,44 @@
|
||||
/obj/item/stack/animalhide = 3\
|
||||
)
|
||||
|
||||
var/forager = TRUE // Can eat from trees and bushes.
|
||||
var/scavenger = FALSE // Can eat from corpses.
|
||||
var/burrower = FALSE // Can dig dens.
|
||||
|
||||
/decl/mob_organ_names/quadruped //Most subtypes have this basic body layout.
|
||||
hit_zones = list("head", "torso", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "tail")
|
||||
hit_zones = list("head", "torso", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "tail")
|
||||
|
||||
/mob/living/simple_mob/animal/do_interaction(var/atom/A)
|
||||
var/static/list/atom_types_with_animal_interactions = list(
|
||||
/obj/structure/animal_den,
|
||||
/obj/structure/flora,
|
||||
/turf/simulated/floor/outdoors
|
||||
)
|
||||
for(var/checktype in atom_types_with_animal_interactions)
|
||||
if(istype(A, checktype))
|
||||
attack_generic(A, 0, "investigates")
|
||||
return TRUE
|
||||
if(scavenger && isliving(A) && a_intent == I_HURT)
|
||||
var/mob/living/M = A
|
||||
if(M.stat == DEAD && length(M.internal_organs))
|
||||
to_chat(src, SPAN_NOTICE("You dig into the guts of \the [M], hunting for the sweetest meat."))
|
||||
if(do_after(src, M, 2 SECOND) && !QDELETED(M) && length(M.internal_organs))
|
||||
var/obj/item/organ = M.rip_out_internal_organ(check_zone(zone_sel.selecting), damage_descriptor = "animal teeth")
|
||||
if(organ)
|
||||
visible_message(SPAN_DANGER("\The [src] rips \the [organ] out of \the [M] and devours [organ.gender == PLURAL ? "them" : "it"]!"))
|
||||
eat_food_item(organ)
|
||||
if(!length(M.internal_organs) && M.gib_on_butchery)
|
||||
M.gib()
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/animal/proc/eat_food_item(var/obj/item/snack, var/silent)
|
||||
if(istype(snack, /obj/item/organ))
|
||||
var/obj/item/organ/organ = snack
|
||||
if(organ.meat_type)
|
||||
eat_food_item(new organ.meat_type(src), silent = TRUE)
|
||||
if(!silent)
|
||||
playsound(src, 'sound/items/eatfood.ogg', rand(10,50), 1)
|
||||
if(snack.reagents?.total_volume)
|
||||
snack.reagents.trans_to_mob(src, snack.reagents.total_volume, CHEM_INGEST)
|
||||
qdel(snack)
|
||||
|
||||
@@ -425,4 +425,4 @@
|
||||
attack_speed_percent = 0.8
|
||||
|
||||
/decl/mob_organ_names/kururak
|
||||
hit_zones = list("head", "chest", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "far left tail", "far right tail", "left middle tail", "right middle tail")
|
||||
hit_zones = list("head", "chest", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "far left tail", "far right tail", "left middle tail", "right middle tail")
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
say_list_type = /datum/say_list/siffet
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/siffet
|
||||
burrower = TRUE
|
||||
|
||||
/datum/say_list/siffet
|
||||
speak = list("Yap!", "Heh!", "Huff.")
|
||||
@@ -58,4 +59,8 @@
|
||||
/mob/living/simple_mob/animal/sif/siffet/IIsAlly(mob/living/L)
|
||||
. = ..()
|
||||
if(!. && L.mob_size > 10) //Attacks things it considers small enough to take on, otherwise only attacks if attacked.
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
/obj/structure/animal_den/ghost_join/siffet
|
||||
name = "siffet den"
|
||||
critter = /mob/living/simple_mob/animal/sif/siffet
|
||||
|
||||
Reference in New Issue
Block a user