diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm index 41a563a703..20e2999e23 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm @@ -13,6 +13,7 @@ icon_dead = "badboi-dead" icon_rest = "badboi_rest" icon = 'icons/mob/vore64x32.dmi' + has_eye_glow = TRUE faction = "corrupt" @@ -92,44 +93,22 @@ else ..() - -/mob/living/simple_mob/vore/aggressive/corrupthound/add_eyes() - if(!eye_layer) - eye_layer = image(icon, "badboi-eyes") - eye_layer.plane = PLANE_LIGHTING_ABOVE - add_overlay(eye_layer) - -/mob/living/simple_mob/vore/aggressive/corrupthound/remove_eyes() - cut_overlay(eye_layer) - -/mob/living/simple_mob/vore/aggressive/corrupthound/New() - add_eyes() - ..() - /mob/living/simple_mob/vore/aggressive/corrupthound/death(gibbed, deathmessage = "shudders and collapses!") .=..() resting = 0 icon_state = icon_dead -/mob/living/simple_mob/vore/aggressive/corrupthound/update_icon() - . = ..() - remove_eyes() - if(stat == CONSCIOUS && !resting) - add_eyes() - -/* //VOREStation AI Temporary Removal /mob/living/simple_mob/vore/aggressive/corrupthound/Login() . = ..() if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount + riding_datum = new /datum/riding/simple_mob(src) + verbs |= /mob/living/simple_mob/proc/animal_mount /mob/living/simple_mob/vore/aggressive/corrupthound/MouseDrop_T(mob/living/M, mob/living/user) return -*/ /datum/say_list/corrupthound - speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...") + speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...") emote_hear = list("jitters and snaps.", "lets out an agonizingly distorted scream.", "wails mechanically", "growls.", "emits illegibly distorted speech.", "gurgles ferociously.", "lets out a distorted beep.", "borks.", "lets out a broken howl.") emote_see = list("stares ferociously.", "snarls.", "jitters and snaps.", "convulses.", "suddenly attacks something unseen.", "appears to howl unaudibly.", "shakes violently.", "dissociates for a moment.", "twitches.") say_maybe_target = list("MEAT?", "N0w YOU DNE FcukED UP b0YO!", "WHAT!", "Not again. NOT AGAIN!") @@ -144,4 +123,4 @@ /datum/ai_holder/simple_mob/melee/evasive/corrupthound violent_breakthrough = TRUE - can_breakthrough = TRUE + can_breakthrough = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index 44b9ff59e5..80d1dda4c5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -1,8 +1,3 @@ -// ToDo: Make this code not a fucking snowflaky horrible broken mess. Do not use until it's actually fixed. It's miserably bad right now. -// Also ToDo: Dev-to-dev communication to ensure responsible parties (if available. In this case, yes.) are aware of what's going on and what's broken. -// Probably easier to troubleshoot when we ain't breaking the server by spawning a buttload of heavily extra feature coded snowflake mobs to the wilderness as mass cannonfodder. -// Also ToDo: An actual "simple" mob for that purpose if necessary :v - /mob/living/simple_mob/otie //Spawn this one only if you're looking for a bad time. Not friendly. name = "otie" desc = "The classic bioengineered longdog." @@ -13,25 +8,9 @@ icon_dead = "otie-dead" icon_rest = "otie_rest" faction = "otie" - recruitable = 1 maxHealth = 150 health = 150 minbodytemp = 200 - move_to_delay = 4 - hostile = 1 - investigates = 1 - reacts = 1 - animal = 1 - specific_targets = 1 - run_at_them = 0 - attack_same = 0 - speak_chance = 4 - speak = list("Boof.","Waaf!","Prurr.","Bork!","Rurrr..","Arf.") - speak_emote = list("growls", "roars", "yaps", "Awoos") - emote_hear = list("rurrs", "rumbles", "rowls", "groans softly", "murrs", "sounds hungry", "yawns") - emote_see = list("stares ferociously", "snarls", "licks their chops", "stretches", "yawns") - say_maybe_target = list("Ruh?", "Waf?") - say_got_target = list("Rurrr!", "ROAR!", "MARR!", "RERR!", "RAHH!", "RAH!", "WARF!") melee_damage_lower = 2 melee_damage_upper = 7 //Don't break my bones bro response_help = "pets the" @@ -52,9 +31,9 @@ buckle_lying = FALSE mount_offset_y = 10 - var/glowyeyes = FALSE - var/image/eye_layer = null - var/eyetype + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/otie + say_list_type = /datum/say_list/otie + var/mob/living/carbon/human/friend var/tamed = 0 var/tame_chance = 50 //It's a fiddy-fiddy default you may get a buddy pal or you may get mauled and ate. Win-win! @@ -71,14 +50,12 @@ name = "mutated feral otie" desc = "The classic bioengineered longdog. No pets. Only bite. This one has mutated from too much time out on the surface of Virgo-3B." tt_desc = "Otus phoronis" - icon_state = "siftusian" - icon_living = "siftusian" - icon_dead = "siftusian-dead" - icon_rest = "siftusian_rest" + icon_state = "photie" + icon_living = "photie" + icon_dead = "photie-dead" + icon_rest = "photie_rest" faction = "virgo3b" tame_chance = 5 // Only a 1 in 20 chance of success. It's feral. What do you expect? - melee_damage_lower = 5 - melee_damage_upper = 12 // Lazy way of making sure this otie survives outside. min_oxy = 0 max_oxy = 0 @@ -88,8 +65,7 @@ max_co2 = 0 min_n2 = 0 max_n2 = 0 - glowyeyes = TRUE - eyetype = "photie" + has_eye_glow = TRUE /mob/living/simple_mob/otie/red name = "feral red otie" @@ -101,8 +77,6 @@ icon_rest = "hotie_rest" faction = "cult" tame_chance = 20 - melee_damage_lower = 5 - melee_damage_upper = 12 // Lazy way of making sure this otie survives outside. min_oxy = 0 max_oxy = 0 @@ -112,8 +86,8 @@ max_co2 = 0 min_n2 = 0 max_n2 = 0 - glowyeyes = TRUE - eyetype = "hotie" + maxbodytemp = 1000 + has_eye_glow = TRUE /mob/living/simple_mob/otie/red/friendly //gets the pet2tame feature and doesn't kill you right away name = "red otie" @@ -143,7 +117,7 @@ icon_state = "pcotie" icon_living = "pcotie" icon_rest = "pcotie_rest" - icon_dead = "siftusian-dead" + icon_dead = "photie-dead" min_oxy = 0 max_oxy = 0 min_tox = 0 @@ -152,8 +126,7 @@ max_co2 = 0 min_n2 = 0 max_n2 = 0 - glowyeyes = TRUE - eyetype = "photie" + has_eye_glow = TRUE /mob/living/simple_mob/otie/security //tame by default unless you're a marked crimester. can be befriended to follow with pets tho. name = "guard otie" @@ -166,8 +139,7 @@ maxHealth = 200 //armored or something health = 200 tamed = 1 - glowyeyes = TRUE - eyetype = "sotie" + has_eye_glow = TRUE loot_list = list(/obj/item/clothing/glasses/sunglasses/sechud,/obj/item/clothing/suit/armor/vest/alt) vore_pounce_chance = 60 // Good boys don't do too much police brutality. @@ -176,14 +148,12 @@ /mob/living/simple_mob/otie/security/phoron name = "mutated guard otie" - desc = "An extra rare phoron resistant version of the VARMAcorp trained snowflake guard dogs." + desc = "An extra rare phoron resistant version of the VARMAcorp trained snowflake guard dogs for infernal environments." tt_desc = "Otus phoronis" - icon_state = "sifguard" - icon_living = "sifguard" - icon_rest = "sifguard_rest" - icon_dead = "sifguard-dead" - melee_damage_lower = 5 - melee_damage_upper = 12 + icon_state = "secphotie" + icon_living = "secphotie" + icon_rest = "secphotie_rest" + icon_dead = "secphotie-dead" min_oxy = 0 max_oxy = 0 min_tox = 0 @@ -192,48 +162,22 @@ max_co2 = 0 min_n2 = 0 max_n2 = 0 - glowyeyes = TRUE - eyetype = "sotie" -/mob/living/simple_mob/otie/PunchTarget() - if(istype(target_mob,/mob/living/simple_mob/animal/passive/mouse)) - return EatTarget() - else ..() - -/mob/living/simple_mob/otie/Found(var/atom/found_atom) - if(!SA_attackable(found_atom)) - return null - if(istype(found_atom,/mob/living/simple_mob/animal/passive/mouse)) - return found_atom - else if(ismob(found_atom)) - var/mob/found_mob = found_atom - if(found_mob.faction == faction) - return null - else if(friend == found_atom) - return null - else if(tamed == 1 && ishuman(found_atom)) - return null - else if(tamed == 1 && isrobot(found_atom)) - return null - else - if(resting) - lay_down() - return found_atom - else - return null - -/mob/living/simple_mob/otie/security/Found(var/atom/found_atom) - if(check_threat(found_atom) >= 4) - if(resting) - lay_down() - return found_atom - ..() +/mob/living/simple_mob/otie/security/phoron/red + name = "red guard otie" + desc = "An ominous looking version of the VARMAcorp trained snowflake guard dogs." + tt_desc = "Otus infernalis" + icon_state = "sechotie" + icon_living = "sechotie" + icon_rest = "sechotie_rest" + icon_dead = "sechotie-dead" + maxbodytemp = 1000 /mob/living/simple_mob/otie/attackby(var/obj/item/O, var/mob/user) // Trade donuts for bellybrig victims. if(istype(O, /obj/item/weapon/reagent_containers/food)) qdel(O) playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) - if(ai_inactive)//No autobarf on player control. + if(!has_AI())//No autobarf on player control. return if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/donut) && istype(src, /mob/living/simple_mob/otie/security)) to_chat(user,"The guard pup accepts your offer for their catch.") @@ -258,80 +202,12 @@ return 0 return M.assess_perp(0, 0, 0, check_records, check_arrest) -/mob/living/simple_mob/otie/security/set_target(var/mob/M) - ai_log("SetTarget([M])",2) - if(!M || (world.time - last_target_time < 5 SECONDS) && target_mob) - ai_log("SetTarget() can't set it again so soon",3) - return 0 - - var/turf/seen = get_turf(M) - - if(investigates && (annoyed < 10)) - try_say_list(say_maybe_target) - face_atom(seen) - annoyed += 14 - sleep(1 SECOND) //For realism - - if(M in ListTargets(view_range)) - try_say_list(say_got_target) - target_mob = M - last_target_time = world.time - if(check_threat(M) >= 4) - global_announcer.autosay("[src] is attempting to detain suspect [target_name(M)] in [get_area(src)].", "SmartCollar oversight", "Security") - return M - else if(investigates) - spawn(1) - WanderTowards(seen) - - return 0 - - /mob/living/simple_mob/otie/security/proc/target_name(mob/living/T) if(ishuman(T)) var/mob/living/carbon/human/H = T return H.get_id_name("unidentified person") return "unidentified lifeform" -//Basic friend AI - -/mob/living/simple_mob/otie/Life() - . = ..() - if(!. || ai_inactive) return - - if(prob(5) && (stance == STANCE_IDLE)) - lay_down() - - if(!friend) return - - var/friend_dist = get_dist(src,friend) - - if (friend_dist <= 4) - if(stance == STANCE_IDLE) - if(set_follow(friend)) - handle_stance(STANCE_FOLLOW) - if(resting) - lay_down() - - if (friend_dist <= 1) - if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit) - if (prob((friend.stat < DEAD)? 50 : 15)) - var/verb = pick("whines", "yelps", "whimpers") - audible_emote(pick("[verb] in distress.", "[verb] anxiously.")) - else - if (prob(5)) - visible_emote(pick("nuzzles [friend].", - "brushes against [friend].", - "rubs against [friend].", - "noses at [friend].", - "slobberlicks [friend].", - "murrs contently.", - "leans on [friend].", - "nibbles affectionately on [friend].")) - else if (friend.health <= 50) - if (prob(10)) - var/verb = pick("whines", "yelps", "whimpers") - audible_emote("[verb] anxiously.") - //Pet 4 friendly /mob/living/simple_mob/otie/attack_hand(mob/living/carbon/human/M as mob) @@ -340,24 +216,26 @@ if(I_HELP) if(health > 0) M.visible_message("[M] [response_help] \the [src].") - if(ai_inactive) - return - LoseTarget() - handle_stance(STANCE_IDLE) - if(prob(tame_chance)) - friend = M - if(tamed != 1) - tamed = 1 - faction = M.faction - sleep(1 SECOND) + if(has_AI()) + var/datum/ai_holder/AI = ai_holder + AI.set_stance(STANCE_IDLE) + if(prob(tame_chance)) + AI.hostile = FALSE + friend = M + AI.set_follow(friend) + if(tamed != 1) + tamed = 1 + faction = M.faction + sleep(1 SECOND) if(I_GRAB) if(health > 0) - if(ai_inactive) - return - audible_emote("growls disapprovingly at [M].") - if(M == friend) - friend = null + if(has_AI()) + var/datum/ai_holder/AI = ai_holder + audible_emote("growls disapprovingly at [M].") + if(M == friend) + AI.lose_follow() + friend = null return else ..() @@ -365,36 +243,30 @@ else ..() -/mob/living/simple_mob/otie/proc/add_eyes() - if(!eye_layer) - eye_layer = image(icon, "[eyetype]-eyes") - eye_layer.plane = PLANE_LIGHTING_ABOVE - add_overlay(eye_layer) - -/mob/living/simple_mob/otie/proc/remove_eyes() - cut_overlay(eye_layer) - -/mob/living/simple_mob/otie/New() - if(glowyeyes) - add_eyes() - ..() - -/mob/living/simple_mob/otie/update_icon() - . = ..() - remove_eyes() - if(glowyeyes && stat == CONSCIOUS && !resting) - add_eyes() - /mob/living/simple_mob/otie/death(gibbed, deathmessage = "dies!") .=..() resting = 0 icon_state = icon_dead -/mob/living/simple_animal/otie/Login() +/mob/living/simple_mob/otie/Login() . = ..() if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount + riding_datum = new /datum/riding/simple_mob(src) + verbs |= /mob/living/simple_mob/proc/animal_mount -/mob/living/simple_animal/otie/MouseDrop_T(mob/living/M, mob/living/user) +/mob/living/simple_mob/otie/MouseDrop_T(mob/living/M, mob/living/user) return + +/datum/say_list/otie + speak = list("Boof.","Waaf!","Prurr.","Bork!","Rurrr..","Arf.") + emote_hear = list("rurrs", "rumbles", "rowls", "groans softly", "murrs", "yawns") + emote_see = list("stares ferociously", "snarls", "licks their chops", "stretches", "yawns") + say_maybe_target = list("Ruh?", "Waf?") + say_got_target = list("Rurrr!", "ROAR!", "MARR!", "RERR!", "RAHH!", "RAH!", "WARF!") + +/datum/ai_holder/simple_mob/melee/evasive/otie + +/datum/ai_holder/simple_mob/melee/evasive/otie/New(var/mob/living/simple_mob/otie/new_holder) + .=..() + if(new_holder.tamed) + hostile = FALSE diff --git a/icons/mob/vore64x32.dmi b/icons/mob/vore64x32.dmi index 1a0a93486d..7a96aa40ca 100644 Binary files a/icons/mob/vore64x32.dmi and b/icons/mob/vore64x32.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 72bbd1f10a..2d31596679 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2447,6 +2447,7 @@ #include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\rat.dm" #include "code\modules\mob\living\simple_mob\subtypes\vore\redpanda.dm"