diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm index 324bbdbd5105..cb13dbe7656f 100644 --- a/code/game/objects/effects/landmarks/landmarks.dm +++ b/code/game/objects/effects/landmarks/landmarks.dm @@ -152,11 +152,16 @@ /obj/effect/landmark/lizard_spawn name = "lizard spawn" icon_state = "lizard_spawn" + var/lizard_path = /mob/living/simple_animal/hostile/retaliate/giant_lizard + +/obj/effect/landmark/lizard_spawn/bortrough + name = "bortrough spawn" + lizard_path = /mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough /obj/effect/landmark/lizard_spawn/Initialize(mapload, ...) . = ..() if(prob(66)) - new /mob/living/simple_animal/hostile/retaliate/giant_lizard(loc) + new lizard_path(loc) addtimer(CALLBACK(src, PROC_REF(latespawn_lizard)), rand(35 MINUTES, 50 MINUTES)) /obj/effect/landmark/lizard_spawn/proc/latespawn_lizard() @@ -170,7 +175,7 @@ continue addtimer(CALLBACK(src, PROC_REF(latespawn_lizard)), 1 MINUTES) return - new /mob/living/simple_animal/hostile/retaliate/giant_lizard(loc) + new lizard_path(loc) #undef MAXIMUM_LIZARD_AMOUNT diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bortrough.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bortrough.dm new file mode 100644 index 000000000000..499e2066933c --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bortrough.dm @@ -0,0 +1,68 @@ +#define ALIGATOR_SPEED_DRAGING 2.8 +#define LIZARD_SPEED_NORMAL 1.2 + + +/mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough + name = "Aligator" + icon = 'icons/mob/bortrough.dmi' + icon_state = "Bortrough Running" + icon_living = "Bortrough Running" + icon_dead = "Bortrough Dead" + stun_duration = 2 + grab_level = GRAB_CHOKE + base_state = "Bortrough" + death_sound = 'sound/effects/bortrough-die.mp3' + growl_sound = "bortrough-chuff" + hiss_sound = "bortrough-hurt" + wound_icon = 'icons/mob/bortrough.dmi' + pixel_x = -22 + var/pulling_state = "Bortrough Running Open Jaws" + +/mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough/ListTargets(dist = 4) + . = ..() + +/mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough/update_transform(instant_update = FALSE) + . = ..() + if(pulling) + icon_state = "Bortrough Running Open Jaws" + if(istype(loc, /turf/open/gm/river) && stat != DEAD) + icon_state = "Bortrough Submerged" + +/mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough/Move(NewLoc, direct) + . = ..() + if(istype(loc, /turf/open/gm/river) && stat != DEAD) + icon_state = "Bortrough Submerged" + update_wounds() + else + if(icon_state == "Bortrough Submerged") + update_transform() + update_wounds() + +/mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough/update_wounds() + . = ..() + if(istype(loc, /turf/open/gm/river) && stat != DEAD) + wound_icon_holder.icon_state = "none" + +/mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough/try_to_extinguish() + if(istype(get_turf(src), /turf/open/gm/river) || (/obj/effect/blocker/water in loc) || istype(get_turf(src), /turf/open/beach/coastline) || istype(get_turf(src), /turf/open/gm/coast)) + ExtinguishMob() + . = ..() + +/mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough/pounced_mob(mob/living/pounced_mob) + . = ..() + throwing = 0 + start_pulling(pounced_mob, TRUE, simple_mob = TRUE) + MoveTo(target_mob_ref?.resolve(), 5, TRUE, 2 SECONDS, TRUE) //drag our target away + +/mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough/start_pulling(atom/movable/clone/AM, lunge, no_msg, simple_mob) + . = ..() + if(.) + update_transform() + speed = ALIGATOR_SPEED_DRAGING +/mob/living/simple_animal/hostile/retaliate/giant_lizard/bortrough/stop_pulling() + . = ..() + speed = LIZARD_SPEED_NORMAL + update_transform() + +#undef ALIGATOR_SPEED_DRAGING +#undef LIZARD_SPEED_NORMAL diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm index 02205b913e01..ef4e36a31207 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_lizard.dm @@ -43,6 +43,17 @@ attack_same = FALSE langchat_color = LIGHT_COLOR_GREEN + ///used for the other icons to be modular + var/base_state = "Giant Lizard" + + var/death_sound = 'sound/effects/giant_lizard_death.ogg' + + var/growl_sound = "giant_lizard_growl" + + var/hiss_sound = "giant_lizard_hiss" + + var/wound_icon = 'icons/mob/mob_64.dmi' + ///Reference to the ZZzzz sleep overlay when resting. var/sleep_overlay ///Reference to the tongue flick overlay. @@ -89,6 +100,8 @@ var/list/acceptable_foods = list(/obj/item/reagent_container/food/snacks/mre_food, /obj/item/reagent_container/food/snacks/resin_fruit) ///Is the mob currently eating the food_target? var/is_eating = FALSE + ///How long do we stun the pounced target for + var/stun_duration = 0.5 ///Cooldown dictating how long the mob will wait between eating food. COOLDOWN_DECLARE(food_cooldown) @@ -148,6 +161,7 @@ /mob/living/simple_animal/hostile/retaliate/giant_lizard/Initialize() . = ..() wound_icon_holder = new(null, src) + wound_icon_holder.icon = wound_icon tongue_icon_holder = new(null, src) tongue_icon_holder.pixel_x = 2 vis_contents += wound_icon_holder @@ -178,7 +192,7 @@ manual_emote("growls at [target_mob].") else manual_emote("growls.") - playsound(loc, "giant_lizard_growl", 60) + playsound(loc, growl_sound, 60) COOLDOWN_START(src, growl_message, rand(10, 14) SECONDS) /mob/living/simple_animal/hostile/retaliate/giant_lizard/get_status_tab_items() @@ -237,9 +251,9 @@ icon_state = icon_dead else if(body_position == LYING_DOWN) if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) - icon_state = "Giant Lizard Sleeping" + icon_state = "[base_state] Sleeping" else - icon_state = "Giant Lizard Knocked Down" + icon_state = "[base_state] Knocked Down" tongue_icon_holder.alpha = 0 //we can't stop an animation that's called via flick(). best we can do is hide it. else @@ -271,11 +285,11 @@ wound_icon_holder.icon_state = "none" else if(body_position == LYING_DOWN) if(!HAS_TRAIT(src, TRAIT_INCAPACITATED) && !HAS_TRAIT(src, TRAIT_FLOORED)) - wound_icon_holder.icon_state = "Giant Lizard [health_threshold] Rest" + wound_icon_holder.icon_state = "[base_state] [health_threshold] Rest" else - wound_icon_holder.icon_state = "Giant Lizard [health_threshold] Stun" + wound_icon_holder.icon_state = "[base_state] [health_threshold] Stun" else - wound_icon_holder.icon_state = "Giant Lizard [health_threshold]" + wound_icon_holder.icon_state = "[base_state] [health_threshold]" #undef NO_WOUNDS #undef SMALL_WOUNDS @@ -313,7 +327,7 @@ return ..() /mob/living/simple_animal/hostile/retaliate/giant_lizard/death(datum/cause_data/cause_data, gibbed = FALSE, deathmessage = "lets out a waning growl....") - playsound(loc, 'sound/effects/giant_lizard_death.ogg', 70) + playsound(loc, death_sound, 70) GLOB.giant_lizards_alive -= src return ..() @@ -355,7 +369,7 @@ COOLDOWN_START(src, emote_cooldown, rand(5, 8) SECONDS) manual_emote(pick(pick(pet_emotes), "stares at [attacking_mob].", "nuzzles [attacking_mob].", "licks [attacking_mob]'s hand."), "nibbles [attacking_mob]'s arm.") if(prob(50)) - playsound(loc, "giant_lizard_hiss", 25) + playsound(loc, hiss_sound, 25) flick("Giant Lizard Tongue", tongue_icon_holder) if(attacking_mob.a_intent == INTENT_DISARM && prob(25)) playsound(loc, 'sound/weapons/alien_knockdown.ogg', 25, 1) @@ -397,7 +411,7 @@ food_target_ref = null is_eating = FALSE manual_emote("hisses in agony!") - playsound(src, "giant_lizard_hiss", 40) + playsound(src, hiss_sound, 40) MoveTo(null, 9, TRUE, 4 SECONDS, FALSE) COOLDOWN_START(src, calm_cooldown, 8 SECONDS) @@ -932,8 +946,8 @@ playsound(loc, 'sound/weapons/alien_knockdown.ogg', 25, 1) return - playsound(loc, "giant_lizard_hiss", 25) - pounced_mob.KnockDown(0.5) + playsound(loc, hiss_sound, 25) + pounced_mob.KnockDown(stun_duration) step_to(src, pounced_mob) if(!client && !(pounced_mob.faction in faction_group)) ravagingattack(pounced_mob) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 324a1f61bd27..8acd2b9760a5 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -471,11 +471,11 @@ /mob/proc/start_pulling(atom/movable/AM, lunge, no_msg) return -/mob/living/start_pulling(atom/movable/clone/AM, lunge, no_msg) +/mob/living/start_pulling(atom/movable/clone/AM, lunge, no_msg, simple_mob = FALSE) if(istype(AM, /atom/movable/clone)) AM = AM.mstr //If AM is a clone, refer to the real target - if ( QDELETED(AM) || !usr || src==AM || !isturf(loc) || !isturf(AM.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! + if ( QDELETED(AM) || (!usr && !simple_mob) || src==AM || !isturf(loc) || !isturf(AM.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! return if (AM.anchored || AM.throwing) diff --git a/colonialmarines.dme b/colonialmarines.dme index af6e0cf6ead6..ee54c751f2fa 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -2328,6 +2328,7 @@ #include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\tree.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\bortrough.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\giant_lizard.dm" diff --git a/icons/mob/bortrough.dmi b/icons/mob/bortrough.dmi new file mode 100644 index 000000000000..06dae9c5cee5 Binary files /dev/null and b/icons/mob/bortrough.dmi differ diff --git a/sound/effects/bortrough-chuff1.mp3 b/sound/effects/bortrough-chuff1.mp3 new file mode 100644 index 000000000000..d472486f3499 Binary files /dev/null and b/sound/effects/bortrough-chuff1.mp3 differ diff --git a/sound/effects/bortrough-chuff2.mp3 b/sound/effects/bortrough-chuff2.mp3 new file mode 100644 index 000000000000..ffba1d3285fb Binary files /dev/null and b/sound/effects/bortrough-chuff2.mp3 differ diff --git a/sound/effects/bortrough-die.mp3 b/sound/effects/bortrough-die.mp3 new file mode 100644 index 000000000000..c098516a40dc Binary files /dev/null and b/sound/effects/bortrough-die.mp3 differ