diff --git a/code/datums/supplypacks/science_vr.dm b/code/datums/supplypacks/science_vr.dm index c3ec833438..327bc71798 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 3c656741ee..20629de0b4 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 b64fdab337..63430b54d3 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 36ed6bdbc9..8728fb1877 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 dfeff29d0e..59ab41cb0e 100644 Binary files a/icons/mob/vore64x32.dmi and b/icons/mob/vore64x32.dmi differ