diff --git a/baystation12.dme b/baystation12.dme
index 5c1b234bbb2..6075a79f5fa 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1576,6 +1576,7 @@
#include "code\modules\mob\living\simple_animal\hostile\commanded\_command_defines.dm"
#include "code\modules\mob\living\simple_animal\hostile\commanded\bear_companion.dm"
#include "code\modules\mob\living\simple_animal\hostile\commanded\commanded.dm"
+#include "code\modules\mob\living\simple_animal\hostile\commanded\guard_dog.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index cbebfae872b..4243a2d8cab 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -77,3 +77,13 @@
name = "chicken crate"
held_count = 5
held_type = /mob/living/simple_animal/chick
+
+/obj/structure/largecrate/animal/dog
+ name = "dog carrier"
+ held_type = /mob/living/simple_animal/hostile/commanded/dog
+
+/obj/structure/largecrate/animal/dog/amaskan
+ held_type = /mob/living/simple_animal/hostile/commanded/dog/amaskan
+
+/obj/structure/largecrate/animal/dog/pug
+ held_type = /mob/living/simple_animal/hostile/commanded/dog/pug
diff --git a/code/modules/cargo/randomstock.dm b/code/modules/cargo/randomstock.dm
index fe55225f10d..28d625c9fef 100644
--- a/code/modules/cargo/randomstock.dm
+++ b/code/modules/cargo/randomstock.dm
@@ -262,6 +262,7 @@ var/list/global/random_stock_large = list(
"pipemachine" = 1.7,
"bike" = 0.3,
"sol" = 0.2,
+ "dog" = 0.2,
"nothing" = 0)
@@ -1655,6 +1656,12 @@ var/list/global/random_stock_large = list(
new /obj/structure/closet/sol/navy(L)
else
new /obj/structure/closet/sol/marine(L)
+ if ("dog")
+ var/list/dogs = list(/obj/structure/largecrate/animal/dog,
+ /obj/structure/largecrate/animal/dog/amaskan,
+ /obj/structure/largecrate/animal/dog/pug)
+ var/type = pick(dogs)
+ new type(L)
//This will be complex
//Spawns a random exosuit, Probably not in good condition
diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm b/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm
new file mode 100644
index 00000000000..e96d9a94b52
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm
@@ -0,0 +1,120 @@
+/mob/living/simple_animal/hostile/commanded/dog
+ name = "guard dog"
+ desc = "A dog trained to listen and obey its owner commands, this one is a german shepherd."
+
+ icon = 'icons/mob/dog.dmi'
+ icon_state = "german"
+ icon_living = "german"
+ icon_dead = "german_dead"
+
+ health = 75
+ maxHealth = 75
+
+ stop_automated_movement_when_pulled = 1 //so people can drag the dog around
+ density = 1
+
+ speak_chance = 1
+ turns_per_move = 7
+ see_in_dark = 6
+
+ speak = list("Woof!", "Bark!", "AUUUUUU!","AwooOOOoo!")
+ speak_emote = list("barks", "woofs")
+ emote_hear = list("barks", "woofs")
+
+ attacktext = "bitten"
+ attack_sound = 'sound/misc/dog_bark.ogg'
+ harm_intent_damage = 5
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+
+ mob_size = 6
+
+ response_help = "pets"
+ response_harm = "hits"
+ response_disarm = "pushes"
+
+ hunger_enabled = 1 //so you can feed your dog or something
+ autoseek_food = 0
+ beg_for_food = 0
+
+ known_commands = list("stay", "stop", "attack", "follow")
+
+ var/name_changed = 0
+
+/mob/living/simple_animal/hostile/commanded/dog/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone)
+ . = ..()
+ if(!.)
+ src.emote("barks!")
+
+/mob/living/simple_animal/hostile/commanded/dog/attack_hand(mob/living/carbon/human/M as mob)
+ ..()
+ if(M.a_intent == I_HURT)
+ src.emote("barks!")
+
+
+/mob/living/simple_animal/hostile/commanded/dog/verb/befriend()
+ set name = "Befriend Dog"
+ set category = "IC"
+ set src in view(1)
+
+ if(!master)
+ var/mob/living/carbon/human/H = usr
+ if(istype(H))
+ master = usr
+ . = 1
+ else if(usr == master)
+ . = 1 //already friends, but show success anyways
+
+ else
+ usr << "[src] ignores you."
+
+ return
+
+/mob/living/simple_animal/hostile/commanded/dog/verb/change_name()
+ set name = "Name Dog"
+ set category = "IC"
+ set src in view(1)
+
+ var/mob/M = usr
+ if(!M.mind) return 0
+
+ if(!name_changed)
+
+ var/input = sanitizeSafe(input("What do you want to name the dog?", ,""), MAX_NAME_LEN)
+
+ if(src && input && !M.stat && in_range(M,src))
+ name = input
+ real_name = input
+ name_changed = 1
+ return 1
+
+ else
+ usr << "[src] already has a name!"
+ return
+
+/mob/living/simple_animal/hostile/commanded/dog/amaskan
+ desc = "A dog trained to listen and obey its owner commands, this one is an amaskan."
+
+ icon_state = "amaskan"
+ icon_living = "amaskan"
+ icon_dead = "amaskan_dead"
+
+
+/mob/living/simple_animal/hostile/commanded/dog/pug
+ name = "pug"
+ desc = "A small dog with a wrinkly muzzle."
+
+ icon_state = "pug"
+ icon_living = "pug"
+ icon_dead = "pug_dead"
+
+ health = 25
+ maxHealth = 25
+
+ density = 0
+
+ mob_size = 5
+
+ harm_intent_damage = 5
+ melee_damage_lower = 5
+ melee_damage_upper = 5
diff --git a/icons/mob/dog.dmi b/icons/mob/dog.dmi
new file mode 100644
index 00000000000..5f436d57823
Binary files /dev/null and b/icons/mob/dog.dmi differ
diff --git a/sound/misc/dog_bark.ogg b/sound/misc/dog_bark.ogg
new file mode 100644
index 00000000000..71b44f0576d
Binary files /dev/null and b/sound/misc/dog_bark.ogg differ