diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm index 9b1b0fbab52f..57c5e0a15b74 100644 --- a/code/game/objects/effects/landmarks/landmarks.dm +++ b/code/game/objects/effects/landmarks/landmarks.dm @@ -152,11 +152,17 @@ /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" + icon_state = "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 +176,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/game/sound.dm b/code/game/sound.dm index fb51a77f8370..358c3d4e9e17 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -445,8 +445,12 @@ sound = pick('sound/effects/clownstep1.ogg', 'sound/effects/clownstep2.ogg') if("giant_lizard_growl") sound = pick('sound/effects/giant_lizard_growl1.ogg', 'sound/effects/giant_lizard_growl2.ogg') + if("bortrough_growl") + sound = pick('sound/effects/bortrough-chuff1.ogg', 'sound/effects/bortrough-chuff2.ogg') if("giant_lizard_hiss") sound = pick('sound/effects/giant_lizard_hiss1.ogg', 'sound/effects/giant_lizard_hiss2.ogg') + if("bortrough_hiss") + sound = pick('sound/effects/bortrough-hurt.ogg') if("evo_screech") sound = pick('sound/voice/alien_echoroar_1.ogg', 'sound/voice/alien_echoroar_2.ogg', 'sound/voice/alien_echoroar_3.ogg') if("wy_droid_pain") diff --git a/code/game/turfs/soro.dm b/code/game/turfs/soro.dm index 67baf1c5e416..2d74b611f157 100644 --- a/code/game/turfs/soro.dm +++ b/code/game/turfs/soro.dm @@ -311,3 +311,4 @@ icon = 'icons/turf/floors/swamp_water.dmi' icon_state = "swampshallow" icon_overlay = "swampriverwater" + no_overlay = TRUE 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..1530e1b38ed1 --- /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 = "Bortrough" + 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.ogg' + growl_sound = "bortrough_growl" + hiss_sound = "bortrough_hiss" + 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 f0a20124ae12..3267ba19d393 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -2331,6 +2331,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/landmarks.dmi b/icons/landmarks.dmi index 0c2315b5dc30..ab8ff7c779c1 100644 Binary files a/icons/landmarks.dmi and b/icons/landmarks.dmi differ 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/maps/map_files/Sekhmet_Swamp/Sekhmet_Swamp.dmm b/maps/map_files/Sekhmet_Swamp/Sekhmet_Swamp.dmm index 2e946c1c204d..8103c15efb25 100644 --- a/maps/map_files/Sekhmet_Swamp/Sekhmet_Swamp.dmm +++ b/maps/map_files/Sekhmet_Swamp/Sekhmet_Swamp.dmm @@ -9568,6 +9568,10 @@ "dQr" = ( /turf/open/floor/strata/floor2, /area/sekhmet/int_glass/complex_generic) +"dQK" = ( +/obj/effect/landmark/lizard_spawn/bortrough, +/turf/open/gm/dirt/swamp_dirt/variant_5/south, +/area/sekhmet/outside/swamp) "dRf" = ( /obj/structure/flora/bush/ausbushes/var3/fernybush{ color = "#fceab2"; @@ -17013,6 +17017,10 @@ }, /turf/open/gm/river/swamp, /area/sekhmet/outside/swamp) +"hHf" = ( +/obj/effect/landmark/lizard_spawn/bortrough, +/turf/open/auto_turf/swamp_grass/layer1, +/area/sekhmet/outside/swamp) "hHl" = ( /obj/structure/flora/bush/ausbushes/var3/sparsegrass, /turf/open/auto_turf/swamp_grass/layer0_mud_alt, @@ -26319,7 +26327,7 @@ /turf/open/gm/river/swamp, /area/sekhmet/outside/swamp) "mXJ" = ( -/obj/effect/landmark/lizard_spawn, +/obj/effect/landmark/lizard_spawn/bortrough, /turf/open/gm/coast/dirt/swampdir/west, /area/sekhmet/outside/swamp) "mXK" = ( @@ -29834,6 +29842,10 @@ /obj/effect/landmark/objective_landmark/far, /turf/open/floor/strata/floor3, /area/sekhmet/int_glass/offices) +"oLk" = ( +/obj/effect/landmark/lizard_spawn/bortrough, +/turf/open/gm/coast/dirt/swampdir/south, +/area/sekhmet/outside/swamp) "oLw" = ( /obj/structure/shuttle/part/ert/transparent/left_engine, /turf/open/floor/corsat, @@ -33481,6 +33493,10 @@ /obj/structure/largecrate/random/case/double, /turf/open/floor/strata/multi_tiles/southwest, /area/sekhmet/int_reg/southwest_complex) +"qPV" = ( +/obj/effect/landmark/lizard_spawn/bortrough, +/turf/open/auto_turf/swamp_dirt/layer1, +/area/sekhmet/outside/swamp) "qPW" = ( /obj/structure/largecrate/random/barrel/true_random, /turf/open/floor/strata/floor2, @@ -34490,6 +34506,10 @@ /obj/effect/abstract/ripple/shadow, /turf/open/gm/coast/dirt/swampbeachcorner2/south_east, /area/sekhmet/outside/swamp) +"rvv" = ( +/obj/effect/landmark/lizard_spawn/bortrough, +/turf/open/gm/dirt/swamp_dirt/variant_2, +/area/sekhmet/outside/swamp) "rvz" = ( /obj/structure/reagent_dispensers/tank/fuel, /turf/open/floor/plating/kutjevo, @@ -34946,6 +34966,10 @@ }, /turf/open/auto_turf/sand_white/layer0, /area/sekhmet/caves/temple) +"rGr" = ( +/obj/effect/landmark/lizard_spawn/bortrough, +/turf/open/auto_turf/swamp_grass/layer1, +/area/sekhmet/outside/east_jungle) "rGJ" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_21"; @@ -46518,8 +46542,8 @@ /turf/open/floor/strata/multi_tiles/southwest, /area/sekhmet/int_reg/complex_operation) "xUB" = ( -/obj/effect/landmark/lizard_spawn, -/turf/open/auto_turf/swamp_grass/layer1, +/obj/effect/landmark/lizard_spawn/bortrough, +/turf/open/gm/dirt/swamp_dirt, /area/sekhmet/outside/swamp) "xUQ" = ( /obj/structure/stairs/perspective{ @@ -88598,7 +88622,7 @@ mnc vWE uKV pBz -pBz +hHf tHT nJZ qln @@ -91258,7 +91282,7 @@ lzJ pBz pBz cHW -pBz +hHf pZW bMh cFn @@ -94208,7 +94232,7 @@ duS hUQ cHW kRb -kRb +qPV kCV kCV lzJ @@ -94683,7 +94707,7 @@ tKj xUZ jen wuj -dVw +oLk cHW pBz pBz @@ -95022,7 +95046,7 @@ kCV kCV kCV rUO -aOp +rvv pZW qbK sih @@ -97454,7 +97478,7 @@ bzC kCV kCV ahB -ahB +dQK pHK lpw oES @@ -97875,7 +97899,7 @@ bsP aOp hnk kRb -cHW +xUB rMZ lQU fts @@ -99711,7 +99735,7 @@ lzW tAg pBz ahk -aOp +rvv lzJ qIY pmQ @@ -100374,7 +100398,7 @@ uFZ vyp rEe pBz -cHW +xUB gqP pZW lmA @@ -101910,7 +101934,7 @@ pBz pBz pBz pBz -cHW +xUB pZW xOG bpU @@ -102237,7 +102261,7 @@ cfh uhn vRr atp -xUB +pBz qqg lzJ qTH @@ -103356,7 +103380,7 @@ uwE pdy bbl hsS -cHW +xUB cHW rUO mxU @@ -119413,7 +119437,7 @@ efC rEu rEu rEu -grS +rGr rSl pvr oQs diff --git a/sound/effects/bortrough-chuff1.ogg b/sound/effects/bortrough-chuff1.ogg new file mode 100644 index 000000000000..4b60258ee5e8 Binary files /dev/null and b/sound/effects/bortrough-chuff1.ogg differ diff --git a/sound/effects/bortrough-chuff2.ogg b/sound/effects/bortrough-chuff2.ogg new file mode 100644 index 000000000000..bc21e335800e Binary files /dev/null and b/sound/effects/bortrough-chuff2.ogg differ diff --git a/sound/effects/bortrough-die.ogg b/sound/effects/bortrough-die.ogg new file mode 100644 index 000000000000..647c7a2f4d7f Binary files /dev/null and b/sound/effects/bortrough-die.ogg differ diff --git a/sound/effects/bortrough-hurt.ogg b/sound/effects/bortrough-hurt.ogg new file mode 100644 index 000000000000..c807c0abf90c Binary files /dev/null and b/sound/effects/bortrough-hurt.ogg differ