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"