diff --git a/code/datums/supplypacks/science_vr.dm b/code/datums/supplypacks/science_vr.dm
index c3ec8334380..327bc717988 100644
--- a/code/datums/supplypacks/science_vr.dm
+++ b/code/datums/supplypacks/science_vr.dm
@@ -66,3 +66,10 @@
containertype = /obj/structure/largecrate/animal/otie
containername = "VARMAcorp adoptable reject (Dangerous!)"
access = access_xenobiology
+
+/datum/supply_packs/sci/phoronotie
+ name = "VARMAcorp adaptive beta subject (Experimental)"
+ cost = 200
+ containertype = /obj/structure/largecrate/animal/otie/phoron
+ containername = "VARMAcorp adaptive beta subject (Experimental)"
+ access = access_xenobiology
\ No newline at end of file
diff --git a/code/datums/supplypacks/security_vr.dm b/code/datums/supplypacks/security_vr.dm
index 3c656741eec..20629de0b4e 100644
--- a/code/datums/supplypacks/security_vr.dm
+++ b/code/datums/supplypacks/security_vr.dm
@@ -7,6 +7,15 @@
access_security,
access_xenobiology)
+/datum/supply_packs/security/guardmutant
+ name = "VARMAcorp autoNOMous security solution for hostile environments"
+ cost = 250
+ containertype = /obj/structure/largecrate/animal/guardmutant
+ containername = "VARMAcorp autoNOMous security phoron-proof solution crate"
+ access = list(
+ access_security,
+ access_xenobiology)
+
/datum/supply_packs/security/biosuit
contains = list(
/obj/item/clothing/head/bio_hood/security = 3,
diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm
index b64fdab3373..63430b54d3e 100644
--- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm
@@ -53,7 +53,8 @@
/mob/living/simple_animal/hostile/bear;0.5,
/mob/living/simple_animal/hostile/bear/brown;0.5,
/mob/living/simple_animal/hostile/carp,
- /mob/living/simple_animal/hostile/mimic)
+ /mob/living/simple_animal/hostile/mimic,
+ /mob/living/simple_animal/otie;0.5)
..()
@@ -78,16 +79,28 @@
desc = "The VARMAcorp bioengineering division flagship product on trained optimal snowflake guard dogs."
icon = 'icons/obj/storage_vr.dmi'
icon_state = "sotiecrate"
- held_type = /mob/living/simple_animal/otie/friendly/security
+ held_type = /mob/living/simple_animal/otie/security
+
+/obj/structure/largecrate/animal/guardmutant
+ name = "VARMAcorp autoNOMous security solution for hostile environments."
+ desc = "The VARMAcorp bioengineering division flagship product on trained optimal snowflake guard dogs. This one can survive hostile atmosphere."
+ icon = 'icons/obj/storage_vr.dmi'
+ icon_state = "sotiecrate"
+ held_type = /mob/living/simple_animal/otie/security/phoron
/obj/structure/largecrate/animal/otie
name = "VARMAcorp adoptable reject (Dangerous!)"
desc = "A warning on the side says the creature inside was returned to the supplier after injuring or devouring several unlucky members of the previous adoption family. It was given a second chance with the next customer. Godspeed and good luck with your new pet!"
icon = 'icons/obj/storage_vr.dmi'
icon_state = "otiecrate2"
- held_type = /mob/living/simple_animal/otie/friendly/cotie
+ held_type = /mob/living/simple_animal/otie/cotie
var/taped = 1
+/obj/structure/largecrate/animal/otie/phoron
+ name = "VARMAcorp adaptive beta subject (Experimental)"
+ desc = "VARMAcorp experimental hostile environment adaptive breeding development kit. WARNING, DO NOT RELEASE IN WILD!"
+ held_type = /mob/living/simple_animal/otie/cotie/phoron
+
/obj/structure/largecrate/animal/otie/attack_hand(mob/living/carbon/human/M as mob)//I just couldn't decide between the icons lmao
if(taped == 1)
playsound(src, 'sound/items/poster_ripped.ogg', 50, 1)
diff --git a/code/modules/mob/living/simple_animal/vore/otie.dm b/code/modules/mob/living/simple_animal/vore/otie.dm
index 36ed6bdbc90..8728fb18770 100644
--- a/code/modules/mob/living/simple_animal/vore/otie.dm
+++ b/code/modules/mob/living/simple_animal/vore/otie.dm
@@ -83,15 +83,32 @@
faction = "neutral"
tamed = 1
-/mob/living/simple_animal/otie/friendly/cotie //same as above but has a little collar :v
+/mob/living/simple_animal/otie/cotie //same as above but has a little collar :v
name = "tamed otie"
desc = "The classic bioengineered longdog. This one has a nice little collar on its neck. However a proper domesticated otie is an oxymoron and the collar is likely just a decoration."
icon_state = "cotie"
icon_living = "cotie"
icon_rest = "cotie_rest"
faction = "neutral"
+ tamed = 1
-/mob/living/simple_animal/otie/friendly/security //tame by default unless you're a marked crimester. can be befriended to follow with pets tho.
+/mob/living/simple_animal/otie/cotie/phoron //friendly phoron pup with collar
+ name = "mutated otie"
+ desc = "Looks like someone did manage to domesticate one of those wild phoron mutants. What a badass."
+ icon_state = "pcotie"
+ icon_living = "pcotie"
+ icon_rest = "pcotie_rest"
+ icon_dead = "siftusian-dead"
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+
+/mob/living/simple_animal/otie/security //tame by default unless you're a marked crimester. can be befriended to follow with pets tho.
name = "guard otie"
desc = "The VARMAcorp bioengineering division flagship product on trained optimal snowflake guard dogs."
icon_state = "sotie"
@@ -101,23 +118,22 @@
faction = "neutral"
maxHealth = 200 //armored or something
health = 200
+ tamed = 1
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.
var/check_records = 0 // If true, arrests people without a record.
var/check_arrest = 1 // If true, arrests people who are set to arrest.
-/mob/living/simple_animal/otie/friendly/security/phoron
+/mob/living/simple_animal/otie/security/phoron
name = "mutated guard otie"
desc = "An extra rare phoron resistant version of the VARMAcorp trained snowflake guard dogs."
icon_state = "sifguard"
icon_living = "sifguard"
icon_rest = "sifguard_rest"
icon_dead = "sifguard-dead"
-
melee_damage_lower = 10
melee_damage_upper = 25
- // Lazy way of making sure this otie survives outside.
min_oxy = 0
max_oxy = 0
min_tox = 0
@@ -154,7 +170,7 @@
else
return null
-/mob/living/simple_animal/otie/friendly/security/Found(var/atom/found_atom)
+/mob/living/simple_animal/otie/security/Found(var/atom/found_atom)
if(check_threat(found_atom) >= 4)
if(resting)
lay_down()
@@ -165,7 +181,9 @@
if(istype(O, /obj/item/weapon/reagent_containers/food))
qdel(O)
playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
- if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/donut) && istype(src, /mob/living/simple_animal/otie/friendly/security))
+ if(ai_inactive)//No autobarf on player control.
+ return
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/donut) && istype(src, /mob/living/simple_animal/otie/security))
user << "The guard pup accepts your offer for their catch."
for(var/I in vore_organs)
var/datum/belly/B = vore_organs[I]
@@ -179,7 +197,7 @@
return
..()
-/mob/living/simple_animal/otie/friendly/security/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey) // Make the gut start out safe for bellybrigging.
+/mob/living/simple_animal/otie/security/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey) // Make the gut start out safe for bellybrigging.
var/datum/belly/B = user.vore_selected
var/datum/belly/belly_target = user.vore_organs[B]
if(ishuman(target_mob))
@@ -188,12 +206,12 @@
belly_target.digest_mode = DM_DIGEST
..()
-/mob/living/simple_animal/otie/friendly/security/proc/check_threat(var/mob/living/M)
+/mob/living/simple_animal/otie/security/proc/check_threat(var/mob/living/M)
if(!M || !ishuman(M) || M.stat == DEAD || src == M)
return 0
return M.assess_perp(0, 0, 0, check_records, check_arrest)
-/mob/living/simple_animal/otie/friendly/security/set_target(var/mob/M)
+/mob/living/simple_animal/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)
@@ -221,7 +239,7 @@
return 0
-/mob/living/simple_animal/otie/friendly/security/proc/target_name(mob/living/T)
+/mob/living/simple_animal/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")
@@ -229,8 +247,13 @@
//Basic friend AI
-/mob/living/simple_animal/otie/friendly/Life()
- ..()
+/mob/living/simple_animal/otie/Life()
+ . = ..()
+ if(!. || ai_inactive) return
+
+ if(prob(5) && (stance == STANCE_IDLE))
+ lay_down()
+
if(!friend) return
var/friend_dist = get_dist(src,friend)
@@ -262,13 +285,6 @@
var/verb = pick("whines", "yelps", "whimpers")
audible_emote("[verb] anxiously.")
-/mob/living/simple_animal/otie/Life()
- . = ..()
- if(!. || ai_inactive) return
-
- if(prob(5) && (stance == STANCE_IDLE))
- lay_down()
-
//Pet 4 friendly
/mob/living/simple_animal/otie/attack_hand(mob/living/carbon/human/M as mob)
@@ -277,6 +293,8 @@
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))
@@ -288,6 +306,8 @@
if(I_GRAB)
if(health > 0)
+ if(ai_inactive)
+ return
audible_emote("growls disapprovingly at [M].")
if(M == friend)
friend = null
diff --git a/icons/mob/vore64x32.dmi b/icons/mob/vore64x32.dmi
index dfeff29d0ed..59ab41cb0e6 100644
Binary files a/icons/mob/vore64x32.dmi and b/icons/mob/vore64x32.dmi differ