Вы поместили [target.name] в [src.name].")
+ to_chat(target, "[user.name] поместил[user.gender == FEMALE ? "" : "а"] вас в [src.name].")
+ update_icon()
+ return TRUE
+
+/obj/item/pet_carrier/proc/try_free_content(atom/new_location, mob/user)
+ if(!opened)
+ if(user)
+ to_chat(user, "Ваша переноска закрыта! Содержимое невозможно выгрузить!")
+ return FALSE
+ free_content(new_location)
+
+/obj/item/pet_carrier/proc/free_content(atom/new_location)
+ if(istype(loc,/turf) || length(contents))
+ for(var/mob/M in contents)
+ var/atom/movable/mob_container
+ mob_container = M
+ mob_container.forceMove(new_location ? new_location : get_turf(src))
+ contains_pet = FALSE
+ name = initial(name)
+ desc = initial(desc)
+ update_icon()
+ return TRUE
+ return FALSE
+
+/obj/item/pet_carrier/proc/change_state()
+ opened = !opened
+ update_icon()
+
+/obj/item/pet_carrier/update_icon()
+ overlays.Cut()
+ if(contains_pet)
+ var/mob/living/M
+ for(var/mob/living/temp_M in contents)
+ M = temp_M
+ break
+ var/image/I = image(M.icon, icon_state = M.icon_state)
+ I.color = opened ? contains_pet_color_open : contains_pet_color_close
+ I.pixel_y = M.mob_size <= MOB_SIZE_TINY ? 6 : 3
+ overlays += I
+
+ if(!opened)
+ var/image/I = image(icon, icon_state = "[icon_state]_door")
+ overlays += I
+
+ if(color_skin)
+ var/image/I = image(icon, icon_state = "[icon_state]_[color_skin]")
+ overlays += I
+
+ return ..()
+
+/obj/item/pet_carrier/emp_act(intensity)
+ for(var/mob/living/M in contents)
+ M.emp_act(intensity)
+
+/obj/item/pet_carrier/ex_act(intensity)
+ for(var/mob/living/M in contents)
+ M.ex_act(intensity)
+
+/obj/item/pet_carrier/container_resist(mob/living/L)
+ var/breakout_time = 60 SECONDS //1 minute
+ var/breakout_time_open = 5 SECONDS //for escape
+
+ if(do_after(L,(breakout_time_open/2), target = src))
+ to_chat(L, "ТЕСТ 1 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)")
+
+ if(do_after(L,(breakout_time_open/2)))
+ to_chat(L, "ТЕСТ 2 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)")
+
+ if(do_after(L,(breakout_time_open/2), target = loc))
+ to_chat(L, "ТЕСТ 3 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)")
+
+ if(do_after(L,(breakout_time_open/2), target = src.loc))
+ to_chat(L, "ТЕСТ 4 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)")
+
+ if(do_after(L,(breakout_time_open/2), target = L))
+ to_chat(L, "ТЕСТ 5 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)")
+
+ if(do_after(L,(breakout_time_open/2), target = L.loc))
+ to_chat(L, "ТЕСТ 6 - Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)")
+
+
+
+ if(opened && L.loc == src)
+ to_chat(L, "Вы начали вылезать из переноски (это займет [breakout_time_open] секунд, не двигайтесь)")
+ spawn(0)
+ if(do_after(L,(breakout_time_open), target = src))
+ if(!src || !L || L.stat != CONSCIOUS || L.loc != src || !opened)
+ to_chat(L, "Побег прерван!")
+ return
+
+ free_content()
+ visible_message("[L.name] вылез из переноски.")
+ return
+
+ to_chat(L, "Вы начали ломиться в закрытую дверцу переноски и пытаетесь её выбить или открыть. (это займет [breakout_time] секунд, не двигайтесь)")
+ for(var/mob/O in viewers(usr.loc))
+ O.show_message("[src.name] начинает трястись!", 1)
+
+ spawn(0)
+ if(do_after(L,(breakout_time), target = src))
+ if(!src || !L || L.stat != CONSCIOUS || L.loc != src || opened) //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened
+ to_chat(L, "Побег прерван!")
+ return
+
+ var/mob/M = src.loc
+ if(istype(M))
+ to_chat(M, "[src.name] вырывается из вашей переноски!")
+ to_chat(L, "Вы вырываетесь из переноски [M.name]!")
+ else
+ to_chat(L, "Вы выбираетесь из переноски.")
+
+ //Free & open
+ free_content()
+ change_state()
+ return
+
+/obj/item/pet_carrier/verb/open_close()
+ set name = "Открыть/закрыть переноску"
+ set desc = "Меняет состояние дверцы переноски, блокируя или разблокируя возможность достать содержимое."
+ set category = "Object"
+
+ if(usr.stat || !ishuman(usr) || usr.restrained())
+ return
+
+ change_state()
+
+/obj/item/pet_carrier/verb/unload_content()
+ set name = "Опустошить переноску"
+ set desc = "Вытаскивает животное из переноски."
+ set category = "Object"
+
+ if(usr.stat || !ishuman(usr) || usr.restrained())
+ return
+
+ try_free_content(user = usr)
+
+/obj/item/pet_carrier/MouseDrop(obj/over_object)
+ if(ishuman(usr))
+ var/mob/M = usr
+
+ if(istype(M.loc,/obj/mecha) || M.incapacitated(FALSE, TRUE, TRUE)) // Stops inventory actions in a mech as well as while being incapacitated
+ return
+
+ if(over_object == M && Adjacent(M)) // this must come before the screen objects only block
+ try_free_content(M, M)
+ return
+
+ if((istype(over_object, /obj/structure/table) || istype(over_object, /turf/simulated/floor)) \
+ && length(contents) && loc == usr && !usr.stat && !usr.restrained() && over_object.Adjacent(usr))
+ var/turf/T = get_turf(over_object)
+ if(istype(over_object, /turf/simulated/floor))
+ if(get_turf(usr) != T)
+ return // Can only empty containers onto the floor under you
+ if("Да" != alert(usr,"Вытащить питомца из [src.name] на [T.name]?","Подтверждение","Да","Нет"))
+ return
+ if(!(usr && over_object && contents.len && loc == usr && !usr.stat && !usr.restrained() && get_turf(usr) == T))
+ return // Something happened while the player was thinking
+
+ usr.face_atom(over_object)
+ usr.visible_message("[usr] вытащил питомца из [src.name] на [over_object.name].",
+ "Вы вытащили питомца из [src.name] на [over_object.name].")
+
+ try_free_content(T, usr)
+ return TRUE
+
+ if(!(istype(over_object, /obj/screen)))
+ return ..()
+ if(!(loc == usr) || (loc && loc.loc == usr))
+ return
+ playsound(loc, "rustle", 50, TRUE, -5)
+ if(!(M.restrained()) && !(M.stat))
+ switch(over_object.name)
+ if("r_hand")
+ if(!M.unEquip(src))
+ return
+ M.put_in_r_hand(src)
+ if("l_hand")
+ if(!M.unEquip(src))
+ return
+ M.put_in_l_hand(src)
+ add_fingerprint(usr)
+ return
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/crab.dm b/modular_ss220/mobs/code/simple_animal/friendly/crab.dm
new file mode 100644
index 000000000000..55d032eb578c
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/crab.dm
@@ -0,0 +1,38 @@
+/mob/living/simple_animal/crab
+ death_sound = 'modular_ss220/mobs/sound/creatures/crack_death2.ogg'
+ mob_size = MOB_SIZE_SMALL
+ response_help = "гладит"
+ response_disarm = "отталкивает"
+ response_harm = "щипает"
+ holder_type = /obj/item/holder/crab
+
+/mob/living/simple_animal/crab/sea
+ name = "морской краб"
+ desc = "Кто проживает на дне океана?"
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "bluecrab"
+ icon_living = "bluecrab"
+ icon_dead = "bluecrab_dead"
+ response_help = "гладит"
+ response_disarm = "отталкивает"
+ response_harm = "щипает"
+ health = 50
+ maxHealth = 50
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 3)
+
+/mob/living/simple_animal/crab/royal
+ name = "королевский краб"
+ desc = "Величественный королевский краб."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "royalcrab"
+ icon_living = "royalcrab"
+ icon_dead = "royalcrab_dead"
+ response_help = "с уважением гладит"
+ response_disarm = "с уважением отталкивает"
+ response_harm = "щипает без уважения"
+ health = 50
+ maxHealth = 50
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 5)
+
+/mob/living/simple_animal/crab/evil
+ holder_type = /obj/item/holder/evilcrab
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/farm_animals.dm b/modular_ss220/mobs/code/simple_animal/friendly/farm_animals.dm
new file mode 100644
index 000000000000..5386a7a522be
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/farm_animals.dm
@@ -0,0 +1,129 @@
+/mob/living/simple_animal/hostile/retaliate/goat
+ tts_seed = "Muradin"
+
+ attacktext = "бодает"
+ death_sound = 'modular_ss220/mobs/sound/creatures/goat_death.ogg'
+
+/mob/living/simple_animal/cow
+ tts_seed = "Cairne"
+
+ attacktext = "бодает"
+ death_sound = 'modular_ss220/mobs/sound/creatures/cow_death.ogg'
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/cow_damaged.ogg')
+ talk_sound = list('modular_ss220/mobs/sound/creatures/cow_talk1.ogg', 'modular_ss220/mobs/sound/creatures/cow_talk2.ogg')
+
+/mob/living/simple_animal/chicken
+ name = "курица"
+ desc = "Гордая несушка. Яички должны быть хороши!"
+ tts_seed = "Windranger"
+ death_sound = 'modular_ss220/mobs/sound/creatures/chicken_death.ogg'
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg', 'modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg')
+ talk_sound = list('modular_ss220/mobs/sound/creatures/chicken_talk.ogg')
+ holder_type = /obj/item/holder/chicken
+
+/mob/living/simple_animal/chick
+ name = "цыпленок"
+ desc = "Маленькая прелесть! Но пока что маловата..."
+ tts_seed = "Meepo"
+ attacktext = "клюёт"
+ death_sound = 'modular_ss220/mobs/sound/creatures/mouse_squeak.ogg'
+ holder_type = /obj/item/holder/chick
+
+/mob/living/simple_animal/chick/Life(seconds, times_fired)
+ if(amount_grown >= 100 && prob(20))
+ var/mob/living/simple_animal/C = new /mob/living/simple_animal/cock(loc)
+ if(mind)
+ mind.transfer_to(C)
+ qdel(src)
+ . = ..()
+
+/mob/living/simple_animal/cock
+ name = "петух"
+ desc = "Гордый и важный вид."
+ gender = MALE
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "cock"
+ icon_living = "cock"
+ icon_dead = "cock_dead"
+ speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.")
+ speak_emote = list("clucks","croons")
+ emote_hear = list("clucks")
+ emote_see = list("pecks at the ground","flaps its wings viciously")
+ tts_seed = "pantheon"
+ density = 0
+ speak_chance = 2
+ turns_per_move = 3
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 4)
+ response_help = "pets the"
+ response_disarm = "gently pushes aside the"
+ response_harm = "kicks the"
+ melee_damage_type = STAMINA
+ melee_damage_lower = 2
+ melee_damage_upper = 6
+ attacktext = "клюёт"
+ death_sound = 'modular_ss220/mobs/sound/creatures/chicken_death.ogg'
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg', 'modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg')
+ talk_sound = list('modular_ss220/mobs/sound/creatures/chicken_talk.ogg')
+ health = 30
+ maxHealth = 30
+ ventcrawler = 2
+ pass_flags = PASSTABLE | PASSMOB
+ mob_size = MOB_SIZE_SMALL
+ can_hide = 1
+ can_collar = 1
+ gold_core_spawnable = FRIENDLY_SPAWN
+ footstep_type = FOOTSTEP_MOB_CLAW
+ holder_type = /obj/item/holder/cock
+
+/mob/living/simple_animal/cock/npc_safe(mob/user)
+ return TRUE
+
+/mob/living/simple_animal/pig
+ name = "свинья"
+ tts_seed = "Anubarak"
+ attacktext = "лягает"
+ death_sound = 'modular_ss220/mobs/sound/creatures/pig_death.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/pig_talk1.ogg', 'modular_ss220/mobs/sound/creatures/pig_talk2.ogg')
+ damaged_sound = list()
+
+/mob/living/simple_animal/pig/npc_safe(mob/user)
+ return TRUE
+
+/mob/living/simple_animal/turkey
+ name = "индюшка"
+ desc = "И не благодари."
+ death_sound = 'modular_ss220/mobs/sound/creatures/duck_quak1.ogg'
+
+
+/mob/living/simple_animal/goose
+ name = "гусь"
+ desc = "Прекрасная птица для набива подушек и страха детишек."
+ icon_resting = "goose_rest"
+ melee_damage_type = STAMINA
+ melee_damage_lower = 2
+ melee_damage_upper = 8
+ attacktext = "щипает"
+ death_sound = 'modular_ss220/mobs/sound/creatures/duck_quak1.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/duck_talk1.ogg', 'modular_ss220/mobs/sound/creatures/duck_talk2.ogg', 'modular_ss220/mobs/sound/creatures/duck_talk3.ogg', 'modular_ss220/mobs/sound/creatures/duck_quak1.ogg', 'modular_ss220/mobs/sound/creatures/duck_quak2.ogg', 'modular_ss220/mobs/sound/creatures/duck_quak3.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/duck_aggro1.ogg', 'modular_ss220/mobs/sound/creatures/duck_aggro2.ogg')
+
+/mob/living/simple_animal/goose/npc_safe(mob/user)
+ return TRUE
+
+/mob/living/simple_animal/goose/gosling
+ name = "гусенок"
+ desc = "Симпатичный гусенок. Скоро он станей грозой всей станции."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "gosling"
+ icon_living = "gosling"
+ icon_dead = "gosling_dead"
+ icon_resting = "gosling_rest"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 3)
+ melee_damage_lower = 0
+ melee_damage_upper = 0
+ health = 20
+ maxHealth = 20
+
+/mob/living/simple_animal/seal
+ tts_seed = "Narrator"
+ death_sound = 'modular_ss220/mobs/sound/creatures/seal_death.ogg'
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/frog.dm b/modular_ss220/mobs/code/simple_animal/friendly/frog.dm
new file mode 100644
index 000000000000..5f0fc7aa4c52
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/frog.dm
@@ -0,0 +1,148 @@
+/mob/living/simple_animal/frog
+ name = "лягушка"
+ real_name = "лягушка"
+ desc = "Выглядит грустным не по средам и когда её не целуют."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "frog"
+ icon_living = "frog"
+ icon_dead = "frog_dead"
+ icon_resting = "frog"
+ speak = list("Квак!","КУААК!","Квуак!")
+ speak_emote = list("квак","куак","квуак")
+ emote_hear = list("квак","куак","квуак")
+ emote_see = list("лежит расслабленная", "издает гортанные звуки", "лупает глазками")
+ var/scream_sound = list ('modular_ss220/mobs/sound/creatures/frog_scream_1.ogg','modular_ss220/mobs/sound/creatures/frog_scream_2.ogg','modular_ss220/mobs/sound/creatures/frog_scream_3.ogg')
+ talk_sound = list('modular_ss220/mobs/sound/creatures/frog_talk1.ogg', 'modular_ss220/mobs/sound/creatures/frog_talk2.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/frog_damaged.ogg')
+ death_sound = 'modular_ss220/mobs/sound/creatures/frog_death.ogg'
+ tts_seed = "pantheon"
+ speak_chance = 1
+ turns_per_move = 5
+ see_in_dark = 10
+ maxHealth = 10
+ health = 10
+ blood_volume = BLOOD_VOLUME_SURVIVE
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat = 1)
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "stamps on"
+ density = 0
+ ventcrawler = 2
+ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ mob_size = MOB_SIZE_TINY
+ layer = MOB_LAYER
+ atmos_requirements = list("min_oxy" = 16, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 223 // Below -50 Degrees Celcius
+ maxbodytemp = 323 // Above 50 Degrees Celcius
+ universal_speak = 0
+ can_hide = 1
+ holder_type = /obj/item/holder/frog
+ can_collar = 1
+ gold_core_spawnable = FRIENDLY_SPAWN
+
+/mob/living/simple_animal/frog/toxic
+ name = "яркая лягушка"
+ real_name = "яркая лягушка"
+ desc = "Уникальная токсичная раскраска. Лучше не трогать голыми руками."
+ icon_state = "rare_frog"
+ icon_living = "rare_frog"
+ icon_dead = "rare_frog_dead"
+ icon_resting = "rare_frog"
+ var/toxin_per_touch = 2.5
+ var/toxin_type = "toxin"
+ gold_core_spawnable = HOSTILE_SPAWN
+ holder_type = /obj/item/holder/frog/toxic
+
+/mob/living/simple_animal/frog/scream
+ name = "орущая лягушка"
+ real_name = "орущая лягушка"
+ desc = "Не любит когда на неё наступают. Используется в качестве наказания за проступки"
+ var/squeak_sound = list ('modular_ss220/mobs/sound/creatures/frog_scream1.ogg','modular_ss220/mobs/sound/creatures/frog_scream2.ogg')
+ gold_core_spawnable = NO_SPAWN
+
+// Frog procs
+/mob/living/simple_animal/frog/attack_hand(mob/living/carbon/human/M as mob)
+ if(M.a_intent == INTENT_HELP)
+ get_scooped(M)
+ ..()
+
+/mob/living/simple_animal/frog/Crossed(AM as mob|obj, oldloc)
+ if(ishuman(AM))
+ if(!stat)
+ var/mob/M = AM
+ to_chat(M, "[bicon(src)] квакнул!")
+ ..()
+
+// Toxic frog procs
+/mob/living/simple_animal/frog/toxic/attack_hand(mob/living/carbon/human/H as mob)
+ if(ishuman(H))
+ if(!istype(H.gloves, /obj/item/clothing/gloves))
+ for(var/obj/item/organ/external/A in H.bodyparts)
+ if(!A.is_robotic())
+ if((A.body_part == HAND_LEFT) || (A.body_part == HAND_RIGHT))
+ to_chat(H, "Дотронувшись до [src.name], ваша кожа начинает чесаться!")
+ toxin_affect(H)
+ if(H.a_intent == INTENT_DISARM || H.a_intent == INTENT_HARM)
+ ..()
+ ..()
+
+/mob/living/simple_animal/frog/toxic/Crossed(AM as mob|obj, oldloc)
+ if(ishuman(AM))
+ var/mob/living/carbon/human/H = AM
+ if(!istype(H.shoes, /obj/item/clothing/shoes))
+ for(var/obj/item/organ/external/F in H.bodyparts)
+ if(!F.is_robotic())
+ if((F.body_part == FOOT_LEFT) || (F.body_part == FOOT_RIGHT))
+ toxin_affect(H)
+ to_chat(H, "Ваши ступни начинают чесаться!")
+ ..()
+
+/mob/living/simple_animal/frog/toxic/proc/toxin_affect(mob/living/carbon/human/M as mob)
+ if(M.reagents && !toxin_per_touch == 0)
+ M.reagents.add_reagent(toxin_type, toxin_per_touch)
+
+// Scream frog procs
+/mob/living/simple_animal/frog/scream/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/squeak, squeak_sound, 50, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a frog or whatever
+
+/mob/living/simple_animal/frog/toxic/scream
+ var/squeak_sound = list ('modular_ss220/mobs/sound/creatures/frog_scream1.ogg','modular_ss220/mobs/sound/creatures/frog_scream2.ogg')
+ gold_core_spawnable = NO_SPAWN
+
+/mob/living/simple_animal/frog/toxic/scream/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/squeak, squeak_sound, 50, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a frog or whatever
+
+// Additional procs
+/mob/living/simple_animal/frog/handle_automated_movement()
+ . = ..()
+ if(!resting && !buckled)
+ if(prob(1))
+ custom_emote(1,"издаёт боевой клич!")
+ playsound(src, pick(src.scream_sound), 50, TRUE)
+
+/mob/living/simple_animal/frog/emote(act, m_type = 1, message = null, intentional, force)
+ if(incapacitated())
+ return
+
+ var/on_CD = 0
+ act = lowertext(act)
+ switch(act)
+ if("warcry")
+ on_CD = start_audio_emote_cooldown()
+ else
+ on_CD = 0
+
+ if(!force && on_CD == 1)
+ return
+
+ switch(act)
+ if("warcry")
+ message = "издаёт боевой клич!"
+ m_type = 2 //audible
+ playsound(src, pick(src.scream_sound), 50, TRUE)
+ if("help")
+ to_chat(src, "warcry")
+ ..()
+
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/hamster.dm b/modular_ss220/mobs/code/simple_animal/friendly/hamster.dm
new file mode 100644
index 000000000000..e959237219ab
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/hamster.dm
@@ -0,0 +1,93 @@
+/mob/living/simple_animal/mouse/hamster
+ name = "хомяк"
+ real_name = "хомяк"
+ desc = "С надутыми щечками."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "hamster"
+ icon_living = "hamster"
+ icon_dead = "hamster_dead"
+ icon_resting = "hamster_rest"
+ gender = MALE
+ non_standard = TRUE
+ speak_chance = 0
+ childtype = list(/mob/living/simple_animal/mouse/hamster/baby)
+ animal_species = /mob/living/simple_animal/mouse/hamster
+ holder_type = /obj/item/holder/hamster
+ gold_core_spawnable = FRIENDLY_SPAWN
+ tts_seed = "Gyro"
+ maxHealth = 10
+ health = 10
+
+
+/mob/living/simple_animal/mouse/hamster/baby
+ name = "хомячок"
+ real_name = "хомячок"
+ desc = "Очень миленький! Какие у него пушистые щечки!"
+ tts_seed = "Meepo"
+ turns_per_move = 2
+ response_help = "полапал"
+ response_disarm = "аккуратно отодвинул"
+ response_harm = "пихнул"
+ attacktext = "толкается"
+ transform = matrix(0.7, 0, 0, 0, 0.7, 0)
+ health = 3
+ maxHealth = 3
+ var/amount_grown = 0
+ can_hide = 1
+ can_collar = 0
+ holder_type = /obj/item/holder/hamster
+
+// Hamster procs
+#define MAX_HAMSTER 20
+GLOBAL_VAR_INIT(hamster_count, 0)
+
+/mob/living/simple_animal/mouse/hamster/color_pick()
+ reinitial()
+ return
+
+/mob/living/simple_animal/mouse/hamster/New()
+ gender = prob(80) ? MALE : FEMALE
+ desc += MALE ? " Самец!" : " Самочка! Ох... Нет... "
+ GLOB.hamster_count++
+ . = ..()
+
+/mob/living/simple_animal/mouse/hamster/Destroy()
+ GLOB.hamster_count--
+ . = ..()
+
+/mob/living/simple_animal/mouse/hamster/death(gibbed)
+ if(!gibbed)
+ GLOB.hamster_count--
+ . = ..()
+
+/mob/living/simple_animal/mouse/hamster/pull_constraint(atom/movable/AM, show_message = FALSE)
+ return TRUE
+
+/mob/living/simple_animal/mouse/hamster/Life(seconds, times_fired)
+ ..()
+ if(GLOB.hamster_count < MAX_HAMSTER)
+ make_babies()
+
+/mob/living/simple_animal/mouse/hamster/baby/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)
+ if(show_message)
+ to_chat(src, "Вы слишком малы чтобы что-то тащить.")
+ return
+
+/mob/living/simple_animal/mouse/hamster/baby/Life(seconds, times_fired)
+ . =..()
+ if(.)
+ amount_grown++
+ if(amount_grown >= 100)
+ var/mob/living/simple_animal/A = new /mob/living/simple_animal/mouse/hamster(loc)
+ if(mind)
+ mind.transfer_to(A)
+ qdel(src)
+
+/mob/living/simple_animal/mouse/hamster/baby/Crossed(AM as mob|obj, oldloc)
+ if(ishuman(AM))
+ if(!stat)
+ var/mob/M = AM
+ to_chat(M, "[bicon(src)] раздавлен!")
+ death()
+ splat(user = AM)
+ ..()
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/lizard.dm b/modular_ss220/mobs/code/simple_animal/friendly/lizard.dm
new file mode 100644
index 000000000000..4d80124152d1
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/lizard.dm
@@ -0,0 +1,14 @@
+/mob/living/simple_animal/lizard
+ tts_seed = "Ladyvashj"
+ death_sound = 'modular_ss220/mobs/sound/creatures/lizard_death.ogg'
+
+/mob/living/simple_animal/lizard/axolotl
+ name = "Аксолотль"
+ desc = "Маленький милый аксолотль."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "axolotl"
+ icon_living = "axolotl"
+ icon_dead = "axolotl_dead"
+ holder_type = /obj/item/holder/axolotl
+
+
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/moth.dm b/modular_ss220/mobs/code/simple_animal/friendly/moth.dm
new file mode 100644
index 000000000000..eee8153c18c6
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/moth.dm
@@ -0,0 +1,54 @@
+/mob/living/simple_animal/moth
+ name = "моль"
+ desc = "Смотря на эту моль становится понятно куда пропали шубы перевозимые СССП."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "moth"
+ icon_living = "moth"
+ icon_dead = "moth_dead"
+ turns_per_move = 1
+ emote_see = list("flutters")
+ response_help = "shoos"
+ response_disarm = "brushes aside"
+ response_harm = "squashes"
+ speak_chance = 0
+ maxHealth = 15
+ health = 15
+ see_in_dark = 100
+ friendly = "nudges"
+ density = 0
+ flying = TRUE
+ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ ventcrawler = 2
+ mob_size = MOB_SIZE_TINY
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat = 1)
+ gold_core_spawnable = FRIENDLY_SPAWN
+ holder_type = /obj/item/holder/moth
+ tts_seed = "Tychus"
+
+/mob/living/simple_animal/mothroach
+ name = "mothroach"
+ desc = "Мотылёк. Обожает светочи."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "mothroach"
+ icon_living = "mothroach"
+ icon_dead = "mothroach_dead"
+ icon_resting = "mothroach_sleep"
+ response_help = "pets"
+ response_disarm = "bops"
+ response_harm = "kicks"
+ faction = list("neutral")
+ maxHealth = 15
+ health = 15
+ see_in_dark = 30
+ turns_per_move = 10
+ emote_see = list("flutters")
+ response_help = "shoos"
+ response_disarm = "brushes aside"
+ response_harm = "squashes"
+ friendly = "nudges"
+ density = 0
+ gold_core_spawnable = FRIENDLY_SPAWN
+ footstep_type = FOOTSTEP_MOB_BAREFOOT
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/xenomeat = 1)
+ holder_type = /obj/item/holder/mothroach
+ tts_seed = "Tychus"
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/mouse.dm b/modular_ss220/mobs/code/simple_animal/friendly/mouse.dm
new file mode 100644
index 000000000000..e5d81a187e73
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/mouse.dm
@@ -0,0 +1,96 @@
+/mob/living/simple_animal/mouse
+ var/non_standard = FALSE // for no "mouse_" with mouse_color
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ death_sound = 'modular_ss220/mobs/sound/creatures/rat_death.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/rat_talk.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/rat_wound.ogg')
+ blood_volume = BLOOD_VOLUME_SURVIVE
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/mouse)
+ tts_seed = "Gyro"
+
+/mob/living/simple_animal/mouse/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/squeak, list("[squeak_sound]" = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever
+
+/mob/living/simple_animal/mouse/New()
+ ..()
+ pixel_x = rand(-6, 6)
+ pixel_y = rand(0, 10)
+
+ mouse_color = initial(mouse_color) // сбрасываем из-за наследования чтобы своим проком переписать
+ color_pick()
+
+/mob/living/simple_animal/mouse/proc/color_pick()
+ if(!mouse_color)
+ mouse_color = pick( list("brown","gray","white") )
+ icon_state = "mouse_[mouse_color]"
+ icon_living = "mouse_[mouse_color]"
+ icon_dead = "mouse_[mouse_color]_dead"
+ icon_resting = "mouse_[mouse_color]_sleep"
+ update_appearance(UPDATE_DESC)
+
+/mob/living/simple_animal/mouse/proc/reinitial()
+ mouse_color = initial(mouse_color)
+ icon_state = initial(icon_state)
+ icon_living = initial(icon_living)
+ icon_dead = initial(icon_dead)
+ icon_resting = initial(icon_resting)
+
+/mob/living/simple_animal/mouse/splat(obj/item/item = null, mob/living/user = null)
+ if(non_standard)
+ var/temp_state = initial(icon_state)
+ icon_dead = "[temp_state]_splat"
+ icon_state = "[temp_state]_splat"
+ else
+ ..()
+
+ if(prob(50))
+ var/turf/location = get_turf(src)
+ add_splatter_floor(location)
+ if(item)
+ item.add_mob_blood(src)
+ if(user)
+ user.add_mob_blood(src)
+
+/mob/living/simple_animal/mouse/death(gibbed)
+ if(gibbed)
+ make_remains()
+ . = ..(gibbed)
+
+/mob/living/simple_animal/mouse/proc/make_remains()
+ var/obj/effect/decal/remains = new /obj/effect/decal/remains/mouse(src.loc)
+ remains.pixel_x = pixel_x
+ remains.pixel_y = pixel_y
+
+
+// /mob/living/simple_animal/mouse/emote(act, m_type = 1, message = null, force)
+
+// if("help")
+// to_chat(src, "scream, squeak")
+// playsound(src, damaged_sound, 40, 1)
+
+/mob/living/simple_animal/mouse/white
+ tts_seed = "Meepo"
+
+/mob/living/simple_animal/mouse/brown
+ tts_seed = "Clockwerk"
+
+/mob/living/simple_animal/mouse/brown/Tom
+ tts_seed = "Arthas"
+ maxHealth = 10
+ health = 10
+
+/mob/living/simple_animal/mouse/fluff/clockwork
+ name = "Chip"
+ real_name = "Chip"
+ mouse_color = "clockwork"
+ icon_state = "mouse_clockwork"
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "stamps on"
+ gold_core_spawnable = NO_SPAWN
+ can_collar = 0
+ butcher_results = list(/obj/item/stack/sheet/metal = 1)
+ maxHealth = 20
+ health = 20
+ tts_seed = "Clockwerk"
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/possum.dm b/modular_ss220/mobs/code/simple_animal/friendly/possum.dm
new file mode 100644
index 000000000000..763cdf16fad9
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/possum.dm
@@ -0,0 +1,51 @@
+/mob/living/simple_animal/possum
+ name = "possum"
+ desc = "The opossum is a small, scavenging marsupial of the order Didelphimorphia, previously \
+ endemic to the Americas of Earth, but now inexplicably found across settled space. Nobody is \
+ entirely sure how they travel to such disparate locations, with the leading theories including \
+ smuggling, cargo stowaways, fungal spore reproduction, teleportation, or unknown quantum effects."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "possum"
+ icon_living = "possum"
+ icon_dead = "possum_dead"
+ icon_resting = "possum_sleep"
+ var/icon_harm = "possum_aaa"
+ response_help = "pets"
+ response_disarm = "bops"
+ response_harm = "kicks"
+ speak = list("Hsss...", "Hisss...")
+ speak_emote = list("Hsss", "Hisss")
+ emote_hear = list("Aaaaa!", "Ahhss!")
+ emote_see = list("shakes its head.", "chases its tail.", "shivers.")
+ tts_seed = "Clockwerk"
+ faction = list("neutral")
+ maxHealth = 30
+ health = 30
+ mob_size = MOB_SIZE_SMALL
+ pass_flags = PASSTABLE
+ ventcrawler = VENTCRAWLER_ALWAYS
+ blood_volume = BLOOD_VOLUME_NORMAL
+ melee_damage_type = STAMINA
+ melee_damage_lower = 3
+ melee_damage_upper = 8
+ attacktext = "кусает"
+ attack_sound = 'sound/weapons/bite.ogg'
+ see_in_dark = 5
+ speak_chance = 1
+ turns_per_move = 10
+ gold_core_spawnable = FRIENDLY_SPAWN
+ footstep_type = FOOTSTEP_MOB_CLAW
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 2)
+ holder_type = /obj/item/holder/possum
+
+/mob/living/simple_animal/possum/attackby(obj/item/O, mob/living/user)
+ icon_state = icon_harm
+ . = ..()
+
+/mob/living/simple_animal/possum/attack_hand(mob/living/carbon/human/M)
+ switch(M.a_intent)
+ if(INTENT_HELP)
+ icon_state = initial(icon_state)
+ if(INTENT_HARM, INTENT_DISARM, INTENT_GRAB)
+ icon_state = icon_harm
+ . = ..()
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/rat.dm b/modular_ss220/mobs/code/simple_animal/friendly/rat.dm
new file mode 100644
index 000000000000..40b37f87c136
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/rat.dm
@@ -0,0 +1,49 @@
+/mob/living/simple_animal/mouse/rat
+ name = "rat"
+ real_name = "rat"
+ desc = "Серая крыса. Не яркий представитель своего вида."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ squeak_sound = 'modular_ss220/mobs/sound/creatures/rat_squeak.ogg'
+ icon_state = "rat_gray"
+ icon_living = "rat_gray"
+ icon_dead = "rat_gray_dead"
+ icon_resting = "rat_gray_sleep"
+ non_standard = TRUE
+ mouse_color = null
+ maxHealth = 15
+ health = 15
+ mob_size = MOB_SIZE_SMALL
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/mouse = 2)
+
+/mob/living/simple_animal/mouse/rat/white
+ name = "white rat"
+ real_name = "white rat"
+ desc = "Типичный представитель лабораторных крыс."
+ icon_state = "rat_white"
+ icon_living = "rat_white"
+ icon_dead = "rat_white_dead"
+ icon_resting = "rat_white_sleep"
+ mouse_color = "white"
+
+/mob/living/simple_animal/mouse/rat/irish
+ name = "irish rat"
+ real_name = "irish rat"
+ desc = "Ирландская крыса, борец за независимость. На космической станции?! На этот раз им точно некуда бежать!"
+ icon_state = "rat_irish"
+ icon_living = "rat_irish"
+ icon_dead = "rat_irish_dead"
+ icon_resting = "rat_irish_sleep"
+ mouse_color = "irish"
+
+/mob/living/simple_animal/mouse/rat/color_pick()
+ if(!mouse_color)
+ mouse_color = pick(list("gray","white","irish"))
+ icon_state = "rat_[mouse_color]"
+ icon_living = "rat_[mouse_color]"
+ icon_dead = "rat_[mouse_color]_dead"
+ icon_resting = "rat_[mouse_color]_sleep"
+
+/mob/living/simple_animal/mouse/rat/pull_constraint(atom/movable/AM, show_message = FALSE)
+ return TRUE
+
+
diff --git a/modular_ss220/mobs/code/simple_animal/friendly/snail.dm b/modular_ss220/mobs/code/simple_animal/friendly/snail.dm
new file mode 100644
index 000000000000..70188814923a
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/friendly/snail.dm
@@ -0,0 +1,87 @@
+/mob/living/simple_animal/snail
+ name = "space snail"
+ desc = "Маленькая космо-улиточка со своим космо-домиком. Прочная, тихая и медленная."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "snail"
+ icon_living = "snail"
+ icon_dead = "snail_dead"
+ speak = list("Uhh.", "Hurrr.")
+ tts_seed = "Ladyvashj"
+ health = 100
+ maxHealth = 100
+ speed = 10
+ attacktext = "толкает"
+ death_sound = 'modular_ss220/mobs/sound/creatures/crack_death1.ogg'
+ response_help = "pets"
+ response_disarm = "shoos"
+ response_harm = "stomps on"
+ ventcrawler = 2
+ density = 0
+ pass_flags = PASSTABLE | PASSMOB
+ mob_size = MOB_SIZE_SMALL
+ gender = NEUTER
+ can_hide = 1
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/salmonmeat/snailmeat = 1, /obj/item/stack/ore/tranquillite = 1)
+ can_collar = 1
+ gold_core_spawnable = FRIENDLY_SPAWN
+ stop_automated_movement_when_pulled = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ faction = list("slime", "neutral")
+ reagents = new()
+ holder_type = /obj/item/holder/snail
+
+/mob/living/simple_animal/snail/Process_Spacemove(movement_dir = 0)
+ return 1
+
+/mob/living/simple_animal/snail/Move(atom/newloc, direct, movetime)
+ var/oldLoc = src.loc
+ . = ..()
+ if(.)
+ if(stat != DEAD)
+ make_wet_floor(oldLoc)
+
+/mob/living/simple_animal/snail/proc/make_wet_floor(atom/oldLoc)
+ if(oldLoc != src.loc)
+ reagents.add_reagent("water",10)
+ reagents.reaction(oldLoc, REAGENT_TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
+ reagents.remove_any(10)
+
+/mob/living/simple_animal/snail/lube
+ name = "space snail"
+ desc = "Маленькая космо-улиточка со своим космо-домиком. Прочная, тихая и медленная. И очень склизкая."
+ gold_core_spawnable = HOSTILE_SPAWN
+ faction = list("slime", "hostile")
+
+/mob/living/simple_animal/snail/lube/make_wet_floor(atom/oldLoc)
+ if(oldLoc != src.loc)
+ reagents.add_reagent("lube",10)
+ reagents.reaction(oldLoc, REAGENT_TOUCH, 10)
+ reagents.remove_any(10)
+
+/mob/living/simple_animal/turtle
+ name = "черепаха"
+ desc = "Большая космочерепаха. Прочная, тихая и медленная."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "yeeslow"
+ icon_living = "yeeslow"
+ icon_dead = "yeeslow_dead"
+ icon_resting = "yeeslow_scared"
+ speak = list("Uhh.", "Hurrr.")
+ tts_seed = "Ladyvashj"
+ health = 500
+ maxHealth = 500
+ speed = 20
+ attacktext = "толкает"
+ death_sound = 'modular_ss220/mobs/sound/creatures/crack_death1.ogg'
+ response_help = "pets"
+ response_disarm = "shoos"
+ response_harm = "stomps on"
+ ventcrawler = 0
+ density = 1
+ pass_flags = PASSTABLE | PASSGRILLE
+ status_flags = CANPARALYSE | CANPUSH
+ mob_size = MOB_SIZE_SMALL
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/salmonmeat/turtlemeat = 10, /obj/item/stack/ore/tranquillite = 5)
+ footstep_type = FOOTSTEP_MOB_SLIME
+ holder_type = /obj/item/holder/turtle
diff --git a/modular_ss220/mobs/code/simple_animal/hostile/alien.dm b/modular_ss220/mobs/code/simple_animal/hostile/alien.dm
new file mode 100644
index 000000000000..be6b4f7b2791
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/hostile/alien.dm
@@ -0,0 +1,12 @@
+/mob/living/simple_animal/hostile/alien
+ attacktext = "кромсает"
+ tts_seed = "Ladyvashj"
+
+/mob/living/simple_animal/hostile/alien/queen
+ tts_seed = "Queen"
+
+/mob/living/carbon/alien
+ tts_seed = "Ladyvashj"
+
+/mob/living/carbon/alien/humanoid/queen
+ tts_seed = "Queen"
diff --git a/modular_ss220/mobs/code/simple_animal/hostile/bear.dm b/modular_ss220/mobs/code/simple_animal/hostile/bear.dm
new file mode 100644
index 000000000000..a974d7d1a268
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/hostile/bear.dm
@@ -0,0 +1,54 @@
+/mob/living/simple_animal/hostile/bear
+ name = "космический медведь"
+ desc = "Вам не нужно быть быстрее медведя, вам нужно быть быстрее напарников."
+ blood_volume = BLOOD_VOLUME_NORMAL
+ attacktext = "терзает"
+ death_sound = 'modular_ss220/mobs/sound/creatures/bear_death.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/bear_talk1.ogg', 'modular_ss220/mobs/sound/creatures/bear_talk2.ogg', 'modular_ss220/mobs/sound/creatures/bear_talk3.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/bear_onerawr1.ogg', 'modular_ss220/mobs/sound/creatures/bear_onerawr2.ogg', 'modular_ss220/mobs/sound/creatures/bear_onerawr3.ogg')
+ var/trigger_sound = 'modular_ss220/mobs/sound/creatures/bear_rawr.ogg'
+
+/mob/living/simple_animal/hostile/bear/handle_automated_movement()
+ if(..())
+ playsound(src, src.trigger_sound, 40, 1)
+
+// /mob/living/simple_animal/hostile/bear/Move()
+// icon_state = "[icon_living]"
+// icon_state = "[icon_living]floor"
+
+/mob/living/simple_animal/hostile/bear/brown
+ name = "бурый медведь"
+ desc = "Не такой уж и плюшевый"
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "brownbear"
+ icon_living = "brownbear"
+ icon_dead = "brownbear_dead"
+ icon_gib = "brownbear_gib"
+
+/mob/living/simple_animal/hostile/bear/snow
+ name = "снежный медведь"
+ desc = "Не любит гостей в своей берлоге."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "snowbear"
+ icon_living = "snowbear"
+ icon_dead = "snowbear_dead"
+ icon_gib = "snowbear_gib"
+
+/mob/living/simple_animal/hostile/bear/combat
+ name = "боевой медведь"
+ desc = "Боевая машина для убийств."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "combatbear"
+ icon_living = "combatbear"
+ icon_dead = "combatbear_dead"
+ icon_gib = "combatbear_gib"
+
+ maxHealth = 200
+ health = 200
+ obj_damage = 80
+ melee_damage_lower = 30
+ melee_damage_upper = 80
+
+ speed = 2
+ blood_volume = BLOOD_VOLUME_NORMAL
+ attacktext = "терзает"
diff --git a/modular_ss220/mobs/code/simple_animal/hostile/headcrab.dm b/modular_ss220/mobs/code/simple_animal/hostile/headcrab.dm
new file mode 100644
index 000000000000..8d401c8a5e86
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/hostile/headcrab.dm
@@ -0,0 +1,194 @@
+// port old headcrabs
+/mob/living/simple_animal/hostile/headcrab
+ name = "headcrab"
+ desc = "A small parasitic creature that would like to connect with your brain stem."
+ icon = 'modular_ss220/mobs/icons/mob/headcrab.dmi'
+ icon_state = "headcrab"
+ icon_living = "headcrab"
+ icon_dead = "headcrab_dead"
+ health = 60
+ maxHealth = 60
+ dodging = 1
+ melee_damage_lower = 5
+ melee_damage_upper = 10
+ ranged = 1
+ ranged_message = "leaps"
+ ranged_cooldown_time = 40
+ var/jumpdistance = 4
+ var/jumpspeed = 1
+ attacktext = "грызёт"
+ attack_sound = 'modular_ss220/mobs/sound/creatures/headcrab_attack.ogg'
+ speak_emote = list("hisses")
+ var/is_zombie = 0
+ stat_attack = DEAD // Necessary for them to attack (zombify) dead humans
+ robust_searching = 1
+ var/host_species = ""
+ var/list/human_overlays = list()
+
+/mob/living/simple_animal/hostile/headcrab/Life(seconds, times_fired)
+ if(..() && !stat)
+ if(!is_zombie && isturf(src.loc))
+ for(var/mob/living/carbon/human/H in oview(src, 1)) //Only for corpse right next to/on same tile
+ if(H.stat == DEAD || (!H.check_death_method() && H.health <= HEALTH_THRESHOLD_DEAD))
+ Zombify(H)
+ break
+ if(times_fired % 4 == 0)
+ for(var/mob/living/simple_animal/K in oview(src, 1)) //Only for corpse right next to/on same tile
+ if(K.stat == DEAD || (!K.check_death_method() && K.health <= HEALTH_THRESHOLD_DEAD))
+ visible_message("[src] consumes [K] whole!")
+ if(health < maxHealth)
+ health += 10
+ qdel(K)
+ break
+
+/mob/living/simple_animal/hostile/headcrab/OpenFire(atom/A)
+ if(check_friendly_fire)
+ for(var/turf/T in getline(src,A)) // Not 100% reliable but this is faster than simulating actual trajectory
+ for(var/mob/living/L in T)
+ if(L == src || L == A)
+ continue
+ if(faction_check_mob(L) && !attack_same)
+ return
+ visible_message("[src] [ranged_message] at [A]!")
+ throw_at(A, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)
+ ranged_cooldown = world.time + ranged_cooldown_time
+
+/mob/living/simple_animal/hostile/headcrab/proc/Zombify(mob/living/carbon/human/H)
+ if(!H.check_death_method())
+ H.death()
+ var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ is_zombie = TRUE
+ if(H.wear_suit)
+ var/obj/item/clothing/suit/armor/A = H.wear_suit
+ if(A.armor && A.armor.getRating("melee"))
+ maxHealth += A.armor.getRating("melee") //That zombie's got armor, I want armor!
+ maxHealth += 200
+ health = maxHealth
+ name = "zombie"
+ desc = "A corpse animated by the alien being on its head."
+ melee_damage_lower = 10
+ melee_damage_upper = 15
+ ranged = 0
+ stat_attack = CONSCIOUS // Disables their targeting of dead mobs once they're already a zombie
+ icon = H.icon
+ speak = list('modular_ss220/mobs/sound/creatures/zombie_idle1.ogg','modular_ss220/mobs/sound/creatures/zombie_idle2.ogg','modular_ss220/mobs/sound/creatures/zombie_idle3.ogg')
+ speak_chance = 50
+ speak_emote = list("groans")
+ attacktext = "грызёт"
+ attack_sound = 'modular_ss220/mobs/sound/creatures/zombie_attack.ogg'
+ icon_state = "zombie2_s"
+ if(head_organ)
+ head_organ.h_style = null
+ H.update_hair()
+ host_species = H.dna.species.name
+ human_overlays = H.overlays
+ update_icons()
+ H.forceMove(src)
+ visible_message("The corpse of [H.name] suddenly rises!")
+
+/mob/living/simple_animal/hostile/headcrab/death()
+ ..()
+ if(is_zombie)
+ qdel(src)
+
+/mob/living/simple_animal/hostile/headcrab/handle_automated_speech() // This way they have different screams when attacking, sometimes. Might be seen as sphagetthi code though.
+ if(speak_chance)
+ if(rand(0,200) < speak_chance)
+ if(speak && speak.len)
+ playsound(get_turf(src), pick(speak), 200, 1)
+
+/mob/living/simple_animal/hostile/headcrab/Destroy()
+ if(contents)
+ for(var/mob/M in contents)
+ M.loc = get_turf(src)
+ return ..()
+
+/mob/living/simple_animal/hostile/headcrab/update_icons()
+ . = ..()
+ if(is_zombie)
+ overlays.Cut()
+ overlays = human_overlays
+ var/image/I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "headcrabpod")
+ if(host_species == "Vox")
+ I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "headcrabpod_vox")
+ else if(host_species == "Gray")
+ I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "headcrabpod_gray")
+ overlays += I
+
+/mob/living/simple_animal/hostile/headcrab/CanAttack(atom/the_target)
+ if(stat_attack == DEAD && isliving(the_target) && !ishuman(the_target))
+ var/mob/living/L = the_target
+ if(L.stat == DEAD)
+ // Override default behavior of stat_attack, to stop headcrabs targeting dead mobs they cannot infect, such as silicons.
+ return FALSE
+ return ..()
+
+/mob/living/simple_animal/hostile/headcrab/fast
+ name = "fast headcrab"
+ desc = "A fast parasitic creature that would like to connect with your brain stem."
+ icon = 'modular_ss220/mobs/icons/mob/headcrab.dmi'
+ icon_state = "fast_headcrab"
+ icon_living = "fast_headcrab"
+ icon_dead = "fast_headcrab_dead"
+ health = 40
+ maxHealth = 40
+ ranged_cooldown_time = 30
+ jumpdistance = 8
+ jumpspeed = 2
+ speak_emote = list("screech")
+
+/mob/living/simple_animal/hostile/headcrab/fast/update_icons()
+ . = ..()
+ if(is_zombie)
+ overlays.Cut()
+ overlays = human_overlays
+ var/image/I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "fast_headcrabpod")
+ if(host_species == "Vox")
+ I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "fast_headcrabpod_vox")
+ else if(host_species == "Gray")
+ I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "fast_headcrabpod_gray")
+ overlays += I
+
+/mob/living/simple_animal/hostile/headcrab/fast/Zombify(mob/living/carbon/human/H)
+ . = ..()
+ speak = list('modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg','modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg','modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg')
+
+/mob/living/simple_animal/hostile/headcrab/poison
+ name = "poison headcrab"
+ desc = "A poison parasitic creature that would like to connect with your brain stem."
+ icon = 'modular_ss220/mobs/icons/mob/headcrab.dmi'
+ icon_state = "poison_headcrab"
+ icon_living = "poison_headcrab"
+ icon_dead = "poison_headcrab_dead"
+ health = 80
+ maxHealth = 80
+ ranged_cooldown_time = 50
+ jumpdistance = 3
+ jumpspeed = 1
+ melee_damage_lower = 8
+ melee_damage_upper = 20
+ attack_sound = 'modular_ss220/mobs/sound/creatures/ph_scream1.ogg'
+ speak_emote = list("screech")
+
+/mob/living/simple_animal/hostile/headcrab/poison/update_icons()
+ . = ..()
+ if(is_zombie)
+ overlays.Cut()
+ overlays = human_overlays
+ var/image/I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "poison_headcrabpod")
+ if(host_species == "Vox")
+ I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "poison_headcrabpod_vox")
+ else if(host_species == "Gray")
+ I = image('modular_ss220/mobs/icons/mob/headcrab.dmi', icon_state = "poison_headcrabpod_gray")
+ overlays += I
+
+
+/mob/living/simple_animal/hostile/headcrab/poison/AttackingTarget()
+ . = ..()
+ if(iscarbon(target) && target.reagents)
+ var/inject_target = pick("chest", "head")
+ var/mob/living/carbon/C = target
+ if(C.IsStunned() || C.can_inject(null, FALSE, inject_target, FALSE))
+ if(C.AmountEyeBlurry() < 60)
+ C.AdjustEyeBlurry(10)
+ visible_message("[src] buries its fangs deep into the [inject_target] of [target]!")
diff --git a/modular_ss220/mobs/code/simple_animal/hostile/lizard.dm b/modular_ss220/mobs/code/simple_animal/hostile/lizard.dm
new file mode 100644
index 000000000000..33dba1c9cb24
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/hostile/lizard.dm
@@ -0,0 +1,72 @@
+/mob/living/simple_animal/hostile/lizard
+ name = "игуана"
+ desc = "Грациозный предок космодраконов. Её взгляд не вызывает никаких враждебных подозрений... Но она по прежнему хочет съесть вас."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "iguana"
+ icon_living = "iguana"
+ icon_dead = "iguana_dead"
+ speak = list("RAWR!","Rawr!","GRR!","Growl!")
+ speak_emote = list("growls", "roars")
+ emote_hear = list("rawrs","grumbles","grawls")
+ emote_see = list("stares ferociously", "stomps")
+ tts_seed = "Shaker"
+ speak_chance = 1
+ turns_per_move = 5
+ see_in_dark = 6
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat = 3, /obj/item/stack/sheet/animalhide/lizard = 1)
+ response_help = "погладил"
+ response_disarm = "аккуратно оттолкнул"
+ response_harm = "ударил"
+ stop_automated_movement_when_pulled = 0
+ speed = 2
+ maxHealth = 40
+ health = 40
+ blood_volume = BLOOD_VOLUME_NORMAL
+ obj_damage = 60
+ melee_damage_lower = 20
+ melee_damage_upper = 30
+ attacktext = "терзает"
+ attack_sound = 'sound/weapons/bite.ogg'
+ death_sound = 'modular_ss220/mobs/sound/creatures/lizard_death_big.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/lizard_angry1.ogg', 'modular_ss220/mobs/sound/creatures/lizard_angry2.ogg', 'modular_ss220/mobs/sound/creatures/lizard_angry3.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/lizard_damaged.ogg')
+ footstep_type = FOOTSTEP_MOB_CLAW
+
+ minbodytemp = 250 //Weak to cold
+ maxbodytemp = T0C + 200
+
+ gold_core_spawnable = HOSTILE_SPAWN
+
+/mob/living/simple_animal/hostile/lizard/gator
+ name = "аллигатор"
+ desc = "Величавый аллигатор, так и норовящийся оторвать от вас самый лакомый кусочек. Или кусок. Не путать с крокодилом!"
+ icon_state = "gator"
+ icon_living = "gator"
+ icon_dead = "gator_dead"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat = 7, /obj/item/stack/sheet/animalhide/lizard = 5)
+ speed = 4
+ maxHealth = 200
+ health = 200
+ obj_damage = 80
+ melee_damage_lower = 30
+ melee_damage_upper = 80
+
+/mob/living/simple_animal/hostile/lizard/croco
+ name = "крокодил"
+ desc = "Не стоит сувать голову ему в пасть! Это негативно сказывается на умственных способностях"
+ icon_state = "steppy"
+ icon_living = "steppy"
+ icon_dead = "steppy_dead"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/lizardmeat = 5, /obj/item/stack/sheet/animalhide/lizard = 3)
+ maxHealth = 100
+ health = 100
+ obj_damage = 80
+ melee_damage_lower = 20
+ melee_damage_upper = 50
+
+
+
+
+
+
+
diff --git a/modular_ss220/mobs/code/simple_animal/hostile/snake.dm b/modular_ss220/mobs/code/simple_animal/hostile/snake.dm
new file mode 100644
index 000000000000..16d3c6995ba9
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/hostile/snake.dm
@@ -0,0 +1,6 @@
+/mob/living/simple_animal/hostile/retaliate/poison/snake
+ attacktext = "кусает"
+ attack_sound = 'sound/weapons/bite.ogg'
+ death_sound = 'modular_ss220/mobs/sound/creatures/snake_death.ogg'
+ tts_seed = "Ladyvashj"
+ holder_type = /obj/item/holder/snake
diff --git a/modular_ss220/mobs/code/simple_animal/hostile/spider.dm b/modular_ss220/mobs/code/simple_animal/hostile/spider.dm
new file mode 100644
index 000000000000..bf603a4dd122
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/hostile/spider.dm
@@ -0,0 +1,63 @@
+//Giants
+
+/mob/living/simple_animal/hostile/poison/giant_spider
+ death_sound = 'modular_ss220/mobs/sound/creatures/spider_death.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/spider_talk1.ogg', 'modular_ss220/mobs/sound/creatures/spider_talk2.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/spider_attack1.ogg', 'modular_ss220/mobs/sound/creatures/spider_attack2.ogg')
+ attacktext = "кусает"
+ response_help = "лапает"
+ response_disarm = "осторожно отталкивает"
+ friendly = "осторожно проводит лапками по"
+ tts_seed = "Anubarak"
+
+
+// Terrors
+
+/mob/living/simple_animal/hostile/poison/terror_spider
+ response_help = "лапает"
+ response_disarm = "осторожно отталкивает"
+ friendly = "осторожно проводит лапками по"
+ death_sound = 'modular_ss220/mobs/sound/creatures/spider_death.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/spider_talk1.ogg', 'modular_ss220/mobs/sound/creatures/spider_talk2.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/spider_attack1.ogg', 'modular_ss220/mobs/sound/creatures/spider_attack2.ogg')
+ attacktext = "кусает"
+ response_help = "лапает"
+ response_disarm = "осторожно отталкивает"
+ friendly = "осторожно проводит лапками по"
+ tts_seed = "Anubarak"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/mother
+ tts_seed = "Deathwhisper"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/princess
+ tts_seed = "Lissandra"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen
+ tts_seed = "Anivia"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/queen/empress
+ tts_seed = "Queen"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/prince
+ tts_seed = "Alduin"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/red
+ tts_seed = "Chu"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/green
+ tts_seed = "Myra"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/gray
+ tts_seed = "Cassiopeia"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/brown
+ tts_seed = "Zuljin"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/purple
+ tts_seed = "Avozu"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/black
+ tts_seed = "Karastamper"
+
+/mob/living/simple_animal/hostile/poison/terror_spider/white
+ tts_seed = "F_darkelf"
diff --git a/modular_ss220/mobs/code/simple_animal/hostile/syndi_rat.dm b/modular_ss220/mobs/code/simple_animal/hostile/syndi_rat.dm
new file mode 100644
index 000000000000..f7f42612a359
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/hostile/syndi_rat.dm
@@ -0,0 +1,118 @@
+/mob/living/simple_animal/hostile/retaliate/syndirat
+ name = "Синди-мышь"
+ desc = "Мышь на службе синдиката?"
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "syndirat"
+ icon_living = "syndirat"
+ icon_dead = "syndirat_dead"
+ icon_resting = "syndirat_sleep"
+ response_help = "pets the"
+ response_disarm = "gently pushes aside the"
+ response_harm = "stamps on the"
+ health = 50
+ maxHealth = 50
+ speak_chance = 2
+ turns_per_move = 5
+ pull_force = 1000
+ density = 0
+ ventcrawler = 2
+ can_hide = 1
+ can_collar = 1
+ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
+ see_in_dark = 6
+ speak = list("Слава Синдикату!","Смерть НаноТрейзен!", "У вас есть сыр?")
+ speak_emote = list("squeeks","squeaks","squiks")
+ emote_hear = list("squeeks","squeaks","squiks")
+ emote_see = list("runs in a circle", "shakes", "scritches at something")
+
+ mob_size = MOB_SIZE_TINY // If theyre not at least small it doesnt seem like the treadmill works or makes sound
+ pass_flags = PASSTABLE
+ stop_automated_movement = 1
+
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+
+ ranged = 1
+ projectiletype = /obj/item/projectile/beam/disabler
+
+ attack_sound = 'sound/weapons/punch1.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/rat_talk.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/rat_wound.ogg')
+ death_sound = 'modular_ss220/mobs/sound/creatures/rat_death.ogg'
+
+ harm_intent_damage = 5
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+ var/chew_probability = 1
+ var/squeak_sound = 'sound/creatures/mousesqueak.ogg'
+
+/mob/living/simple_animal/hostile/retaliate/syndirat/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueak.ogg' = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever
+
+/mob/living/simple_animal/hostile/retaliate/syndirat/handle_automated_action()
+ if(prob(chew_probability) && isturf(loc))
+ var/turf/simulated/floor/F = get_turf(src)
+ if(istype(F) && !F.intact)
+ var/obj/structure/cable/C = locate() in F
+ if(C && prob(15))
+ if(C.get_available_power() && !HAS_TRAIT(src, TRAIT_SHOCKIMMUNE))
+ visible_message("[src] chews through [C]. It's toast!")
+ playsound(src, 'sound/effects/sparks2.ogg', 100, 1)
+ toast() // mmmm toasty.
+ else
+ visible_message("[src] chews through [C].")
+ investigate_log("was chewed through by a mouse at [COORD(F)]", "wires")
+ C.deconstruct()
+
+/mob/living/simple_animal/hostile/retaliate/syndirat/proc/toast()
+ add_atom_colour("#3A3A3A", FIXED_COLOUR_PRIORITY)
+ desc = "It's toast."
+ death()
+
+/mob/living/simple_animal/hostile/retaliate/syndirat/handle_automated_speech()
+ ..()
+ if(prob(speak_chance) && !incapacitated())
+ playsound(src, squeak_sound, 100, 1)
+
+/mob/living/simple_animal/hostile/retaliate/syndirat/handle_automated_movement()
+ . = ..()
+ if(resting)
+ if(prob(1))
+ on_standing_up()
+ else if(prob(5))
+ custom_emote(2, "snuffles")
+ else if(prob(0.5))
+ on_lying_down()
+
+/mob/living/simple_animal/hostile/retaliate/syndirat/Crossed(AM as mob|obj, oldloc)
+ if(ishuman(AM))
+ if(!stat)
+ var/mob/M = AM
+ to_chat(M, "[bicon(src)] Squeek!")
+ ..()
+
+/mob/living/simple_animal/hostile/retaliate/syndirat/emote(act, m_type = 1, message = null, intentional, force)
+ if(stat != CONSCIOUS)
+ return
+
+ var/on_CD = 0
+ act = lowertext(act)
+ switch(act)
+ if("squeak") //Mouse time
+ on_CD = start_audio_emote_cooldown()
+ else
+ on_CD = 0
+
+ if(!force && on_CD == 1)
+ return
+
+ switch(act)
+ if("squeak")
+ message = "[pick(emote_hear)]!"
+ m_type = 2 //audible
+ playsound(src, squeak_sound, 40, 1)
+ if("help")
+ to_chat(src, "scream, squeak")
+
+ ..()
diff --git a/modular_ss220/mobs/code/simple_animal/hostile/undead.dm b/modular_ss220/mobs/code/simple_animal/hostile/undead.dm
new file mode 100644
index 000000000000..7a9db442d4cd
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/hostile/undead.dm
@@ -0,0 +1,12 @@
+/mob/living/simple_animal/hostile/undead
+ attacktext = "бьет"
+ attack_sound = 'modular_ss220/mobs/sound/creatures/zombie_attack.ogg'
+ death_sound = 'modular_ss220/mobs/sound/creatures/zombie_idle2.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/zombie_idle1.ogg', 'modular_ss220/mobs/sound/creatures/zombie_idle3.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/zombie_idle1.ogg', 'modular_ss220/mobs/sound/creatures/zombie_idle2.ogg', 'modular_ss220/mobs/sound/creatures/zombie_idle3.ogg')
+
+/mob/living/simple_animal/hostile/undead/zombie/fast
+ death_sound = 'modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg'
+ talk_sound = list('modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg', 'modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg')
+ damaged_sound = list('modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg')
+
diff --git a/modular_ss220/mobs/code/simple_animal/items.dm b/modular_ss220/mobs/code/simple_animal/items.dm
new file mode 100644
index 000000000000..dfb46832a8f6
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/items.dm
@@ -0,0 +1,56 @@
+// Meat
+/obj/item/reagent_containers/food/snacks/meat/dog
+ name = "dog meat"
+ desc = "Не слишком питательно. Но говорят деликатес космокорейцев."
+ list_reagents = list("protein" = 2, "epinephrine" = 2)
+
+/obj/item/reagent_containers/food/snacks/meat/security
+ name = "security meat"
+ desc = "Мясо наполненное чувством мужества и долга."
+ list_reagents = list("protein" = 3, "epinephrine" = 5)
+
+/obj/item/reagent_containers/food/snacks/meat/pug
+ name = "pug meat"
+ desc = "Чуть менее очарователен в нарезке."
+ list_reagents = list("protein" = 2, "epinephrine" = 2)
+
+/obj/item/reagent_containers/food/snacks/meat/ham/old
+ name = "жесткая ветчина"
+ desc = "Мясо почтенного хряка."
+ list_reagents = list("protein" = 2, "porktonium" = 10)
+
+/obj/item/reagent_containers/food/snacks/meat/mouse
+ name = "мышатина"
+ desc = "На безрыбье и мышь мясо. Кто знает чем питался этот грызун до его подачи к столу."
+ icon = 'modular_ss220/mobs/icons/items.dmi'
+ icon_state = "meat_clear"
+ list_reagents = list("nutriment" = 2, "blood" = 3, "toxin" = 1)
+
+/obj/item/reagent_containers/food/snacks/salmonmeat/snailmeat
+ name = "snail meat"
+ desc = "Сырая космо-улитка в собственном соку."
+ filling_color = "#6bb4a8"
+ list_reagents = list("protein" = 5, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/salmonmeat/turtlemeat
+ name = "snail meat"
+ desc = "Сырая космо-улитка в собственном соку."
+ filling_color = "#2fa24c"
+ list_reagents = list("protein" = 10, "vitamin" = 8)
+
+/obj/structure/bed/dogbed/pet
+ name = "Удобная лежанка"
+ desc = "Комфортная лежанка для любимейшего питомца отдела."
+ anchored = TRUE
+
+// Останки
+/obj/effect/decal/remains/mouse
+ name = "remains"
+ desc = "Некогда бывшая мышь. Её останки. Больше не будет пищать..."
+ icon = 'modular_ss220/mobs/icons/items.dmi'
+ icon_state = "mouse_skeleton"
+ anchored = FALSE
+ move_resist = MOVE_FORCE_EXTREMELY_WEAK
+
+/obj/effect/decal/remains/mouse/water_act(volume, temperature, source, method)
+ . = ..()
diff --git a/modular_ss220/mobs/code/simple_animal/mobs.dm b/modular_ss220/mobs/code/simple_animal/mobs.dm
new file mode 100644
index 000000000000..1decab575cf3
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/mobs.dm
@@ -0,0 +1,16 @@
+/mob/living/simple_animal/cockroach
+ death_sound = 'modular_ss220/mobs/sound/creatures/crack_death2.ogg'
+
+/mob/living/simple_animal/hostile/feral_cat
+ blood_volume = BLOOD_VOLUME_NORMAL
+ attacktext = "рвёт"
+
+/mob/living/simple_animal/hostile/headslug
+ attacktext = "грызёт"
+ holder_type = /obj/item/holder/headslug
+
+/mob/living/simple_animal/hostile/retaliate/clown/goblin
+ holder_type = /obj/item/holder/clowngoblin
+
+/mob/living/simple_animal/parrot
+ holder_type = /obj/item/holder/parrot
diff --git a/modular_ss220/mobs/code/simple_animal/named_animals.dm b/modular_ss220/mobs/code/simple_animal/named_animals.dm
new file mode 100644
index 000000000000..53c5c1199de8
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/named_animals.dm
@@ -0,0 +1,144 @@
+/mob/living/simple_animal/pig/Sanya
+ name = "Саня"
+ desc = "Старый добрый хряк с сединой. Слегка подслеповат, но нюх и харизма по прежнему с ним. Чудом не пущен на мясо и дожил до почтенного возраста."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "pig_old"
+ icon_living = "pig_old"
+ icon_dead = "pig_old_dead"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/ham/old = 10)
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ maxHealth = 80
+ health = 80
+
+/mob/living/simple_animal/pig/Sanya/npc_safe(mob/user) // depriving the chef of his animals is not cool
+ return FALSE
+
+/mob/living/simple_animal/cow/betsy
+ name = "Бетси"
+ desc = "Старая добрая старушка. Нескончаемый источник природного молока без ГМО. Ну почти без ГМО..."
+ gold_core_spawnable = NO_SPAWN
+
+/mob/living/simple_animal/chicken/Wife
+ name = "Галя"
+ desc = "Почетная наседка. Жена Коммандора, следующая за ним в коммандировки по космическим станциям."
+ icon_state = "chicken_white"
+ icon_living = "chicken_white"
+ icon_dead = "chicken_white_dead"
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ maxHealth = 20
+ health = 20
+
+/mob/living/simple_animal/chicken/Wife/npc_safe(mob/user) // depriving the chef of his animals is not cool
+ return FALSE
+
+/mob/living/simple_animal/cock/Clucky
+ name = "Коммандор Клакки"
+ desc = "Его великая армия бесчисленна. Ко-ко-ко."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ maxHealth = 40 // Veteran
+ health = 40
+
+/mob/living/simple_animal/cock/Clucky/npc_safe(mob/user) // depriving the chef of his animals is not cool
+ return FALSE
+
+/mob/living/simple_animal/goose/Scientist
+ name = "Гуськор"
+ desc = "Учёный Гусь. Везде учусь. Крайне умная и задиристая птица. Обожает генетику. Надеемся это не бывший пропавший генетик..."
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "goose_labcoat"
+ icon_living = "goose_labcoat"
+ icon_dead = "goose_labcoat_dead"
+ icon_resting = "goose_labcoat_rest"
+ attacktext = "умно щипает"
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ maxHealth = 80
+ health = 80
+ resting = TRUE
+
+/mob/living/simple_animal/goose/Scientist/npc_safe(mob/user)
+ return FALSE
+
+/mob/living/simple_animal/hostile/lizard/croco/Gena
+ name = "Гена"
+ desc = "Крокодил обожающий музыкальные инструменты и плюшевые игрушки. Пожевать."
+ faction = list("neutral")
+
+// rats
+/mob/living/simple_animal/mouse/rat/Ratatui
+ name = "Рататуй"
+ real_name = "Рататуй"
+ desc = "Личная крыса шеф повара, помогающая ему при готовке наиболее изысканных блюд. До момента пока он не пропадет и повар не начнет готовить что-то новенькое..."
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ maxHealth = 20
+ health = 20
+
+/mob/living/simple_animal/mouse/rat/irish/Remi
+ name = "Реми"
+ real_name = "Реми"
+ desc = "Близкий друг Рататуя. Не любимец повара, но пока тот не мешает на кухне, ему разрешили здесь остаться. Очень толстая крыса."
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ maxHealth = 25
+ health = 25
+ transform = matrix(1.250, 0, 0, 0, 1, 0) // Толстячок на +2 пикселя
+
+/mob/living/simple_animal/mouse/rat/white/Brain
+ name = "Брейн"
+ real_name = "Брейн"
+ desc = "Сообразительная личная лабораторная крыса директора исследований, даже освоившая речь. Настолько часто сбегал, что его перестали помещать в клетку. Он явно хочет захватить мир. Где-то спрятался его напарник..."
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ maxHealth = 20
+ health = 20
+ universal_speak = 1
+ resting = TRUE
+
+/obj/effect/decal/remains/mouse/Pinkie
+ name = "Пинки"
+ desc = "Когда-то это был напарник самой сообразительной крысы в мире. К сожалению он таковым не являлся..."
+ anchored = TRUE
+
+// hamster
+/mob/living/simple_animal/mouse/hamster/Representative
+ name = "представитель Алексей"
+ desc = "Представитель федерации хомяков. Проявите уважение при его виде, ведь он с позитивным исходом решил немало дипломатических вопросов между федерацией мышей, республикой крыс и корпорацией Нанотрейзен. Да и кто вообще хомяка так назвал?!"
+ icon = 'modular_ss220/mobs/icons/mob/animal.dmi'
+ icon_state = "hamster_rep"
+ icon_living = "hamster_rep"
+ icon_dead = "hamster_rep_dead"
+ icon_resting = "hamster_rep_rest"
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ holder_type = /obj/item/holder/hamster_rep
+ maxHealth = 20
+ health = 20
+ resting = TRUE
+
+/mob/living/simple_animal/possum/Poppy
+ name = "Ключик"
+ desc = "Маленький работяга. Его жилетка подчеркивает его рабочие... лапы. Тот еще трудяга. Очень не любит ассистентов в инженерном отделе. И Полли. Интересно, почему?"
+ icon_state = "possum_poppy"
+ icon_living = "possum_poppy"
+ icon_dead = "possum_poppy_dead"
+ icon_resting = "possum_poppy_sleep"
+ icon_harm = "possum_poppy_aaa"
+ maxHealth = 50
+ health = 50
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ holder_type = /obj/item/holder/possum/poppy
+
+/mob/living/simple_animal/frog/Wednesday
+ name = "Среда"
+ real_name = "Среда"
+ desc = "Это Среда, мои чуваки!"
+ maxHealth = 20
+ health = 20
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
diff --git a/modular_ss220/mobs/code/simple_animal/overrides.dm b/modular_ss220/mobs/code/simple_animal/overrides.dm
new file mode 100644
index 000000000000..09f35d7bcce4
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/overrides.dm
@@ -0,0 +1,108 @@
+/mob/living/simple_animal
+ response_help = "тычет"
+ response_disarm = "толкает"
+ response_harm = "пихает"
+ attacktext = "атакует"
+ attack_sound = null
+ friendly = "утыкается в" //If the mob does no damage with it's attack
+
+ tts_seed = "Kleiner"
+ var/list/damaged_sound = null // The sound played when player hits animal
+ var/list/talk_sound = null // The sound played when talk
+
+
+/mob/living/simple_animal/say(message, verb, sanitize, ignore_speech_problems, ignore_atmospherics)
+ . = ..()
+ if(. && length(src.talk_sound))
+ playsound(src, pick(src.talk_sound), 75, TRUE)
+
+/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user)
+ . = ..()
+ if(. && length(src.damaged_sound) && src.stat != DEAD)
+ playsound(src, pick(src.damaged_sound), 40, 1)
+
+/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M)
+ . = ..()
+ if(. && length(src.damaged_sound) && src.stat != DEAD)
+ playsound(src, pick(src.damaged_sound), 40, 1)
+
+/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M)
+ . = ..()
+ if(. && length(src.damaged_sound) && src.stat != DEAD)
+ playsound(src, pick(src.damaged_sound), 40, 1)
+
+/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M)
+ . = ..()
+ if(. && length(src.damaged_sound) && src.stat != DEAD)
+ playsound(src, pick(src.damaged_sound), 40, 1)
+
+/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L)
+ . = ..()
+ if(. && length(src.damaged_sound) && src.stat != DEAD)
+ playsound(src, pick(src.damaged_sound), 40, 1)
+
+/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M)
+ . = ..()
+ if(. && length(src.damaged_sound) && src.stat != DEAD)
+ playsound(src, pick(src.damaged_sound), 40, 1)
+
+/mob/living/simple_animal/attack_robot(mob/living/user)
+ . = ..()
+ if(. && length(src.damaged_sound) && src.stat != DEAD)
+ playsound(src, pick(src.damaged_sound), 40, 1)
+
+
+// Simple animal procs
+/mob/living/simple_animal/start_pulling(atom/movable/AM, state, force = pull_force, show_message = FALSE)
+ if(pull_constraint(AM, show_message))
+ return ..()
+
+/mob/living/simple_animal/proc/pull_constraint(atom/movable/AM, show_message = FALSE)
+ return TRUE
+
+
+// Animals additions
+
+/* Megafauna */
+/mob/living/simple_animal/hostile/megafauna/legion
+ death_sound = 'modular_ss220/mobs/sound/creatures/legion_death.ogg'
+
+/mob/living/simple_animal/hostile/megafauna/legion/death(gibbed)
+ for(var/area/lavaland/L in world)
+ SEND_SOUND(L, sound('modular_ss220/mobs/sound/creatures/legion_death_far.ogg'))
+ . = ..()
+
+/* Nar Sie */
+/obj/singularity/narsie/large/Destroy()
+ SEND_SOUND(world, sound('modular_ss220/mobs/sound/creatures/narsie_rises.ogg'))
+ . = ..()
+
+
+/* Loot Drops */
+/obj/effect/spawner/lootdrop/bluespace_tap/organic/Initialize(mapload)
+ . = ..()
+ LAZYADD(loot, list(
+ //mob/living/simple_animal/pet/dog/corgi = 5,
+
+ /mob/living/simple_animal/pet/dog/brittany = 2,
+ /mob/living/simple_animal/pet/dog/german = 2,
+ /mob/living/simple_animal/pet/dog/tamaskan = 2,
+ /mob/living/simple_animal/pet/dog/bullterrier = 2,
+
+ //mob/living/simple_animal/pet/cat = 5,
+
+ /mob/living/simple_animal/pet/cat/cak = 2,
+ /mob/living/simple_animal/pet/cat/fat = 2,
+ /mob/living/simple_animal/pet/cat/white = 2,
+ /mob/living/simple_animal/pet/cat/birman = 2,
+ /mob/living/simple_animal/pet/cat/spacecat = 2,
+
+ //mob/living/simple_animal/pet/dog/fox = 5,
+
+ /mob/living/simple_animal/pet/dog/fox/forest = 2,
+ /mob/living/simple_animal/pet/dog/fox/fennec = 2,
+ /mob/living/simple_animal/possum = 2,
+
+ /mob/living/simple_animal/pet/penguin = 5,
+ //mob/living/simple_animal/pig = 5,
+ ))
diff --git a/modular_ss220/mobs/code/simple_animal/pets/cat.dm b/modular_ss220/mobs/code/simple_animal/pets/cat.dm
new file mode 100644
index 000000000000..9f314db19422
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/pets/cat.dm
@@ -0,0 +1,125 @@
+/mob/living/simple_animal/pet/cat
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ holder_type = /obj/item/holder/cat2
+
+/mob/living/simple_animal/pet/cat/Runtime
+ holder_type = /obj/item/holder/cat
+
+/mob/living/simple_animal/pet/cat/cak
+ holder_type = /obj/item/holder/cak
+
+/mob/living/simple_animal/pet/cat/fat
+ name = "fat cat"
+ desc = "Упитана. Счастлива."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "iriska"
+ icon_living = "iriska"
+ icon_dead = "iriska_dead"
+ icon_resting = "iriska"
+ gender = FEMALE
+ mob_size = MOB_SIZE_LARGE // THICK!!!
+ //canmove = FALSE
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 8)
+ tts_seed = "Huntress"
+ maxHealth = 40 // Sooooo faaaat...
+ health = 40
+ speed = 10 // TOO FAT
+ wander = 0 // LAZY
+ can_hide = 0
+ resting = TRUE
+ holder_type = /obj/item/holder/fatcat
+
+/mob/living/simple_animal/pet/cat/fat/handle_automated_action()
+ return
+
+/mob/living/simple_animal/pet/cat/white
+ name = "white cat"
+ desc = "Белоснежная шерстка. Плохо различается на белой плитке, зато отлично виден в темноте!"
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "penny"
+ icon_living = "penny"
+ icon_dead = "penny_dead"
+ icon_resting = "penny_rest"
+ gender = MALE
+ holder_type = /obj/item/holder/cak
+
+/mob/living/simple_animal/pet/cat/birman
+ name = "birman cat"
+ real_name = "birman cat"
+ desc = "Священная порода Бирма."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "crusher"
+ icon_living = "crusher"
+ icon_dead = "crusher_dead"
+ icon_resting = "crusher_rest"
+ gender = MALE
+ holder_type = /obj/item/holder/crusher
+
+
+/mob/living/simple_animal/pet/cat/black
+ name = "black cat"
+ real_name = "black cat"
+ desc = "Он ужас летящий на крыльях ночи! Он - тыгыдык и спотыкание во тьме ночной! Бойся не заметить черного кота в тени!"
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "salem"
+ icon_living = "salem"
+ icon_dead = "salem_dead"
+ icon_resting = "salem_rest"
+ gender = MALE
+ holder_type = /obj/item/holder/cat
+
+/mob/living/simple_animal/pet/cat/spacecat
+ name = "spacecat"
+ desc = "Space Kitty!!"
+ icon_state = "spacecat"
+ icon_living = "spacecat"
+ icon_dead = "spacecat_dead"
+ icon_resting = "spacecat_rest"
+ unsuitable_atmos_damage = 0
+ minbodytemp = TCMB
+ maxbodytemp = T0C + 40
+ holder_type = /obj/item/holder/spacecat
+
+//named
+/mob/living/simple_animal/pet/cat/Floppa
+ name = "Большой Шлёпа"
+ desc = "Он выглядит так, будто собирается совершить военное преступление."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "floppa"
+ icon_living = "floppa"
+ icon_dead = "floppa_dead"
+ icon_resting = "floppa_rest"
+ tts_seed = "Uther"
+ unique_pet = TRUE
+
+/mob/living/simple_animal/pet/cat/fat/Iriska
+ name = "Ириска"
+ desc = "Упитана. Счастлива. Бюрократы её обожают. И похоже даже черезчур сильно."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+
+/mob/living/simple_animal/pet/cat/white/Penny
+ name = "Копейка"
+ desc = "Любит таскать монетки и мелкие предметы. Успевайте прятать их!"
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ resting = TRUE
+
+/mob/living/simple_animal/pet/cat/birman/Crusher
+ name = "Бедокур"
+ desc = "Любит крушить всё что не прикручено. Нужно вовремя прибираться."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ resting = TRUE
+
+/mob/living/simple_animal/pet/cat/spacecat/Musya
+ name = "Муся"
+ desc = "Любимая почтенная кошка отдела токсинов. Всегда готова к вылетам!"
+
+/mob/living/simple_animal/pet/cat/black/Salem
+ name = "Салем"
+ real_name = "Салем"
+ desc = "Говорят что это бывший колдун, лишенный всех своих сил и превратившейся в черного кота Советом Колдунов из-за попытки захватить мир, а в руки НТ попал чтобы отбывать своё наказание. Судя по его скверному нраву, это может быть похоже на правду."
diff --git a/modular_ss220/mobs/code/simple_animal/pets/dog.dm b/modular_ss220/mobs/code/simple_animal/pets/dog.dm
new file mode 100644
index 000000000000..259600f7b1ff
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/pets/dog.dm
@@ -0,0 +1,176 @@
+/mob/living/simple_animal/pet/dog
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ tts_seed = "Stetmann"
+ maxHealth = 50
+ health = 50
+ melee_damage_type = STAMINA
+ melee_damage_lower = 6
+ melee_damage_upper = 10
+ attacktext = "кусает"
+ var/growl_sound = list('modular_ss220/mobs/sound/creatures/dog_grawl1.ogg','modular_ss220/mobs/sound/creatures/dog_grawl2.ogg') //Used in emote.
+
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/dog = 4)
+ collar_type = "dog"
+
+/mob/living/simple_animal/pet/dog/wuv(change, mob/M)
+ . = ..()
+ if(change)
+ if(change < 0)
+ if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
+ playsound(src, pick(src.growl_sound), 75, TRUE)
+
+
+/mob/living/simple_animal/pet/dog/corgi
+ holder_type = /obj/item/holder/corgi
+
+/mob/living/simple_animal/pet/dog/corgi/Ian/persistent_load()
+ . = ..()
+ if(age == record_age)
+ holder_type = /obj/item/holder/old_corgi
+
+/mob/living/simple_animal/pet/dog/corgi/narsie
+ holder_type = /obj/item/holder/narsian
+ maxHealth = 300
+ health = 300
+ melee_damage_type = STAMINA //Пади ниц!
+ melee_damage_lower = 50
+ melee_damage_upper = 100
+ tts_seed = "Mannoroth"
+
+/* // При добавлении Ратвара
+/mob/living/simple_animal/pet/dog/corgi/ratvar
+ name = "Cli-k"
+ desc = "It's a coolish Ian that clicks!"
+ icon = 'icons/mob/clockwork_mobs.dmi'
+ icon_state = "clik"
+ icon_living = "clik"
+ icon_dead = "clik_dead"
+ faction = list("neutral", "clockwork_cult")
+ gold_core_spawnable = NO_SPAWN
+ nofur = TRUE
+ unique_pet = TRUE
+ maxHealth = 100
+ health = 100
+ tts_seed = "Clockwerk"
+
+/mob/living/simple_animal/pet/dog/corgi/ratvar/update_corgi_fluff()
+ ..()
+ speak = list("V'z fuvavat jneevbe!", "CLICK!", "KL-KL-KLIK")
+ speak_emote = list("growls", "barks ominously")
+ emote_hear = list("barks echoingly!", "woofs hauntingly!", "yaps in an judicial manner.", "mutters something unspeakable.")
+ emote_see = list("communes with the unnameable.", "seeks the light in souls.", "shakes.")
+
+/mob/living/simple_animal/pet/dog/corgi/ratvar/ratvar_act()
+ adjustBruteLoss(-maxHealth)
+*/
+
+/mob/living/simple_animal/pet/dog/corgi/puppy
+ maxHealth = 20
+ health = 20
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/corgi = 1)
+ tts_seed = "Jaina"
+
+/mob/living/simple_animal/pet/dog/corgi/puppy/void
+ maxHealth = 60
+ health = 60
+ tts_seed = "Kael"
+ holder_type = /obj/item/holder/void_puppy
+
+/mob/living/simple_animal/pet/dog/corgi/puppy/slime
+ name = "\improper slime puppy"
+ real_name = "slimy"
+ desc = "Крайне склизкий. Но прикольный!"
+ icon_state = "slime_puppy"
+ icon_living = "slime_puppy"
+ icon_dead = "slime_puppy_dead"
+ nofur = TRUE
+ holder_type = /obj/item/holder/slime_puppy
+ minbodytemp = 250 //Weak to cold
+ maxbodytemp = INFINITY
+
+/mob/living/simple_animal/pet/dog/corgi/Lisa
+ tts_seed = "Luna"
+ holder_type = /obj/item/holder/lisa
+
+/mob/living/simple_animal/pet/dog/corgi/borgi
+ tts_seed = "Glados"
+ holder_type = /obj/item/holder/borgi
+
+/mob/living/simple_animal/pet/dog/pug
+ tts_seed = "Kleiner"
+ holder_type = /obj/item/holder/pug
+ maxHealth = 30
+ health = 30
+
+/mob/living/simple_animal/pet/dog/bullterrier
+ name = "bullterrier"
+ real_name = "bullterrier"
+ desc = "Кого-то его мордочка напоминает..."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "bullterrier"
+ icon_living = "bullterrier"
+ icon_dead = "bullterrier_dead"
+ tts_seed = "Kleiner"
+ holder_type = /obj/item/holder/bullterrier
+
+/mob/living/simple_animal/pet/dog/tamaskan
+ name = "tamaskan"
+ real_name = "tamaskan"
+ desc = "Хорошая семейная собака. Уживается с другими собаками и ассистентами."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "tamaskan"
+ icon_living = "tamaskan"
+ icon_dead = "tamaskan_dead"
+ holder_type = /obj/item/holder/bullterrier
+ tts_seed = "Kleiner"
+
+/mob/living/simple_animal/pet/dog/german
+ name = "german"
+ real_name = "german"
+ desc = "Немецкая овчарка с помесью двортерьера. Судя по крупу - явно не породистый."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "german"
+ icon_living = "german"
+ icon_dead = "german_dead"
+ tts_seed = "Kleiner"
+
+/mob/living/simple_animal/pet/dog/brittany
+ name = "brittany"
+ real_name = "brittany"
+ desc = "Старая порода, которую любят аристократы."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "brittany"
+ icon_living = "brittany"
+ icon_dead = "brittany_dead"
+
+
+
+// named
+/mob/living/simple_animal/pet/dog/brittany/Psycho
+ name = "Перрито"
+ real_name = "Перрито"
+ desc = "Собака, обожающая котов, особенно в сапогах, прекрасно лающая на Испанском, прошла терапевтические курсы, готова выслушать все ваши проблемы и выдать вам целебных объятий с завершением в виде почесыванием животика."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ resting = TRUE
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+
+/mob/living/simple_animal/pet/dog/pug/Frank
+ name = "Фрэнк"
+ real_name = "Фрэнк"
+ desc = "Мопс полученный в результате эксперимента ученых в черном. Почему его не забрали интересный вопрос. Похоже он всем надоел своей болтовней, после чего его лишили дара речи."
+ resting = TRUE
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+
+
+/mob/living/simple_animal/pet/dog/bullterrier/Genn
+ name = "Геннадий"
+ desc = "Собачий аристократ. Выглядит очень важным и начитанным. Доброжелательный любимец ассистентов."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ maxHealth = 5
+ health = 5
+ resting = TRUE
+
diff --git a/modular_ss220/mobs/code/simple_animal/pets/fashion.dm b/modular_ss220/mobs/code/simple_animal/pets/fashion.dm
new file mode 100644
index 000000000000..c6d6e0829149
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/pets/fashion.dm
@@ -0,0 +1,131 @@
+/obj/item
+ var/datum/muhtar_fashion/muhtar_fashion = null
+ var/datum/snake_fashion/snake_fashion = null
+
+/// Muhtar fashion
+/datum/muhtar_fashion
+ var/name
+ var/desc
+ var/emote_see
+ var/emote_hear
+ var/speak
+ var/speak_emote
+
+ // This isn't applied to the dog, but stores the icon_state of the
+ // sprite that the associated item uses
+ var/icon_file
+ var/obj_icon_state
+ var/obj_alpha
+ var/obj_color
+
+/datum/muhtar_fashion/New(mob/M)
+ name = replacetext(name, "REAL_NAME", M.real_name)
+ desc = replacetext(desc, "NAME", name)
+
+/datum/muhtar_fashion/proc/apply(mob/living/simple_animal/pet/dog/D)
+ if(name)
+ D.name = name
+ if(desc)
+ D.desc = desc
+ if(emote_see)
+ D.emote_see = emote_see
+ if(emote_hear)
+ D.emote_hear = emote_hear
+ if(speak)
+ D.speak = speak
+ if(speak_emote)
+ D.speak_emote = speak_emote
+
+/datum/muhtar_fashion/proc/get_overlay(dir)
+ if(icon_file && obj_icon_state)
+ var/image/muhtar = image(icon_file, obj_icon_state, dir = dir)
+ muhtar.alpha = obj_alpha
+ muhtar.color = obj_color
+ return muhtar
+
+// Item datums
+/datum/muhtar_fashion/head
+ icon_file = 'modular_ss220/mobs/icons/muhtar_accessories.dmi'
+
+/datum/muhtar_fashion/mask
+ icon_file = 'modular_ss220/mobs/icons/muhtar_accessories.dmi'
+
+/datum/muhtar_fashion/head/detective
+ name = "Детектив REAL_NAME"
+ desc = "NAME sees through your lies..."
+ emote_see = list("investigates the area.","sniffs around for clues.","searches for scooby snacks.","takes a candycorn from the hat.")
+
+/datum/muhtar_fashion/mask/cigar
+ obj_icon_state = "cigar"
+
+/datum/muhtar_fashion/head/beret
+ name = "Лейтенант REAL_NAME"
+ obj_icon_state = "beret"
+
+// Muhtar items
+/obj/item/clothing/mask/cigarette/cigar
+ muhtar_fashion = /datum/muhtar_fashion/mask/cigar
+
+/obj/item/clothing/head/det_hat
+ muhtar_fashion = /datum/muhtar_fashion/head/detective
+
+/obj/item/clothing/head/beret/sec
+ muhtar_fashion = /datum/muhtar_fashion/head/beret
+
+/// Snake fashion
+/datum/snake_fashion
+ var/name
+ var/desc
+ var/emote_see
+ var/emote_hear
+ var/speak
+ var/speak_emote
+
+ // This isn't applied to the snake, but stores the icon_state of the
+ // sprite that the associated item uses
+ var/icon_file
+ var/obj_icon_state
+ var/icon_state
+ var/icon_living
+ var/icon_dead
+ var/obj_alpha
+ var/obj_color
+
+/datum/snake_fashion/New(mob/M)
+ name = replacetext(name, "REAL_NAME", M.real_name)
+ desc = replacetext(desc, "NAME", name)
+
+/datum/snake_fashion/proc/apply(mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/D)
+ if(name)
+ D.name = name
+ if(desc)
+ D.desc = desc
+ if(emote_see)
+ D.emote_see = emote_see
+ if(emote_hear)
+ D.emote_hear = emote_hear
+ if(speak)
+ D.speak = speak
+ if(speak_emote)
+ D.speak_emote = speak_emote
+
+/datum/snake_fashion/proc/get_overlay()
+ if(icon_file && obj_icon_state)
+ var/image/snek = image(icon_file, obj_icon_state)
+ snek.alpha = obj_alpha
+ snek.color = obj_color
+ return snek
+
+// Item datums
+/datum/snake_fashion/head
+ icon_file = 'modular_ss220/mobs/icons/rouge_accessories.dmi'
+
+/datum/snake_fashion/head/beret_hos_black
+ name = "Ля Руж"
+ desc = "Mon Dieu! C'est un serpent à trois têtes!"
+ speak = list("le shhh!")
+ emote_see = list("трясётся в наигранном страхе.", "сдаётся.","устраивает тихую битву между своими головами.", "притворяется мёртвой.","ведёт себя так будто перед ней невидимая стенка.")
+
+// Rouge items
+/obj/item/clothing/head/HoS/beret
+ snake_fashion = /datum/snake_fashion/head/beret_hos_black
diff --git a/modular_ss220/mobs/code/simple_animal/pets/fox.dm b/modular_ss220/mobs/code/simple_animal/pets/fox.dm
new file mode 100644
index 000000000000..7771955a4d93
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/pets/fox.dm
@@ -0,0 +1,58 @@
+/mob/living/simple_animal/pet/dog/fox
+ tts_seed = "Barney"
+ yelp_sound = 'modular_ss220/mobs/sound/creatures/fox_yelp.ogg' //Used on death.
+ holder_type = /obj/item/holder/fox
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+
+/mob/living/simple_animal/pet/dog/fox/fennec
+ name = "fennec"
+ real_name = "fennec"
+ desc = "Миниатюрная лисичка с очень большими ушами. Фенек, фенек, зачем тебе такие большие уши? Чтобы избегать дормитория?"
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "fennec"
+ icon_living = "fennec"
+ icon_dead = "fennec_dead"
+ icon_resting = "fennec_rest"
+ see_in_dark = 10
+ holder_type = /obj/item/holder/fennec
+
+/mob/living/simple_animal/pet/dog/fox/forest
+ name = "forest fox"
+ real_name = "forest fox"
+ desc = "Лесная дикая лисица. Может укусить."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "fox_forest"
+ icon_living = "fox_forest"
+ icon_dead = "fox_forest_dead"
+ icon_resting = "fox_forest_rest"
+ melee_damage_type = BRUTE
+ melee_damage_lower = 6
+ melee_damage_upper = 12
+
+
+
+// named
+
+/mob/living/simple_animal/pet/dog/fox/alisa
+ name = "Алиса"
+ desc = "Алиса, любимый питомец любого Офицера Специальных Операций. Интересно, что она говорит?"
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "alisa"
+ icon_living = "alisa"
+ icon_dead = "alisa_dead"
+ icon_resting = "alisa_rest"
+ faction = list("nanotrasen")
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ melee_damage_lower = 10
+ melee_damage_upper = 20
+
+/mob/living/simple_animal/pet/dog/fox/fennec/fenya
+ name = "Феня"
+ desc = "Миниатюрная лисичка c важным видом и очень большими ушами. Был пойман во время разливания огромного мороженого по формочкам и теперь Магистрат держит его при себе и следит за ним. Но похоже что ему даже нравится быть частью правосудия."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ resting = TRUE
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
diff --git a/modular_ss220/mobs/code/simple_animal/pets/pet.dm b/modular_ss220/mobs/code/simple_animal/pets/pet.dm
new file mode 100644
index 000000000000..60a549b67ffd
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/pets/pet.dm
@@ -0,0 +1,18 @@
+
+/mob/living/simple_animal/pet
+ attacktext = "кусает"
+ attack_sound = 'sound/weapons/bite.ogg'
+
+/mob/living/simple_animal/pet/sloth
+ tts_seed = "Peon"
+ holder_type = /obj/item/holder/sloth
+
+/mob/living/simple_animal/pet/sloth/paperwork
+ name = "Пэйперворк" // Бумажник
+ desc = "Любимец Карго - ленивец. Примерно так же полезен, как и остальные каргонцы."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "cool_sloth"
+ icon_living = "cool_sloth"
+ icon_dead = "cool_sloth_dead"
+ unique_pet = TRUE
+ gold_core_spawnable = NO_SPAWN
diff --git a/modular_ss220/mobs/code/simple_animal/pets/rouge.dm b/modular_ss220/mobs/code/simple_animal/pets/rouge.dm
new file mode 100644
index 000000000000..3d24b2c219fb
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/pets/rouge.dm
@@ -0,0 +1,278 @@
+//Уникальный питомец Офицера Телекомов. Спрайты от Элл Гуда
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge
+ name = "Руж"
+ desc = "Уникальная трёхголовая змея Офицера Телекоммуникаций синдиката. Выращена в лаборатории. У каждой головы свой характер!"
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ mob_size = MOB_SIZE_SMALL
+ blood_volume = BLOOD_VOLUME_NORMAL
+ can_collar = TRUE
+ gender = FEMALE
+ icon_state = "rouge"
+ icon_living = "rouge"
+ icon_dead = "rouge_dead"
+ icon_resting = "rouge_rest"
+ speak_chance = 5
+ speak = list("Шшш", "Тсс!", "Тц тц тц!", "ШШшшШШшшШ!")
+ speak_emote = list("hisses")
+ emote_hear = list("Зевает", "Шипит", "Дурачится", "Толкается")
+ emote_see = list("Высовывает язык", "Кружится", "Трясёт хвостом")
+ tts_seed = "Ladyvashj"
+ health = 20
+ maxHealth = 20
+ attacktext = "кусает"
+ melee_damage_lower = 5
+ melee_damage_upper = 6
+ response_help = "pets"
+ var/rest = FALSE
+ response_disarm = "shoos"
+ response_harm = "steps on"
+ var/obj/item/inventory_head
+ faction = list("neutral", "syndicate")
+ gold_core_spawnable = NO_SPAWN
+ unique_pet = TRUE
+ can_hide = 1
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/verb/chasetail()
+ set name = "Chase your tail"
+ set desc = "d'awwww."
+ set category = "Animal"
+ visible_message("[src] [pick("dances around", "chases [p_their()] tail")].", "[pick("You dance around", "You chase your tail")].")
+ spin(20, 1)
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/emote(act, m_type = 1, message = null, intentional, force)
+ if(incapacitated())
+ return
+
+ act = lowertext(act)
+ if(!force && act == "hiss" && start_audio_emote_cooldown())
+ return
+
+ switch(act)
+ if("hiss")
+ message = "[src] [pick(src.speak_emote)]!"
+ ..()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/attack_hand(mob/living/carbon/human/M)
+ . = ..()
+ switch(M.a_intent)
+ if(INTENT_HELP)
+ shh(1, M)
+ if(INTENT_HARM)
+ shh(-1, M)
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/on_lying_down(updating = 1)
+ ..()
+ if(icon_resting && stat != DEAD)
+ icon_state = icon_resting
+ rest = TRUE
+ if(collar_type)
+ collar_type = "[initial(collar_type)]_rest"
+ regenerate_icons()
+ if(inventory_head)
+ regenerate_icons()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/on_standing_up(updating = 1)
+ ..()
+ if(icon_resting && stat != DEAD)
+ icon_state = icon_living
+ rest = FALSE
+ if(collar_type)
+ collar_type = "[initial(collar_type)]"
+ regenerate_icons()
+ if(inventory_head)
+ regenerate_icons()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/proc/shh(change, mob/M)
+ if(!M || stat)
+ return
+ if(change > 0)
+ new /obj/effect/temp_visual/heart(loc)
+ custom_emote(1, "hisses happily!")
+ else
+ custom_emote(1, "hisses angrily!")
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/Initialize(mapload)
+ . = ..()
+ regenerate_icons()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/Destroy()
+ QDEL_NULL(inventory_head)
+ return ..()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/handle_atom_del(atom/A)
+ if(A == inventory_head)
+ inventory_head = null
+ regenerate_icons()
+ return ..()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/Life(seconds, times_fired)
+ . = ..()
+ regenerate_icons()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/death(gibbed)
+ ..(gibbed)
+ regenerate_icons()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/show_inv(mob/user)
+ if(user.incapacitated() || !Adjacent(user))
+ return
+ user.set_machine(src)
+
+ var/dat = {"Inventory of [name]
"}
+ dat += "
Head: [inventory_head]" : "add_inv=head'>Nothing"]"
+ dat += "
Collar: [pcollar]" : "add_inv=collar'>Nothing"]"
+
+ var/datum/browser/popup = new(user, "mob[UID()]", "[src]", 440, 250)
+ popup.set_content(dat)
+ popup.open()
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/getarmor(def_zone, type)
+ var/armorval = inventory_head?.armor.getRating(type)
+ if(!def_zone)
+ armorval *= 0.5
+ else if(def_zone != "head")
+ armorval = 0
+ return armorval
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/Topic(href, href_list)
+ if(!(iscarbon(usr) || isrobot(usr)) || usr.incapacitated() || !Adjacent(usr))
+ usr << browse(null, "window=mob[UID()]")
+ usr.unset_machine()
+ return
+
+ //Removing from inventory
+ if(href_list["remove_inv"])
+ var/remove_from = href_list["remove_inv"]
+ switch(remove_from)
+ if("head")
+ if(inventory_head)
+ if(inventory_head.flags & NODROP)
+ to_chat(usr, "\The [inventory_head] is stuck too hard to [src] for you to remove!")
+ return
+ drop_item(inventory_head)
+ usr.put_in_hands(inventory_head)
+ inventory_head = null
+ update_snek_fluff()
+ regenerate_icons()
+ else
+ to_chat(usr, "There is nothing to remove from its [remove_from].")
+ return
+ if("collar")
+ if(pcollar)
+ var/the_collar = pcollar
+ drop_item(pcollar)
+ usr.put_in_hands(the_collar)
+ pcollar = null
+ update_snek_fluff()
+ regenerate_icons()
+
+ show_inv(usr)
+
+ //Adding things to inventory
+ else if(href_list["add_inv"])
+ var/add_to = href_list["add_inv"]
+
+ switch(add_to)
+ if("collar")
+ add_collar(usr.get_active_hand(), usr)
+ update_snek_fluff()
+
+ if("head")
+ place_on_head(usr.get_active_hand(),usr)
+
+ show_inv(usr)
+ else
+ return ..()
+
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/proc/place_on_head(obj/item/item_to_add, mob/user)
+
+ if(istype(item_to_add, /obj/item/grenade/plastic/c4)) // last thing she ever wears, I guess
+ item_to_add.afterattack(src,user,1)
+ return
+
+ if(inventory_head)
+ if(user)
+ to_chat(user, "You can't put more than one hat on [src]!")
+ return
+ if(!item_to_add)
+ user.visible_message("[user] pets [src].", "You rest your hand on [src]'s head for a moment.")
+ if(flags_2 & HOLOGRAM_2)
+ return
+ return
+
+ if(user && !user.unEquip(item_to_add))
+ to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!")
+ return 0
+
+ var/valid = FALSE
+ if(ispath(item_to_add.snake_fashion, /datum/snake_fashion/head))
+ valid = TRUE
+
+ if(valid)
+ if(health <= 0)
+ to_chat(user, "Безжизненный взгляд в глазах [real_name] никак не меняется, когда вы надеваете [item_to_add] на неё.")
+ else if(user)
+ user.visible_message("[user] надевает [item_to_add] на центральную голову [real_name]. [src] смотрит на [user] и довольно шипит.",
+ "Вы надеваете [item_to_add] на голову [real_name]. [src] озадачено смотрит на вас, пока другие головы смотрят на центральную с завистью.",
+ "Вы слышите дружелюбное шипение.")
+ item_to_add.forceMove(src)
+ inventory_head = item_to_add
+ update_snek_fluff()
+ regenerate_icons()
+ else
+ to_chat(user, "Вы надеваете [item_to_add] на голову [src], но она скидывает [item_to_add] с себя!")
+ item_to_add.forceMove(drop_location())
+ if(prob(25))
+ step_rand(item_to_add)
+ for(var/i in list(1,2,4,8,4,8,4,dir))
+ setDir(i)
+ sleep(1)
+
+ return valid
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/proc/update_snek_fluff() //имя, описание, эмоуты
+ // First, change back to defaults
+ name = real_name
+ desc = initial(desc)
+ // BYOND/DM doesn't support the use of initial on lists.
+ speak = list("Шшш", "Тсс!", "Тц тц тц!", "ШШшшШШшшШ!")
+ speak_emote = list("hisses")
+ emote_hear = list("Зевает", "Шипит", "Дурачится", "Толкается")
+ emote_see = list("Высовывает язык", "Кружится", "Трясёт хвостом")
+
+///Этот код скопирован с кода для корги и обнуляет показатели которые ему даёт риг. Если когда нибудь змейке дадут риг, раскомментируете///
+/*
+ set_light(0)
+ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ mutations.Remove(BREATHLESS)
+ minbodytemp = initial(minbodytemp)
+*/
+ if(inventory_head?.snake_fashion)
+ var/datum/snake_fashion/SF = new inventory_head.snake_fashion(src)
+ SF.apply(src)
+
+/mob/living/simple_animal/hostile/retaliate/poison/snake/rouge/regenerate_icons() // оверлей
+ ..()
+ if(inventory_head)
+ var/image/head_icon
+ var/datum/snake_fashion/SF = new inventory_head.snake_fashion(src)
+
+ if(!SF.obj_icon_state)
+ SF.obj_icon_state = inventory_head.icon_state
+ if(src.rest || stat == DEAD)
+ SF.obj_icon_state += "_rest"
+ if(!SF.obj_alpha)
+ SF.obj_alpha = inventory_head.alpha
+ if(!SF.obj_color)
+ SF.obj_color = inventory_head.color
+
+ if(stat || src.rest) //без сознания или отдыхает
+ head_icon = SF.get_overlay()
+ if(stat)
+ head_icon.pixel_y = -2
+ head_icon.pixel_x = -2
+ else
+ head_icon = SF.get_overlay()
+
+ add_overlay(head_icon)
diff --git a/modular_ss220/mobs/code/simple_animal/pets/security_dogs.dm b/modular_ss220/mobs/code/simple_animal/pets/security_dogs.dm
new file mode 100644
index 000000000000..cc8161fc931c
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/pets/security_dogs.dm
@@ -0,0 +1,344 @@
+/mob/living/simple_animal/pet/dog/security
+ name = "Мухтар"
+ real_name = "Мухтар"
+ desc = "Верный служебный пес. Он гордо несёт бремя хорошего мальчика."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "german_shep"
+ icon_living = "german_shep"
+ icon_resting = "german_shep_rest"
+ icon_dead = "german_shep_dead"
+ health = 35
+ maxHealth = 35
+ melee_damage_type = STAMINA
+ melee_damage_lower = 8
+ melee_damage_upper = 10
+ attacktext = "кусает"
+ var/obj/item/inventory_head
+ var/obj/item/inventory_mask
+ footstep_type = FOOTSTEP_MOB_CLAW
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/security = 3)
+ tts_seed = "Furion"
+
+/mob/living/simple_animal/pet/dog/security/ranger
+ name = "Ranger"
+ real_name = "Ranger"
+ desc = "That's Ranger, your friendly and fierce k9. He has seen the terror of Xenomorphs, so it's best to be nice to him. RANGER LEAD THE WAY!"
+ icon_state = "ranger"
+ icon_living = "ranger"
+ icon_resting = "ranger_rest"
+ icon_dead = "ranger_dead"
+ tts_seed = "Pudge"
+
+/mob/living/simple_animal/pet/dog/security/warden
+ name = "Джульбарс"
+ real_name = "Джульбарс"
+ desc = "Мудрый служебный пес, названный в честь единственной собаки удостоившийся боевой награды."
+ icon_state = "german_shep2"
+ icon_living = "german_shep2"
+ icon_resting = "german_shep2_rest"
+ icon_dead = "german_shep2_dead"
+ tts_seed = "pantheon"
+
+/mob/living/simple_animal/pet/dog/security/detective
+ name = "Гав-Гавыч"
+ desc = "Старый служебный пёс. Он давно потерял нюх, однако детектив по-прежнему содержит и заботится о нём."
+ icon_state = "blackdog"
+ icon_living = "blackdog"
+ icon_dead = "blackdog_dead"
+ icon_resting = "blackdog_rest"
+ tts_seed = "Thrall"
+
+/mob/living/simple_animal/pet/dog/security/detective/show_inv(mob/user)
+ return
+
+/mob/living/simple_animal/pet/dog/security/show_inv(mob/user)
+ if(user.incapacitated() || !Adjacent(user))
+ return
+ user.set_machine(src)
+
+ var/dat = {"
Inventory of [name]
"}
+ dat += "
Head: [inventory_head]" : "add_inv=head'>Nothing"]"
+ dat += "
Mask: [inventory_mask]" : "add_inv=mask'>Nothing"]"
+ dat += "
Collar: [pcollar]" : "add_inv=collar'>Nothing"]"
+
+ var/datum/browser/popup = new(user, "mob[UID()]", "[src]", 440, 250)
+ popup.set_content(dat)
+ popup.open()
+
+/mob/living/simple_animal/pet/dog/security/ranger/show_inv(mob/user)
+ if(user.incapacitated() || !Adjacent(user))
+ return
+ user.set_machine(src)
+
+ var/dat = {"
Inventory of [name]
"}
+ dat += "
Mask: [inventory_mask]" : "add_inv=mask'>Nothing"]"
+ dat += "
Collar: [pcollar]" : "add_inv=collar'>Nothing"]"
+
+ var/datum/browser/popup = new(user, "mob[UID()]", "[src]", 440, 250)
+ popup.set_content(dat)
+ popup.open()
+
+/mob/living/simple_animal/pet/dog/security/on_lying_down(new_lying_angle)
+ ..()
+ if(icon_resting && stat != DEAD)
+ icon_state = icon_resting
+ regenerate_icons()
+ if(collar_type)
+ collar_type = "[initial(collar_type)]_rest"
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/dog/security/on_standing_up(updating = 1)
+ ..()
+ if(icon_resting && stat != DEAD)
+ icon_state = icon_living
+ regenerate_icons()
+ if(collar_type)
+ collar_type = "[initial(collar_type)]"
+ regenerate_icons()
+
+
+/mob/living/simple_animal/pet/dog/security/Initialize(mapload)
+ . = ..()
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/dog/security/Destroy()
+ QDEL_NULL(inventory_head)
+ QDEL_NULL(inventory_mask)
+ return ..()
+
+/mob/living/simple_animal/pet/dog/security/handle_atom_del(atom/A)
+ if(A == inventory_head)
+ inventory_head = null
+ regenerate_icons()
+ if(A == inventory_mask)
+ inventory_mask = null
+ regenerate_icons()
+ return ..()
+
+/mob/living/simple_animal/pet/dog/security/Life(seconds, times_fired)
+ . = ..()
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/dog/security/death(gibbed)
+ ..(gibbed)
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/dog/security/Topic(href, href_list)
+ if(!(iscarbon(usr) || isrobot(usr)) || usr.incapacitated() || !Adjacent(usr))
+ usr << browse(null, "window=mob[UID()]")
+ usr.unset_machine()
+ return
+
+ //Removing from inventory
+ if(href_list["remove_inv"])
+ var/remove_from = href_list["remove_inv"]
+ switch(remove_from)
+ if("head")
+ if(inventory_head)
+ if(inventory_head.flags & NODROP)
+ to_chat(usr, "\The [inventory_head] is stuck too hard to [src] for you to remove!")
+ return
+ drop_item(inventory_head)
+ usr.put_in_hands(inventory_head)
+ inventory_head = null
+ update_muhtar_fluff()
+ regenerate_icons()
+ else
+ to_chat(usr, "There is nothing to remove from its [remove_from].")
+ return
+ if("mask")
+ if(inventory_mask)
+ if(inventory_mask.flags & NODROP)
+ to_chat(usr, "\The [inventory_head] is stuck too hard to [src] for you to remove!")
+ return
+ drop_item(inventory_mask)
+ usr.put_in_hands(inventory_mask)
+ inventory_mask = null
+ update_muhtar_fluff()
+ regenerate_icons()
+ else
+ to_chat(usr, "There is nothing to remove from its [remove_from].")
+ return
+ if("collar")
+ if(pcollar)
+ var/the_collar = pcollar
+ drop_item(pcollar)
+ usr.put_in_hands(the_collar)
+ pcollar = null
+ update_muhtar_fluff()
+ regenerate_icons()
+
+ show_inv(usr)
+
+ //Adding things to inventory
+ else if(href_list["add_inv"])
+ var/add_to = href_list["add_inv"]
+
+ switch(add_to)
+ if("collar")
+ add_collar(usr.get_active_hand(), usr)
+ update_muhtar_fluff()
+
+ if("head")
+ place_on_head(usr.get_active_hand(),usr)
+
+ if("mask")
+ if(inventory_mask)
+ to_chat(usr, "It's already wearing something!")
+ return
+ else
+ var/obj/item/item_to_add = usr.get_active_hand()
+
+ if(!item_to_add)
+ usr.visible_message("[usr] pets [src].", "You rest your hand on [src]'s face for a moment.")
+ return
+
+ if(!usr.drop_item(item_to_add))
+ to_chat(usr, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s face!")
+ return
+
+ if(istype(item_to_add, /obj/item/grenade/plastic/c4)) // last thing he ever wears, I guess
+ item_to_add.afterattack(src,usr,1)
+ return
+
+ //The objects that secdogs can wear on their faces.
+ var/allowed = FALSE
+ if(ispath(item_to_add.muhtar_fashion, /datum/muhtar_fashion/mask))
+ allowed = TRUE
+
+ if(!allowed)
+ to_chat(usr, "You set [item_to_add] on [src]'s face, but it falls off!")
+ item_to_add.forceMove(drop_location())
+ if(prob(25))
+ step_rand(item_to_add)
+ for(var/i in list(1,2,4,8,4,8,4,dir))
+ setDir(i)
+ sleep(1)
+ return
+
+ item_to_add.forceMove(src)
+ inventory_mask = item_to_add
+ update_muhtar_fluff()
+ regenerate_icons()
+
+ show_inv(usr)
+ else
+ return ..()
+
+/mob/living/simple_animal/pet/dog/security/proc/place_on_head(obj/item/item_to_add, mob/user)
+
+ if(istype(item_to_add, /obj/item/grenade/plastic/c4)) // last thing he ever wears, I guess
+ item_to_add.afterattack(src,user,1)
+ return
+
+ if(inventory_head)
+ if(user)
+ to_chat(user, "You can't put more than one hat on [src]!")
+ return
+ if(!item_to_add)
+ user.visible_message("[user] pets [src].", "You rest your hand on [src]'s head for a moment.")
+ if(flags_2 & HOLOGRAM_2)
+ return
+ return
+
+ if(user && !user.unEquip(item_to_add))
+ to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!")
+ return 0
+
+ var/valid = FALSE
+ if(ispath(item_to_add.muhtar_fashion, /datum/muhtar_fashion/head))
+ valid = TRUE
+
+ //Various hats and items (worn on his head) change muhtar's behaviour. His attributes are reset when a hat is removed.
+
+ if(valid)
+ if(health <= 0)
+ to_chat(user, "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on [p_them()].")
+ else if(user)
+ user.visible_message("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once.",
+ "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks.",
+ "You hear a friendly-sounding bark.")
+ item_to_add.forceMove(src)
+ inventory_head = item_to_add
+ update_muhtar_fluff()
+ regenerate_icons()
+ else
+ to_chat(user, "You set [item_to_add] on [src]'s head, but it falls off!")
+ item_to_add.forceMove(drop_location())
+ if(prob(25))
+ step_rand(item_to_add)
+ for(var/i in list(1,2,4,8,4,8,4,dir))
+ setDir(i)
+ sleep(1)
+
+ return valid
+
+/mob/living/simple_animal/pet/dog/security/proc/update_muhtar_fluff()
+ // First, change back to defaults
+ name = real_name
+ desc = initial(desc)
+ // BYOND/DM doesn't support the use of initial on lists.
+ speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
+ speak_emote = list("barks", "woofs")
+ emote_hear = list("barks!", "woofs!", "yaps.","pants.")
+ emote_see = list("shakes its head.", "chases its tail.","shivers.")
+ desc = initial(desc)
+
+ if(inventory_head && inventory_head.muhtar_fashion)
+ var/datum/muhtar_fashion/DF = new inventory_head.muhtar_fashion(src)
+ DF.apply(src)
+
+ if(inventory_mask && inventory_mask.muhtar_fashion)
+ var/datum/muhtar_fashion/DF = new inventory_mask.muhtar_fashion(src)
+ DF.apply(src)
+
+/mob/living/simple_animal/pet/dog/security/regenerate_icons()
+ ..()
+ if(inventory_head)
+ var/image/head_icon
+ var/datum/muhtar_fashion/DF = new inventory_head.muhtar_fashion(src)
+
+ if(!DF.obj_icon_state)
+ DF.obj_icon_state = inventory_head.icon_state
+ if(!DF.obj_alpha)
+ DF.obj_alpha = inventory_head.alpha
+ if(!DF.obj_color)
+ DF.obj_color = inventory_head.color
+
+
+ if (icon_state == icon_resting)
+ head_icon = DF.get_overlay()
+ head_icon.pixel_y = -2
+ else
+ head_icon = DF.get_overlay()
+
+ if(health <= 0)
+ head_icon = DF.get_overlay(dir = EAST)
+ head_icon.pixel_y = -8
+ head_icon.transform = turn(head_icon.transform, 180)
+
+ add_overlay(head_icon)
+
+ if(inventory_mask)
+ var/image/mask_icon
+ var/datum/muhtar_fashion/DF = new inventory_mask.muhtar_fashion(src)
+
+ if(!DF.obj_icon_state)
+ DF.obj_icon_state = inventory_mask.icon_state
+ if(!DF.obj_alpha)
+ DF.obj_alpha = inventory_mask.alpha
+ if(!DF.obj_color)
+ DF.obj_color = inventory_mask.color
+
+ if(icon_state == icon_resting)
+ mask_icon = DF.get_overlay()
+ mask_icon.pixel_y = -2
+ else
+ mask_icon = DF.get_overlay()
+
+ if(health <= 0)
+ mask_icon = DF.get_overlay(dir = EAST)
+ mask_icon.pixel_y = -11
+ mask_icon.transform = turn(mask_icon.transform, 180)
+
+ add_overlay(mask_icon)
diff --git a/modular_ss220/mobs/code/simple_animal/pets/slugcat.dm b/modular_ss220/mobs/code/simple_animal/pets/slugcat.dm
new file mode 100644
index 000000000000..61ae441463eb
--- /dev/null
+++ b/modular_ss220/mobs/code/simple_animal/pets/slugcat.dm
@@ -0,0 +1,345 @@
+/mob/living/simple_animal/pet/slugcat
+ name = "слизнекот"
+ desc = "Удивительное существо, напоминающая кота и слизня в одном обличии. Но это не слизь, а иной вид существа. Гордость ксенобиологии. Крайне ловкое и умное, родом с планеты с опасной средой обитания. Обожает копья, не стоит давать ему его в лапки. На нем отлично смотрятся шляпы."
+ icon = 'modular_ss220/mobs/icons/mob/pets.dmi'
+ icon_state = "slugcat"
+ icon_living = "slugcat"
+ icon_dead = "slugcat_dead"
+ icon_resting = "slugcat_rest"
+ speak = list("Furrr.","Uhh.", "Hurrr.")
+ gender = MALE
+ turns_per_move = 5
+ see_in_dark = 8
+ health = 100
+ maxHealth = 100
+ blood_volume = BLOOD_VOLUME_NORMAL
+ melee_damage_type = STAMINA
+ melee_damage_lower = 0
+ melee_damage_upper = 0
+ attacktext = "бьет"
+ mob_size = MOB_SIZE_SMALL
+ pass_flags = PASSTABLE
+ ventcrawler = VENTCRAWLER_ALWAYS
+ can_collar = 1
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat = 5)
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "kicks"
+ gold_core_spawnable = FRIENDLY_SPAWN
+ footstep_type = FOOTSTEP_MOB_SLIME
+ tts_seed = "Narrator"
+ faction = list("slime","neutral")
+ //holder_type = /obj/item/holder/cat2
+
+ //Шляпы для слизнекота!
+ var/obj/item/inventory_head
+ var/obj/item/inventory_hand
+
+ var/hat_offset_y = -8
+ var/hat_offset_y_rest = -19
+ var/hat_icon_file = 'icons/mob/clothing/head.dmi'
+ var/hat_icon_state
+ var/hat_alpha
+ var/hat_color
+
+ var/is_pacifist = FALSE
+ var/is_reduce_damage = TRUE
+
+/mob/living/simple_animal/pet/slugcat/monk
+ name = "слизнекот-монах"
+ desc = "Удивительное существо, напоминающая кота и слизня в одном обличии. Но это не слизь, а иной вид существа. Гордость ксенобиологии. Крайне ловкое и умное, родом с планеты с опасной средой обитания. Не любит охоту и не умеет пользоваться копьями. На нем отлично смотрятся шляпы."
+ icon_state = "slugcat_monk"
+ icon_living = "slugcat_monk"
+ icon_dead = "slugcat_monk_dead"
+ icon_resting = "slugcat_monk_rest"
+ is_pacifist = TRUE
+ gold_core_spawnable = FRIENDLY_SPAWN
+ health = 80
+ maxHealth = 80
+
+/mob/living/simple_animal/pet/slugcat/hunter
+ name = "слизнекот-охотник"
+ desc = "Удивительное существо, напоминающая кота и слизня в одном обличии. Но это не слизь, а иной вид существа. Гордость ксенобиологии. Крайне ловкое и умное, родом с планеты с опасной средой обитания. Обожает копья и умело управляется ими, не стоит давать ему его в лапки. На нем отлично смотрятся шляпы."
+ icon_state = "slugcat_hunter"
+ icon_living = "slugcat_hunter"
+ icon_dead = "slugcat_hunter_dead"
+ icon_resting = "slugcat_hunter_rest"
+ is_pacifist = FALSE
+ is_reduce_damage = FALSE
+ faction = list("slime","neutral","hostile")
+ gold_core_spawnable = HOSTILE_SPAWN
+ health = 150
+ maxHealth = 150
+
+/mob/living/simple_animal/pet/slugcat/gold //for admins
+ name = "золотой слизнекот"
+ desc = "Уникальный золотой слизнекот полученный чудотворным путём."
+ icon_state = "slugcat_gold"
+ icon_living = "slugcat_gold"
+ icon_dead = "slugcat_gold_dead"
+ icon_resting = "slugcat_gold_rest"
+ is_pacifist = FALSE
+ is_reduce_damage = FALSE
+ gold_core_spawnable = NO_SPAWN
+ health = 300
+ maxHealth = 300
+
+/mob/living/simple_animal/pet/slugcat/New()
+ ..()
+ regenerate_icons()
+
+
+/mob/living/simple_animal/pet/slugcat/attackby(obj/item/W, mob/user, params)
+ if(stat != DEAD)
+ if(istype(W, /obj/item/clothing/head) && user.a_intent == INTENT_HELP)
+ place_on_head(user.get_active_hand(), user)
+ return
+ if(istype(W, /obj/item/spear) && user.a_intent != INTENT_HARM)
+ place_to_hand(user.get_active_hand(), user)
+ return
+
+ . = ..()
+
+/mob/living/simple_animal/pet/slugcat/death(gibbed)
+ drop_hat()
+ drop_hand()
+ . = ..()
+
+/mob/living/simple_animal/pet/slugcat/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(!(iscarbon(usr) || usr.incapacitated() || !Adjacent(usr)))
+ usr << browse(null, "window=mob[UID()]")
+ usr.unset_machine()
+ return
+
+ if (stat == DEAD)
+ return 0
+
+ if(href_list["remove_inv"])
+ var/remove_from = href_list["remove_inv"]
+ switch(remove_from)
+ if("head")
+ remove_from_head(usr)
+ if("hand")
+ remove_from_hand(usr)
+ show_inv(usr)
+
+ else if(href_list["add_inv"])
+ var/add_to = href_list["add_inv"]
+ switch(add_to)
+ if("head")
+ place_on_head(usr.get_active_hand(), usr)
+ if("hand")
+ place_to_hand(usr.get_active_hand(), usr)
+ show_inv(usr)
+
+ if(usr != src)
+ return 1
+
+/mob/living/simple_animal/pet/slugcat/regenerate_icons()
+ overlays.Cut()
+ ..()
+
+ if(inventory_hand)
+ if(istype(inventory_hand, /obj/item/spear))
+ speared()
+
+ if(inventory_head)
+ var/image/head_icon
+
+ if(!hat_icon_state)
+ hat_icon_state = inventory_head.icon_state
+ if(!hat_alpha)
+ hat_alpha = inventory_head.alpha
+ if(!hat_color)
+ hat_color = inventory_head.color
+
+ head_icon = get_hat_overlay()
+
+ add_overlay(head_icon)
+
+/mob/living/simple_animal/pet/slugcat/on_lying_down(updating = 1)
+ if(inventory_head || inventory_hand)
+ hat_offset_y = hat_offset_y_rest
+ drop_hand()
+ regenerate_icons()
+ . = ..()
+
+/mob/living/simple_animal/pet/slugcat/on_standing_up(updating = 1)
+ if(inventory_head)
+ hat_offset_y = initial(hat_offset_y)
+ regenerate_icons()
+ . = ..()
+
+/mob/living/simple_animal/pet/slugcat/proc/speared()
+ icon_state = "[initial(icon_state)]_spear"
+
+ var/obj/item/spear/spear = inventory_hand
+
+ attacktext = "бьет копьем"
+ attack_sound = 'sound/weapons/bladeslice.ogg'
+ melee_damage_type = BRUTE
+ melee_damage_lower = round(spear.force_unwielded / (is_reduce_damage ? 2 : 1))
+ melee_damage_upper = round(spear.force_wielded / (is_reduce_damage ? 2 : 1))
+ obj_damage = spear.force
+
+/mob/living/simple_animal/pet/slugcat/proc/unspeared()
+ icon_state = initial(icon_state)
+ attacktext = initial(attacktext)
+ attack_sound = initial(attack_sound)
+ melee_damage_type = initial(melee_damage_type)
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
+ obj_damage = initial(obj_damage)
+
+/mob/living/simple_animal/pet/slugcat/proc/get_hat_overlay()
+ if(hat_icon_file && hat_icon_state)
+ var/image/slugI = image(hat_icon_file, hat_icon_state)
+ slugI.alpha = hat_alpha
+ slugI.color = hat_color
+ slugI.pixel_y = hat_offset_y
+ //slugI.transform = matrix(1, 0, 1, 0, 1, 0)
+ return slugI
+
+/mob/living/simple_animal/pet/slugcat/show_inv(mob/user)
+ if(user.incapacitated() || !Adjacent(user))
+ return
+ user.set_machine(src)
+
+ var/dat = {"
Inventory of [name]
"}
+ dat += "
Head: [inventory_head]" : "add_inv=head'>Nothing"]"
+ dat += "
Hand: [inventory_hand]" : "add_inv=hand'>Nothing"]"
+
+ var/datum/browser/popup = new(user, "mob[UID()]", "[src]", 440, 250)
+ popup.set_content(dat)
+ popup.open()
+
+/mob/living/simple_animal/pet/slugcat/proc/place_on_head(obj/item/item_to_add, mob/user)
+ if(!item_to_add)
+ user.visible_message("[user] похлопывает по голове [src.name].", "Вы положили руку на голову [src.name].")
+ if(flags_2 & HOLOGRAM_2)
+ return 0
+ return 0
+
+ if(!istype(item_to_add, /obj/item/clothing/head))
+ to_chat(user, "[item_to_add.name] нельзя надеть на голову [src.name]!")
+ return 0
+
+ if(inventory_head)
+ if(user)
+ to_chat(user, "Нельзя надеть больше одного головного убора на голову [src.name]!")
+ return 0
+
+ if(user && !user.unEquip(item_to_add))
+ to_chat(user, "[item_to_add.name] застрял в ваших руках, вы не можете его надеть на голову [src.name]!")
+ return 0
+
+ user.visible_message("[user] надевает [item_to_add].name на голову [real_name].",
+ "Вы надеваете [item_to_add.name] на голову [real_name].",
+ "Вы слышите как что-то нацепили.")
+ inventory_head = item_to_add
+ regenerate_icons()
+
+ return 1
+
+/mob/living/simple_animal/pet/slugcat/proc/remove_from_head(mob/user)
+ if(inventory_head)
+ if(inventory_head.flags & NODROP)
+ to_chat(user, "[inventory_head.name] застрял на голове [src.name]! Его невозможно снять!")
+ return TRUE
+
+ to_chat(user, "Вы сняли [inventory_head.name] с головы [src.name].")
+ drop_item(inventory_head)
+ user.put_in_hands(inventory_head)
+
+ null_hat()
+
+ regenerate_icons()
+ else
+ to_chat(user, "На голове [src.name] нет головного убора!")
+ return FALSE
+
+ return TRUE
+
+/mob/living/simple_animal/pet/slugcat/proc/drop_hat()
+ if(inventory_head)
+ drop_item(inventory_head)
+ null_hat()
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/slugcat/proc/null_hat()
+ inventory_head = null
+ hat_icon_state = null
+ hat_alpha = null
+ hat_color = null
+
+/mob/living/simple_animal/pet/slugcat/proc/place_to_hand(obj/item/item_to_add, mob/user)
+ if(!item_to_add)
+ user.visible_message("[user] пощупал лапки [src].", "Вы пощупали лапки [src].")
+ if(flags_2 & HOLOGRAM_2)
+ return 0
+ return 0
+
+ if(resting)
+ to_chat(user, "[src.name] спит и не принимает [item_to_add.name]!")
+ return 0
+
+ if(!istype(item_to_add, /obj/item/spear))
+ to_chat(user, "[src.name] не принимает [item_to_add.name]!")
+ return 0
+
+ if(inventory_hand)
+ if(user)
+ to_chat(user, "Лапки [src.name] заняты [inventory_hand.name]!")
+ return 0
+
+ if(user && !user.drop_item(item_to_add))
+ to_chat(user, "[item_to_add.name] застрял в ваших руках, вы не можете его дать [src.name]!")
+ return 0
+
+ if(is_pacifist)
+ to_chat(user, "[src.name] пацифист и не пользуется [item_to_add.name]!")
+ return 0
+
+ user.visible_message("[real_name] выхватывает [item_to_add] с рук [user].",
+ "[real_name] выхватывает [item_to_add] с ваших рук.",
+ "Вы видите довольные глаза.")
+ move_item_to_hand(item_to_add)
+
+ return 1
+
+/mob/living/simple_animal/pet/slugcat/proc/move_item_to_hand(obj/item/item_to_add)
+ item_to_add.forceMove(src)
+ inventory_hand = item_to_add
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/slugcat/proc/remove_from_hand(mob/user)
+ if(inventory_hand)
+ if(inventory_hand.flags & NODROP)
+ to_chat(user, "[inventory_hand.name] застрял в лапах [src]! Его невозможно отнять!")
+ return TRUE
+
+ to_chat(user, "Вы забрали [inventory_hand.name] с лап [src].")
+ drop_item(inventory_hand)
+ user.put_in_hands(inventory_hand)
+
+ null_hand()
+
+ regenerate_icons()
+ else
+ to_chat(user, "В лапах [src] нечего отбирать!")
+ return FALSE
+
+ return TRUE
+
+/mob/living/simple_animal/pet/slugcat/proc/drop_hand()
+ if(inventory_hand)
+ drop_item(inventory_hand)
+ null_hand()
+ regenerate_icons()
+
+/mob/living/simple_animal/pet/slugcat/proc/null_hand()
+ unspeared()
+ inventory_hand = null
diff --git a/modular_ss220/mobs/code/supplypacks/crittercrate.dm b/modular_ss220/mobs/code/supplypacks/crittercrate.dm
new file mode 100644
index 000000000000..bb706cf08260
--- /dev/null
+++ b/modular_ss220/mobs/code/supplypacks/crittercrate.dm
@@ -0,0 +1,159 @@
+//dogs
+/obj/structure/closet/critter/corgi
+ name = "dog corgi crate"
+
+/obj/structure/closet/critter/pug
+ name = "dog pug crate"
+
+/obj/structure/closet/critter/dog_bullterrier
+ name = "dog bullterrier crate"
+ content_mob = /mob/living/simple_animal/pet/dog/bullterrier
+
+/obj/structure/closet/critter/dog_tamaskan
+ name = "dog tamaskan crate"
+ content_mob = /mob/living/simple_animal/pet/dog/tamaskan
+
+/obj/structure/closet/critter/dog_german
+ name = "dog german crate"
+ content_mob = /mob/living/simple_animal/pet/dog/german
+
+/obj/structure/closet/critter/dog_brittany
+ name = "dog brittany crate"
+ content_mob = /mob/living/simple_animal/pet/dog/brittany
+
+
+// cats
+/obj/structure/closet/critter/cat/populate_contents()
+ . = ..()
+ if(prob(5))
+ content_mob = /mob/living/simple_animal/pet/cat/fat
+
+/obj/structure/closet/critter/cat_white
+ name = "white cat crate"
+ content_mob = /mob/living/simple_animal/pet/cat/white
+
+/obj/structure/closet/critter/cat_birman
+ name = "birman cat crate"
+ content_mob = /mob/living/simple_animal/pet/cat/birman
+
+// fox
+/obj/structure/closet/critter/fox/populate_contents()
+ . = ..()
+ if(prob(30))
+ content_mob = /mob/living/simple_animal/pet/dog/fox/forest
+
+/obj/structure/closet/critter/fennec
+ name = "fennec crate"
+ content_mob = /mob/living/simple_animal/pet/dog/fox/fennec
+
+// amphibians
+/obj/structure/closet/critter/frog
+ name = "frog crate"
+ content_mob = /mob/living/simple_animal/frog
+
+/obj/structure/closet/critter/frog/populate_contents()
+ amount = rand(1, 3)
+
+/obj/structure/closet/critter/frog/toxic
+ name = "frog crate"
+ content_mob = /mob/living/simple_animal/frog/toxic
+
+/obj/structure/closet/critter/frog/toxic/populate_contents()
+ . = ..()
+ if(prob(25))
+ content_mob = /mob/living/simple_animal/frog/toxic/scream
+
+/obj/structure/closet/critter/frog/scream
+ name = "frog crate"
+ content_mob = /mob/living/simple_animal/frog/scream
+
+/obj/structure/closet/critter/snail
+ name = "snail crate"
+ content_mob = /mob/living/simple_animal/snail
+
+/obj/structure/closet/critter/snail/populate_contents()
+ amount = rand(1, 5)
+
+/obj/structure/closet/critter/turtle
+ name = "turtle crate"
+ content_mob = /mob/living/simple_animal/turtle
+
+// lizards
+/obj/structure/closet/critter/iguana
+ name = "iguana crate"
+ content_mob = /mob/living/simple_animal/hostile/lizard
+
+/obj/structure/closet/critter/gator
+ name = "gator crate"
+ content_mob = /mob/living/simple_animal/hostile/lizard/gator
+
+/obj/structure/closet/critter/croco
+ name = "croco crate"
+ content_mob = /mob/living/simple_animal/hostile/lizard/croco
+
+//misc
+/obj/structure/closet/critter/sloth
+ name = "sloth crate"
+ content_mob = /mob/living/simple_animal/pet/sloth
+
+/obj/structure/closet/critter/goose
+ name = "goose crate"
+ content_mob = /mob/living/simple_animal/goose
+
+/obj/structure/closet/critter/gosling
+ name = "gosling crate"
+ content_mob = /mob/living/simple_animal/goose/gosling
+
+/obj/structure/closet/critter/gosling/populate_contents()
+ amount = rand(1, 3)
+
+/obj/structure/closet/critter/hamster
+ name = "hamster crate"
+ content_mob = /mob/living/simple_animal/mouse/hamster
+
+/obj/structure/closet/critter/hamster/populate_contents()
+ amount = rand(1, 5)
+
+/obj/structure/closet/critter/possum
+ name = "possum crate"
+ content_mob = /mob/living/simple_animal/possum
+
+/obj/structure/closet/critter/possum/populate_contents()
+ amount = rand(1, 5)
+
+/obj/structure/closet/critter/moth //ящик дорогих шуб поели моли. Увынск.
+ name = "ящик дорогих шуб"
+ content_mob = /mob/living/simple_animal/moth
+ var/static/prob_clothes = 50
+ var/static/possible_clothes_list = list(
+ /obj/item/clothing/suit/pimpcoat = 50,
+
+ /obj/item/clothing/suit/tailcoat = 25,
+ /obj/item/clothing/suit/victcoat = 25,
+ /obj/item/clothing/suit/victcoat/red = 25,
+ /obj/item/clothing/suit/draculacoat = 25,
+ /obj/item/clothing/suit/browntrenchcoat = 25,
+ /obj/item/clothing/suit/neocoat = 25,
+ /obj/item/clothing/suit/blacktrenchcoat = 25,
+
+ /obj/item/clothing/suit/storage/blueshield = 5,
+ /obj/item/clothing/suit/sovietcoat = 5,
+
+ /obj/item/clothing/suit/armor/vest/capcarapace/jacket = 1,
+ /obj/item/clothing/suit/armor/vest/capcarapace/jacket/tunic = 1,
+ /obj/item/clothing/suit/armor/vest/capcarapace/coat = 1,
+ /obj/item/clothing/suit/armor/vest/capcarapace/coat/white = 1,
+ )
+
+/obj/structure/closet/critter/moth/populate_contents()
+ amount = rand(1, 5)
+ if(prob(50))
+ content_mob = /mob/living/simple_animal/mothroach
+
+ if(prob(prob_clothes))
+ //contains = list()
+ var/clothes_amount = rand(1, 8)
+ for(var/i in 1 to clothes_amount)
+ var/picked = pick(possible_clothes_list)
+ new picked(src)
+ //contains.add(picked)
diff --git a/modular_ss220/mobs/code/supplypacks/pack_animals.dm b/modular_ss220/mobs/code/supplypacks/pack_animals.dm
new file mode 100644
index 000000000000..2558d2b1c1f3
--- /dev/null
+++ b/modular_ss220/mobs/code/supplypacks/pack_animals.dm
@@ -0,0 +1,142 @@
+//dogs
+/datum/supply_packs/organic/corgi
+ name = "Dog Corgi Crate"
+
+/datum/supply_packs/organic/pug
+ name = "Dog Pug Crate"
+ cost = 300
+ containertype = /obj/structure/closet/critter/pug
+ containername = "dog pug crate"
+
+/datum/supply_packs/organic/dog_bullterrier
+ name = "Dog Bullterrie Crate"
+ cost = 300
+ containertype = /obj/structure/closet/critter/dog_bullterrier
+ containername = "dog bullterrie crate"
+
+/datum/supply_packs/organic/dog_tamaskan
+ name = "Dog Tamaskan Crate"
+ cost = 300
+ containertype = /obj/structure/closet/critter/dog_tamaskan
+ containername = "dog tamaskan crate"
+
+/datum/supply_packs/organic/dog_german
+ name = "Dog German Crate"
+ cost = 300
+ containertype = /obj/structure/closet/critter/dog_german
+ containername = "dog german crate"
+
+/datum/supply_packs/organic/dog_brittany
+ name = "Dog Brittany Crate"
+ cost = 300
+ containertype = /obj/structure/closet/critter/dog_brittany
+ containername = "dog brittany crate"
+
+//cats
+/datum/supply_packs/organic/cat/white
+ name = "White Cat Crate"
+ cost = 400
+ containername = "white crate"
+ containertype = /obj/structure/closet/critter/cat_white
+
+/datum/supply_packs/organic/cat/birman
+ name = "Birman Cat Crate"
+ cost = 500
+ containername = "birman crate"
+ containertype = /obj/structure/closet/critter/cat_birman
+
+//fox
+/datum/supply_packs/organic/fennec
+ name = "Fennec Crate"
+ cost = 500
+ containertype = /obj/structure/closet/critter/fennec
+ containername = "fennec crate"
+
+//amphibia
+/datum/supply_packs/organic/frog
+ name = "Frog Crate"
+ cost = 250
+ containertype = /obj/structure/closet/critter/frog
+ containername = "frog crate"
+
+/datum/supply_packs/organic/frog/toxic
+ name = "ERROR frog Crate"
+ cost = 1500
+ containertype = /obj/structure/closet/critter/frog/toxic
+ containername = "ERROR frog crate"
+ hidden = 1
+
+/datum/supply_packs/organic/frog/toxic
+ name = "LOUD frog Crate"
+ cost = 1000
+ containertype = /obj/structure/closet/critter/frog/scream
+ containername = "LOUD frog crate"
+ hidden = 1
+
+/datum/supply_packs/organic/snail
+ name = "Snail Crate"
+ cost = 600
+ containertype = /obj/structure/closet/critter/snail
+ containername = "snail crate"
+
+/datum/supply_packs/organic/turtle
+ name = "Turtle Crate"
+ cost = 400
+ containertype = /obj/structure/closet/critter/turtle
+ containername = "turtle crate"
+
+//lizards
+/datum/supply_packs/organic/iguana
+ name = "Iguana Crate"
+ cost = 550
+ containertype = /obj/structure/closet/critter/iguana
+ containername = "iguana crate"
+
+/datum/supply_packs/organic/gator
+ name = "Gator Crate"
+ cost = 1000 //most dangerous
+ containertype = /obj/structure/closet/critter/gator
+ containername = "gator crate"
+
+/datum/supply_packs/organic/croco
+ name = "Croco Crate"
+ cost = 850
+ containertype = /obj/structure/closet/critter/croco
+ containername = "croco crate"
+
+//misc
+/datum/supply_packs/organic/sloth
+ name = "Sloth Crate"
+ cost = 500
+ containertype = /obj/structure/closet/critter/sloth
+ containername = "sloth crate"
+
+/datum/supply_packs/organic/goose
+ name = "Goose Crate"
+ cost = 250
+ containertype = /obj/structure/closet/critter/goose
+ containername = "goose crate"
+
+/datum/supply_packs/organic/gosling
+ name = "Gosling Crate"
+ cost = 50
+ containertype = /obj/structure/closet/critter/gosling
+ containername = "gosling crate"
+
+/datum/supply_packs/organic/hamster
+ name = "Hamster Crate"
+ cost = 150
+ containertype = /obj/structure/closet/critter/hamster
+ containername = "hamster crate"
+
+/datum/supply_packs/organic/possum
+ name = "Possum Crate"
+ cost = 200
+ containertype = /obj/structure/closet/critter/possum
+ containername = "possum crate"
+
+/datum/supply_packs/misc/moth
+ name = "ящик дорогих шуб"
+ cost = 2000
+ containertype = /obj/structure/closet/critter/moth
+ containername = "fur crate"
diff --git a/modular_ss220/mobs/icons/items.dmi b/modular_ss220/mobs/icons/items.dmi
new file mode 100644
index 000000000000..24d56208221a
Binary files /dev/null and b/modular_ss220/mobs/icons/items.dmi differ
diff --git a/modular_ss220/mobs/icons/mob/animal.dmi b/modular_ss220/mobs/icons/mob/animal.dmi
new file mode 100644
index 000000000000..94b3966a89f6
Binary files /dev/null and b/modular_ss220/mobs/icons/mob/animal.dmi differ
diff --git a/modular_ss220/mobs/icons/mob/headcrab.dmi b/modular_ss220/mobs/icons/mob/headcrab.dmi
new file mode 100644
index 000000000000..a1081b398350
Binary files /dev/null and b/modular_ss220/mobs/icons/mob/headcrab.dmi differ
diff --git a/modular_ss220/mobs/icons/mob/inhands/mobs_lefthand.dmi b/modular_ss220/mobs/icons/mob/inhands/mobs_lefthand.dmi
new file mode 100644
index 000000000000..f62231afbc2c
Binary files /dev/null and b/modular_ss220/mobs/icons/mob/inhands/mobs_lefthand.dmi differ
diff --git a/modular_ss220/mobs/icons/mob/inhands/mobs_righthand.dmi b/modular_ss220/mobs/icons/mob/inhands/mobs_righthand.dmi
new file mode 100644
index 000000000000..b6947c613fcd
Binary files /dev/null and b/modular_ss220/mobs/icons/mob/inhands/mobs_righthand.dmi differ
diff --git a/modular_ss220/mobs/icons/mob/inhead/ears.dmi b/modular_ss220/mobs/icons/mob/inhead/ears.dmi
new file mode 100644
index 000000000000..7876fe6d7c53
Binary files /dev/null and b/modular_ss220/mobs/icons/mob/inhead/ears.dmi differ
diff --git a/modular_ss220/mobs/icons/mob/inhead/head.dmi b/modular_ss220/mobs/icons/mob/inhead/head.dmi
new file mode 100644
index 000000000000..e08634fcd4dd
Binary files /dev/null and b/modular_ss220/mobs/icons/mob/inhead/head.dmi differ
diff --git a/modular_ss220/mobs/icons/mob/pets.dmi b/modular_ss220/mobs/icons/mob/pets.dmi
new file mode 100644
index 000000000000..658e677ded5a
Binary files /dev/null and b/modular_ss220/mobs/icons/mob/pets.dmi differ
diff --git a/modular_ss220/mobs/icons/mob/unsorted.dmi b/modular_ss220/mobs/icons/mob/unsorted.dmi
new file mode 100644
index 000000000000..2fc6c72b9a1c
Binary files /dev/null and b/modular_ss220/mobs/icons/mob/unsorted.dmi differ
diff --git a/modular_ss220/mobs/icons/muhtar_accessories.dmi b/modular_ss220/mobs/icons/muhtar_accessories.dmi
new file mode 100644
index 000000000000..bad7da59ddc8
Binary files /dev/null and b/modular_ss220/mobs/icons/muhtar_accessories.dmi differ
diff --git a/modular_ss220/mobs/icons/pet_carrier.dmi b/modular_ss220/mobs/icons/pet_carrier.dmi
new file mode 100644
index 000000000000..927532ff3316
Binary files /dev/null and b/modular_ss220/mobs/icons/pet_carrier.dmi differ
diff --git a/modular_ss220/mobs/icons/rouge_accessories.dmi b/modular_ss220/mobs/icons/rouge_accessories.dmi
new file mode 100644
index 000000000000..118748c522d9
Binary files /dev/null and b/modular_ss220/mobs/icons/rouge_accessories.dmi differ
diff --git a/modular_ss220/mobs/sound/creatures/bear_death.ogg b/modular_ss220/mobs/sound/creatures/bear_death.ogg
new file mode 100644
index 000000000000..8b5717ae9c79
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/bear_onerawr1.ogg b/modular_ss220/mobs/sound/creatures/bear_onerawr1.ogg
new file mode 100644
index 000000000000..3b68421ad61e
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_onerawr1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/bear_onerawr2.ogg b/modular_ss220/mobs/sound/creatures/bear_onerawr2.ogg
new file mode 100644
index 000000000000..98d71af8f0ee
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_onerawr2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/bear_onerawr3.ogg b/modular_ss220/mobs/sound/creatures/bear_onerawr3.ogg
new file mode 100644
index 000000000000..1e2b0ef5a1d0
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_onerawr3.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/bear_rawr.ogg b/modular_ss220/mobs/sound/creatures/bear_rawr.ogg
new file mode 100644
index 000000000000..61565198f46f
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_rawr.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/bear_talk1.ogg b/modular_ss220/mobs/sound/creatures/bear_talk1.ogg
new file mode 100644
index 000000000000..bb6815c20487
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_talk1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/bear_talk2.ogg b/modular_ss220/mobs/sound/creatures/bear_talk2.ogg
new file mode 100644
index 000000000000..ae3dbf335758
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_talk2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/bear_talk3.ogg b/modular_ss220/mobs/sound/creatures/bear_talk3.ogg
new file mode 100644
index 000000000000..a8f28d93075d
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bear_talk3.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/bee.ogg b/modular_ss220/mobs/sound/creatures/bee.ogg
new file mode 100644
index 000000000000..ea8dcc2b369b
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/bee.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/cat_meow.ogg b/modular_ss220/mobs/sound/creatures/cat_meow.ogg
new file mode 100644
index 000000000000..f52cbd2a172f
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cat_meow.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/caw.ogg b/modular_ss220/mobs/sound/creatures/caw.ogg
new file mode 100644
index 000000000000..dc199f7f4fe6
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/caw.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg b/modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg
new file mode 100644
index 000000000000..6cc8e63e1511
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/chicken_damaged1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg b/modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg
new file mode 100644
index 000000000000..01a4308d53dc
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/chicken_damaged2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/chicken_death.ogg b/modular_ss220/mobs/sound/creatures/chicken_death.ogg
new file mode 100644
index 000000000000..989c35b9d472
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/chicken_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/chicken_talk.ogg b/modular_ss220/mobs/sound/creatures/chicken_talk.ogg
new file mode 100644
index 000000000000..2f38d2e6c7dc
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/chicken_talk.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/cow_damaged.ogg b/modular_ss220/mobs/sound/creatures/cow_damaged.ogg
new file mode 100644
index 000000000000..7ba82ddb8f4e
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cow_damaged.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/cow_death.ogg b/modular_ss220/mobs/sound/creatures/cow_death.ogg
new file mode 100644
index 000000000000..00555ec9b620
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cow_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/cow_talk1.ogg b/modular_ss220/mobs/sound/creatures/cow_talk1.ogg
new file mode 100644
index 000000000000..1a1f03b69351
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cow_talk1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/cow_talk2.ogg b/modular_ss220/mobs/sound/creatures/cow_talk2.ogg
new file mode 100644
index 000000000000..3ad84c9134f6
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/cow_talk2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/crack_death1.ogg b/modular_ss220/mobs/sound/creatures/crack_death1.ogg
new file mode 100644
index 000000000000..bad0933700b7
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/crack_death1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/crack_death2.ogg b/modular_ss220/mobs/sound/creatures/crack_death2.ogg
new file mode 100644
index 000000000000..8c9ed6aa56a5
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/crack_death2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/dog_bark1.ogg b/modular_ss220/mobs/sound/creatures/dog_bark1.ogg
new file mode 100644
index 000000000000..809f3897c889
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_bark1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/dog_bark2.ogg b/modular_ss220/mobs/sound/creatures/dog_bark2.ogg
new file mode 100644
index 000000000000..e4e27b0f8628
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_bark2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/dog_grawl1.ogg b/modular_ss220/mobs/sound/creatures/dog_grawl1.ogg
new file mode 100644
index 000000000000..1e55c9b09c4d
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_grawl1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/dog_grawl2.ogg b/modular_ss220/mobs/sound/creatures/dog_grawl2.ogg
new file mode 100644
index 000000000000..33b51191149e
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_grawl2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/dog_yelp.ogg b/modular_ss220/mobs/sound/creatures/dog_yelp.ogg
new file mode 100644
index 000000000000..22f1586014dc
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/dog_yelp.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/duck_aggro1.ogg b/modular_ss220/mobs/sound/creatures/duck_aggro1.ogg
new file mode 100644
index 000000000000..9c65adb557aa
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_aggro1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/duck_aggro2.ogg b/modular_ss220/mobs/sound/creatures/duck_aggro2.ogg
new file mode 100644
index 000000000000..2f70b7724dfb
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_aggro2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/duck_quak1.ogg b/modular_ss220/mobs/sound/creatures/duck_quak1.ogg
new file mode 100644
index 000000000000..a21e1022690e
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_quak1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/duck_quak2.ogg b/modular_ss220/mobs/sound/creatures/duck_quak2.ogg
new file mode 100644
index 000000000000..c841535916c0
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_quak2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/duck_quak3.ogg b/modular_ss220/mobs/sound/creatures/duck_quak3.ogg
new file mode 100644
index 000000000000..c985b116279c
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_quak3.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/duck_talk1.ogg b/modular_ss220/mobs/sound/creatures/duck_talk1.ogg
new file mode 100644
index 000000000000..9c38a1220d19
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_talk1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/duck_talk2.ogg b/modular_ss220/mobs/sound/creatures/duck_talk2.ogg
new file mode 100644
index 000000000000..43302c82dc1f
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_talk2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/duck_talk3.ogg b/modular_ss220/mobs/sound/creatures/duck_talk3.ogg
new file mode 100644
index 000000000000..c511727a9d6b
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/duck_talk3.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg b/modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg
new file mode 100644
index 000000000000..373df5f68acb
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/fast_zombie_idle1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg b/modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg
new file mode 100644
index 000000000000..54d7a5890665
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/fast_zombie_idle2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg b/modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg
new file mode 100644
index 000000000000..f9f97049c9a5
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/fast_zombie_idle3.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/fox_yelp.ogg b/modular_ss220/mobs/sound/creatures/fox_yelp.ogg
new file mode 100644
index 000000000000..83c60317f65e
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/fox_yelp.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/frog_damaged.ogg b/modular_ss220/mobs/sound/creatures/frog_damaged.ogg
new file mode 100644
index 000000000000..0a5096e51f8f
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_damaged.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/frog_death.ogg b/modular_ss220/mobs/sound/creatures/frog_death.ogg
new file mode 100644
index 000000000000..c5afa7145b84
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/frog_scream1.ogg b/modular_ss220/mobs/sound/creatures/frog_scream1.ogg
new file mode 100644
index 000000000000..9be0bebcfbd8
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/frog_scream2.ogg b/modular_ss220/mobs/sound/creatures/frog_scream2.ogg
new file mode 100644
index 000000000000..6a635f5a676b
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/frog_scream_1.ogg b/modular_ss220/mobs/sound/creatures/frog_scream_1.ogg
new file mode 100644
index 000000000000..0c397369b4fe
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream_1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/frog_scream_2.ogg b/modular_ss220/mobs/sound/creatures/frog_scream_2.ogg
new file mode 100644
index 000000000000..25dd16c0f7b5
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream_2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/frog_scream_3.ogg b/modular_ss220/mobs/sound/creatures/frog_scream_3.ogg
new file mode 100644
index 000000000000..232f32bd50d1
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_scream_3.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/frog_talk1.ogg b/modular_ss220/mobs/sound/creatures/frog_talk1.ogg
new file mode 100644
index 000000000000..eb34774607a1
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_talk1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/frog_talk2.ogg b/modular_ss220/mobs/sound/creatures/frog_talk2.ogg
new file mode 100644
index 000000000000..f905914a3b00
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/frog_talk2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/goat_death.ogg b/modular_ss220/mobs/sound/creatures/goat_death.ogg
new file mode 100644
index 000000000000..630d1ac75d50
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/goat_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/headcrab_attack.ogg b/modular_ss220/mobs/sound/creatures/headcrab_attack.ogg
new file mode 100644
index 000000000000..4f6d114aa757
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/headcrab_attack.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/hoot.ogg b/modular_ss220/mobs/sound/creatures/hoot.ogg
new file mode 100644
index 000000000000..a1b6b5f18fa4
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/hoot.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/legion_death.ogg b/modular_ss220/mobs/sound/creatures/legion_death.ogg
new file mode 100644
index 000000000000..fdcf9c8a6596
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/legion_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/legion_death_far.ogg b/modular_ss220/mobs/sound/creatures/legion_death_far.ogg
new file mode 100644
index 000000000000..3e3261687c3b
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/legion_death_far.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/legion_spawn.ogg b/modular_ss220/mobs/sound/creatures/legion_spawn.ogg
new file mode 100644
index 000000000000..9fce6dec4c6c
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/legion_spawn.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/lizard_angry1.ogg b/modular_ss220/mobs/sound/creatures/lizard_angry1.ogg
new file mode 100644
index 000000000000..0d73ac0d7fcd
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_angry1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/lizard_angry2.ogg b/modular_ss220/mobs/sound/creatures/lizard_angry2.ogg
new file mode 100644
index 000000000000..56f1f311ae90
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_angry2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/lizard_angry3.ogg b/modular_ss220/mobs/sound/creatures/lizard_angry3.ogg
new file mode 100644
index 000000000000..c68ec9e56078
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_angry3.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/lizard_damaged.ogg b/modular_ss220/mobs/sound/creatures/lizard_damaged.ogg
new file mode 100644
index 000000000000..aeb97e6de64d
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_damaged.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/lizard_death.ogg b/modular_ss220/mobs/sound/creatures/lizard_death.ogg
new file mode 100644
index 000000000000..300e36a33fd1
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/lizard_death_big.ogg b/modular_ss220/mobs/sound/creatures/lizard_death_big.ogg
new file mode 100644
index 000000000000..aeb97e6de64d
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/lizard_death_big.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/mouse_squeak.ogg b/modular_ss220/mobs/sound/creatures/mouse_squeak.ogg
new file mode 100644
index 000000000000..7b413d6da2a0
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/mouse_squeak.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/narsie_rises.ogg b/modular_ss220/mobs/sound/creatures/narsie_rises.ogg
new file mode 100644
index 000000000000..ccd10cf115fa
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/narsie_rises.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/nymphchirp.ogg b/modular_ss220/mobs/sound/creatures/nymphchirp.ogg
new file mode 100644
index 000000000000..e0e573d497d6
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/nymphchirp.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/ph_scream1.ogg b/modular_ss220/mobs/sound/creatures/ph_scream1.ogg
new file mode 100644
index 000000000000..857cf11b0a21
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/ph_scream1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/pig_death.ogg b/modular_ss220/mobs/sound/creatures/pig_death.ogg
new file mode 100644
index 000000000000..0b83fd283627
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/pig_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/pig_talk1.ogg b/modular_ss220/mobs/sound/creatures/pig_talk1.ogg
new file mode 100644
index 000000000000..0763252277d8
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/pig_talk1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/pig_talk2.ogg b/modular_ss220/mobs/sound/creatures/pig_talk2.ogg
new file mode 100644
index 000000000000..ec5a425459df
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/pig_talk2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/rat_death.ogg b/modular_ss220/mobs/sound/creatures/rat_death.ogg
new file mode 100644
index 000000000000..47021115d4aa
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/rat_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/rat_squeak.ogg b/modular_ss220/mobs/sound/creatures/rat_squeak.ogg
new file mode 100644
index 000000000000..99bbbbe731e9
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/rat_squeak.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/rat_talk.ogg b/modular_ss220/mobs/sound/creatures/rat_talk.ogg
new file mode 100644
index 000000000000..e120c9a33336
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/rat_talk.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/rat_wound.ogg b/modular_ss220/mobs/sound/creatures/rat_wound.ogg
new file mode 100644
index 000000000000..d92c85978870
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/rat_wound.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/seal_death.ogg b/modular_ss220/mobs/sound/creatures/seal_death.ogg
new file mode 100644
index 000000000000..ba40ebc441a8
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/seal_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/snake_death.ogg b/modular_ss220/mobs/sound/creatures/snake_death.ogg
new file mode 100644
index 000000000000..a4104f994f8c
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/snake_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/space_dragon_roar.ogg b/modular_ss220/mobs/sound/creatures/space_dragon_roar.ogg
new file mode 100644
index 000000000000..f7f4503b8946
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/space_dragon_roar.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/spider_attack1.ogg b/modular_ss220/mobs/sound/creatures/spider_attack1.ogg
new file mode 100644
index 000000000000..15d275799502
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_attack1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/spider_attack2.ogg b/modular_ss220/mobs/sound/creatures/spider_attack2.ogg
new file mode 100644
index 000000000000..c7d66176dd0a
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_attack2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/spider_death.ogg b/modular_ss220/mobs/sound/creatures/spider_death.ogg
new file mode 100644
index 000000000000..405b4f4842ec
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_death.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/spider_talk1.ogg b/modular_ss220/mobs/sound/creatures/spider_talk1.ogg
new file mode 100644
index 000000000000..e51baac6b528
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_talk1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/spider_talk2.ogg b/modular_ss220/mobs/sound/creatures/spider_talk2.ogg
new file mode 100644
index 000000000000..634d89c2d0ad
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/spider_talk2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/zombie_attack.ogg b/modular_ss220/mobs/sound/creatures/zombie_attack.ogg
new file mode 100644
index 000000000000..1e9b2a630241
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/zombie_attack.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/zombie_idle1.ogg b/modular_ss220/mobs/sound/creatures/zombie_idle1.ogg
new file mode 100644
index 000000000000..851c88deff49
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/zombie_idle1.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/zombie_idle2.ogg b/modular_ss220/mobs/sound/creatures/zombie_idle2.ogg
new file mode 100644
index 000000000000..04e75da9b226
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/zombie_idle2.ogg differ
diff --git a/modular_ss220/mobs/sound/creatures/zombie_idle3.ogg b/modular_ss220/mobs/sound/creatures/zombie_idle3.ogg
new file mode 100644
index 000000000000..b4cd26007570
Binary files /dev/null and b/modular_ss220/mobs/sound/creatures/zombie_idle3.ogg differ
diff --git a/modular_ss220/mobs/tests/animal.dmi b/modular_ss220/mobs/tests/animal.dmi
new file mode 100644
index 000000000000..78de6fd28b2a
Binary files /dev/null and b/modular_ss220/mobs/tests/animal.dmi differ
diff --git a/modular_ss220/mobs/tests/animal_test.dmi b/modular_ss220/mobs/tests/animal_test.dmi
new file mode 100644
index 000000000000..6853c25994d1
Binary files /dev/null and b/modular_ss220/mobs/tests/animal_test.dmi differ
diff --git a/modular_ss220/mobs/tests/pets.dmi b/modular_ss220/mobs/tests/pets.dmi
new file mode 100644
index 000000000000..11c449b23252
Binary files /dev/null and b/modular_ss220/mobs/tests/pets.dmi differ
diff --git a/modular_ss220/mobs/tests/pets_test.dmi b/modular_ss220/mobs/tests/pets_test.dmi
new file mode 100644
index 000000000000..5018766ad374
Binary files /dev/null and b/modular_ss220/mobs/tests/pets_test.dmi differ
diff --git a/modular_ss220/modular_ss220.dme b/modular_ss220/modular_ss220.dme
index 8ea441971a75..1a850a726aa8 100644
--- a/modular_ss220/modular_ss220.dme
+++ b/modular_ss220/modular_ss220.dme
@@ -51,6 +51,7 @@
#include "keybindings/_keybindings.dme"
#include "loadout/_loadout.dme"
#include "logs/_logs.dme"
+#include "mobs/_mobs.dme"
#include "pixel_shift/_pixel_shift.dme"
#include "radio_sound/radio_sound.dme"
#include "screentip_change/_screentip_change.dme"
diff --git a/modular_ss220/text_to_speech/code/base_seeds/mobs/pets.dm b/modular_ss220/text_to_speech/code/base_seeds/mobs/pets.dm
index 0ec65ab066ee..fee24cc4f0fd 100644
--- a/modular_ss220/text_to_speech/code/base_seeds/mobs/pets.dm
+++ b/modular_ss220/text_to_speech/code/base_seeds/mobs/pets.dm
@@ -1,7 +1,7 @@
//All named pets
-/mob/living/basic/giant_spider/sgt_araneus
+/mob/living/simple_animal/hostile/retaliate/araneus
tts_seed = "Anubarak"
-/mob/living/simple_animal/parrot/poly
+/mob/living/simple_animal/parrot/Poly
tts_seed = "Gyro"