diff --git a/code/datums/supplypacks/science_vr.dm b/code/datums/supplypacks/science_vr.dm
index ee73bf1089..c3ec833438 100644
--- a/code/datums/supplypacks/science_vr.dm
+++ b/code/datums/supplypacks/science_vr.dm
@@ -60,11 +60,9 @@
access = access_xenobiology
contraband = 1
-/* Removed until Otie code is unfucked.
/datum/supply_packs/sci/otie
- name = "V.A.R.M.A.corp adoptable reject (Dangerous!)"
+ name = "VARMAcorp adoptable reject (Dangerous!)"
cost = 100
containertype = /obj/structure/largecrate/animal/otie
- containername = "V.A.R.M.A.corp adoptable reject (Dangerous!)"
+ containername = "VARMAcorp adoptable reject (Dangerous!)"
access = access_xenobiology
-*/
diff --git a/code/datums/supplypacks/security_vr.dm b/code/datums/supplypacks/security_vr.dm
index a432b112fa..3c656741ee 100644
--- a/code/datums/supplypacks/security_vr.dm
+++ b/code/datums/supplypacks/security_vr.dm
@@ -1,13 +1,11 @@
-/* Removed until Otie code is unfucked.
/datum/supply_packs/security/guardbeast
- name = "V.A.R.M.A.corp autoNOMous security solution"
+ name = "VARMAcorp autoNOMous security solution"
cost = 150
containertype = /obj/structure/largecrate/animal/guardbeast
- containername = "V.A.R.M.A.corp autoNOMous security solution crate"
+ containername = "VARMAcorp autoNOMous security solution crate"
access = list(
access_security,
access_xenobiology)
-*/
/datum/supply_packs/security/biosuit
contains = list(
diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm
index 964022061a..b64fdab337 100644
--- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm
@@ -69,19 +69,19 @@
/mob/living/simple_animal/hostile/alien,
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/simple_animal/hostile/alien/sentinel,
- /mob/living/simple_animal/hostile/alien/queen)
+ /mob/living/simple_animal/hostile/alien/queen,
+ /mob/living/simple_animal/otie/feral)
..()
-/* // Removed until Otie code is unfucked.
/obj/structure/largecrate/animal/guardbeast
- name = "V.A.R.M.A.corp autoNOMous security solution"
- desc = "The V.A.R.M.A.corp bioengineering division flagship product on trained optimal snowflake guard dogs."
+ name = "VARMAcorp autoNOMous security solution"
+ 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
/obj/structure/largecrate/animal/otie
- name = "V.A.R.M.A.corp adoptable reject (Dangerous!)"
+ 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"
@@ -93,5 +93,4 @@
playsound(src, 'sound/items/poster_ripped.ogg', 50, 1)
icon_state = "otiecrate"
taped = 0
- ..()
-*/
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/vore/otie.dm b/code/modules/mob/living/simple_animal/vore/otie.dm
index d9083acd57..3186901128 100644
--- a/code/modules/mob/living/simple_animal/vore/otie.dm
+++ b/code/modules/mob/living/simple_animal/vore/otie.dm
@@ -1,4 +1,7 @@
// 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_animal/otie //Spawn this one only if you're looking for a bad time. Not friendly.
name = "otie"
@@ -15,7 +18,6 @@
minbodytemp = 200
move_to_delay = 4
hostile = 1
- //cooperative = 1 // Neutral mobs should not be set like this.
investigates = 1
reacts = 1
retaliate = 1
@@ -23,13 +25,12 @@
run_at_them = 0
attack_same = 0
speak_chance = 4
- speak = list("Boof.","Waaf!","Prurrrr.","Growl!","Bork!","Rurrr..","Aruur!","Awoo!")
+ 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!", "RAHH!", "Slurp.. RAH!")
- say_got_target = list("Rurrr!", "ROAR!", "RERR!", "NOM!", "MINE!", "RAHH!", "RAH!", "WARF!")
+ say_got_target = list("Rurrr!", "ROAR!", "MARR!", "RERR!", "RAHH!", "RAH!", "WARF!")
melee_damage_lower = 5
melee_damage_upper = 15 //Don't break my bones bro
response_help = "pets the"
@@ -56,7 +57,7 @@
vore_icons = SA_ICON_LIVING
/mob/living/simple_animal/otie/feral //gets the pet2tame feature. starts out hostile tho so get gamblin'
- name = "feral otie"
+ 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."
icon_state = "siftusian"
icon_living = "siftusian"
@@ -80,6 +81,7 @@
name = "otie"
desc = "The classic bioengineered longdog. This one might even tolerate you!"
faction = "neutral"
+ tamed = 1
/mob/living/simple_animal/otie/friendly/cotie //same as above but has a little collar :v
name = "tamed otie"
@@ -91,16 +93,16 @@
/mob/living/simple_animal/otie/friendly/security //tame by default unless you're a marked crimester. can be befriended to follow with pets tho.
name = "guard otie"
- desc = "The V.A.R.M.A.corp bioengineering division flagship product on trained optimal snowflake guard dogs."
+ desc = "The VARMAcorp bioengineering division flagship product on trained optimal snowflake guard dogs."
icon_state = "sotie"
icon_living = "sotie"
icon_rest = "sotie_rest"
icon_dead = "sotie-dead"
faction = "neutral"
- tamed = 1
maxHealth = 200 //armored or something
health = 200
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 = 1 // If true, arrests people without a record.
var/check_arrest = 1 // If true, arrests people who are set to arrest.
@@ -115,8 +117,6 @@
return null
if(istype(found_atom,/mob/living/simple_animal/mouse))
return found_atom
- if(found_atom in friends)
- return null
else if(ismob(found_atom))
var/mob/found_mob = found_atom
if(found_mob.faction == faction)
@@ -128,33 +128,37 @@
else if(tamed == 1 && isrobot(found_atom))
return null
else
+ if(resting)
+ lay_down()
return found_atom
else
return null
/mob/living/simple_animal/otie/friendly/security/Found(var/atom/found_atom)
- if(!SA_attackable(found_atom))
- return null
- if(istype(found_atom,/mob/living/simple_animal/mouse))
- return found_atom
if(check_threat(found_atom) >= 4)
+ if(resting)
+ lay_down()
return found_atom
- if(found_atom in friends)
- return null
- 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
- return found_atom
- else
- return null
+ ..()
+
+/mob/living/simple_animal/otie/friendly/security/attackby(var/obj/item/O, var/mob/user) // Trade donuts for bellybrig victims.
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/donut))
+ qdel(O)
+ user << "The guard pup accepts your offer for their catch."
+ for(var/I in vore_organs)
+ var/datum/belly/B = vore_organs[I]
+ B.release_all_contents()
+ 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.
+ var/datum/belly/B = user.vore_selected
+ var/datum/belly/belly_target = user.vore_organs[B]
+ if(check_threat(target_mob) >= 4)
+ belly_target.digest_mode = DM_HOLD
+ if(istype(prey,/mob/living/simple_animal/mouse))
+ belly_target.digest_mode = DM_DIGEST
+ ..()
/mob/living/simple_animal/otie/friendly/security/proc/check_threat(var/mob/living/M)
if(!M || !ishuman(M) || M.stat == DEAD || src == M)
@@ -198,8 +202,8 @@
//Basic friend AI
/mob/living/simple_animal/otie/friendly/Life()
- . = ..()
- if(!. || ai_inactive || !friend) return
+ ..()
+ if(!friend) return
var/friend_dist = get_dist(src,friend)
@@ -220,9 +224,9 @@
visible_emote(pick("nuzzles [friend].",
"brushes against [friend].",
"rubs against [friend].",
- "noses softly at [friend].",
+ "noses at [friend].",
"slobberlicks [friend].",
- "murrs.",
+ "murrs contently.",
"leans on [friend].",
"nibbles affectionately on [friend]."))
else if (friend.health <= 50)
@@ -234,65 +238,31 @@
. = ..()
if(!. || ai_inactive) return
- if(prob(5))
+ 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)
- ..()
- if(M.a_intent == I_GRAB)
- if (M == src)
- return
- if (!(status_flags & CANPUSH))
- return
- if(!incapacitated(INCAPACITATION_ALL) && (stance != STANCE_IDLE) && prob(grab_resist))
- M.visible_message("[M] tries to grab [src] but fails!")
- return
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
- M.put_in_active_hand(G)
- G.synch()
- G.affecting = src
- LAssailant = M
- M.visible_message("[M] has grabbed [src] passively!")
- M.do_attack_animation(src)
- ai_log("attack_hand() I was grabbed by: [M]",2)
- pixel_x = old_x
- react_to_attack(M)
- if(M.a_intent == I_HELP)
- if (health > 0)
- LoseTarget()
- handle_stance(STANCE_IDLE)
- if(prob(tame_chance))
- friend = M
- if(tamed != 1)
- tamed = 1
- faction = M.faction
- sleep(1 SECOND)
- return
+
+ switch(M.a_intent)
+ if(I_HELP)
+ if (health > 0)
+ M.visible_message("[M] [response_help] \the [src].")
+ LoseTarget()
+ handle_stance(STANCE_IDLE)
+ if(prob(tame_chance))
+ friend = M
+ if(tamed != 1)
+ tamed = 1
+ faction = M.faction
+ sleep(1 SECOND)
+
+ else
..()
-/mob/living/simple_animal/otie/death()
- resting = 0
- icon_state = icon_dead
- ..()
-
/mob/living/simple_animal/otie/death(gibbed, deathmessage = "dies!")
- density = 0 //We don't block even if we did before
- walk(src, 0) //We stop any background-processing walks
resting = 0
icon_state = icon_dead
-
- if(faction_friends.len)
- faction_friends -= src
-
- if(loot_list.len) //Drop any loot
- for(var/path in loot_list)
- if(prob(loot_list[path]))
- new path(get_turf(src))
-
- spawn(3) //We'll update our icon in a sec
- icon_state = icon_dead //Goddamn triple check. If this ain't working Imma be PISSED!
- update_icon()
-
- return ..(gibbed,deathmessage)
\ No newline at end of file
+ update_icon()
+ ..()
diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi
index 1a41cf5a44..c965415f23 100644
Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 185ffe70fc..c6267fbecf 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2007,6 +2007,7 @@
#include "code\modules\mob\living\simple_animal\vore\frog.dm"
#include "code\modules\mob\living\simple_animal\vore\gaslamp.dm"
#include "code\modules\mob\living\simple_animal\vore\horse.dm"
+#include "code\modules\mob\living\simple_animal\vore\otie.dm"
#include "code\modules\mob\living\simple_animal\vore\panther.dm"
#include "code\modules\mob\living\simple_animal\vore\snake.dm"
#include "code\modules\mob\living\simple_animal\vore\solargrub.dm"